` (and so on) element. This meant that internal anchors could be automatically generated on the command line from the Markdown content in GitHub using the `[markdown-toc][19]` library, then simply copied in to the WordPress content, where they would automatically link to the `id` attributes generated by WP Anchor Header.
-
-Next, we imported the updated documentation into WordPress from GitHub, and made sure we had meaningful and easy-to-search on slugs, descriptions, and keywords--because what good is excellent documentation if no one can find it?! A final activity was implementing redirects so that people hitting the old documentation would be taken to the new version.
-
-### What next?
-
-[Please do take a moment and have a read through our new documentation][20]. We know it isn't perfect--far from it--but we're confident that the mechanisms we've baked into our new documentation infrastructure will make it easier to identify gaps--and resolve them quickly. If you'd like to know more, or have suggestions for our documentation, please reach out to Kathy Reid on [Chat][21] (@kathy-mycroft) or via [email][22].
-
-_Reprinted with permission from[Mycroft.ai][23]._
-
-### About the author
-Kathy Reid - Director of Developer Relations @MycroftAI, President of @linuxaustralia. Kathy Reid has expertise in open source technology management, web development, video conferencing, digital signage, technical communities and documentation. She has worked in a number of technical and leadership roles over the last 20 years, and holds Arts and Science undergraduate degrees... more about Kathy Reid
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/1/rocking-docs-mycroft
-
-作者:[Kathy Reid][a]
-译者:[译者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/kathyreid
-[1]:https://opensource.com/users/aneta
-[2]:https://opensource.com/article/17/10/doc-audits
-[3]:/file/382466
-[4]:https://opensource.com/sites/default/files/images/life-uploads/mycroft-documentation-audit.png (mycroft documentation audit)
-[5]:https://git-scm.com/
-[6]:https://github.com/MycroftAI
-[7]:https://en.wikipedia.org/wiki/Markdown
-[8]:https://www.wordpress.org/
-[9]:https://github.com/
-[10]:https://github.com/mycroftai
-[11]:http://mycroft.ai/team/
-[12]:https://wordpress.org/plugins/parsedown-party/
-[13]:https://developer.wordpress.org/themes/template-files-section/page-template-files/
-[14]:https://marketingland.com/estimated-reading-times-increase-engagement-79830
-[15]:https://jasonyingling.me/reading-time-wp/
-[16]:https://multiratingpro.com/
-[17]:https://github.com/MycroftAI/docs-rewrite/blob/master/README.md
-[18]:https://wordpress.org/plugins/wp-anchor-header/
-[19]:https://github.com/jonschlinkert/markdown-toc
-[20]:https://mycroft.ai/documentation
-[21]:https://chat.mycroft.ai/
-[22]:mailto:kathy.reid@mycroft.ai
-[23]:https://mycroft.ai/blog/improving-mycrofts-documentation/
diff --git a/sources/talk/20180111 The open organization and inner sourcing movements can share knowledge.md b/sources/talk/20180111 The open organization and inner sourcing movements can share knowledge.md
deleted file mode 100644
index 272c1b03ae..0000000000
--- a/sources/talk/20180111 The open organization and inner sourcing movements can share knowledge.md
+++ /dev/null
@@ -1,121 +0,0 @@
-The open organization and inner sourcing movements can share knowledge
-======
-
-
-Image by : opensource.com
-
-Red Hat is a company with roughly 11,000 employees. The IT department consists of roughly 500 members. Though it makes up just a fraction of the entire organization, the IT department is still sufficiently staffed to have many application service, infrastructure, and operational teams within it. Our purpose is "to enable Red Hatters in all functions to be effective, productive, innovative, and collaborative, so that they feel they can make a difference,"--and, more specifically, to do that by providing technologies and related services in a fashion that is as open as possible.
-
-Being open like this takes time, attention, and effort. While we always strive to be as open as possible, it can be difficult. For a variety of reasons, we don't always succeed.
-
-In this story, I'll explain a time when, in the rush to innovate, the Red Hat IT organization lost sight of its open ideals. But I'll also explore how returning to those ideals--and using the collaborative tactics of "inner source"--helped us to recover and greatly improve the way we deliver services.
-
-### About inner source
-
-Before I explain how inner source helped our team, let me offer some background on the concept.
-
-Inner source is the adoption of open source development practices between teams within an organization to promote better and faster delivery without requiring project resources be exposed to the world or openly licensed. It allows an organization to receive many of the benefits of open source development methods within its own walls.
-
-In this way, inner source aligns well with open organization strategies and principles; it provides a path for open, collaborative development. While the open organization defines its principles of openness broadly as transparency, inclusivity, adaptability, collaboration, and community--and covers how to use these open principles for communication, decision making, and many other topics--inner source is about the adoption of specific and tactical practices, processes, and patterns from open source communities to improve delivery.
-
-For instance, [the Open Organization Maturity Model][1] suggests that in order to be transparent, teams should, at minimum, share all project resources with the project team (though it suggests that it's generally better to share these resources with the entire organization). The common pattern in both inner source and open source development is to host all resources in a publicly available version control system, for source control management, which achieves the open organization goal of high transparency.
-
-Inner source aligns well with open organization strategies and principles.
-
-Another example of value alignment appears in the way open source communities accept contributions. In open source communities, source code is transparently available. Community contributions in the form of patches or merge requests are commonly accepted practices (even expected ones). This provides one example of how to meet the open organization's goal of promoting inclusivity and collaboration.
-
-### The challenge
-
-Early in 2014, Red Hat IT began its first steps toward making Amazon Web Services (AWS) a standard hosting offering for business critical systems. While teams within Red Hat IT had built several systems and services in AWS by this time, these were bespoke creations, and we desired to make deploying services to IT standards in AWS both simple and standardized.
-
-In order to make AWS cloud hosting meet our operational standards (while being scalable), the Cloud Enablement team within Red Hat IT decided that all infrastructure in AWS would be configured through code, rather than manually, and that everyone would use a standard set of tools. The Cloud Enablement team designed and built these standard tools; a separate group, the Platform Operations team, was responsible for provisioning and hosting systems and services in AWS using the tools.
-
-The Cloud Enablement team built a toolset, obtusely named "Template Util," based on AWS Cloud Formations configurations wrapped in a management layer to enforce certain configuration requirements and make stamping out multiple copies of services across environments easier. While the Template Util toolset technically met all our initial requirements, and we eventually provisioned the infrastructure for more than a dozen services with it, engineers in every team working with the tool found using it to be painful. Michael Johnson, one engineer using the tool, said "It made doing something relatively straightforward really complicated."
-
-Among the issues Template Util exhibited were:
-
- * Underlying cloud formations technologies implied constraints on application stack management at odds with how we managed our application systems.
- * The tooling was needlessly complex and brittle in places, using multiple layered templating technologies and languages making syntax issues hard to debug.
- * The code for the tool--and some of the data users needed to manipulate the tool--were kept in a repository that was difficult for most users to access.
- * There was no standard process to contributing or accepting changes.
- * The documentation was poor.
-
-
-
-As more engineers attempted to use the Template Util toolset, they found even more issues and limitations with the tools. Unhappiness continued to grow. To make matters worse, the Cloud Enablement team then shifted priorities to other deliverables without relinquishing ownership of the tool, so bug fixes and improvements to the tools were further delayed.
-
-The real, core issues here were our inability to build an inclusive community to collaboratively build shared tooling that met everyone's needs. Fear of losing "ownership," fear of changing requirements, and fear of seeing hard work abandoned all contributed to chronic conflict, which in turn led to poorer outcomes.
-
-### Crisis point
-
-By September 2015, more than a year after launching our first major service in AWS with the Template Util tool, we hit a crisis point.
-
-Many engineers refused to use the tools. That forced all of the related service provisioning work on a small set of engineers, further fracturing the community and disrupting service delivery roadmaps as these engineers struggled to deal with unexpected work. We called an emergency meeting and invited all the teams involved to find a solution.
-
-During the emergency meeting, we found that people generally thought we needed immediate change and should start the tooling effort over, but even the decision to start over wasn't unanimous. Many solutions emerged--sometimes multiple solutions from within a single team--all of which would require significant work to implement. While we couldn't reach a consensus on which solution to use during this meeting, we did reach an agreement to give proponents of different technologies two weeks to work together, across teams, to build their case with a prototype, which the community could then review.
-
-While we didn't reach a final and definitive decision, this agreement was the first point where we started to return to the open source ideals that guide our mission. By inviting all involved parties, we were able to be transparent and inclusive, and we could begin rebuilding our internal community. By making clear that we wanted to improve things and were open to new options, we showed our commitment to adaptability and meritocracy. Most importantly, the plan for building prototypes gave people a clear, return path to collaboration.
-
-When the community reviewed the prototypes, it determined that the clear leader was an Ansible-based toolset that would eventually become known, internally, as Ansicloud. (At the time, no one involved with this work had any idea that Red Hat would acquire Ansible the following month. It should also be noted that other teams within Red Hat have found tools based on Cloud Formation extremely useful, even when our specific Template Util tool did not find success.)
-
-This prototyping and testing phase didn't fix things overnight, though. While we had consensus on the general direction we needed to head, we still needed to improve the new prototype to the point at which engineers could use it reliably for production services.
-
-So over the next several months, a handful of engineers worked to further build and extend the Ansicloud toolset. We built three new production services. While we were sharing code, that sharing activity occurred at a low level of maturity. Some engineers had trouble getting access due to older processes. Other engineers headed in slightly different directions, with each engineer having to rediscover some of the core design issues themselves.
-
-### Returning to openness
-
-This led to a turning point: Building on top of the previous agreement, we focused on developing a unified vision and providing easier access. To do this, we:
-
- 1. created a list of specific goals for the project (both "must-haves" and "nice-to-haves"),
- 2. created an open issue log for the project to avoid solving the same problem repeatedly,
- 3. opened our code base so anyone in Red Hat could read or clone it, and
- 4. made it easy for engineers to get trusted committer access
-
-
-
-Our agreement to collaborate, our finally unified vision, and our improved tool development methods spurred the growth of our community. Ansicloud adoption spread throughout the involved organizations, but this led to a new problem: The tool started changing more quickly than users could adapt to it, and improvements that different groups submitted were beginning to affect other groups in unanticipated ways.
-
-These issues resulted in our recent turn to inner source practices. While every open source project operates differently, we focused on adopting some best practices that seemed common to many of them. In particular:
-
- * We identified the business owner of the project and the core-contributor group of developers who would govern the development of the tools and decide what contributions to accept. While we want to keep things open, we can't have people working against each other or breaking each other's functionality.
- * We developed a project README clarifying the purpose of the tool and specifying how to use it. We also created a CONTRIBUTING document explaining how to contribute, what sort of contributions would be useful, and what sort of tests a contribution would need to pass to be accepted.
- * We began building continuous integration and testing services for the Ansicloud tool itself. This helped us ensure we could quickly and efficiently validate contributions technically, before the project accepted and merged them.
-
-
-
-With these basic agreements, documents, and tools available, we were back onto the path of open collaboration and successful inner sourcing.
-
-### Why it matters
-
-Why does inner source matter?
-
-From a developer community point of view, shifting from a traditional siloed development model to the inner source model has produced significant, quantifiable improvements:
-
- * Contributions to our tooling have grown 72% per week (by number of commits).
- * The percentage of contributions from non-core committers has grown from 27% to 78%; the users of the toolset are driving its development.
- * The contributor list has grown by 15%, primarily from new users of the tool set, rather than core committers, increasing our internal community.
-
-
-
-And the tools we've delivered through this project have allowed us to see dramatic improvements in our business outcomes. Using the Ansicloud tools, 54 new multi-environment application service deployments were created in 385 days (compared to 20 services in 1,013 days with the Template Util tools). We've gone from one new service deployment in a 50-day period to one every week--a seven-fold increase in the velocity of our delivery.
-
-What really matters here is that the improvements we saw were not aberrations. Inner source provides common, easily understood patterns that organizations can adopt to effectively promote collaboration (not to mention other open organization principles). By mirroring open source production practices, inner source can also mirror the benefits of open source code, which have been seen time and time again: higher quality code, faster development, and more engaged communities.
-
-This article is part of the [Open Organization Workbook project][2].
-
-### about the author
-Tom Benninger - Tom Benninger is a Solutions Architect, Systems Engineer, and continual tinkerer at Red Hat, Inc. Having worked with startups, small businesses, and larger enterprises, he has experience within a broad set of IT disciplines. His current area of focus is improving Application Lifecycle Management in the enterprise. He has a particular interest in how open source, inner source, and collaboration can help support modern application development practices and the adoption of DevOps, CI/CD, Agile,...
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/open-organization/18/1/open-orgs-and-inner-source-it
-
-作者:[Tom Benninger][a]
-译者:[译者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/tomben
-[1]:https://opensource.com/open-organization/resources/open-org-maturity-model
-[2]:https://opensource.com/open-organization/17/8/workbook-project-announcement
diff --git a/sources/talk/20180112 in which the cost of structured data is reduced.md b/sources/talk/20180112 in which the cost of structured data is reduced.md
deleted file mode 100644
index 992ad57a39..0000000000
--- a/sources/talk/20180112 in which the cost of structured data is reduced.md
+++ /dev/null
@@ -1,181 +0,0 @@
-in which the cost of structured data is reduced
-======
-Last year I got the wonderful opportunity to attend [RacketCon][1] as it was hosted only 30 minutes away from my home. The two-day conference had a number of great talks on the first day, but what really impressed me was the fact that the entire second day was spent focusing on contribution. The day started out with a few 15- to 20-minute talks about how to contribute to a specific codebase (including that of Racket itself), and after that people just split off into groups focused around specific codebases. Each table had maintainers helping guide other folks towards how to work with the codebase and construct effective patch submissions.
-
-![lensmen chronicles][2]
-
-I came away from the conference with a great sense of appreciation for how friendly and welcoming the Racket community is, and how great Racket is as a swiss-army-knife type tool for quick tasks. (Not that it's unsuitable for large projects, but I don't have the opportunity to start any new large projects very frequently.)
-
-The other day I wanted to generate colored maps of the world by categorizing countries interactively, and Racket seemed like it would fit the bill nicely. The job is simple: show an image of the world with one country selected; when a key is pressed, categorize that country, then show the map again with all categorized countries colored, and continue with the next country selected.
-
-### GUIs and XML
-
-I have yet to see a language/framework more accessible and straightforward out of the box for drawing1. Here's the entry point which sets up state and then constructs a canvas that handles key input and display:
-```
-(define (main path)
- (let ([frame (new frame% [label "World color"])]
- [categorizations (box '())]
- [doc (call-with-input-file path read-xml/document)])
- (new (class canvas%
- (define/override (on-char event)
- (handle-key this categorizations (send event get-key-code)))
- (super-new))
- [parent frame]
- [paint-callback (draw doc categorizations)])
- (send frame show #t)))
-
-```
-
-While the class system is not one of my favorite things about Racket (most newer code seems to avoid it in favor of [generic interfaces][3] in the rare case that polymorphism is truly called for), the fact that classes can be constructed in a light-weight, anonymous way makes it much less onerous than it could be. This code sets up all mutable state in a [`box`][4] which you use in the way you'd use a `ref` in ML or Clojure: a mutable wrapper around an immutable data structure.
-
-The world map I'm using is [an SVG of the Robinson projection][5] from Wikipedia. If you look closely there's a call to bind `doc` that calls [`call-with-input-file`][6] with [`read-xml/document`][7] which loads up the whole map file's SVG; just about as easily as you could ask for.
-
-The data you get back from `read-xml/document` is in fact a [document][8] struct, which contains an `element` struct containing `attribute` structs and lists of more `element` structs. All very sensible, but maybe not what you would expect in other dynamic languages like Clojure or Lua where free-form maps reign supreme. Racket really wants structure to be known up-front when possible, which is one of the things that help it produce helpful error messages when things go wrong.
-
-Here's how we handle keyboard input; we're displaying a map with one country highlighted, and `key` here tells us what the user pressed to categorize the highlighted country. If that key is in the `categories` hash then we put it into `categorizations`.
-```
-(define categories #hash((select . "eeeeff")
- (#\1 . "993322")
- (#\2 . "229911")
- (#\3 . "ABCD31")
- (#\4 . "91FF55")
- (#\5 . "2439DF")))
-
-(define (handle-key canvas categorizations key)
- (cond [(equal? #\backspace key) (swap! categorizations cdr)]
- [(member key (dict-keys categories)) (swap! categorizations (curry cons key))]
- [(equal? #\space key) (display (unbox categorizations))])
- (send canvas refresh))
-
-```
-
-### Nested updates: the bad parts
-
-Finally once we have a list of categorizations, we need to apply it to the map document and display. We apply a [`fold`][9] reduction over the XML document struct and the list of country categorizations (plus `'select` for the country that's selected to be categorized next) to get back a "modified" document struct where the proper elements have the style attributes applied for the given categorization, then we turn it into an image and hand it to [`draw-pict`][10]:
-```
-
-(define (update original-doc categorizations)
- (for/fold ([doc original-doc])
- ([category (cons 'select (unbox categorizations))]
- [n (in-range (length (unbox categorizations)) 0 -1)])
- (set-style doc n (style-for category))))
-
-(define ((draw doc categorizations) _ context)
- (let* ([newdoc (update doc categorizations)]
- [xml (call-with-output-string (curry write-xml newdoc))])
- (draw-pict (call-with-input-string xml svg-port->pict) context 0 0)))
-
-```
-
-The problem is in that pesky `set-style` function. All it has to do is reach deep down into the `document` struct to find the `n`th `path` element (the one associated with a given country), and change its `'style` attribute. It ought to be a simple task. Unfortunately this function ends up being anything but simple:
-```
-
-(define (set-style doc n new-style)
- (let* ([root (document-element doc)]
- [g (list-ref (element-content root) 8)]
- [paths (element-content g)]
- [path (first (drop (filter element? paths) n))]
- [path-num (list-index (curry eq? path) paths)]
- [style-index (list-index (lambda (x) (eq? 'style (attribute-name x)))
- (element-attributes path))]
- [attr (list-ref (element-attributes path) style-index)]
- [new-attr (make-attribute (source-start attr)
- (source-stop attr)
- (attribute-name attr)
- new-style)]
- [new-path (make-element (source-start path)
- (source-stop path)
- (element-name path)
- (list-set (element-attributes path)
- style-index new-attr)
- (element-content path))]
- [new-g (make-element (source-start g)
- (source-stop g)
- (element-name g)
- (element-attributes g)
- (list-set paths path-num new-path))]
- [root-contents (list-set (element-content root) 8 new-g)])
- (make-document (document-prolog doc)
- (make-element (source-start root)
- (source-stop root)
- (element-name root)
- (element-attributes root)
- root-contents)
- (document-misc doc))))
-
-```
-
-The reason for this is that while structs are immutable, they don't support functional updates. Whenever you're working with immutable data structures, you want to be able to say "give me a new version of this data, but with field `x` replaced by the value of `(f (lookup x))`". Racket can [do this with dictionaries][11] but not with structs2. If you want a modified version you have to create a fresh one3.
-
-### Lenses to the rescue?
-
-![first lensman][12]
-
-When I brought this up in the `#racket` channel on Freenode, I was helpfully pointed to the 3rd-party [Lens][13] library. Lenses are a general-purpose way of composing arbitrarily nested lookups and updates. Unfortunately at this time there's [a flaw][14] preventing them from working with `xml` structs, so it seemed I was out of luck.
-
-But then I was pointed to [X-expressions][15] as an alternative to structs. The [`xml->xexpr`][16] function turns the structs into a deeply-nested list tree with symbols and strings in it. The tag is the first item in the list, followed by an associative list of attributes, then the element's children. While this gives you fewer up-front guarantees about the structure of the data, it does work around the lens issue.
-
-For this to work, we need to compose a new lens based on the "path" we want to use to drill down into the `n`th country and its `style` attribute. The [`lens-compose`][17] function lets us do that. Note that the order here might be backwards from what you'd expect; it works deepest-first (the way [`compose`][18] works for functions). Also note that defining one lens gives us the ability to both get nested values (with [`lens-view`][19]) and update them.
-```
-(define (style-lens n)
- (lens-compose (dict-ref-lens 'style)
- second-lens
- (list-ref-lens (add1 (* n 2)))
- (list-ref-lens 10)))
-```
-
-Our `` XML elements are under the 10th item of the root xexpr, (hence the [`list-ref-lens`][20] with 10) and they are interspersed with whitespace, so we have to double `n` to find the `` we want. The [`second-lens`][21] call gets us to that element's attribute alist, and [`dict-ref-lens`][22] lets us zoom in on the `'style` key out of that alist.
-
-Once we have our lens, it's just a matter of replacing `set-style` with a call to [`lens-set`][23] in our `update` function we had above, and then we're off:
-```
-(define (update doc categorizations)
- (for/fold ([d doc])
- ([category (cons 'select (unbox categorizations))]
- [n (in-range (length (unbox categorizations)) 0 -1)])
- (lens-set (style-lens n) d (list (style-for category)))))
-```
-
-![second stage lensman][24]
-
-Often times the trade-off between freeform maps/hashes vs structured data feels like one of convenience vs long-term maintainability. While it's unfortunate that they can't be used with the `xml` structs4, lenses provide a way to get the best of both worlds, at least in some situations.
-
-The final version of the code clocks in at 51 lines and is is available [on GitLab][25].
-
-๛
-
---------------------------------------------------------------------------------
-
-via: https://technomancy.us/185
-
-作者:[Phil Hagelberg][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://technomancy.us/
-[1]:https://con.racket-lang.org/
-[2]:https://technomancy.us/i/chronicles-of-lensmen.jpg
-[3]:https://docs.racket-lang.org/reference/struct-generics.html
-[4]:https://docs.racket-lang.org/reference/boxes.html?q=box#%28def._%28%28quote._~23~25kernel%29._box%29%29
-[5]:https://commons.wikimedia.org/wiki/File:BlankMap-World_gray.svg
-[6]:https://docs.racket-lang.org/reference/port-lib.html#(def._((lib._racket%2Fport..rkt)._call-with-input-string))
-[7]:https://docs.racket-lang.org/xml/index.html?q=read-xml#%28def._%28%28lib._xml%2Fmain..rkt%29._read-xml%2Fdocument%29%29
-[8]:https://docs.racket-lang.org/xml/#%28def._%28%28lib._xml%2Fmain..rkt%29._document%29%29
-[9]:https://docs.racket-lang.org/reference/for.html?q=for%2Ffold#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._for%2Ffold%29%29
-[10]:https://docs.racket-lang.org/pict/Rendering.html?q=draw-pict#%28def._%28%28lib._pict%2Fmain..rkt%29._draw-pict%29%29
-[11]:https://docs.racket-lang.org/reference/dicts.html?q=dict-update#%28def._%28%28lib._racket%2Fdict..rkt%29._dict-update%29%29
-[12]:https://technomancy.us/i/first-lensman.jpg
-[13]:https://docs.racket-lang.org/lens/lens-guide.html
-[14]:https://github.com/jackfirth/lens/issues/290
-[15]:https://docs.racket-lang.org/pollen/second-tutorial.html?q=xexpr#%28part._.X-expressions%29
-[16]:https://docs.racket-lang.org/xml/index.html?q=xexpr#%28def._%28%28lib._xml%2Fmain..rkt%29._xml-~3exexpr%29%29
-[17]:https://docs.racket-lang.org/lens/lens-reference.html#%28def._%28%28lib._lens%2Fcommon..rkt%29._lens-compose%29%29
-[18]:https://docs.racket-lang.org/reference/procedures.html#%28def._%28%28lib._racket%2Fprivate%2Flist..rkt%29._compose%29%29
-[19]:https://docs.racket-lang.org/lens/lens-reference.html?q=lens-view#%28def._%28%28lib._lens%2Fcommon..rkt%29._lens-view%29%29
-[20]:https://docs.racket-lang.org/lens/lens-reference.html?q=lens-view#%28def._%28%28lib._lens%2Fdata%2Flist..rkt%29._list-ref-lens%29%29
-[21]:https://docs.racket-lang.org/lens/lens-reference.html?q=lens-view#%28def._%28%28lib._lens%2Fdata%2Flist..rkt%29._second-lens%29%29
-[22]:https://docs.racket-lang.org/lens/lens-reference.html?q=lens-view#%28def._%28%28lib._lens%2Fdata%2Fdict..rkt%29._dict-ref-lens%29%29
-[23]:https://docs.racket-lang.org/lens/lens-reference.html?q=lens-view#%28def._%28%28lib._lens%2Fcommon..rkt%29._lens-set%29%29
-[24]:https://technomancy.us/i/second-stage-lensman.jpg
-[25]:https://gitlab.com/technomancy/world-color/blob/master/world-color.rkt
diff --git a/sources/talk/20180124 Security Chaos Engineering- A new paradigm for cybersecurity.md b/sources/talk/20180124 Security Chaos Engineering- A new paradigm for cybersecurity.md
deleted file mode 100644
index 35c89150c8..0000000000
--- a/sources/talk/20180124 Security Chaos Engineering- A new paradigm for cybersecurity.md
+++ /dev/null
@@ -1,87 +0,0 @@
-Security Chaos Engineering: A new paradigm for cybersecurity
-======
-
-
-Security is always changing and failure always exists.
-
-This toxic scenario requires a fresh perspective on how we think about operational security. We must understand that we are often the primary cause of our own security flaws. The industry typically looks at cybersecurity and failure in isolation or as separate matters. We believe that our lack of insight and operational intelligence into our own security control failures is one of the most common causes of security incidents and, subsequently, data breaches.
-
-> Fall seven times, stand up eight." --Japanese proverb
-
-The simple fact is that "to err is human," and humans derive their success as a direct result of the failures they encounter. Their rate of failure, how they fail, and their ability to understand that they failed in the first place are important building blocks to success. Our ability to learn through failure is inherent in the systems we build, the way we operate them, and the security we use to protect them. Yet there has been a lack of focus when it comes to how we approach preventative security measures, and the spotlight has trended toward the evolving attack landscape and the need to buy or build new solutions.
-
-### Security spending is continually rising and so are security incidents
-
-We spend billions on new information security technologies, however, we rarely take a proactive look at whether those security investments perform as expected. This has resulted in a continual increase in security spending on new solutions to keep up with the evolving attacks.
-
-Despite spending more on security, data breaches are continuously getting bigger and more frequent across all industries. We have marched so fast down this path of the "get-ahead-of-the-attacker" strategy that we haven't considered that we may be a primary cause of our own demise. How is it that we are building more and more security measures, but the problem seems to be getting worse? Furthermore, many of the notable data breaches over the past year were not the result of an advanced nation-state or spy-vs.-spy malicious advanced persistent threats (APTs); rather the principal causes of those events were incomplete implementation, misconfiguration, design flaws, and lack of oversight.
-
-The 2017 Ponemon Cost of a Data Breach Study breaks down the [root causes of data breaches][1] into three areas: malicious or criminal attacks, human factors or errors, and system glitches, including both IT and business-process failure. Of the three categories, malicious or criminal attacks comprises the largest distribution (47%), followed by human error (28%), and system glitches (25%). Cybersecurity vendors have historically focused on malicious root causes of data breaches, as it is the largest sole cause, but together human error and system glitches total 53%, a larger share of the overall problem.
-
-What is not often understood, whether due to lack of insight, reporting, or analysis, is that malicious or criminal attacks are often successful due to human error and system glitches. Both human error and system glitches are, at their root, primary markers of the existence of failure. Whether it's IT system failures, failures in process, or failures resulting from humans, it begs the question: "Should we be focusing on finding a method to identify, understand, and address our failures?" After all, it can be an arduous task to predict the next malicious attack, which often requires investment of time to sift threat intelligence, dig through forensic data, or churn threat feeds full of unknown factors and undetermined motives. Failure instrumentation, identification, and remediation are mostly comprised of things that we know, have the ability to test, and can measure.
-
-Failures we can analyze consist not only of IT, business, and general human factors but also the way we design, build, implement, configure, operate, observe, and manage security controls. People are the ones designing, building, monitoring, and managing the security controls we put in place to defend against malicious attackers. How often do we proactively instrument what we designed, built, and are operationally managing to determine if the controls are failing? Most organizations do not discover that their security controls were failing until a security incident results from that failure. The worst time to find out your security investment failed is during a security incident at 3 a.m.
-
-> Security incidents are not detective measures and hope is not a strategy when it comes to operating effective security controls.
-
-We hypothesize that a large portion of data breaches are caused not by sophisticated nation-state actors or hacktivists, but rather simple things rooted in human error and system glitches. Failure in security controls can arise from poor control placement, technical misconfiguration, gaps in coverage, inadequate testing practices, human error, and numerous other things.
-
-### The journey into Security Chaos Testing
-
-Our venture into this new territory of Security Chaos Testing has shifted our thinking about the root cause of many of our notable security incidents and data breaches.
-
-We were brought together by [Bruce Wong][2], who now works at Stitch Fix with Charles, one of the authors of this article. Prior to Stitch Fix, Bruce was a founder of the Chaos Engineering and System Reliability Engineering (SRE) practices at Netflix, the company commonly credited with establishing the field. Bruce learned about this article's other author, Aaron, through the open source [ChaoSlingr][3] Security Chaos Testing tool project, on which Aaron was a contributor. Aaron was interested in Bruce's perspective on the idea of applying Chaos Engineering to cybersecurity, which led Bruce to connect us to share what we had been working on. As security practitioners, we were both intrigued by the idea of Chaos Engineering and had each begun thinking about how this new method of instrumentation might have a role in cybersecurity.
-
-Within a short timeframe, we began finishing each other's thoughts around testing and validating security capabilities, which we collectively call "Security Chaos Engineering." We directly challenged many of the concepts we had come to depend on in our careers, such as compensating security controls, defense-in-depth, and how to design preventative security. Quickly we realized that we needed to challenge the status quo "set-it-and-forget-it" model and instead execute on continuous instrumentation and validation of security capabilities.
-
-Businesses often don't fully understand whether their security capabilities and controls are operating as expected until they are not. We had both struggled throughout our careers to provide measurements on security controls that go beyond simple uptime metrics. Our journey has shown us there is a need for a more pragmatic approach that emphasizes proactive instrumentation and experimentation over blind faith.
-
-### Defining new terms
-
-In the security industry, we have a habit of not explaining terms and assuming we are speaking the same language. To correct that, here are a few key terms in this new approach:
-
- * **(Security) Chaos Experiments** are foundationally rooted in the scientific method, in that they seek not to validate what is already known to be true or already known to be false, rather they are focused on deriving new insights about the current state.
- * **Security Chaos Engineering** is the discipline of instrumentation, identification, and remediation of failure within security controls through proactive experimentation to build confidence in the system's ability to defend against malicious conditions in production.
-
-
-
-### Security and distributed systems
-
-Consider the evolving nature of modern application design where systems are becoming more and more distributed, ephemeral, and immutable in how they operate. In this shifting paradigm, it is becoming difficult to comprehend the operational state and health of our systems' security. Moreover, how are we ensuring that it remains effective and vigilant as the surrounding environment is changing its parameters, components, and methodologies?
-
-What does it mean to be effective in terms of security controls? After all, a single security capability could easily be implemented in a wide variety of diverse scenarios in which failure may arise from many possible sources. For example, a standard firewall technology may be implemented, placed, managed, and configured differently depending on complexities in the business, web, and data logic.
-
-It is imperative that we not operate our business products and services on the assumption that something works. We must constantly, consistently, and proactively instrument our security controls to ensure they cut the mustard when it matters. This is why Security Chaos Testing is so important. What Security Chaos Engineering does is it provides a methodology for the experimentation of the security of distributed systems in order to build confidence in the ability to withstand malicious conditions.
-
-In Security Chaos Engineering:
-
- * Security capabilities must be end-to-end instrumented.
- * Security must be continuously instrumented to build confidence in the system's ability to withstand malicious conditions.
- * Readiness of a system's security defenses must be proactively assessed to ensure they are battle-ready and operating as intended.
- * The security capability toolchain must be instrumented from end to end to drive new insights into not only the effectiveness of the functionality within the toolchain but also to discover where added value and improvement can be injected.
- * Practiced instrumentation seeks to identify, detect, and remediate failures in security controls.
- * The focus is on vulnerability and failure identification, not failure management.
- * The operational effectiveness of incident management is sharpened.
-
-
-
-As Henry Ford said, "Failure is only the opportunity to begin again, this time more intelligently." Security Chaos Engineering and Security Chaos Testing give us that opportunity.
-
-Would you like to learn more? Join the discussion by following [@aaronrinehart][4] and [@charles_nwatu][5] on Twitter.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/1/new-paradigm-cybersecurity
-
-作者:[Aaron Rinehart][a]
-译者:[译者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/aaronrinehart
-[1]:https://www.ibm.com/security/data-breach
-[2]:https://twitter.com/bruce_m_wong?lang=en
-[3]:https://github.com/Optum/ChaoSlingr
-[4]:https://twitter.com/aaronrinehart
-[5]:https://twitter.com/charles_nwatu
diff --git a/sources/talk/20180131 How to write a really great resume that actually gets you hired.md b/sources/talk/20180131 How to write a really great resume that actually gets you hired.md
deleted file mode 100644
index b54b3944ae..0000000000
--- a/sources/talk/20180131 How to write a really great resume that actually gets you hired.md
+++ /dev/null
@@ -1,395 +0,0 @@
-How to write a really great resume that actually gets you hired
-============================================================
-
-
-
-
-This is a data-driven guide to writing a resume that actually gets you hired. I’ve spent the past four years analyzing which resume advice works regardless of experience, role, or industry. The tactics laid out below are the result of what I’ve learned. They helped me land offers at Google, Microsoft, and Twitter and have helped my students systematically land jobs at Amazon, Apple, Google, Microsoft, Facebook, and more.
-
-### Writing Resumes Sucks.
-
-It’s a vicious cycle.
-
-We start by sifting through dozens of articles by career “gurus,” forced to compare conflicting advice and make our own decisions on what to follow.
-
-The first article says “one page MAX” while the second says “take two or three and include all of your experience.”
-
-The next says “write a quick summary highlighting your personality and experience” while another says “summaries are a waste of space.”
-
-You scrape together your best effort and hit “Submit,” sending your resume into the ether. When you don’t hear back, you wonder what went wrong:
-
- _“Was it the single page or the lack of a summary? Honestly, who gives a s**t at this point. I’m sick of sending out 10 resumes every day and hearing nothing but crickets.”_
-
-
-
-How it feels to try and get your resume read in today’s world.
-
-Writing resumes sucks but it’s not your fault.
-
-The real reason it’s so tough to write a resume is because most of the advice out there hasn’t been proven against the actual end goal of getting a job. If you don’t know what consistently works, you can’t lay out a system to get there.
-
-It’s easy to say “one page works best” when you’ve seen it happen a few times. But how does it hold up when we look at 100 resumes across different industries, experience levels, and job titles?
-
-That’s what this article aims to answer.
-
-Over the past four years, I’ve personally applied to hundreds of companies and coached hundreds of people through the job search process. This has given me a huge opportunity to measure, analyze, and test the effectiveness of different resume strategies at scale.
-
-This article is going to walk through everything I’ve learned about resumes over the past 4 years, including:
-
-* Mistakes that more than 95% of people make, causing their resumes to get tossed immediately
-
-* Three things that consistently appear in the resumes of highly effective job searchers (who go on to land jobs at the world’s best companies)
-
-* A quick hack that will help you stand out from the competition and instantly build relationships with whomever is reading your resume (increasing your chances of hearing back and getting hired)
-
-* The exact resume template that got me interviews and offers at Google, Microsoft, Twitter, Uber, and more
-
-Before we get to the unconventional strategies that will help set you apart, we need to make sure our foundational bases are covered. That starts with understanding the mistakes most job seekers make so we can make our resume bulletproof.
-
-### Resume Mistakes That 95% Of People Make
-
-Most resumes that come through an online portal or across a recruiter’s desk are tossed out because they violate a simple rule.
-
-When recruiters scan a resume, the first thing they look for is mistakes. Your resume could be fantastic, but if you violate a rule like using an unprofessional email address or improper grammar, it’s going to get tossed out.
-
-Our goal is to fully understand the triggers that cause recruiters/ATS systems to make the snap decisions on who stays and who goes.
-
-In order to get inside the heads of these decision makers, I collected data from dozens of recruiters and hiring mangers across industries. These people have several hundred years of hiring experience under their belts and they’ve reviewed 100,000+ resumes across industries.
-
-They broke down the five most common mistakes that cause them to cut resumes from the pile:
-
-
-
-
-### The Five Most Common Resume Mistakes (According To Recruiters & Hiring Managers)
-
-Issue #1: Sloppiness (typos, spelling errors, & grammatical mistakes). Close to 60% of resumes have some sort of typo or grammatical issue.
-
-Solution: Have your resume reviewed by three separate sources — spell checking software, a friend, and a professional. Spell check should be covered if you’re using Microsoft Word or Google Docs to create your resume.
-
-A friend or family member can cover the second base, but make sure you trust them with reviewing the whole thing. You can always include an obvious mistake to see if they catch it.
-
-Finally, you can hire a professional editor on [Upwork][1]. It shouldn’t take them more than 15–20 minutes to review so it’s worth paying a bit more for someone with high ratings and lots of hours logged.
-
-Issue #2: Summaries are too long and formal. Many resumes include summaries that consist of paragraphs explaining why they are a “driven, results oriented team player.” When hiring managers see a block of text at the top of the resume, you can bet they aren’t going to read the whole thing. If they do give it a shot and read something similar to the sentence above, they’re going to give up on the spot.
-
-Solution: Summaries are highly effective, but they should be in bullet form and showcase your most relevant experience for the role. For example, if I’m applying for a new business sales role my first bullet might read “Responsible for driving $11M of new business in 2018, achieved 168% attainment (#1 on my team).”
-
-Issue #3: Too many buzz words. Remember our driven team player from the last paragraph? Phrasing like that makes hiring managers cringe because your attempt to stand out actually makes you sound like everyone else.
-
-Solution: Instead of using buzzwords, write naturally, use bullets, and include quantitative results whenever possible. Would you rather hire a salesperson who “is responsible for driving new business across the healthcare vertical to help companies achieve their goals” or “drove $15M of new business last quarter, including the largest deal in company history”? Skip the buzzwords and focus on results.
-
-Issue #4: Having a resume that is more than one page. The average employer spends six seconds reviewing your resume — if it’s more than one page, it probably isn’t going to be read. When asked, recruiters from Google and Barclay’s both said multiple page resumes “are the bane of their existence.”
-
-Solution: Increase your margins, decrease your font, and cut down your experience to highlight the most relevant pieces for the role. It may seem impossible but it’s worth the effort. When you’re dealing with recruiters who see hundreds of resumes every day, you want to make their lives as easy as possible.
-
-### More Common Mistakes & Facts (Backed By Industry Research)
-
-In addition to personal feedback, I combed through dozens of recruitment survey results to fill any gaps my contacts might have missed. Here are a few more items you may want to consider when writing your resume:
-
-* The average interviewer spends 6 seconds scanning your resume
-
-* The majority of interviewers have not looked at your resume until
- you walk into the room
-
-* 76% of resumes are discarded for an unprofessional email address
-
-* Resumes with a photo have an 88% rejection rate
-
-* 58% of resumes have typos
-
-* Applicant tracking software typically eliminates 75% of resumes due to a lack of keywords and phrases being present
-
-Now that you know every mistake you need to avoid, the first item on your to-do list is to comb through your current resume and make sure it doesn’t violate anything mentioned above.
-
-Once you have a clean resume, you can start to focus on more advanced tactics that will really make you stand out. There are a few unique elements you can use to push your application over the edge and finally get your dream company to notice you.
-
-
-
-
-### The 3 Elements Of A Resume That Will Get You Hired
-
-My analysis showed that highly effective resumes typically include three specific elements: quantitative results, a simple design, and a quirky interests section. This section breaks down all three elements and shows you how to maximize their impact.
-
-### Quantitative Results
-
-Most resumes lack them.
-
-Which is a shame because my data shows that they make the biggest difference between resumes that land interviews and resumes that end up in the trash.
-
-Here’s an example from a recent resume that was emailed to me:
-
-> Experience
-
-> + Identified gaps in policies and processes and made recommendations for solutions at the department and institution level
-
-> + Streamlined processes to increase efficiency and enhance quality
-
-> + Directly supervised three managers and indirectly managed up to 15 staff on multiple projects
-
-> + Oversaw execution of in-house advertising strategy
-
-> + Implemented comprehensive social media plan
-
-As an employer, that tells me absolutely nothing about what to expect if I hire this person.
-
-They executed an in-house marketing strategy. Did it work? How did they measure it? What was the ROI?
-
-They also also identified gaps in processes and recommended solutions. What was the result? Did they save time and operating expenses? Did it streamline a process resulting in more output?
-
-Finally, they managed a team of three supervisors and 15 staffers. How did that team do? Was it better than the other teams at the company? What results did they get and how did those improve under this person’s management?
-
-See what I’m getting at here?
-
-These types of bullets talk about daily activities, but companies don’t care about what you do every day. They care about results. By including measurable metrics and achievements in your resume, you’re showcasing the value that the employer can expect to get if they hire you.
-
-Let’s take a look at revised versions of those same bullets:
-
-> Experience
-
-> + Managed a team of 20 that consistently outperformed other departments in lead generation, deal size, and overall satisfaction (based on our culture survey)
-
-> + Executed in-house marketing strategy that resulted in a 15% increase in monthly leads along with a 5% drop in the cost per lead
-
-> + Implemented targeted social media campaign across Instagram & Pintrest, which drove an additional 50,000 monthly website visits and generated 750 qualified leads in 3 months
-
-If you were in the hiring manager’s shoes, which resume would you choose?
-
-That’s the power of including quantitative results.
-
-### Simple, Aesthetic Design That Hooks The Reader
-
-These days, it’s easy to get carried away with our mission to “stand out.” I’ve seen resume overhauls from graphic designers, video resumes, and even resumes [hidden in a box of donuts.][2]
-
-While those can work in very specific situations, we want to aim for a strategy that consistently gets results. The format I saw the most success with was a black and white Word template with sections in this order:
-
-* Summary
-
-* Interests
-
-* Experience
-
-* Education
-
-* Volunteer Work (if you have it)
-
-This template is effective because it’s familiar and easy for the reader to digest.
-
-As I mentioned earlier, hiring managers scan resumes for an average of 6 seconds. If your resume is in an unfamiliar format, those 6 seconds won’t be very comfortable for the hiring manager. Our brains prefer things we can easily recognize. You want to make sure that a hiring manager can actually catch a glimpse of who you are during their quick scan of your resume.
-
-If we’re not relying on design, this hook needs to come from the _Summary_ section at the top of your resume.
-
-This section should be done in bullets (not paragraph form) and it should contain 3–4 highlights of the most relevant experience you have for the role. For example, if I was applying for a New Business Sales position, my summary could look like this:
-
-> Summary
-
-> Drove quarterly average of $11M in new business with a quota attainment of 128% (#1 on my team)
-
-> Received award for largest sales deal of the year
-
-> Developed and trained sales team on new lead generation process that increased total leads by 17% in 3 months, resulting in 4 new deals worth $7M
-
-Those bullets speak directly to the value I can add to the company if I was hired for the role.
-
-### An “Interests” Section That’s Quirky, Unique, & Relatable
-
-This is a little “hack” you can use to instantly build personal connections and positive associations with whomever is reading your resume.
-
-Most resumes have a skills/interests section, but it’s usually parked at the bottom and offers little to no value. It’s time to change things up.
-
-[Research shows][3] that people rely on emotions, not information, to make decisions. Big brands use this principle all the time — emotional responses to advertisements are more influential on a person’s intent to buy than the content of an ad.
-
-You probably remember Apple’s famous “Get A Mac” campaign:
-
-
-When it came to specs and performance, Macs didn’t blow every single PC out of the water. But these ads solidified who was “cool” and who wasn’t, which was worth a few extra bucks to a few million people.
-
-By tugging at our need to feel “cool,” Apple’s campaign led to a [42% increase in market share][4] and a record sales year for Macbooks.
-
-Now we’re going to take that same tactic and apply it to your resume.
-
-If you can invoke an emotional response from your recruiter, you can influence the mental association they assign to you. This gives you a major competitive advantage.
-
-Let’s start with a question — what could you talk about for hours?
-
-It could be cryptocurrency, cooking, World War 2, World of Warcraft, or how Google’s bet on segmenting their company under the Alphabet is going to impact the technology sector over the next 5 years.
-
-Did a topic (or two) pop into year head? Great.
-
-Now think about what it would be like to have a conversation with someone who was just as passionate and knew just as much as you did on the topic. It’d be pretty awesome, right? _Finally, _ someone who gets it!
-
-That’s exactly the kind of emotional response we’re aiming to get from a hiring manager.
-
-There are five “neutral” topics out there that people enjoy talking about:
-
-1. Food/Drink
-
-2. Sports
-
-3. College
-
-4. Hobbies
-
-5. Geography (travel, where people are from, etc.)
-
-These topics are present in plenty of interest sections but we want to take them one step further.
-
-Let’s say you had the best night of your life at the Full Moon Party in Thailand. Which of the following two options would you be more excited to read:
-
-* Traveling
-
-* Ko Pha Ngan beaches (where the full moon party is held)
-
-Or, let’s say that you went to Duke (an ACC school) and still follow their basketball team. Which would you be more pumped about:
-
-* College Sports
-
-* ACC Basketball (Go Blue Devils!)
-
-In both cases, the second answer would probably invoke a larger emotional response because it is tied directly to your experience.
-
-I want you to think about your interests that fit into the five categories I mentioned above.
-
-Now I want you to write a specific favorite associated with each category in parentheses next to your original list. For example, if you wrote travel you can add (ask me about the time I was chased by an elephant in India) or (specifically meditation in a Tibetan monastery).
-
-Here is the [exact set of interests][5] I used on my resume when I interviewed at Google, Microsoft, and Twitter:
-
- _ABC Kitchen’s Atmosphere, Stumptown Coffee (primarily cold brew), Michael Lewis (Liar’s Poker), Fishing (especially fly), Foods That Are Vehicles For Hot Sauce, ACC Sports (Go Deacs!) & The New York Giants_
-
-
-
-
-If you want to cheat here, my experience shows that anything about hot sauce is an instant conversation starter.
-
-### The Proven Plug & Play Resume Template
-
-Now that we have our strategies down, it’s time to apply these tactics to a real resume. Our goal is to write something that increases your chances of hearing back from companies, enhances your relationships with hiring managers, and ultimately helps you score the job offer.
-
-The example below is the exact resume that I used to land interviews and offers at Microsoft, Google, and Twitter. I was targeting roles in Account Management and Sales, so this sample is tailored towards those positions. We’ll break down each section below:
-
-
-
-
-First, I want you to notice how clean this is. Each section is clearly labeled and separated and flows nicely from top to bottom.
-
-My summary speaks directly to the value I’ve created in the past around company culture and its bottom line:
-
-* I consistently exceeded expectations
-
-* I started my own business in the space (and saw real results)
-
-* I’m a team player who prioritizes culture
-
-I purposefully include my Interests section right below my Summary. If my hiring manager’s six second scan focused on the summary, I know they’ll be interested. Those bullets cover all the subconscious criteria for qualification in sales. They’re going to be curious to read more in my Experience section.
-
-By sandwiching my Interests in the middle, I’m upping their visibility and increasing the chance of creating that personal connection.
-
-You never know — the person reading my resume may also be a hot sauce connoisseur and I don’t want that to be overlooked because my interests were sitting at the bottom.
-
-Next, my Experience section aims to flesh out the points made in my Summary. I mentioned exceeding my quota up top, so I included two specific initiatives that led to that attainment, including measurable results:
-
-* A partnership leveraging display advertising to drive users to a gamified experience. The campaign resulted in over 3000 acquisitions and laid the groundwork for the 2nd largest deal in company history.
-
-* A partnership with a top tier agency aimed at increasing conversions for a client by improving user experience and upgrading tracking during a company-wide website overhaul (the client has ~20 brand sites). Our efforts over 6 months resulted in a contract extension worth 316% more than their original deal.
-
-Finally, I included my education at the very bottom starting with the most relevant coursework.
-
-Download My Resume Templates For Free
-
-You can download a copy of the resume sample above as well as a plug and play template here:
-
-Austin’s Resume: [Click To Download][6]
-
-Plug & Play Resume Template: [Click To Download][7]
-
-### Bonus Tip: An Unconventional Resume “Hack” To Help You Beat Applicant Tracking Software
-
-If you’re not already familiar, Applicant Tracking Systems are pieces of software that companies use to help “automate” the hiring process.
-
-After you hit submit on your online application, the ATS software scans your resume looking for specific keywords and phrases (if you want more details, [this article][8] does a good job of explaining ATS).
-
-If the language in your resume matches up, the software sees it as a good fit for the role and will pass it on to the recruiter. However, even if you’re highly qualified for the role but you don’t use the right wording, your resume can end up sitting in a black hole.
-
-I’m going to teach you a little hack to help improve your chances of beating the system and getting your resume in the hands of a human:
-
-Step 1: Highlight and select the entire job description page and copy it to your clipboard.
-
-Step 2: Head over to [WordClouds.com][9] and click on the “Word List” button at the top. Towards the top of the pop up box, you should see a link for Paste/Type Text. Go ahead and click that.
-
-Step 3: Now paste the entire job description into the box, then hit “Apply.”
-
-WordClouds is going to spit out an image that showcases every word in the job description. The larger words are the ones that appear most frequently (and the ones you want to make sure to include when writing your resume). Here’s an example for a data a science role:
-
-
-
-
-You can also get a quantitative view by clicking “Word List” again after creating your cloud. That will show you the number of times each word appeared in the job description:
-
-9 data
-
-6 models
-
-4 experience
-
-4 learning
-
-3 Experience
-
-3 develop
-
-3 team
-
-2 Qualifications
-
-2 statistics
-
-2 techniques
-
-2 libraries
-
-2 preferred
-
-2 research
-
-2 business
-
-When writing your resume, your goal is to include those words in the same proportions as the job description.
-
-It’s not a guaranteed way to beat the online application process, but it will definitely help improve your chances of getting your foot in the door!
-
-* * *
-
-### Want The Inside Info On Landing A Dream Job Without Connections, Without “Experience,” & Without Applying Online?
-
-[Click here to get the 5 free strategies that my students have used to land jobs at Google, Microsoft, Amazon, and more without applying online.][10]
-
- _Originally published at _ [_cultivatedculture.com_][11] _._
-
---------------------------------------------------------------------------------
-
-作者简介:
-
-I help people land jobs they love and salaries they deserve at CultivatedCulture.com
-
-----------
-
-via: https://medium.freecodecamp.org/how-to-write-a-really-great-resume-that-actually-gets-you-hired-e18533cd8d17
-
-作者:[Austin Belcak ][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://medium.freecodecamp.org/@austin.belcak
-[1]:http://www.upwork.com/
-[2]:https://www.thrillist.com/news/nation/this-guy-hides-his-resume-in-boxes-of-donuts-to-score-job-interviews
-[3]:https://www.psychologytoday.com/blog/inside-the-consumer-mind/201302/how-emotions-influence-what-we-buy
-[4]:https://www.businesswire.com/news/home/20070608005253/en/Apple-Mac-Named-Successful-Marketing-Campaign-2007
-[5]:http://cultivatedculture.com/resume-skills-section/
-[6]:https://drive.google.com/file/d/182gN6Kt1kBCo1LgMjtsGHOQW2lzATpZr/view?usp=sharing
-[7]:https://drive.google.com/open?id=0B3WIcEDrxeYYdXFPVlcyQlJIbWc
-[8]:https://www.jobscan.co/blog/8-things-you-need-to-know-about-applicant-tracking-systems/
-[9]:https://www.wordclouds.com/
-[10]:https://cultivatedculture.com/dreamjob/
-[11]:https://cultivatedculture.com/write-a-resume/
\ No newline at end of file
diff --git a/sources/talk/20180206 UQDS- A software-development process that puts quality first.md b/sources/talk/20180206 UQDS- A software-development process that puts quality first.md
deleted file mode 100644
index e9f7bb94ac..0000000000
--- a/sources/talk/20180206 UQDS- A software-development process that puts quality first.md
+++ /dev/null
@@ -1,99 +0,0 @@
-UQDS: A software-development process that puts quality first
-======
-
-
-
-The Ultimate Quality Development System (UQDS) is a software development process that provides clear guidelines for how to use branches, tickets, and code reviews. It was invented more than a decade ago by Divmod and adopted by [Twisted][1], an event-driven framework for Python that underlies popular commercial platforms like HipChat as well as open source projects like Scrapy (a web scraper).
-
-Divmod, sadly, is no longer around—it has gone the way of many startups. Luckily, since many of its products were open source, its legacy lives on.
-
-When Twisted was a young project, there was no clear process for when code was "good enough" to go in. As a result, while some parts were highly polished and reliable, others were alpha quality software—with no way to tell which was which. UQDS was designed as a process to help an existing project with definite quality challenges ramp up its quality while continuing to add features and become more useful.
-
-UQDS has helped the Twisted project evolve from having frequent regressions and needing multiple release candidates to get a working version, to achieving its current reputation of stability and reliability.
-
-### UQDS's building blocks
-
-UQDS was invented by Divmod back in 2006. At that time, Continuous Integration (CI) was in its infancy and modern version control systems, which allow easy branch merging, were barely proofs of concept. Although Divmod did not have today's modern tooling, it put together CI, some ad-hoc tooling to make [Subversion branches][2] work, and a lot of thought into a working process. Thus the UQDS methodology was born.
-
-UQDS is based upon fundamental building blocks, each with their own carefully considered best practices:
-
- 1. Tickets
- 2. Branches
- 3. Tests
- 4. Reviews
- 5. No exceptions
-
-
-
-Let's go into each of those in a little more detail.
-
-#### Tickets
-
-In a project using the UQDS methodology, no change is allowed to happen if it's not accompanied by a ticket. This creates a written record of what change is needed and—more importantly—why.
-
- * Tickets should define clear, measurable goals.
- * Work on a ticket does not begin until the ticket contains goals that are clearly defined.
-
-
-
-#### Branches
-
-Branches in UQDS are tightly coupled with tickets. Each branch must solve one complete ticket, no more and no less. If a branch addresses either more or less than a single ticket, it means there was a problem with the ticket definition—or with the branch. Tickets might be split or merged, or a branch split and merged, until congruence is achieved.
-
-Enforcing that each branch addresses no more nor less than a single ticket—which corresponds to one logical, measurable change—allows a project using UQDS to have fine-grained control over the commits: A single change can be reverted or changes may even be applied in a different order than they were committed. This helps the project maintain a stable and clean codebase.
-
-#### Tests
-
-UQDS relies upon automated testing of all sorts, including unit, integration, regression, and static tests. In order for this to work, all relevant tests must pass at all times. Tests that don't pass must either be fixed or, if no longer relevant, be removed entirely.
-
-Tests are also coupled with tickets. All new work must include tests that demonstrate that the ticket goals are fully met. Without this, the work won't be merged no matter how good it may seem to be.
-
-A side effect of the focus on tests is that the only platforms that a UQDS-using project can say it supports are those on which the tests run with a CI framework—and where passing the test on the platform is a condition for merging a branch. Without this restriction on supported platforms, the quality of the project is not Ultimate.
-
-#### Reviews
-
-While automated tests are important to the quality ensured by UQDS, the methodology never loses sight of the human factor. Every branch commit requires code review, and each review must follow very strict rules:
-
- 1. Each commit must be reviewed by a different person than the author.
- 2. Start with a comment thanking the contributor for their work.
- 3. Make a note of something that the contributor did especially well (e.g., "that's the perfect name for that variable!").
- 4. Make a note of something that could be done better (e.g., "this line could use a comment explaining the choices.").
- 5. Finish with directions for an explicit next step, typically either merge as-is, fix and merge, or fix and submit for re-review.
-
-
-
-These rules respect the time and effort of the contributor while also increasing the sharing of knowledge and ideas. The explicit next step allows the contributor to have a clear idea on how to make progress.
-
-#### No exceptions
-
-In any process, it's easy to come up with reasons why you might need to flex the rules just a little bit to let this thing or that thing slide through the system. The most important fundamental building block of UQDS is that there are no exceptions. The entire community works together to make sure that the rules do not flex, not for any reason whatsoever.
-
-Knowing that all code has been approved by a different person than the author, that the code has complete test coverage, that each branch corresponds to a single ticket, and that this ticket is well considered and complete brings a piece of mind that is too valuable to risk losing, even for a single small exception. The goal is quality, and quality does not come from compromise.
-
-### A downside to UQDS
-
-While UQDS has helped Twisted become a highly stable and reliable project, this reliability hasn't come without cost. We quickly found that the review requirements caused a slowdown and backlog of commits to review, leading to slower development. The answer to this wasn't to compromise on quality by getting rid of UQDS; it was to refocus the community priorities such that reviewing commits became one of the most important ways to contribute to the project.
-
-To help with this, the community developed a bot in the [Twisted IRC channel][3] that will reply to the command `review tickets` with a list of tickets that still need review. The [Twisted review queue][4] website returns a prioritized list of tickets for review. Finally, the entire community keeps close tabs on the number of tickets that need review. It's become an important metric the community uses to gauge the health of the project.
-
-### Learn more
-
-The best way to learn about UQDS is to [join the Twisted Community][5] and see it in action. If you'd like more information about the methodology and how it might help your project reach a high level of reliability and stability, have a look at the [UQDS documentation][6] in the Twisted wiki.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/2/uqds
-
-作者:[Moshe Zadka][a]
-译者:[译者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/moshez
-[1]:https://twistedmatrix.com/trac/
-[2]:http://structure.usc.edu/svn/svn.branchmerge.html
-[3]:http://webchat.freenode.net/?channels=%23twisted
-[4]:https://twisted.reviews
-[5]:https://twistedmatrix.com/trac/wiki/TwistedCommunity
-[6]:https://twistedmatrix.com/trac/wiki/UltimateQualityDevelopmentSystem
diff --git a/sources/talk/20180207 Why Mainframes Aren-t Going Away Any Time Soon.md b/sources/talk/20180207 Why Mainframes Aren-t Going Away Any Time Soon.md
deleted file mode 100644
index 7a1a837ff9..0000000000
--- a/sources/talk/20180207 Why Mainframes Aren-t Going Away Any Time Soon.md
+++ /dev/null
@@ -1,73 +0,0 @@
-Why Mainframes Aren't Going Away Any Time Soon
-======
-
-
-
-IBM's last earnings report showed the [first uptick in revenue in more than five years.][1] Some of that growth was from an expected source, cloud revenue, which was up 24 percent year over year and now accounts for 21 percent of Big Blue's take. Another major boost, however, came from a spike in mainframe revenue. Z series mainframe sales were up 70 percent, the company said.
-
-This may sound somewhat akin to a return to vacuum tube technology in a world where transistors are yesterday's news. In actuality, this is only a sign of the changing face of IT.
-
-**Related:** [One Click and Voilà, Your Entire Data Center is Encrypted][2]
-
-Modern mainframes definitely aren't your father's punch card-driven machines that filled entire rooms. These days, they most often run Linux and have found a renewed place in the data center, where they're being called upon to do a lot of heavy lifting. Want to know where the largest instance of Oracle's database runs? It's on a Linux mainframe. How about the largest implementation of SAP on the planet? Again, Linux on a mainframe.
-
-"Before the advent of Linux on the mainframe, the people who bought mainframes primarily were people who already had them," Leonard Santalucia explained to Data Center Knowledge several months back at the All Things Open conference. "They would just wait for the new version to come out and upgrade to it, because it would run cheaper and faster.
-
-**Related:** [IBM Designs a “Performance Beast” for AI][3]
-
-"When Linux came out, it opened up the door to other customers that never would have paid attention to the mainframe. In fact, probably a good three to four hundred new clients that never had mainframes before got them. They don't have any old mainframes hanging around or ones that were upgraded. These are net new mainframes."
-
-Although Santalucia is CTO at Vicom Infinity, primarily an IBM reseller, at the conference he was wearing his hat as chairperson of the Linux Foundation's Open Mainframe Project. He was joined in the conversation by John Mertic, the project's director of program management.
-
-Santalucia knows IBM's mainframes from top to bottom, having spent 27 years at Big Blue, the last eight as CTO for the company's systems and technology group.
-
-"Because of Linux getting started with it back in 1999, it opened up a lot of doors that were closed to the mainframe," he said. "Beforehand it was just z/OS, z/VM, z/VSE, z/TPF, the traditional operating systems. When Linux came along, it got the mainframe into other areas that it never was, or even thought to be in, because of how open it is, and because Linux on the mainframe is no different than Linux on any other platform."
-
-The focus on Linux isn't the only motivator behind the upsurge in mainframe use in data centers. Increasingly, enterprises with heavy IT needs are finding many advantages to incorporating modern mainframes into their plans. For example, mainframes can greatly reduce power, cooling, and floor space costs. In markets like New York City, where real estate is at a premium, electricity rates are high, and electricity use is highly taxed to reduce demand, these are significant advantages.
-
-"There was one customer where we were able to do a consolidation of 25 x86 cores to one core on a mainframe," Santalucia said. "They have several thousand machines that are ten and twenty cores each. So, as far as the eye could see in this data center, [x86 server workloads] could be picked up and moved onto this box that is about the size of a sub-zero refrigerator in your kitchen."
-
-In addition to saving on physical data center resources, this customer by design would likely see better performance.
-
-"When you look at the workload as it's running on an x86 system, the math, the application code, the I/O to manage the disk, and whatever else is attached to that system, is all run through the same chip," he explained. "On a Z, there are multiple chip architectures built into the system. There's one specifically just for the application code. If it senses the application needs an I/O or some mathematics, it sends it off to a separate processor to do math or I/O, all dynamically handled by the underlying firmware. Your Linux environment doesn't have to understand that. When it's running on a mainframe, it knows it's running on a mainframe and it will exploit that architecture."
-
-The operating system knows it's running on a mainframe because when IBM was readying its mainframe for Linux it open sourced something like 75,000 lines of code for Linux distributions to use to make sure their OS's were ready for IBM Z.
-
-"A lot of times people will hear there's 170 processors on the Z14," Santalucia said. "Well, there's actually another 400 other processors that nobody counts in that count of application chips, because it is taken for granted."
-
-Mainframes are also resilient when it comes to disaster recovery. Santalucia told the story of an insurance company located in lower Manhattan, within sight of the East River. The company operated a large data center in a basement that among other things housed a mainframe backed up to another mainframe located in Upstate New York. When Hurricane Sandy hit in 2012, the data center flooded, electrocuting two employees and destroying all of the servers, including the mainframe. But the mainframe's workload was restored within 24 hours from the remote backup.
-
-The x86 machines were all destroyed, and the data was never recovered. But why weren't they also backed up?
-
-"The reason they didn't do this disaster recovery the same way they did with the mainframe was because it was too expensive to have a mirror of all those distributed servers someplace else," he explained. "With the mainframe, you can have another mainframe as an insurance policy that's lower in price, called Capacity BackUp, and it just sits there idling until something like this happens."
-
-Mainframes are also evidently tough as nails. Santalucia told another story in which a data center in Japan was struck by an earthquake strong enough to destroy all of its x86 machines. The center's one mainframe fell on its side but continued to work.
-
-The mainframe also comes with built-in redundancy to guard against situations that would be disastrous with x86 machines.
-
-"What if a hard disk fails on a node in x86?" the Open Mainframe Project's Mertic asked. "You're taking down a chunk of that cluster potentially. With a mainframe you're not. A mainframe just keeps on kicking like nothing's ever happened."
-
-Mertic added that a motherboard can be pulled from a running mainframe, and again, "the thing keeps on running like nothing's ever happened."
-
-So how do you figure out if a mainframe is right for your organization? Simple, says Santalucia. Do the math.
-
-"The approach should be to look at it from a business, technical, and financial perspective -- not just a financial, total-cost-of-acquisition perspective," he said, pointing out that often, costs associated with software, migration, networking, and people are not considered. The break-even point, he said, comes when at least 20 to 30 servers are being migrated to a mainframe. After that point the mainframe has a financial advantage.
-
-"You can get a few people running the mainframe and managing hundreds or thousands of virtual servers," he added. "If you tried to do the same thing on other platforms, you'd find that you need significantly more resources to maintain an environment like that. Seven people at ADP handle the 8,000 virtual servers they have, and they need seven only in case somebody gets sick.
-
-"If you had eight thousand servers on x86, even if they're virtualized, do you think you could get away with seven?"
-
---------------------------------------------------------------------------------
-
-via: http://www.datacenterknowledge.com/hardware/why-mainframes-arent-going-away-any-time-soon
-
-作者:[Christine Hall][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:http://www.datacenterknowledge.com/archives/author/christine-hall
-[1]:http://www.datacenterknowledge.com/ibm/mainframe-sales-fuel-growth-ibm
-[2]:http://www.datacenterknowledge.com/design/one-click-and-voil-your-entire-data-center-encrypted
-[3]:http://www.datacenterknowledge.com/design/ibm-designs-performance-beast-ai
diff --git a/sources/talk/20180209 Arch Anywhere Is Dead, Long Live Anarchy Linux.md b/sources/talk/20180209 Arch Anywhere Is Dead, Long Live Anarchy Linux.md
deleted file mode 100644
index c3c78e84ad..0000000000
--- a/sources/talk/20180209 Arch Anywhere Is Dead, Long Live Anarchy Linux.md
+++ /dev/null
@@ -1,127 +0,0 @@
-Arch Anywhere Is Dead, Long Live Anarchy Linux
-======
-
-
-
-Arch Anywhere was a distribution aimed at bringing Arch Linux to the masses. Due to a trademark infringement, Arch Anywhere has been completely rebranded to [Anarchy Linux][1]. And I’m here to say, if you’re looking for a distribution that will enable you to enjoy Arch Linux, a little Anarchy will go a very long way. This distribution is seriously impressive in what it sets out to do and what it achieves. In fact, anyone who previously feared Arch Linux can set those fears aside… because Anarchy Linux makes Arch Linux easy.
-
-Let’s face it; Arch Linux isn’t for the faint of heart. The installation alone will turn off many a new user (and even some seasoned users). That’s where distributions like Anarchy make for an easy bridge to Arch. With a live ISO that can be tested and then installed, Arch becomes as user-friendly as any other distribution.
-
-Anarchy Linux goes a little bit further than that, however. Let’s fire it up and see what it does.
-
-### The installation
-
-The installation of Anarchy Linux isn’t terribly challenging, but it’s also not quite as simple as for, say, [Ubuntu][2], [Linux Mint][3], or [Elementary OS][4]. Although you can run the installer from within the default graphical desktop environment (Xfce4), it’s still much in the same vein as Arch Linux. In other words, you’re going to have to do a bit of work—all within a text-based installer.
-
-To start, the very first step of the installer (Figure 1) requires you to update the mirror list, which will likely trip up new users.
-
-![Updating the mirror][6]
-
-Figure 1: Updating the mirror list is a necessity for the Anarchy Linux installation.
-
-[Used with permission][7]
-
-From the options, select Download & Rank New Mirrors. Tab down to OK and hit Enter on your keyboard. You can then select the nearest mirror (to your location) and be done with it. The next few installation screens are simple (keyboard layout, language, timezone, etc.). The next screen should surprise many an Arch fan. Anarchy Linux includes an auto partition tool. Select Auto Partition Drive (Figure 2), tab down to Ok, and hit Enter on your keyboard.
-
-![partitioning][9]
-
-Figure 2: Anarchy makes partitioning easy.
-
-[Used with permission][7]
-
-You will then have to select the drive to be used (if you only have one drive this is only a matter of hitting Enter). Once you’ve selected the drive, choose the filesystem type to be used (ext2/3/4, btrfs, jfs, reiserfs, xfs), tab down to OK, and hit Enter. Next you must choose whether you want to create SWAP space. If you select Yes, you’ll then have to define how much SWAP to use. The next window will stop many new users in their tracks. It asks if you want to use GPT (GUID Partition Table). This is different than the traditional MBR (Master Boot Record) partitioning. GPT is a newer standard and works better with UEFI. If you’ll be working with UEFI, go with GPT, otherwise, stick with the old standby, MBR. Finally select to write the changes to the disk, and your installation can continue.
-
-The next screen that could give new users pause, requires the selection of the desired installation. There are five options:
-
- * Anarchy-Desktop
-
- * Anarchy-Desktop-LTS
-
- * Anarchy-Server
-
- * Anarchy-Server-LTS
-
- * Anarchy-Advanced
-
-
-
-
-If you want long term support, select Anarchy-Desktop-LTS, otherwise click Anarchy-Desktop (the default), and tab down to Ok. Click Enter on your keyboard. After you select the type of installation, you will get to select your desktop. You can select from five options: Budgie, Cinnamon, GNOME, Openbox, and Xfce4.
-Once you’ve selected your desktop, give the machine a hostname, set the root password, create a user, and enable sudo for the new user (if applicable). The next section that will raise the eyebrows of new users is the software selection window (Figure 3). You must go through the various sections and select which software packages to install. Don’t worry, if you miss something, you can always installed it later.
-
-
-![software][11]
-
-Figure 3: Selecting the software you want on your system.
-
-[Used with permission][7]
-
-Once you’ve made your software selections, tab to Install (Figure 4), and hit Enter on your keyboard.
-
-![ready to install][13]
-
-Figure 4: Everything is ready to install.
-
-[Used with permission][7]
-
-Once the installation completes, reboot and enjoy Anarchy.
-
-### Post install
-
-I installed two versions of Anarchy—one with Budgie and one with GNOME. Both performed quite well, however you might be surprised to see that the version of GNOME installed is decked out with a dock. In fact, comparing the desktops side-by-side and they do a good job of resembling one another (Figure 5).
-
-![GNOME and Budgie][15]
-
-Figure 5: GNOME is on the right, Budgie is on the left.
-
-[Used with permission][7]
-
-My guess is that you’ll find all desktop options for Anarchy configured in such a way to offer a similar look and feel. Of course, the second you click on the bottom left “buttons”, you’ll see those similarities immediately disappear (Figure 6).
-
-![GNOME and Budgie][17]
-
-Figure 6: The GNOME Dash and the Budgie menu are nothing alike.
-
-[Used with permission][7]
-
-Regardless of which desktop you select, you’ll find everything you need to install new applications. Open up your desktop menu of choice and select Packages to search for and install whatever is necessary for you to get your work done.
-
-### Why use Arch Linux without the “Arch”?
-
-This is a valid question. The answer is simple, but revealing. Some users may opt for a distribution like [Arch Linux][18] because they want the feeling of “elitism” that comes with using, say, [Gentoo][19], without having to go through that much hassle. With regards to complexity, Arch rests below Gentoo, which means it’s accessible to more users. However, along with that complexity in the platform, comes a certain level of dependability that may not be found in others. So if you’re looking for a Linux distribution with high stability, that’s not quite as challenging as Gentoo or Arch to install, Anarchy might be exactly what you want. In the end, you’ll wind up with an outstanding desktop platform that’s easy to work with (and maintain), based on a very highly regarded distribution of Linux.
-
-That’s why you might opt for Arch Linux without the Arch.
-
-Anarchy Linux is one of the finest “user-friendly” takes on Arch Linux I’ve ever had the privilege of using. Without a doubt, if you’re looking for a friendlier version of a rather challenging desktop operating system, you cannot go wrong with Anarchy.
-
-Learn more about Linux through the free ["Introduction to Linux" ][20]course from The Linux Foundation and edX.
-
---------------------------------------------------------------------------------
-
-via: https://www.linux.com/learn/intro-to-linux/2018/2/arch-anywhere-dead-long-live-anarchy-linux
-
-作者:[Jack Wallen][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.linux.com/users/jlwallen
-[1]:https://anarchy-linux.org/
-[2]:https://www.ubuntu.com/
-[3]:https://linuxmint.com/
-[4]:https://elementary.io/
-[6]:https://www.linux.com/sites/lcom/files/styles/rendered_file/public/anarchy_install_1.jpg?itok=WgHRqFTf (Updating the mirror)
-[7]:https://www.linux.com/licenses/category/used-permission
-[9]:https://www.linux.com/sites/lcom/files/styles/rendered_file/public/anarchy_install_2.jpg?itok=D7HkR97t (partitioning)
-[10]:/files/images/anarchyinstall3jpg
-[11]:https://www.linux.com/sites/lcom/files/styles/rendered_file/public/anarchy_install_3.jpg?itok=5-9E2u0S (software)
-[12]:/files/images/anarchyinstall4jpg
-[13]:https://www.linux.com/sites/lcom/files/styles/rendered_file/public/anarchy_install_4.jpg?itok=fuSZqtZS (ready to install)
-[14]:/files/images/anarchyinstall5jpg
-[15]:https://www.linux.com/sites/lcom/files/styles/rendered_file/public/anarchy_install_5.jpg?itok=4y9kiC8I (GNOME and Budgie)
-[16]:/files/images/anarchyinstall6jpg
-[17]:https://www.linux.com/sites/lcom/files/styles/rendered_file/public/anarchy_install_6.jpg?itok=fJ7Lmdci (GNOME and Budgie)
-[18]:https://www.archlinux.org/
-[19]:https://www.gentoo.org/
-[20]:https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
diff --git a/sources/talk/20180209 How writing can change your career for the better, even if you don-t identify as a writer.md b/sources/talk/20180209 How writing can change your career for the better, even if you don-t identify as a writer.md
deleted file mode 100644
index 55618326c6..0000000000
--- a/sources/talk/20180209 How writing can change your career for the better, even if you don-t identify as a writer.md
+++ /dev/null
@@ -1,149 +0,0 @@
-How writing can change your career for the better, even if you don't identify as a writer
-======
-Have you read Marie Kondo's book [The Life-Changing Magic of Tidying Up][1]? Or did you, like me, buy it and read a little bit and then add it to the pile of clutter next to your bed?
-
-Early in the book, Kondo talks about keeping possessions that "spark joy." In this article, I'll examine ways writing about what we and other people are doing in the open source world can "spark joy," or at least how writing can improve your career in unexpected ways.
-
-Because I'm a community manager and editor on Opensource.com, you might be thinking, "She just wants us to [write for Opensource.com][2]." And that is true. But everything I will tell you about why you should write is true, even if you never send a story in to Opensource.com. Writing can change your career for the better, even if you don't identify as a writer. Let me explain.
-
-### How I started writing
-
-Early in the first decade of my career, I transitioned from a customer service-related role at a tech publishing company into an editing role on Sys Admin Magazine. I was plugging along, happily laying low in my career, and then that all changed when I started writing about open source technologies and communities, and the people in them. But I did _not_ start writing voluntarily. The tl;dr: of it is that my colleagues at Linux New Media eventually talked me into launching our first blog on the [Linux Pro Magazine][3] site. And as it turns out, it was one of the best career decisions I've ever made. I would not be working on Opensource.com today had I not started writing about what other people in open source were doing all those years ago.
-
-When I first started writing, my goal was to raise awareness of the company I worked for and our publications, while also helping raise the visibility of women in tech. But soon after I started writing, I began seeing unexpected results.
-
-#### My network started growing
-
-When I wrote about a person, an organization, or a project, I got their attention. Suddenly the people I wrote about knew who I was. And because I was sharing knowledge—that is to say, I wasn't being a critic—I'd generally become an ally, and in many cases, a friend. I had a platform and an audience, and I was sharing them with other people in open source.
-
-#### I was learning
-
-In addition to promoting our website and magazine and growing my network, the research and fact-checking I did when writing articles helped me become more knowledgeable in my field and improve my tech chops.
-
-#### I started meeting more people IRL
-
-When I went to conferences, I found that my blog posts helped me meet people. I introduced myself to people I'd written about or learned about during my research, and I met new people to interview. People started knowing who I was because they'd read my articles. Sometimes people were even excited to meet me because I'd highlighted them, their projects, or someone or something they were interested in. I had no idea writing could be so exciting and interesting away from the keyboard.
-
-#### My conference talks improved
-
-I started speaking at events about a year after launching my blog. A few years later, I started writing articles based on my talks prior to speaking at events. The process of writing the articles helps me organize my talks and slides, and it was a great way to provide "notes" for conference attendees, while sharing the topic with a larger international audience that wasn't at the event in person.
-
-### What should you write about?
-
-Maybe you're interested in writing, but you struggle with what to write about. You should write about two things: what you know, and what you don't know.
-
-#### Write about what you know
-
-Writing about what you know can be relatively easy. For example, a script you wrote to help automate part of your daily tasks might be something you don't give any thought to, but it could make for a really exciting article for someone who hates doing that same task every day. That could be a relatively quick, short, and easy article for you to write, and you might not even think about writing it. But it could be a great contribution to the open source community.
-
-#### Write about what you don't know
-
-Writing about what you don't know can be much harder and more time consuming, but also much more fulfilling and help your career. I've found that writing about what I don't know helps me learn, because I have to research it and understand it well enough to explain it.
-
-> "When I write about a technical topic, I usually learn a lot more about it. I want to make sure my article is as good as it can be. So even if I'm writing about something I know well, I'll research the topic a bit more so I can make sure to get everything right." ~Jim Hall, FreeDOS project leader
-
-For example, I wanted to learn about machine learning, and I thought narrowing down the topic would help me get started. My team mate Jason Baker suggested that I write an article on the [Top 3 machine learning libraries for Python][4], which gave me a focus for research.
-
-The process of researching that article inspired another article, [3 cool machine learning projects using TensorFlow and the Raspberry Pi][5]. That article was also one of our most popular last year. I'm not an _expert_ on machine learning now, but researching the topic with writing an article in mind allowed me to give myself a crash course in the topic.
-
-### Why people in tech write
-
-Now let's look at a few benefits of writing that other people in tech have found. I emailed the Opensource.com writers' list and asked, and here's what writers told me.
-
-#### Grow your network or your project community
-
-Xavier Ho wrote for us for the first time last year ("[A programmer's cleaning guide for messy sensor data][6]"). He says: "I've been getting Twitter mentions from all over the world, including Spain, US, Australia, Indonesia, the UK, and other European countries. It shows the article is making some impact... This is the kind of reach I normally don't have. Hope it's really helping someone doing similar work!"
-
-#### Help people
-
-Writing about what other people are working on is a great way to help your fellow community members. Antoine Thomas, who wrote "[Linux helped me grow as a musician][7]", says, "I began to use open source years ago, by reading tutorials and documentation. That's why now I share my tips and tricks, experience or knowledge. It helped me to get started, so I feel that it's my turn to help others to get started too."
-
-#### Give back to the community
-
-[Jim Hall][8], who started the [FreeDOS project][9], says, "I like to write ... because I like to support the open source community by sharing something neat. I don't have time to be a program maintainer anymore, but I still like to do interesting stuff. So when something cool comes along, I like to write about it and share it."
-
-#### Highlight your community
-
-Emilio Velis wrote an article, "[Open hardware groups spread across the globe][10]", about projects in Central and South America. He explains, "I like writing about specific aspects of the open culture that are usually enclosed in my region (Latin America). I feel as if smaller communities and their ideas are hidden from the mainstream, so I think that creating this sense of broadness in participation is what makes some other cultures as valuable."
-
-#### Gain confidence
-
-[Don Watkins][11] is one of our regular writers and a [community moderator][12]. He says, "When I first started writing I thought I was an impostor, later I realized that many people feel that way. Writing and contributing to Opensource.com has been therapeutic, too, as it contributed to my self esteem and helped me to overcome feelings of inadequacy. … Writing has given me a renewed sense of purpose and empowered me to help others to write and/or see the valuable contributions that they too can make if they're willing to look at themselves in a different light. Writing has kept me younger and more open to new ideas."
-
-#### Get feedback
-
-One of our writers described writing as a feedback loop. He said that he started writing as a way to give back to the community, but what he found was that community responses give back to him.
-
-Another writer, [Stuart Keroff][13] says, "Writing for Opensource.com about the program I run at school gave me valuable feedback, encouragement, and support that I would not have had otherwise. Thousands upon thousands of people heard about the Asian Penguins because of the articles I wrote for the website."
-
-#### Exhibit expertise
-
-Writing can help you show that you've got expertise in a subject, and having writing samples on well-known websites can help you move toward better pay at your current job, get a new role at a different organization, or start bringing in writing income.
-
-[Jeff Macharyas][14] explains, "There are several ways I've benefitted from writing for Opensource.com. One, is the credibility I can add to my social media sites, resumes, bios, etc., just by saying 'I am a contributing writer to Opensource.com.' … I am hoping that I will be able to line up some freelance writing assignments, using my Opensource.com articles as examples, in the future."
-
-### Where should you publish your articles?
-
-That depends. Why are you writing?
-
-You can always post on your personal blog, but if you don't already have a lot of readers, your article might get lost in the noise online.
-
-Your project or company blog is a good option—again, you'll have to think about who will find it. How big is your company's reach? Or will you only get the attention of people who already give you their attention?
-
-Are you trying to reach a new audience? A bigger audience? That's where sites like Opensource.com can help. We attract more than a million page views a month, and more than 700,000 unique visitors. Plus you'll work with editors who will polish and help promote your article.
-
-We aren't the only site interested in your story. What are your favorite sites to read? They might want to help you share your story, and it's ok to pitch to multiple publications. Just be transparent about whether your article has been shared on other sites when working with editors. Occasionally, editors can even help you modify articles so that you can publish variations on multiple sites.
-
-#### Do you want to get rich by writing? (Don't count on it.)
-
-If your goal is to make money by writing, pitch your article to publications that have author budgets. There aren't many of them, the budgets don't tend to be huge, and you will be competing with experienced professional tech journalists who write seven days a week, 365 days a year, with large social media followings and networks. I'm not saying it can't be done—I've done it—but I am saying don't expect it to be easy or lucrative. It's not. (And frankly, I've found that nothing kills my desire to write much like having to write if I want to eat...)
-
-A couple of people have asked me whether Opensource.com pays for content, or whether I'm asking someone to write "for exposure." Opensource.com does not have an author budget, but I won't tell you to write "for exposure," either. You should write because it meets a need.
-
-If you already have a platform that meets your needs, and you don't need editing or social media and syndication help: Congratulations! You are privileged.
-
-### Spark joy!
-
-Most people don't know they have a story to tell, so I'm here to tell you that you probably do, and my team can help, if you just submit a proposal.
-
-Most people—myself included—could use help from other people. Sites like Opensource.com offer one way to get editing and social media services at no cost to the writer, which can be hugely valuable to someone starting out in their career, someone who isn't a native English speaker, someone who wants help with their project or organization, and so on.
-
-If you don't already write, I hope this article helps encourage you to get started. Or, maybe you already write. In that case, I hope this article makes you think about friends, colleagues, or people in your network who have great stories and experiences to share. I'd love to help you help them get started.
-
-I'll conclude with feedback I got from a recent writer, [Mario Corchero][15], a Senior Software Developer at Bloomberg. He says, "I wrote for Opensource because you told me to :)" (For the record, I "invited" him to write for our [PyCon speaker series][16] last year.) He added, "And I am extremely happy about it—not only did it help me at my workplace by gaining visibility, but I absolutely loved it! The article appeared in multiple email chains about Python and was really well received, so I am now looking to publish the second :)" Then he [wrote for us][17] again.
-
-I hope you find writing to be as fulfilling as we do.
-
-You can connect with Opensource.com editors, community moderators, and writers in our Freenode [IRC][18] channel #opensource.com, and you can reach me and the Opensource.com team by email at [open@opensource.com][19].
-
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/2/career-changing-magic-writing
-
-作者:[Rikki Endsley][a]
-译者:[译者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/rikki-endsley
-[1]:http://tidyingup.com/books/the-life-changing-magic-of-tidying-up-hc
-[2]:https://opensource.com/how-submit-article
-[3]:http://linuxpromagazine.com/
-[4]:https://opensource.com/article/17/2/3-top-machine-learning-libraries-python
-[5]:https://opensource.com/article/17/2/machine-learning-projects-tensorflow-raspberry-pi
-[6]:https://opensource.com/article/17/9/messy-sensor-data
-[7]:https://opensource.com/life/16/9/my-linux-story-musician
-[8]:https://opensource.com/users/jim-hall
-[9]:http://www.freedos.org/
-[10]:https://opensource.com/article/17/6/open-hardware-latin-america
-[11]:https://opensource.com/users/don-watkins
-[12]:https://opensource.com/community-moderator-program
-[13]:https://opensource.com/education/15/3/asian-penguins-Linux-middle-school-club
-[14]:https://opensource.com/users/jeffmacharyas
-[15]:https://opensource.com/article/17/5/understanding-datetime-python-primer
-[16]:https://opensource.com/tags/pycon
-[17]:https://opensource.com/article/17/9/python-logging
-[18]:https://opensource.com/article/16/6/getting-started-irc
-[19]:mailto:open@opensource.com
diff --git a/sources/talk/20180209 Why an involved user community makes for better software.md b/sources/talk/20180209 Why an involved user community makes for better software.md
deleted file mode 100644
index 2b51023e44..0000000000
--- a/sources/talk/20180209 Why an involved user community makes for better software.md
+++ /dev/null
@@ -1,47 +0,0 @@
-Why an involved user community makes for better software
-======
-
-
-Imagine releasing a major new infrastructure service based on open source software only to discover that the product you deployed had evolved so quickly that the documentation for the version you released is no longer available. At Bloomberg, we experienced this problem firsthand in our deployment of OpenStack. In late 2016, we spent six months testing and rolling out [Liberty][1] on our OpenStack environment. By that time, Liberty was about a year old, or two versions behind the latest build.
-
-As our users started taking advantage of its new functionality, we found ourselves unable to solve a few tricky problems and to answer some detailed questions about its API. When we went looking for Liberty's documentation, it was nowhere to be found on the OpenStack website. Liberty, it turned out, had been labeled "end of life" and was no longer supported by the OpenStack developer community.
-
-The disappearance wasn't intentional, rather the result of a development community that had not anticipated the real-world needs of users. The documentation was stored in the source branch along with the source code, and, as Liberty was superseded by newer versions, it had been deleted. Worse, in the intervening months, the documentation for the newer versions had been completely restructured, and there was no way to easily rebuild it in a useful form. And believe me, we tried.
-
-The disappearance wasn't intentional, rather the result of a development community that had not anticipated the real-world needs of users. ]After consulting other users and our vendor, we found that OpenStack's development cadence of two releases per year had created some unintended, yet deeply frustrating, consequences. Older releases that were typically still widely in use were being superseded and effectively killed for the purposes of support.
-
-Eventually, conversations took place between OpenStack users and developers that resulted in changes. Documentation was moved out of the source branch, and users can now build documentation for whatever version they're using—more or less indefinitely. The problem was solved. (I'm especially indebted to my colleague [Chris Morgan][2], who was knee-deep in this effort and first wrote about it in detail for the [OpenStack Superuser blog][3].)
-
-Many other enterprise users were in the same boat as Bloomberg—running older versions of OpenStack that are three or four versions behind the latest build. There's a good reason for that: On average it takes a reasonably large enterprise about six months to qualify, test, and deploy a new version of OpenStack. And, from my experience, this is generally true of most open source infrastructure projects.
-
-For most of the past decade, companies like Bloomberg that adopted open source software relied on distribution vendors to incorporate, test, verify, and support much of it. These vendors provide long-term support (LTS) releases, which enable enterprise users to plan for upgrades on a two- or three-year cycle, knowing they'll still have support for a year or two, even if their deployment schedule slips a bit (as they often do). In the past few years, though, infrastructure software has advanced so rapidly that even the distribution vendors struggle to keep up. And customers of those vendors are yet another step removed, so many are choosing to deploy this type of software without vendor support.
-
-Losing vendor support also usually means there are no LTS releases; OpenStack, Kubernetes, and Prometheus, and many more, do not yet provide LTS releases of their own. As a result, I'd argue that healthy interaction between the development and user community should be high on the list of considerations for adoption of any open source infrastructure. Do the developers building the software pay attention to the needs—and frustrations—of the people who deploy it and make it useful for their enterprise?
-
-There is a solid model for how this should happen. We recently joined the [Cloud Native Computing Foundation][4], part of The Linux Foundation. It has a formal [end-user community][5], whose members include organizations just like us: enterprises that are trying to make open source software useful to their internal customers. Corporate members also get a chance to have their voices heard as they vote to select a representative to serve on the CNCF [Technical Oversight Committee][6]. Similarly, in the OpenStack community, Bloomberg is involved in the semi-annual Operators Meetups, where companies who deploy and support OpenStack for their own users get together to discuss their challenges and provide guidance to the OpenStack developer community.
-
-The past few years have been great for open source infrastructure. If you're working for a large enterprise, the opportunity to deploy open source projects like the ones mentioned above has made your company more productive and more agile.
-
-As large companies like ours begin to consume more open source software to meet their infrastructure needs, they're going to be looking at a long list of considerations before deciding what to use: license compatibility, out-of-pocket costs, and the health of the development community are just a few examples. As a result of our experiences, we'll add the presence of a vibrant and engaged end-user community to the list.
-
-Increased reliance on open source infrastructure projects has also highlighted a key problem: People in the development community have little experience deploying the software they work on into production environments or supporting the people who use it to get things done on a daily basis. The fast pace of updates to these projects has created some unexpected problems for the people who deploy and use them. There are numerous examples I can cite where open source projects are updated so frequently that new versions will, usually unintentionally, break backwards compatibility.
-
-As open source increasingly becomes foundational to the operation of so many enterprises, this cannot be allowed to happen, and members of the user community should assert themselves accordingly and press for the creation of formal representation. In the end, the software can only be better.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/2/important-conversation
-
-作者:[Kevin P.Fleming][a]
-译者:[译者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/kpfleming
-[1]:https://releases.openstack.org/liberty/
-[2]:https://www.linkedin.com/in/mihalis68/
-[3]:http://superuser.openstack.org/articles/openstack-at-bloomberg/
-[4]:https://www.cncf.io/
-[5]:https://www.cncf.io/people/end-user-community/
-[6]:https://www.cncf.io/people/technical-oversight-committee/
diff --git a/sources/talk/20180214 Can anonymity and accountability coexist.md b/sources/talk/20180214 Can anonymity and accountability coexist.md
deleted file mode 100644
index 8b15ed169c..0000000000
--- a/sources/talk/20180214 Can anonymity and accountability coexist.md
+++ /dev/null
@@ -1,79 +0,0 @@
-Can anonymity and accountability coexist?
-=========================================
-
-Anonymity might be a boon to more open, meritocratic organizational cultures. But does it conflict with another important value: accountability?
-
-
-
-Image by :opensource.com
-
-### Get the newsletter
-
-Join the 85,000 open source advocates who receive our giveaway alerts and article roundups.
-
-Whistleblowing protections, crowdsourcing, anonymous voting processes, and even Glassdoor reviews—anonymous speech may take many forms in organizations.
-
-As well-established and valued as these anonymous feedback mechanisms may be, anonymous speech becomes a paradoxical idea when one considers how to construct a more open organization. While an inability to discern speaker identity seems non-transparent, an opportunity for anonymity may actually help achieve a _more inclusive and meritocratic_ environment.
-
-More about open organizations
-
-* [Download free Open Org books](https://opensource.com/open-organization/resources/book-series?src=too_resource_menu1a)
-* [What is an Open Organization?](https://opensource.com/open-organization/resources/open-org-definition?src=too_resource_menu2a)
-* [How open is your organization?](https://opensource.com/open-organization/resources/open-org-maturity-model?src=too_resource_menu3a)
-* [What is an Open Decision?](https://opensource.com/open-organization/resources/open-decision-framework?src=too_resource_menu4a)
-* [The Open Org two years later](https://www.redhat.com/en/about/blog/open-organization-two-years-later-and-going-strong?src=too_resource_menu4b&intcmp=70160000000h1s6AAA)
-
-But before allowing outlets for anonymous speech to propagate, however, leaders of an organization should carefully reflect on whether an organization's "closed" practices make anonymity the unavoidable alternative to free, non-anonymous expression. Though some assurance of anonymity is necessary in a few sensitive and exceptional scenarios, dependence on anonymous feedback channels within an organization may stunt the normalization of a culture that encourages diversity and community.
-
-### The benefits of anonymity
-
-In the case of [_Talley v. California (1960)_](https://supreme.justia.com/cases/federal/us/362/60/case.html), the Supreme Court voided a city ordinance prohibiting the anonymous distribution of handbills, asserting that "there can be no doubt that such an identification requirement would tend to restrict freedom to distribute information and thereby freedom of expression." Our judicial system has legitimized the notion that the protection of anonymity facilitates the expression of otherwise unspoken ideas. A quick scroll through any [subreddit](https://www.reddit.com/reddits/) exemplifies what the Court has codified: anonymity can foster [risk-taking creativity](https://www.reddit.com/r/sixwordstories/) and the [inclusion and support of marginalized voices](https://www.reddit.com/r/MyLittleSupportGroup/). Anonymity empowers individuals by granting them the safety to speak without [detriment to their reputations or, more importantly, their physical selves.](https://www.psychologytoday.com/blog/the-compassion-chronicles/201711/why-dont-victims-sexual-harassment-come-forward-sooner)
-
-For example, an anonymous suggestion program to garner ideas from members or employees in an organization may strengthen inclusivity and enhance the diversity of suggestions the organization receives. It would also make for a more meritocratic decision-making process, as anonymity would ensure that the quality of the articulated idea, rather than the rank and reputation of the articulator, is what's under evaluation. Allowing members to anonymously vote for anonymously-submitted ideas would help curb the influence of office politics in decisions affecting the organization's growth.
-
-### The harmful consequences of anonymity
-
-Yet anonymity and the open value of _accountability_ may come into conflict with one another. For instance, when establishing anonymous programs to drive greater diversity and more meritocratic evaluation of ideas, organizations may need to sacrifice the ability to hold speakers accountable for the opinions they express.
-
-Reliance on anonymous speech for serious organizational decision-making may also contribute to complacency in an organizational culture that falls short of openness. Outlets for anonymous speech may be as similar to open as crowdsourcing is—or rather, is not. [Like efforts to crowdsource creative ideas](https://opensource.com/business/10/4/why-open-source-way-trumps-crowdsourcing-way), anonymous suggestion programs may create an organizational environment in which diverse perspectives are only valued when an organization's leaders find it convenient to take advantage of members' ideas.
-
-Anonymity and the open value of accountability may come into conflict with one another.
-
-A similar concern holds for anonymous whistle-blowing or concern submission. Though anonymity is important for sexual harassment and assault reporting, regularly redirecting member concerns and frustrations to a "complaints box" makes it more difficult for members to hold their organization's leaders accountable for acting on concerns. It may also hinder intra-organizational support networks and advocacy groups from forming around shared concerns, as members would have difficulty identifying others with similar experiences. For example, many working mothers might anonymously submit requests for a lactation room in their workplace, then falsely attribute a lack of action from leaders to a lack of similar concerns from others.
-
-### An anonymity checklist
-
-Organizations in which anonymous speech is the primary mode of communication, like subreddits, have generated innovative works and thought-provoking discourse. These anonymous networks call attention to the potential for anonymity to help organizations pursue open values of diversity and meritocracy. Organizations in which anonymous speech is _not_ the main form of communication should acknowledge the strengths of anonymous speech, but carefully consider whether anonymity is the wisest means to the goal of sustainable openness.
-
-Leaders may find reflecting on the following questions useful prior to establishing outlets for anonymous feedback within their organizations:
-
-1\. _Availability of additional communication mechanisms_: Rather than investing time and resources into establishing a new, anonymous channel for communication, can the culture or structure of existing avenues of communication be reconfigured to achieve the same goal? This question echoes the open source affinity toward realigning, rather than reinventing, the wheel.
-
-2\. _Failure of other communication avenues:_ How and why is the organization ill-equipped to handle the sensitive issue/situation at hand through conventional (i.e. non-anonymous) means of communication?
-
-Careful deliberation on these questions may help prevent outlets for anonymous speech from leading to a dangerous sense of complacency.
-
-3\. _Consequences of anonymity:_ If implemented, could the anonymous mechanism stifle the normalization of face-to-face discourse about issues important to the organization's growth? If so, how can leaders ensure that members consider the anonymous communication channel a "last resort," without undermining the legitimacy of the anonymous system?
-
-4\. _Designing the anonymous communication channel:_ How can accountability be promoted in anonymous communication without the ability to determine the identity of speakers?
-
-5\. _Long-term considerations_: Is the anonymous feedback mechanism sustainable, or a temporary solution to a larger organizational issue? If the latter, is [launching a campaign](https://opensource.com/open-organization/16/6/8-steps-more-open-communications) to address overarching problems with the organization's communication culture feasible?
-
-These five points build off of one another to help leaders recognize the tradeoffs involved in legitimizing anonymity within their organization. Careful deliberation on these questions may help prevent outlets for anonymous speech from leading to a dangerous sense of complacency with a non-inclusive organizational structure.
-
-About the author
-----------------
-
-[](https://opensource.com/users/susiechoi)
-
-Susie Choi - Susie is an undergraduate student studying computer science at Duke University. She is interested in the implications of technological innovation and open source principles for issues relating to education and socioeconomic inequality.
-
-[More about me](https://opensource.com/users/susiechoi)
-
-* * *
-
-via: [https://opensource.com/open-organization/18/1/balancing-accountability-and-anonymity](https://opensource.com/open-organization/18/1/balancing-accountability-and-anonymity)
-
-作者: [Susie Choi](https://opensource.com/users/susiechoi) 选题者: [@lujun9972](https://github.com/lujun9972) 译者: [译者ID](https://github.com/译者ID) 校对: [校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
\ No newline at end of file
diff --git a/sources/talk/20180216 Q4OS Makes Linux Easy for Everyone.md b/sources/talk/20180216 Q4OS Makes Linux Easy for Everyone.md
deleted file mode 100644
index a868ed28d5..0000000000
--- a/sources/talk/20180216 Q4OS Makes Linux Easy for Everyone.md
+++ /dev/null
@@ -1,140 +0,0 @@
-Q4OS Makes Linux Easy for Everyone
-======
-
-
-
-Modern Linux distributions tend to target a variety of users. Some claim to offer a flavor of the open source platform that anyone can use. And, I’ve seen some such claims succeed with aplomb, while others fall flat. [Q4OS][1] is one of those odd distributions that doesn’t bother to make such a claim but pulls off the feat anyway.
-
-So, who is the primary market for Q4OS? According to its website, the distribution 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.”
-
-What’s very interesting here is that the Q4OS developers offer commercial support for the desktop. Said support can cover the likes of system customization (including core level API programming) as well as user interface modifications.
-
-Once you understand this (and have installed Q4OS), the target audience becomes quite obvious: Business users looking for a Windows XP/7 replacement. But that should not prevent home users from giving Q4OS at try. It’s a Linux distribution that has a few unique tools that come together to make a solid desktop distribution.
-
-Let’s take a look at Q4OS and see if it’s a version of Linux that might work for you.
-
-### What Q4OS all about
-
-Q4OS that does an admirable job of being the open source equivalent of Windows XP/7. Out of the box, it pulls this off with the help of the [Trinity Desktop][2] (a fork of KDE). With a few tricks up its sleeve, Q4OS turns the Trinity Desktop into a remarkably similar desktop (Figure 1).
-
-![default desktop][4]
-
-Figure 1: The Q4OS default desktop.
-
-[Used with permission][5]
-
-When you fire up the desktop, you will be greeted by a Welcome screen that makes it very easy for new users to start setting up their desktop with just a few clicks. From this window, you can:
-
- * Run the Desktop Profiler (which allows you to select which desktop environment to use as well as between a full-featured desktop, a basic desktop, or a minimal desktop—Figure 2).
-
- * Install applications (which opens the Synaptic Package Manager).
-
- * Install proprietary codecs (which installs all the necessary media codecs for playing audio and video).
-
- * Turn on Desktop effects (if you want more eye candy, turn this on).
-
- * Switch to Kickoff start menu (switches from the default start menu to the newer kickoff menu).
-
- * Set Autologin (allows you to set login such that it won’t require your password upon boot).
-
-
-
-
-![Desktop Profiler][7]
-
-Figure 2: The Desktop Profiler allows you to further customize your desktop experience.
-
-[Used with permission][5]
-
-If you want to install a different desktop environment, open up the Desktop Profiler and then click the Desktop environments drop-down, in the upper left corner of the window. A new window will appear, where you can select your desktop of choice from the drop-down (Figure 3). Once back at the main Profiler Window, select which type of desktop profile you want, and then click Install.
-
-![Desktop Profiler][9]
-
-Figure 3: Installing a different desktop is quite simple from within the Desktop Profiler.
-
-[Used with permission][5]
-
-Note that installing a different desktop will not wipe the default desktop. Instead, it will allow you to select between the two desktops (at the login screen).
-
-### Installed software
-
-After selecting full-featured desktop, from the Desktop Profiler, I found the following user applications ready to go:
-
- * LibreOffice 5.2.7.2
-
- * VLC 2.2.7
-
- * Google Chrome 64.0.3282
-
- * Thunderbird 52.6.0 (Includes Lightning addon)
-
- * Synaptic 0.84.2
-
- * Konqueror 14.0.5
-
- * Firefox 52.6.0
-
- * Shotwell 0.24.5
-
-
-
-
-Obviously some of those applications are well out of date. Since this distribution is based on Debian, we can run and update/upgrade with the commands:
-```
-sudo apt update
-
-sudo apt upgrade
-
-```
-
-However, after running both commands, it seems everything is up to date. This particular release (2.4) is an LTS release (supported until 2022). Because of this, expect software to be a bit behind. If you want to test out the bleeding edge version (based on Debian “Buster”), you can download the testing image [here][10].
-
-### Security oddity
-
-There is one rather disturbing “feature” found in Q4OS. In the developer’s quest to make the distribution closely resemble Windows, they’ve made it such that installing software (from the command line) doesn’t require a password! You read that correctly. If you open the Synaptic package manager, you’re asked for a password. However (and this is a big however), open up a terminal window and issue a command like sudo apt-get install gimp. At this point, the software will install… without requiring the user to type a sudo password.
-
-Did you cringe at that? You should.
-
-I get it, the developers want to ease away the burden of Linux and make a platform the masses could easily adapt to. They’ve done a splendid job of doing just that. However, in the process of doing so, they’ve bypassed a crucial means of security. Is having as near an XP/7 clone as you can find on Linux worth that lack of security? I would say that if it enables more people to use Linux, then yes. But the fact that they’ve required a password for Synaptic (the GUI tool most Windows users would default to for software installation) and not for the command-line tool makes no sense. On top of that, bypassing passwords for the apt and dpkg commands could make for a significant security issue.
-
-Fear not, there is a fix. For those that prefer to require passwords for the command line installation of software, you can open up the file /etc/sudoers.d/30_q4os_apt and comment out the following three lines:
-```
-%sudo ALL = NOPASSWD: /usr/bin/apt-get *
-
-%sudo ALL = NOPASSWD: /usr/bin/apt-key *
-
-%sudo ALL = NOPASSWD: /usr/bin/dpkg *
-
-```
-
-Once commented out, save and close the file, and reboot the system. At this point, users will now be prompted for a password, should they run the apt-get, apt-key, or dpkg commands.
-
-### A worthy contender
-
-Setting aside the security curiosity, Q4OS is one of the best attempts at recreating Windows XP/7 I’ve come across in a while. If you have users who fear change, and you want to migrate them away from Windows, this distribution might be exactly what you need. I would, however, highly recommend you re-enable passwords for the apt-get, apt-key, and dpkg commands… just to be on the safe side.
-
-In any case, the addition of the Desktop Profiler, and the ability to easily install alternative desktops, makes Q4OS a distribution that just about anyone could use.
-
-Learn more about Linux through the free ["Introduction to Linux" ][11]course from The Linux Foundation and edX.
-
---------------------------------------------------------------------------------
-
-via: https://www.linux.com/learn/intro-to-linux/2018/2/q4os-makes-linux-easy-everyone
-
-作者:[JACK WALLEN][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.linux.com/users/jlwallen
-[1]:https://q4os.org
-[2]:https://www.trinitydesktop.org/
-[4]:https://www.linux.com/sites/lcom/files/styles/rendered_file/public/q4os_1.jpg?itok=dalJk9Xf (default desktop)
-[5]:/licenses/category/used-permission
-[7]:https://www.linux.com/sites/lcom/files/styles/rendered_file/public/q4os_2.jpg?itok=GlouIm73 (Desktop Profiler)
-[9]:https://www.linux.com/sites/lcom/files/styles/rendered_file/public/q4os_3.jpg?itok=riSTP_1z (Desktop Profiler)
-[10]:https://q4os.org/downloads2.html
-[11]:https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
diff --git a/sources/talk/20180220 4 considerations when naming software development projects.md b/sources/talk/20180220 4 considerations when naming software development projects.md
deleted file mode 100644
index 1e1add0b68..0000000000
--- a/sources/talk/20180220 4 considerations when naming software development projects.md
+++ /dev/null
@@ -1,91 +0,0 @@
-4 considerations when naming software development projects
-======
-
-
-
-Working on a new open source project, you're focused on the code—getting that great new idea released so you can share it with the world. And you'll want to attract new contributors, so you need a terrific **name** for your project.
-
-We've all read guides for creating names, but how do you go about choosing the right one? Keeping that cool science fiction reference you're using internally might feel fun, but it won't mean much to new users you're trying to attract. A better approach is to choose a name that's memorable to new users and developers searching for your project.
-
-Names set expectations. Your project's name should showcase its functionality in the ecosystem and explain to users what your story is. In the crowded open source software world, it's important not to get entangled with other projects out there. Taking a little extra time now, before sending out that big announcement, will pay off later.
-
-Here are four factors to keep in mind when choosing a name for your project.
-
-### What does your project's code do?
-
-Start with your project: What does it do? You know the code intimately—but can you explain what it does to a new developer? Can you explain it to a CTO or non-developer at another company? What kinds of problems does your project solve for users?
-
-Your project's name needs to reflect what it does in a way that makes sense to newcomers who want to use or contribute to your project. That means considering the ecosystem for your technology and understanding if there are any naming styles or conventions used for similar kinds of projects. Imagine that you're trying to evaluate someone else's project: Would the name be appealing to you?
-
-Any distribution channels you push to are also part of the ecosystem. If your code will be in a Linux distribution, [npm][1], [CPAN][2], [Maven][3], or in a Ruby Gem, you need to review any naming standards or common practices for that package manager. Review any similar existing names in that distribution channel, and get a feel for naming styles of other programs there.
-
-### Who are the users and developers you want to attract?
-
-The hardest aspect of choosing a new name is putting yourself in the shoes of new users. You built this project; you already know how powerful it is, so while your cool name may sound great, it might not draw in new people. You need a name that is interesting to someone new, and that tells the world what problems your project solves.
-
-Great names depend on what kind of users you want to attract. Are you building an [Eclipse][4] plugin or npm module that's focused on developers? Or an analytics toolkit that brings visualizations to the average user? Understanding your user base and the kinds of open source contributors you want to attract is critical.
-
-Great names depend on what kind of users you want to attract.
-
-Take the time to think this through. Who does your project most appeal to, and how can it help them do their job? What kinds of problems does your code solve for end users? Understanding the target user helps you focus on what users need, and what kind of names or brands they respond to.
-
-Take the time to think this through. Who does your project most appeal to, and how can it help them do their job? What kinds of problems does your code solve for end users? Understanding the target user helps you focus on what users need, and what kind of names or brands they respond to.
-
-When you're open source, this equation changes a bit—your target is not just users; it's also developers who will want to contribute code back to your project. You're probably a developer, too: What kinds of names and brands excite you, and what images would entice you to try out someone else's new project?
-
-Once you have a better feel of what users and potential contributors expect, use that knowledge to refine your names. Remember, you need to step outside your project and think about how the name would appeal to someone who doesn't know how amazing your code is—yet. Once someone gets to your website, does the name synchronize with what your product does? If so, move to the next step.
-
-### Who else is using similar names for software?
-
-Now that you've tried on a user's shoes to evaluate potential names, what's next? Figuring out if anyone else is already using a similar name. It sometimes feels like all the best names are taken—but if you search carefully, you'll find that's not true.
-
-The first step is to do a few web searches using your proposed name. Search for the name, plus "software", "open source", and a few keywords for the functionality that your code provides. Look through several pages of results for each search to see what's out there in the software world.
-
-The first step is to do a few web searches using your proposed name.
-
-Unless you're using a completely made-up word, you'll likely get a lot of hits. The trick is understanding which search results might be a problem. Again, put on the shoes of a new user to your project. If you were searching for this great new product and saw the other search results along with your project's homepage, would you confuse them? Are the other search results even software products? If your product solves a similar problem to other search results, that's a problem: Users may gravitate to an existing product instead of a new one.
-
-Unless you're using a completely made-up word, you'll likely get a lot of hits. The trick is understanding which search results might be a problem. Again, put on the shoes of a new user to your project. If you were searching for this great new product and saw the other search results along with your project's homepage, would you confuse them? Are the other search results even software products? If your product solves a similar problem to other search results, that's a problem: Users may gravitate to an existing product instead of a new one.
-
-Similar non-software product names are rarely an issue unless they are famous trademarks—like Nike or Red Bull, for example—where the companies behind them won't look kindly on anyone using a similar name. Using the same name as a less famous non-software product might be OK, depending on how big your project gets.
-
-### How big do you plan to grow your project?
-
-Are you building a new node module or command-line utility, but not planning a career around it? Is your new project a million-dollar business idea, and you're thinking startup? Or is it something in between?
-
-If your project is a basic developer utility—something useful that developers will integrate into their workflow—then you have enough data to choose a name. Think through the ecosystem and how a new user would see your potential names, and pick one. You don't need perfection, just a name you're happy with that seems right for your project.
-
-If you're planning to build a business around your project, use these tips to develop a shortlist of names, but do more vetting before announcing the winner. Use for a business or major project requires some level of registered trademark search, which is usually performed by a law firm.
-
-### Common pitfalls
-
-Finally, when choosing a name, avoid these common pitfalls:
-
- * Using an esoteric acronym. If new users don't understand the name, they'll have a hard time finding you.
-
- * Using current pop-culture references. If you want your project's appeal to last, pick a name that will last.
-
- * Failing to consider non-English speakers. Does the name have a specific meaning in another language that might be confusing?
-
- * Using off-color jokes or potentially unsavory references. Even if it seems funny to developers, it may fall flat for newcomers and turn away contributors.
-
-
-
-
-Good luck—and remember to take the time to step out of your shoes and consider how a newcomer to your project will think of the name.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/2/choosing-project-names-four-key-considerations
-
-作者:[Shane Curcuru][a]
-译者:[译者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/shane-curcuru
-[1]:https://www.npmjs.com/
-[2]:https://www.cpan.org/
-[3]:https://maven.apache.org/
-[4]:https://www.eclipse.org/
diff --git a/sources/talk/20180221 3 warning flags of DevOps metrics.md b/sources/talk/20180221 3 warning flags of DevOps metrics.md
deleted file mode 100644
index a103a2bbca..0000000000
--- a/sources/talk/20180221 3 warning flags of DevOps metrics.md
+++ /dev/null
@@ -1,42 +0,0 @@
-3 warning flags of DevOps metrics
-======
-
-
-Metrics. Measurements. Data. Monitoring. Alerting. These are all big topics for DevOps and for cloud-native infrastructure and application development more broadly. In fact, acm Queue, a magazine published by the Association of Computing Machinery, recently devoted an [entire issue][1] to the topic.
-
-I've argued before that we conflate a lot of things under the "metrics" term, from key performance indicators to critical failure alerts to data that may be vaguely useful someday for something or other. But that's a topic for another day. What I want to discuss here is how metrics affect behavior.
-
-In 2008, Daniel Ariely published [Predictably Irrational][2] , one of a number of books written around that time that introduced behavioral psychology and behavioral economics to the general public. One memorable quote from that book is the following: "Human beings adjust behavior based on the metrics they're held against. Anything you measure will impel a person to optimize his score on that metric. What you measure is what you'll get. Period."
-
-This shouldn't be surprising. It's a finding that's been repeatedly confirmed by research. It should also be familiar to just about anyone with business experience. It's certainly not news to anyone in sales management, for example. Base sales reps' (or their managers'!) bonuses solely on revenue, and they'll discount whatever it takes to maximize revenue even if it puts margin in the toilet. Conversely, want the sales force to push a new product line—which will probably take extra effort—but skip the [spiffs][3]? Probably not happening.
-
-And lest you think I'm unfairly picking on sales, this behavior is pervasive, all the way up to the CEO, as Ariely describes in [a 2010 Harvard Business Review article][4]. "CEOs care about stock value because that's how we measure them. If we want to change what they care about, we should change what we measure," writes Ariely.
-
-Think developers and operations folks are immune from such behaviors? Think again. Let's consider some problematic measurements. They're not all bad or wrong but, if you rely too much on them, warning flags should go up.
-
-### Three warning signs for DevOps metrics
-
-First, there are the quantity metrics. Lines of code or bugs fixed are perhaps self-evidently absurd. But there are also the deployments per week or per month that are so widely quoted to illustrate DevOps velocity relative to more traditional development and deployment practices. Speed is good. It's one of the reasons you're probably doing DevOps—but don't reward people on it excessively relative to quality and other measures.
-
-Second, it's obvious that you want to reward individuals who do their work quickly and well. Yes. But. Whether it's your local pro sports team or some project team you've been on, you can probably name someone who was really a talent, but was just so toxic and such a distraction for everyone else that they were a net negative for the team. Moral: Don't provide incentives that solely encourage individual behaviors. You may also want to put in place programs, such as peer rewards, that explicitly value collaboration. [As Red Hat's Jen Krieger told me][5] in a podcast last year: "Having those automated pots of awards, or some sort of system that's tracked for that, can only help teams feel a little more cooperative with one another as in, 'Hey, we're all working together to get something done.'"
-
-The third red flag area is incentives that don't actually incent because neither the individual nor the team has a meaningful ability to influence the outcome. It's often a good thing when DevOps metrics connect to business goals and outcomes. For example, customer ticket volume relates to perceived shortcomings in applications and infrastructure. And it's also a reasonable proxy for overall customer satisfaction, which certainly should be of interest to the executive suite. The best reward systems to drive DevOps behaviors should be tied to specific individual and team actions as opposed to just company success generally.
-
-You've probably noticed a common theme. That theme is balance. Velocity is good but so is quality. Individual achievement is good but not when it damages the effectiveness of the team. The overall success of the business is certainly important, but the best reward systems also tie back to actions and behaviors within development and operations.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/2/three-warning-flags-devops-metrics
-
-作者:[Gordon Haff][a]
-译者:[译者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/ghaff
-[1]:https://queue.acm.org/issuedetail.cfm?issue=3178368
-[2]:https://en.wikipedia.org/wiki/Predictably_Irrational
-[3]:https://en.wikipedia.org/wiki/Spiff
-[4]:https://hbr.org/2010/06/column-you-are-what-you-measure
-[5]:http://bitmason.blogspot.com/2015/09/podcast-making-devops-succeed-with-red.html
diff --git a/sources/talk/20180222 3 reasons to say -no- in DevOps.md b/sources/talk/20180222 3 reasons to say -no- in DevOps.md
deleted file mode 100644
index 5f27fbaf47..0000000000
--- a/sources/talk/20180222 3 reasons to say -no- in DevOps.md
+++ /dev/null
@@ -1,105 +0,0 @@
-3 reasons to say 'no' in DevOps
-======
-
-
-
-DevOps, it has often been pointed out, is a culture that emphasizes mutual respect, cooperation, continual improvement, and aligning responsibility with authority.
-
-Instead of saying no, it may be helpful to take a hint from improv comedy and say, "Yes, and..." or "Yes, but...". This opens the request from the binary nature of "yes" and "no" toward having a nuanced discussion around priority, capacity, and responsibility.
-
-However, sometimes you have no choice but to give a hard "no." These should be rare and exceptional, but they will occur.
-
-### Protecting yourself
-
-Both Agile and DevOps have been touted as ways to improve value to the customer and business, ultimately leading to greater productivity. While reasonable people can understand that the improvements will take time to yield, and the improvements will result in higher quality of work being done, and a better quality of life for those performing it, I think we can all agree that not everyone is reasonable. The less understanding that a person has of the particulars of a given task, the more likely they are to expect that it is a combination of "simple" and "easy."
-
-"You told me that [Agile/DevOps] is supposed to be all about us getting more productivity. Since we're doing [Agile/DevOps] now, you can take care of my need, right?"
-
-Like "Agile," some people have tried to use "DevOps" as a stick to coerce people to do more work than they can handle. Whether the person confronting you with this question is asking in earnest or is being manipulative doesn't really matter.
-
-The biggest areas of concern for me have been **capacity** , **firefighting/maintenance** , **level of quality** , and **" future me."** Many of these ultimately tie back to capacity, but they relate to a long-term effort in different respects.
-
-#### Capacity
-
-Capacity is simple: You know what your workload is, and how much flex occurs due to the unexpected. Exceeding your capacity will not only cause undue stress, but it could decrease the quality of your work and can injure your reputation with regards to making commitments.
-
-There are several avenues of discussion that can happen from here. The simplest is "Your request is reasonable, but I don't have the capacity to work on it." This seldom ends the conversation, and a discussion will often run up the flagpole to clarify priorities or reassign work.
-
-#### Firefighting/maintenance
-
-It's possible that the thing that you're being asked for won't take long to do, but it will require maintenance that you'll be expected to perform, including keeping it alive and fulfilling requests for it on behalf of others.
-
-An example in my mind is the Jenkins server that you're asked to stand up for someone else, but somehow end up being the sole owner and caretaker of. Even if you're careful to scope your level of involvement early on, you might be saddled with responsibility that you did not agree to. Should the service become unavailable, for example, you might be the one who is called. You might be called on to help triage a build that is failing. This is additional firefighting and maintenance work that you did not sign up for and now must fend off.
-
-This needs to be addressed as soon and publicly as possible. I'm not saying that (again, for example) standing up a Jenkins instance is a "no," but rather a ["Yes, but"][1]—where all parties understand that they take on the long-term care, feeding, and use of the product. Make sure to include all your bosses in this conversation so they can have your back.
-
-#### Level of quality
-
-There may be times when you are presented with requirements that include a timeframe that is...problematic. Perhaps you could get a "minimum (cough) viable (cough) product" out in that time. But it wouldn't be resilient or in any way ready for production. It might impact your time and productivity. It could end up hurting your reputation.
-
-The resulting conversation can get into the weeds, with lots of horse-trading about time and features. Another approach is to ask "What is driving this deadline? Where did that timeframe come from?" Discussing the bigger picture might lead to a better option, or that the timeline doesn't depend on the original date.
-
-#### Future me
-
-Ultimately, we are trying to protect "future you." These are lessons learned from the many times that "past me" has knowingly left "current me" to clean up. Sometimes we joke that "that's a problem for 'future me,'" but don't forget that 'future you' will just be 'you' eventually. I've cursed "past me" as a jerk many times. Do your best to keep other people from making "past you" be a jerk to "future you."
-
-I recognize that I have a significant amount of privilege in this area, but if you are told that you cannot say "no" on behalf of your own welfare, you should consider whether you are respected enough to maintain your autonomy.
-
-### Protecting the user experience
-
-Everyone should be an advocate for the user. Regardless of whether that user is right next to you, someone down the hall, or someone you have never met and likely never will, you must care for the customer.
-
-Behavior that is actively hostile to the user—whether it's a poor user experience or something more insidious like quietly violating reasonable expectations of privacy—deserves a "no." A common example of this would be automatically including people into a service or feature, forcing them to explicitly opt-out.
-
-If a "no" is not welcome, it bears considering, or explicitly asking, what the company's relationship with its customers is, who the company thinks of as it's customers, and what it thinks of them.
-
-When bringing up your objections, be clear about what they are. Additionally, remember that your coworkers are people too, and make it clear that you are not attacking their character; you simply find the idea disagreeable.
-
-### Legal, ethical, and moral grounds
-
-There might be situations that don't feel right. A simple test is to ask: "If this were to become public, or come up in a lawsuit deposition, would it be a scandal?"
-
-#### Ethics and morals
-
-If you are asked to lie, that should be a hard no.
-
-Remember if you will the Volkswagen Emissions Scandal of 2017? The emissions systems software was written such that it recognized that the vehicle was operated in a manner consistent with an emissions test, and would run more efficiently than under normal driving conditions.
-
-I don't know what you do in your job, or what your office is like, but I have a hard time imagining the Individual Contributor software engineer coming up with that as a solution on their own. In fact, I imagine a comment along the lines of "the engine engineers can't make their product pass the tests, so I need to hack the performance so that it will!"
-
-When the Volkswagen scandal came public, Volkswagen officials blamed the engineers. I find it unlikely that it came from the mind and IDE of an individual software engineer. Rather, it's more likely indicates significant systemic problems within the company culture.
-
-If you are asked to lie, get the request in writing, citing that the circumstances are suspect. If you are so privileged, decide whether you may decline the request on the basis that it is fundamentally dishonest and hostile to the customer, and would break the public's trust.
-
-#### Legal
-
-I am not a lawyer. If your work should involve legal matters, including requests from law enforcement, involve your company's legal counsel or speak with a private lawyer.
-
-With that said, if you are asked to provide information for law enforcement, I believe that you are within your rights to see the documentation that justifies the request. There should be a signed warrant. You should be provided with a copy of it, or make a copy of it yourself.
-
-When in doubt, begin recording and request legal counsel.
-
-It has been well documented that especially in the early years of the U.S. Patriot Act, law enforcement placed so many requests of telecoms that they became standard work, and the paperwork started slipping. While tedious and potentially stressful, make sure that the legal requirements for disclosure are met.
-
-If for no other reason, we would not want the good work of law enforcement to be put at risk because key evidence was improperly acquired, making it inadmissible.
-
-### Wrapping up
-
-You are going to be your single biggest advocate. There may be times when you are asked to compromise for the greater good. However, you should feel that your dignity is preserved, your autonomy is respected, and that your morals remain intact.
-
-If you don't feel that this is the case, get it on record, doing your best to communicate it calmly and clearly.
-
-Nobody likes being declined, but if you don't have the ability to say no, there may be a bigger problem than your environment not being DevOps.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/2/3-reasons-say-no-devops
-
-作者:[H. "Waldo" Grunenwal][a]
-译者:[译者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/gwaldo
-[1]:http://gwaldo.blogspot.com/2015/12/fear-and-loathing-in-systems.html
diff --git a/sources/talk/20180223 Plasma Mobile Could Give Life to a Mobile Linux Experience.md b/sources/talk/20180223 Plasma Mobile Could Give Life to a Mobile Linux Experience.md
deleted file mode 100644
index 583714836e..0000000000
--- a/sources/talk/20180223 Plasma Mobile Could Give Life to a Mobile Linux Experience.md
+++ /dev/null
@@ -1,123 +0,0 @@
-Plasma Mobile Could Give Life to a Mobile Linux Experience
-======
-
-
-
-In the past few years, it’s become clear that, outside of powering Android, Linux on mobile devices has been a resounding failure. Canonical came close, even releasing devices running Ubuntu Touch. Unfortunately, the idea of [Scopes][1]was doomed before it touched down on its first piece of hardware and subsequently died a silent death.
-
-The next best hope for mobile Linux comes in the form of the [Samsung DeX][2] program. With DeX, users will be able to install an app (Linux On Galaxy—not available yet) on their Samsung devices, which would in turn allow them to run a full-blown Linux distribution. The caveat here is that you’ll be running both Android and Linux at the same time—which is not exactly an efficient use of resources. On top of that, most Linux distributions aren’t designed to run on such small form factors. The good news for DeX is that, when you run Linux on Galaxy and dock your Samsung device to DeX, that Linux OS will be running on your connected monitor—so form factor issues need not apply.
-
-Outside of those two options, a pure Linux on mobile experience doesn’t exist. Or does it?
-
-You may have heard of the [Purism Librem 5][3]. It’s a crowdfunded device that promises to finally bring a pure Linux experience to the mobile landscape. This device will be powered by a i.MX8 SoC chip, so it should run most any Linux operating system.
-
-Out of the box, the device will run an encrypted version of [PureOS][4]. However, last year Purism and KDE joined together to create a mobile version of the KDE desktop that could run on the Librem 5. Recently [ISOs were made available for a beta version of Plasma Mobile][5] and, judging from first glance, they’re onto something that makes perfect sense for a mobile Linux platform. I’ve booted up a live instance of Plasma Mobile to kick the tires a bit.
-
-What I saw seriously impressed me. Let’s take a look.
-
-### Testing platform
-
-Before you download the ISO and attempt to fire it up as a VirtualBox VM, you should know that it won’t work well. Because Plasma Mobile uses Wayland (and VirtualBox has yet to play well with that particular X replacement), you’ll find VirtualBox VM a less-than-ideal platform for the beta release. Also know that the Calamares installer doesn’t function well either. In fact, I have yet to get the OS installed on a non-mobile device. And since I don’t own a supported mobile device, I’ve had to run it as a live session on either a laptop or an [Antsle][6] antlet VM every time.
-
-### What makes Plasma Mobile special?
-
-This could be easily summed up by saying, Plasma Mobile got it all right. Instead of Canonical re-inventing a perfectly functioning wheel, the developers of KDE simply re-tooled the interface such that a full-functioning Linux distribution (complete with all the apps you’ve grown to love and depend upon) could work on a smaller platform. And they did a spectacular job. Even better, they’ve created an interface that any user of a mobile device could instantly feel familiar with.
-
-What you have with the Plasma Mobile interface (Figure 1) are the elements common to most Android home screens:
-
- * Quick Launchers
-
- * Notification Shade
-
- * App Drawer
-
- * Overview button (so you can go back to a previously used app, still running in memory)
-
- * Home button
-
-
-
-
-![KDE mobile][8]
-
-Figure 1: The Plasma Mobile desktop interface.
-
-[Used with permission][9]
-
-Because KDE went this route with the UX, it means there’s zero learning curve. And because this is an actual Linux platform, it takes that user-friendly mobile interface and overlays it onto a system that allows for easy installation and usage of apps like:
-
- * GIMP
-
- * LibreOffice
-
- * Audacity
-
- * Clementine
-
- * Dropbox
-
- * And so much more
-
-
-
-
-Unfortunately, without being able to install Plasma Mobile, you cannot really kick the tires too much, as the live user doesn’t have permission to install applications. However, once Plasma Mobile is fully installed, the Discover software center will allow you to install a host of applications (Figure 2).
-
-
-![Discover center][11]
-
-Figure 2: The Discover software center on Plasma Mobile.
-
-[Used with permission][9]
-
-Swipe up (or scroll down—depending on what hardware you’re using) to reveal the app drawer, where you can launch all of your installed applications (Figure 3).
-
-![KDE mobile][13]
-
-Figure 3: The Plasma Mobile app drawer ready to launch applications.
-
-[Used with permission][9]
-
-Open up a terminal window and you can take care of standard Linux admin tasks, such as using SSH to log into a remote server. Using apt, you can install all of the developer tools you need to make Plasma Mobile a powerful development platform.
-
-We’re talking serious mobile power—either from a phone or a tablet.
-
-### A ways to go
-
-Clearly Plasma Mobile is still way too early in development for it to be of any use to the average user. And because most virtual machine technology doesn’t play well with Wayland, you’re likely to get too frustrated with the current ISO image to thoroughly try it out. However, even without being able to fully install the platform (or get full usage out of it), it’s obvious KDE and Purism are going to have the ideal platform that will put Linux into the hands of mobile users.
-
-If you want to test the waters of Plasma Mobile on an actual mobile device, a handy list of supported hardware can be found [here][14] (for PostmarketOS) or [here][15] (for Halium). If you happen to be lucky enough to have a device that also includes Wi-Fi support, you’ll find you get more out of testing the environment.
-
-If you do have a supported device, you’ll need to use either [PostmarketOS][16] (a touch-optimized, pre-configured Alpine Linux that can be installed on smartphones and other mobile devices) or [Halium][15] (an application that creates an minimal Android layer which allows a new interface to interact with the Android kernel). Using Halium further limits the number of supported devices, as it has only been built for select hardware. However, if you’re willing, you can build your own Halium images (documentation for this process is found [here][17]). If you want to give PostmarketOS a go, [here are the necessary build instructions][18].
-
-Suffice it to say, Plasma Mobile isn’t nearly ready for mass market. If you’re a Linux enthusiast and want to give it a go, let either PostmarketOS or Halium help you get the operating system up and running on your device. Otherwise, your best bet is to wait it out and hope Purism and KDE succeed in bringing this oustanding mobile take on Linux to the masses.
-
-Learn more about Linux through the free ["Introduction to Linux" ][19]course from The Linux Foundation and edX.
-
---------------------------------------------------------------------------------
-
-via: https://www.linux.com/learn/intro-to-linux/2018/2/plasma-mobile-could-give-life-mobile-linux-experience
-
-作者:[JACK WALLEN][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.linux.com/users/jlwallen
-[1]:https://launchpad.net/unity-scopes
-[2]:http://www.samsung.com/global/galaxy/apps/samsung-dex/
-[3]:https://puri.sm/shop/librem-5/
-[4]:https://www.pureos.net/
-[5]:http://blog.bshah.in/2018/01/26/trying-out-plasma-mobile/
-[6]:https://antsle.com/
-[8]:https://www.linux.com/sites/lcom/files/styles/rendered_file/public/kdemobile_1.jpg?itok=EK3_vFVP (KDE mobile)
-[9]:https://www.linux.com/licenses/category/used-permission
-[11]:https://www.linux.com/sites/lcom/files/styles/rendered_file/public/kdemobile_2.jpg?itok=CiUQ-MnB (Discover center)
-[13]:https://www.linux.com/sites/lcom/files/styles/rendered_file/public/kdemobile_3.jpg?itok=i6V8fgK8 (KDE mobile)
-[14]:http://blog.bshah.in/2018/02/02/trying-out-plasma-mobile-part-two/
-[15]:https://github.com/halium/projectmanagement/issues?q=is%3Aissue+is%3Aopen+label%3APorts
-[16]:https://postmarketos.org/
-[17]:http://docs.halium.org/en/latest/
-[18]:https://wiki.postmarketos.org/wiki/Installation_guide
-[19]:https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
diff --git a/sources/talk/20180223 Why culture is the most important issue in a DevOps transformation.md b/sources/talk/20180223 Why culture is the most important issue in a DevOps transformation.md
deleted file mode 100644
index 8fe1b6f273..0000000000
--- a/sources/talk/20180223 Why culture is the most important issue in a DevOps transformation.md
+++ /dev/null
@@ -1,91 +0,0 @@
-Why culture is the most important issue in a DevOps transformation
-======
-
-
-
-You've been appointed the DevOps champion in your organisation: congratulations. So, what's the most important issue that you need to address?
-
-It's the technology—tools and the toolchain—right? Everybody knows that unless you get the right tools for the job, you're never going to make things work. You need integration with your existing stack (though whether you go with tight or loose integration will be an interesting question), a support plan (vendor, third party, or internal), and a bug-tracking system to go with your source code management system. And that's just the start.
-
-No! Don't be ridiculous: It's clearly the process that's most important. If the team doesn't agree on how stand-ups are run, who participates, the frequency and length of the meetings, and how many people are required for a quorum, then you'll never be able to institute a consistent, repeatable working pattern.
-
-In fact, although both the technology and the process are important, there's a third component that is equally important, but typically even harder to get right: culture. Yup, it's that touch-feely thing we techies tend to struggle with.1
-
-### Culture
-
-I was visiting a midsized government institution a few months ago (not in the UK, as it happens), and we arrived a little early to meet the CEO and CTO. We were ushered into the CEO's office and waited for a while as the two of them finished participating in the daily stand-up. They apologised for being a minute or two late, but far from being offended, I was impressed. Here was an organisation where the culture of participation was clearly infused all the way up to the top.
-
-Not that culture can be imposed from the top—nor can you rely on it percolating up from the bottom3—but these two C-level execs were not only modelling the behaviour they expected from the rest of their team, but also seemed, from the brief discussion we had about the process afterwards, to be truly invested in it. If you can get management to buy into the process—and be seen buying in—you are at least likely to have problems with other groups finding plausible excuses to keep their distance and get away with it.
-
-So let's assume management believes you should give DevOps a go. Where do you start?
-
-Developers may well be your easiest target group. They are often keen to try new things and find ways to move things along faster, so they are often the group that can be expected to adopt new technologies and methodologies. DevOps arguably has been driven mainly by the development community.
-
-But you shouldn't assume all developers will be keen to embrace this change. For some, the way things have always been done—your Rick Parfitts of dev, if you will7—is fine. Finding ways to help them work efficiently in the new world is part of your job, not just theirs. If you have superstar developers who aren't happy with change, you risk alienating and losing them if you try to force them into your brave new world. What's worse, if they dig their heels in, you risk the adoption of your DevSecOps vision being compromised when they explain to their managers that things aren't going to change if it makes their lives more difficult and reduces their productivity.
-
-Maybe you're not going to be able to move all the systems and people to DevOps immediately. Maybe you're going to need to choose which apps start with and who will be your first DevOps champions. Maybe it's time to move slowly.
-
-### Not maybe: definitely
-
-No—I lied. You're definitely going to need to move slowly. Trying to change everything at once is a recipe for disaster.
-
-This goes for all elements of the change—which people to choose, which technologies to choose, which applications to choose, which user base to choose, which use cases to choose—bar one. For those elements, if you try to move everything in one go, you will fail. You'll fail for a number of reasons. You'll fail for reasons I can't imagine and, more importantly, for reasons you can't imagine. But some of the reasons will include:
-
- * People—most people—don't like change.
- * Technologies don't like change (you can't just switch and expect everything to still work).
- * Applications don't like change (things worked before, or at least failed in known ways). You want to change everything in one go? Well, they'll all fail in new and exciting9 ways.
- * Users don't like change.
- * Use cases don't like change.
-
-
-
-### The one exception
-
-You noticed I wrote "bar one" when discussing which elements you shouldn't choose to change all in one go? Well done.
-
-What's that exception? It's the initial team. When you choose your initial application to change and you're thinking about choosing the team to make that change, select the members carefully and select a complete set. This is important. If you choose just developers, just test folks, just security folks, just ops folks, or just management—if you leave out one functional group from your list—you won't have proved anything at all. Well, you might have proved to a small section of your community that it kind of works, but you'll have missed out on a trick. And that trick is: If you choose keen people from across your functional groups, it's much harder to fail.
-
-Say your first attempt goes brilliantly. How are you going to convince other people to replicate your success and adopt DevOps? Well, the company newsletter, of course. And that will convince how many people, exactly? Yes, that number.12 If, on the other hand, you have team members from across the functional parts or the organisation, when you succeed, they'll tell their colleagues and you'll get more buy-in next time.
-
-If it fails, if you've chosen your team wisely—if they're all enthusiastic and know that "fail often, fail fast" is good—they'll be ready to go again.
-
-Therefore, you need to choose enthusiasts from across your functional groups. They can work on the technologies and the process, and once that's working, it's the people who will create that cultural change. You can just sit back and enjoy. Until the next crisis, of course.
-
-1\. OK, you're right. It should be "with which we techies tend to struggle."2
-
-2\. You thought I was going to qualify that bit about techies struggling with touchy-feely stuff, didn't you? Read it again: I put "tend to." That's the best you're getting.
-
-3\. Is percolating a bottom-up process? I don't drink coffee,4 so I wouldn't know.
-
-4\. Do people even use percolators to make coffee anymore? Feel free to let me know in the comments. I may pretend interest if you're lucky.
-
-5\. For U.S. readers (and some other countries, maybe?), please substitute "check" for "tick" here.6
-
-6\. For U.S. techie readers, feel free to perform `s/tick/check/;`.
-
-7\. This is a Status Quo8 reference for which I'm extremely sorry.
-
-8\. For millennial readers, please consult your favourite online reference engine or just roll your eyes and move on.
-
-9\. For people who say, "but I love excitement," try being on call at 2 a.m. on a Sunday at the end of the quarter when your chief financial officer calls you up to ask why all of last month's sales figures have been corrupted with the letters "DEADBEEF."10
-
-10\. For people not in the know, this is a string often used by techies as test data because a) it's non-numerical; b) it's numerical (in hexadecimal); c) it's easy to search for in debug files; and d) it's funny.11
-
-11\. Though see.9
-
-12\. It's a low number, is all I'm saying.
-
-This article originally appeared on [Alice, Eve, and Bob – a security blog][1] and is republished with permission.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/2/most-important-issue-devops-transformation
-
-作者:[Mike Bursell][a]
-译者:[译者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
-[1]:https://aliceevebob.com/2018/02/06/moving-to-devops-whats-most-important/
diff --git a/sources/talk/20180301 How to hire the right DevOps talent.md b/sources/talk/20180301 How to hire the right DevOps talent.md
deleted file mode 100644
index bcf9bb3d20..0000000000
--- a/sources/talk/20180301 How to hire the right DevOps talent.md
+++ /dev/null
@@ -1,48 +0,0 @@
-How to hire the right DevOps talent
-======
-
-
-
-DevOps culture is quickly gaining ground, and demand for top-notch DevOps talent is greater than ever at companies all over the world. With the [annual base salary for a junior DevOps engineer][1] now topping $100,000, IT professionals are hurrying to [make the transition into DevOps.][2]
-
-But how do you choose the right candidate to fill your DevOps role?
-
-### Overview
-
-Most teams are looking for candidates with a background in operations and infrastructure, software engineering, or development. This is in conjunction with skills that relate to configuration management, continuous integration, and deployment (CI/CD), as well as cloud infrastructure. Knowledge of container orchestration is also in high demand.
-
-In a perfect world, the two backgrounds would meet somewhere in the middle to form Dev and Ops, but in most cases, candidates lean toward one side or the other. Yet they must possess the skills necessary to understand the needs of their counterparts to work effectively as a team to achieve continuous delivery and deployment. Since every company is different, there is no single right or wrong since so much depends on a company’s tech stack and infrastructure, as well as the goals and the skills of other team members. So how do you focus your search?
-
-### Decide on the background
-
-Begin by assessing the strength of your current team. Do you have rock-star software engineers but lack infrastructure knowledge? Focus on closing the skill gaps. Just because you have the budget to hire a DevOps engineer doesn’t mean you should spend weeks, or even months, trying to find the best software engineer who also happens to use Kubernetes and Docker because they are currently the trend. Instead, look for someone who will provide the most value in your environment, and see how things go from there.
-
-### There is no “Ctrl + F” solution
-
-Instead of concentrating on specific tools, concentrate on a candidate's understanding of DevOps and CI/CD-related processes. You'll be better off with someone who understands methodologies over tools. It is more important to ensure that candidates comprehend the concept of CI/CD than to ask if they prefer Jenkins, Bamboo, or TeamCity. Don’t get too caught up in the exact toolchain—rather, focus on problem-solving skills and the ability to increase efficiency, save time, and automate manual processes. You don't want to miss out on the right candidate just because the word “Puppet” was not on their resume.
-
-### Check your ego
-
-As mentioned above, DevOps is a rapidly growing field, and DevOps engineers are in hot demand. That means candidates have great buying power. You may have an amazing company or product, but hiring top talent is no longer as simple as putting up a “Help Wanted” sign and waiting for top-quality applicants to rush in. I'm not suggesting that maintaining a reputation a great place to work is unimportant, but in today's environment, you need to make an effort to sell your position. Flaws or glitches in the hiring process, such as abruptly canceling interviews or not offering feedback after interviews, can lead to negative reviews spreading across the industry. Remember, it takes just a couple of minutes to leave a negative review on Glassdoor.
-
-### Contractor or permanent employee?
-
-Most recruiters and hiring managers immediately start searching for a full-time employee, even though they may have other options. If you’re looking to design, build, and implement a new DevOps environment, why not hire a senior person who has done this in the past? Consider hiring a senior contractor, along with a junior full-time hire. That way, you can tap the knowledge and experience of the contractor by having them work with the junior employee. Contractors can be expensive, but they bring invaluable knowledge—especially if the work can be done within a short timeframe.
-
-### Cultivate from within
-
-With so many companies competing for talent, it is difficult to find the right DevOps engineer. Not only will you need to pay top dollar to hire this person, but you must also consider that the search can take several months. However, since few companies are lucky enough to find the ideal DevOps engineer, consider searching for a candidate internally. You might be surprised at the talent you can cultivate from within your own organization.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/3/how-hire-right-des-talentvop
-
-作者:[Stanislav Ivaschenko][a]
-译者:[译者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/ilyadudkin
-[1]:https://www.glassdoor.com/Salaries/junior-devops-engineer-salary-SRCH_KO0,22.htm
-[2]:https://squadex.com/insights/system-administrator-making-leap-devops/
diff --git a/sources/talk/20180302 Beyond metrics- How to operate as team on today-s open source project.md b/sources/talk/20180302 Beyond metrics- How to operate as team on today-s open source project.md
deleted file mode 100644
index fb5454bbe4..0000000000
--- a/sources/talk/20180302 Beyond metrics- How to operate as team on today-s open source project.md
+++ /dev/null
@@ -1,53 +0,0 @@
-Beyond metrics: How to operate as team on today's open source project
-======
-
-
-
-How do we traditionally think about community health and vibrancy?
-
-We might quickly zero in on metrics related primarily to code contributions: How many companies are contributing? How many individuals? How many lines of code? Collectively, these speak to both the level of development activity and the breadth of the contributor base. The former speaks to whether the project continues to be enhanced and expanded; the latter to whether it has attracted a diverse group of developers or is controlled primarily by a single organization.
-
-The [Linux Kernel Development Report][1] tracks these kinds of statistics and, unsurprisingly, it appears extremely healthy on all counts.
-
-However, while development cadence and code contributions are still clearly important, other aspects of the open source communities are also coming to the forefront. This is in part because, increasingly, open source is about more than a development model. It’s also about making it easier for users and other interested parties to interact in ways that go beyond being passive recipients of code. Of course, there have long been user groups. But open source streamlines the involvement of users, just as it does software development.
-
-This was the topic of my discussion with Diane Mueller, the director of community development for OpenShift.
-
-When OpenShift became a container platform based in part on Kubernetes in version 3, Mueller saw a need to broaden the community beyond the core code contributors. In part, this was because OpenShift was increasingly touching a broad range of open source projects and organizations such those associated with the [Open Container Initiative (OCI)][2] and the [Cloud Native Computing Foundation (CNCF)][3]. In addition to users, cloud service providers who were offering managed services also wanted ways to get involved in the project.
-
-“What we tried to do was open up our minds about what the community constituted,” Mueller explained, adding, “We called it the [Commons][4] because Red Hat's near Boston, and I'm from that area. Boston Common is a shared resource, the grass where you bring your cows to graze, and you have your farmer's hipster market or whatever it is today that they do on Boston Common.”
-
-This new model, she said, was really “a new ecosystem that incorporated all of those different parties and different perspectives. We used a lot of virtual tools, a lot of new tools like Slack. We stepped up beyond the mailing list. We do weekly briefings. We went very virtual because, one, I don't scale. The Evangelist and Dev Advocate team didn't scale. We need to be able to get all that word out there, all this new information out there, so we went very virtual. We worked with a lot of people to create online learning stuff, a lot of really good tooling, and we had a lot of community help and support in doing that.”
-
-![diane mueller open shift][6]
-
-Diane Mueller, director of community development at Open Shift, discusses the role of strong user communities in open source software development. (Credit: Gordon Haff, CC BY-SA 4.0)
-
-However, one interesting aspect of the Commons model is that it isn’t just virtual. We see the same pattern elsewhere in many successful open source communities, such as the Linux kernel. Lots of day-to-day activities happen on mailings lists, IRC, and other collaboration tools. But this doesn’t eliminate the benefits of face-to-face time that allows for both richer and informal discussions and exchanges.
-
-This interview with Mueller took place in London the day after the [OpenShift Commons Gathering][7]. Gatherings are full-day events, held a number of times a year, which are typically attended by a few hundred people. Much of the focus is on users and user stories. In fact, Mueller notes, “Here in London, one of the Commons members, Secnix, was really the major reason we actually hosted the gathering here. Justin Cook did an amazing job organizing the venue and helping us pull this whole thing together in less than 50 days. A lot of the community gatherings and things are driven by the Commons members.”
-
-Mueller wants to focus on users more and more. “The OpenShift Commons gathering at [Red Hat] Summit will be almost entirely case studies,” she noted. “Users talking about what's in their stack. What lessons did they learn? What are the best practices? Sharing those ideas that they've done just like we did here in London.”
-
-Although the Commons model grew out of some specific OpenShift needs at the time it was created, Mueller believes it’s an approach that can be applied more broadly. “I think if you abstract what we've done, you can apply it to any existing open source community,” she said. “The foundations still, in some ways, play a nice role in giving you some structure around governance, and helping incubate stuff, and helping create standards. I really love what OCI is doing to create standards around containers. There's still a role for that in some ways. I think the lesson that we can learn from the experience and we can apply to other projects is to open up the community so that it includes feedback mechanisms and gives the podium away.”
-
-The evolution of the community model though approaches like the OpenShift Commons mirror the healthy evolution of open source more broadly. Certainly, some users have been involved in the development of open source software for a long time. What’s striking today is how widespread and pervasive direct user participation has become. Sure, open source remains central to much of modern software development. But it’s also becoming increasingly central to how users learn from each other and work together with their partners and developers.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/3/how-communities-are-evolving
-
-作者:[Gordon Haff][a]
-译者:[译者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/ghaff
-[1]:https://www.linuxfoundation.org/2017-linux-kernel-report-landing-page/
-[2]:https://www.opencontainers.org/
-[3]:https://www.cncf.io/
-[4]:https://commons.openshift.org/
-[5]:/file/388586
-[6]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/39369010275_7df2c3c260_z.jpg?itok=gIhnBl6F (diane mueller open shift)
-[7]:https://www.meetup.com/London-OpenShift-User-Group/events/246498196/
diff --git a/sources/talk/20180303 4 meetup ideas- Make your data open.md b/sources/talk/20180303 4 meetup ideas- Make your data open.md
deleted file mode 100644
index a431b8376a..0000000000
--- a/sources/talk/20180303 4 meetup ideas- Make your data open.md
+++ /dev/null
@@ -1,75 +0,0 @@
-4 meetup ideas: Make your data open
-======
-
-
-
-[Open Data Day][1] (ODD) is an annual, worldwide celebration of open data and an opportunity to show the importance of open data in improving our communities.
-
-Not many individuals and organizations know about the meaningfulness of open data or why they might want to liberate their data from the restrictions of copyright, patents, and more. They also don't know how to make their data open—that is, publicly available for anyone to use, share, or republish with modifications.
-
-This year ODD falls on Saturday, March 3, and there are [events planned][2] in every continent except Antarctica. While it might be too late to organize an event for this year, it's never too early to plan for next year. Also, since open data is important every day of the year, there's no reason to wait until ODD 2019 to host an event in your community.
-
-There are many ways to build local awareness of open data. Here are four ideas to help plan an excellent open data event any time of year.
-
-### 1. Organize an entry-level event
-
-You can host an educational event at a local library, college, or another public venue about how open data can be used and why it matters for all of us. If possible, invite a [local speaker][3] or have someone present remotely. You could also have a roundtable discussion with several knowledgeable people in your community.
-
-Consider offering resources such as the [Open Data Handbook][4], which not only provides a guide to the philosophy and rationale behind adopting open data, but also offers case studies, use cases, how-to guides, and other material to support making data open.
-
-### 2. Organize an advanced-level event
-
-For a deeper experience, organize a hands-on training event for open data newbies. Ideas for good topics include [training teachers on open science][5], [creating audiovisual expressions from open data][6], and using [open government data][7] in meaningful ways.
-
-The options are endless. To choose a topic, think about what is locally relevant, identify issues that open data might be able to address, and find people who can do the training.
-
-### 3. Organize a hackathon
-
-Open data hackathons can be a great way to bring open data advocates, developers, and enthusiasts together under one roof. Hackathons are more than just training sessions, though; the idea is to build prototypes or solve real-life challenges that are tied to open data. In a hackathon, people in various groups can contribute to the entire assembly line in multiple ways, such as identifying issues by working collaboratively through [Etherpad][8] or creating focus groups.
-
-Once the hackathon is over, make sure to upload all the useful data that is produced to the internet with an open license.
-
-### 4. Release or relicense data as open
-
-Open data is about making meaningful data publicly available under open licenses while protecting any data that might put people's private information at risk. (Learn [how to protect private data][9].) Try to find existing, interesting, and useful data that is privately owned by individuals or organizations and negotiate with them to relicense or release the data online under any of the [recommended open data licenses][10]. The widely popular [Creative Commons licenses][11] (particularly the CC0 license and the 4.0 licenses) are quite compatible with relicensing public data. (See this FAQ from Creative Commons for more information on [openly licensing data][12].)
-
-Open data can be published on multiple platforms—your website, [GitHub][13], [GitLab][14], [DataHub.io][15], or anywhere else that supports open standards.
-
-### Tips for event success
-
-No matter what type of event you decide to do, here are some general planning tips to improve your chances of success.
-
- * Find a venue that's accessible to the people you want to reach, such as a library, a school, or a community center.
- * Create a curriculum that will engage the participants.
- * Invite your target audience—make sure to distribute information through social media, community events calendars, Meetup, and the like.
-
-
-
-Have you attended or hosted a successful open data event? If so, please share your ideas in the comments.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/3/celebrate-open-data-day
-
-作者:[Subhashish Panigraphi][a]
-译者:[译者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/psubhashish
-[1]:http://www.opendataday.org/
-[2]:http://opendataday.org/#map
-[3]:https://openspeakers.org/
-[4]:http://opendatahandbook.org/
-[5]:https://docs.google.com/forms/d/1BRsyzlbn8KEMP8OkvjyttGgIKuTSgETZW9NHRtCbT1s/viewform?edit_requested=true
-[6]:http://dattack.lv/en/
-[7]:https://www.eventbrite.co.nz/e/open-data-open-potential-event-friday-2-march-2018-tickets-42733708673
-[8]:http://etherpad.org/
-[9]:https://ssd.eff.org/en/module/keeping-your-data-safe
-[10]:https://opendatacommons.org/licenses/
-[11]:https://creativecommons.org/share-your-work/licensing-types-examples/
-[12]:https://wiki.creativecommons.org/wiki/Data#Frequently_asked_questions_about_data_and_CC_licenses
-[13]:https://github.com/MartinBriza/MediaWriter
-[14]:https://about.gitlab.com/
-[15]:https://datahub.io/
diff --git a/sources/talk/20180314 How to apply systems thinking in DevOps.md b/sources/talk/20180314 How to apply systems thinking in DevOps.md
deleted file mode 100644
index c35eb041bd..0000000000
--- a/sources/talk/20180314 How to apply systems thinking in DevOps.md
+++ /dev/null
@@ -1,89 +0,0 @@
-How to apply systems thinking in DevOps
-======
-
-
-For most organizations, adopting DevOps requires a mindset shift. Unless you understand the core of [DevOps][1], you might think it's hype or just another buzzword—or worse, you might believe you have already adopted DevOps because you are using the right tools.
-
-Let’s dig deeper into what DevOps means, and explore how to apply systems thinking in your organization.
-
-### What is systems thinking?
-
-Systems thinking is a holistic approach to problem-solving. It's the opposite of analytical thinking, which separates a problem from the "bigger picture" to better understand it. Instead, systems thinking studies all the elements of a problem, along with the interactions between these elements.
-
-Most people are not used to thinking this way. Since childhood, most of us were taught math, science, and every other subject separately, by different teachers. This approach to learning follows us throughout our lives, from school to university to the workplace. When we first join an organization, we typically work in only one department.
-
-Unfortunately, the world is not that simple. Complexity, unpredictability, and sometimes chaos are unavoidable and require a broader way of thinking. Systems thinking helps us understand the systems we are part of, which in turn enables us to manage them rather than be controlled by them.
-
-According to systems thinking, everything is a system: your body, your family, your neighborhood, your city, your company, and even the communities you belong to. These systems evolve organically; they are alive and fluid. The better you understand a system's behavior, the better you can manage and leverage it. You become their change agent and are accountable for them.
-
-### Systems thinking and DevOps
-
-All systems include properties that DevOps addresses through its practices and tools. Awareness of these properties helps us properly adapt to DevOps. Let's look at the properties of a system and how DevOps relates to each one.
-
-### How systems work
-
-The figure below represents a system. To reach a goal, the system requires input, which is processed and generates output. Feedback is essential for moving the system toward the goal. Without a purpose, the system dies.
-
-
-
-If an organization is a system, its departments are subsystems. The flow of work moves through each department, starting with identifying a market need (the first input on the left) and moving toward releasing a solution that meets that need (the last output on the right). The output that each department generates serves as required input for the next department in the chain.
-
-The more specialized teams an organization has, the more handoffs happen between departments. The process of generating value to clients is more likely to create bottlenecks and thus it takes longer to deliver value. Also, when work is passed between teams, the gap between the goal and what has been done widens.
-
-DevOps aims to optimize the flow of work throughout the organization to deliver value to clients faster—in other words, DevOps reduces time to market. This is done in part by maximizing automation, but mainly by targeting the organization's goals. This empowers prioritization and reduces duplicated work and other inefficiencies that happen during the delivery process.
-
-### System deterioration
-
-All systems are affected by entropy. Nothing can prevent system degradation; that's irreversible. The tendency to decline shows the failure nature of systems. Moreover, systems are subject to threats of all types, and failure is a matter of time.
-
-To mitigate entropy, systems require constant maintenance and improvements. The effects of entropy can be delayed only when new actions are taken or input is changed.
-
-This pattern of deterioration and its opposite force, survival, can be observed in living organisms, social relationships, and other systems as well as in organizations. In fact, if an organization is not evolving, entropy is guaranteed to be increasing.
-
-DevOps attempts to break the entropy process within an organization by fostering continuous learning and improvement. With DevOps, the organization becomes fault-tolerant because it recognizes the inevitability of failure. DevOps enables a blameless culture that offers the opportunity to learn from failure. The [postmortem][2] is an example of a DevOps practice used by organizations that embrace inherent failure.
-
-The idea of intentionally embracing failure may sound counterintuitive, but that's exactly what happens in techniques like [Chaos Monkey][3]: Failure is intentionally introduced to improve availability and reliability in the system. DevOps suggests that putting some pressure into the system in a controlled way is not a bad thing. Like a muscle that gets stronger with exercise, the system benefits from the challenge.
-
-### System complexity
-
-The figure below shows how complex the systems can be. In most cases, one effect can have multiple causes, and one cause can generate multiple effects. The more elements and interactions a system has, the more complex the system.
-
-
-
-In this scenario, we can't immediately identify the reason for a particular event. Likewise, we can't predict with 100% certainty what will happen if a specific action is taken. We are constantly making assumptions and dealing with hypotheses.
-
-System complexity can be explained using the scientific method. In a recent study, for example, mice that were fed excess salt showed suppressed cerebral blood flow. This same experiment would have had different results if, say, the mice were fed sugar and salt. One variable can radically change results in complex systems.
-
-DevOps handles complexity by encouraging experimentation—for example, using the scientific method—and reducing feedback cycles. Smaller changes inserted into the system can be tested and validated more quickly. With a "[fail-fast][4]" approach, organizations can pivot quickly and achieve resiliency. Reacting rapidly to changes makes organizations more adaptable.
-
-DevOps also aims to minimize guesswork and maximize understanding by making the process of delivering value more tangible. By measuring processes, revealing flaws and advantages, and monitoring as much as possible, DevOps helps organizations discover the changes they need to make.
-
-### System limitations
-
-All systems have constraints that limit their performance; a system's overall capacity is delimited by its restrictions. Most of us have learned from experience that systems operating too long at full capacity can crash, and most systems work better when they function with some slack. Ignoring limitations puts systems at risk. For example, when we are under too much stress for a long time, we get sick. Similarly, overused vehicle engines can be damaged.
-
-This principle also applies to organizations. Unfortunately, organizations can't put everything into a system at once. Although this limitation may sometimes lead to frustration, the quality of work usually improves when input is reduced.
-
-Consider what happened when the speed limit on the main roads in São Paulo, Brazil was reduced from 90 km/h to 70 km/h. Studies showed that the number of accidents decreased by 38.5% and the average speed increased by 8.7%. In other words, the entire road system improved and more vehicles arrived safely at their destinations.
-
-For organizations, DevOps suggests global rather than local improvements. It doesn't matter if some improvement is put after a constraint because there's no effect on the system at all. One constraint that DevOps addresses, for instance, is dependency on specialized teams. DevOps brings to organizations a more collaborative culture, knowledge sharing, and cross-functional teams.
-
-### Conclusion
-
-Before adopting DevOps, understand what is involved and how you want to apply it to your organization. Systems thinking will help you accomplish that while also opening your mind to new possibilities. DevOps may be seen as a popular trend today, but in 10 or 20 years, it will be status quo.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/3/how-apply-systems-thinking-devops
-
-作者:[Gustavo Muniz do Carmo][a]
-译者:[译者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/gustavomcarmo
-[1]:https://opensource.com/tags/devops
-[2]:https://landing.google.com/sre/book/chapters/postmortem-culture.html
-[3]:https://medium.com/netflix-techblog/the-netflix-simian-army-16e57fbab116
-[4]:https://en.wikipedia.org/wiki/Fail-fast
diff --git a/sources/talk/20180315 6 ways a thriving community will help your project succeed.md b/sources/talk/20180315 6 ways a thriving community will help your project succeed.md
deleted file mode 100644
index cf15b7f06f..0000000000
--- a/sources/talk/20180315 6 ways a thriving community will help your project succeed.md
+++ /dev/null
@@ -1,111 +0,0 @@
-6 ways a thriving community will help your project succeed
-======
-
-
-NethServer is an open source product that my company, [Nethesis][1], launched just a few years ago. [The product][2] wouldn't be [what it is today][3] without the vibrant community that surrounds and supports it.
-
-In my previous article, I [discussed what organizations should expect to give][4] if they want to experience the benefits of thriving communities. In this article, I'll describe what organizations should expect to receive in return for their investments in the passionate people that make up their communities.
-
-Let's review six benefits.
-
-### 1\. Innovation
-
-"Open innovation" occurs when a company sharing information also listens to the feedback and suggestions from outside the company. As a company, we don't just look at the crowd for ideas. We innovate in, with, and through communities.
-
-You may know that "[the best way to have a good idea is to have a lot of ideas][5]." You can't always expect to have the right idea on your own, so having different point of views on your product is essential. How many truly disruptive ideas can a small company (like Nethesis) create? We're all young, caucasian, and European—while in our community, we can pick up a set of inspirations from a variety of people, with different genders, backgrounds, skills, and ethnicities.
-
-So the ability to invite the entire world to continuously improve the product is now no longer a dream; it's happening before our eyes. Your community could be the idea factory for innovation. With the community, you can really leverage the power of the collective.
-
-No matter who you are, most of the smartest people work for someone else. And community is the way to reach those smart people and work with them.
-
-### 2\. Research
-
-A community can be your strongest source of valuable product research.
-
-First, it can help you avoid "ivory tower development." [As Stack Exchange co-founder Jeff Atwood has said][6], creating an environment where developers have no idea who the users are is dangerous. Isolated developers, who have worked for years in their high towers, often encounter bad results because they don't have any clue about how users actually use their software. Developing in an Ivory tower keeps you away from your users and can only lead to bad decisions. A community brings developers back to reality and helps them stay grounded. Gone are the days of developers working in isolation with limited resources. In this day and age, thanks to the advent of open source communities research department is opening up to the entire world.
-
-No matter who you are, most of the smartest people work for someone else. And community is the way to reach those smart people and work with them.
-
-Second, a community can be an obvious source of product feedback—always necessary as you're researching potential paths forward. If someone gives you feedback, it means that person cares about you. It's a big gift. The community is a good place to acquire such invaluable feedback. Receiving early feedback is super important, because it reduces the cost of developing something that doesn't work in your target market. You can safely fail early, fail fast, and fail often.
-
-And third, communities help you generate comparisons with other projects. You can't know all the features, pros, and cons of your competitors' offerings. [The community, however, can.][7] Ask your community.
-
-### 3\. Perspective
-
-Communities enable companies to look at themselves and their products [from the outside][8], letting them catch strengths and weaknesses, and mostly realize who their products' audiences really are.
-
-Let me offer an example. When we launched the NethServer, we chose a catchy tagline for it. We were all convinced the following sentence was perfect:
-
-> [NethServer][9] is an operating system for Linux enthusiasts, designed for small offices and medium enterprises.
-
-Two years have passed since then. And we've learned that sentence was an epic fail.
-
-We failed to realize who our audience was. Now we know: NethServer is not just for Linux enthusiasts; actually, Windows users are the majority. It's not just for small offices and medium enterprises; actually, several home users install NethServer for personal use. Our community helps us to fully understand our product and look at it from our users' eyes.
-
-### 4\. Development
-
-In open source communities especially, communities can be a welcome source of product development.
-
-They can, first of all, provide testing and bug reporting. In fact, if I ask my developers about the most important community benefit, they'd answer "testing and bug reporting." Definitely. But because your code is freely available to the whole world, practically anyone with a good working knowledge of it (even hobbyists and other companies) has the opportunity to play with it, tweak it, and constantly improve it (even develop additional modules, as in our case). People can do more than just report bugs; they can fix those bugs, too, if they have the time and knowledge.
-
-But the community doesn't just create code. It can also generate resources like [how-to guides,][10] FAQs, support documents, and case studies. How much would it cost to fully translate your product in seven different languages? At NethServer, we got that for free—thanks to our community members.
-
-### 5\. Marketing
-
-Communities can help your company go global. Our small Italian company, for example, wasn't prepared for a global market. The community got us prepared. For example, we needed to study and improve our English so we could read and write correctly or speak in public without looking foolish for an audience. The community gently forced us to organize [our first NethServer Conference][11], too—only in English.
-
-A strong community can also help your organization attain the holy grail of marketers everywhere: word of mouth marketing (or what Seth Godin calls "[tribal marketing][12]").
-
-Communities ensure that your company's messaging travels not only from company to tribe but also "sideways," from tribe member to potential tribe member. The community will become your street team, spreading word of your organization and its projects to anyone who will listen.
-
-In addition, communities help organizations satisfy one of the most fundamental members needs: the desire to belong, to be involved in something bigger than themselves, and to change the world together.
-
-Never forget that working with communities is always a matter of giving and taking—striking a delicate balance between the company and the community.
-
-### 6\. Loyalty
-
-Attracting new users costs a business five times as much as keeping an existing one. So loyalty can have a huge impact on your bottom line. Quite simply, community helps us build brand loyalty. It's much more difficult to leave a group of people you're connected to than a faceless product or company. In a community, you're building connections with people, which is way more powerful than features or money (trust me!).
-
-### Conclusion
-
-Never forget that working with communities is always a matter of giving and taking—striking a delicate balance between the company and the community.
-
-And I wouldn't be honest with you if I didn't admit that the approach has some drawbacks. Doing everything in the open means moderating, evaluating, and processing of all the data you're receiving. Supporting your members and leading the discussions definitely takes time and resources. But, if you look at what a community enables, you'll see that all this is totally worth the effort.
-
-As my friend and mentor [David Spinks keeps saying over and over again][13], "Companies fail their communities when when they treat community as a tactic instead of making it a core part of their business philosophy." And [as I've said][4]: Communities aren't simply extensions of your marketing teams; "community" isn't an efficient short-term strategy. When community is a core part of your business philosophy, it can do so much more than give you short-term returns.
-
-At Nethesis we experience that every single day. As a small company, we could never have achieved the results we have without our community. Never.
-
-Community can completely set your business apart from every other company in the field. It can redefine markets. It can inspire millions of people, give them a sense of belonging, and make them feel an incredible bond with your company.
-
-And it can make you a whole lot of money.
-
-Community-driven companies will always win. Remember that.
-
-[Subscribe to our weekly newsletter][14] to learn more about open organizations.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/open-organization/18/3/why-build-community-3
-
-作者:[Alessio Fattorini][a]
-译者:[译者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/alefattorini
-[1]:http://www.nethesis.it/
-[2]:https://www.nethserver.org/
-[3]:https://distrowatch.com/table.php?distribution=nethserver
-[4]:https://opensource.com/open-organization/18/2/why-build-community-2
-[5]:https://www.goodreads.com/author/quotes/52938.Linus_Pauling
-[6]:https://blog.codinghorror.com/ivory-tower-development/
-[7]:https://community.nethserver.org/tags/comparison
-[8]:https://community.nethserver.org/t/improve-our-communication/2569
-[9]:http://www.nethserver.org/
-[10]:https://community.nethserver.org/c/howto
-[11]:https://community.nethserver.org/t/nethserver-conference-in-italy-sept-29-30-2017/6404
-[12]:https://www.ted.com/talks/seth_godin_on_the_tribes_we_lead
-[13]:http://cmxhub.com/article/community-business-philosophy-tactic/
-[14]:https://opensource.com/open-organization/resources/newsletter
diff --git a/sources/talk/20180315 Lessons Learned from Growing an Open Source Project Too Fast.md b/sources/talk/20180315 Lessons Learned from Growing an Open Source Project Too Fast.md
deleted file mode 100644
index 6ae7cbea2c..0000000000
--- a/sources/talk/20180315 Lessons Learned from Growing an Open Source Project Too Fast.md
+++ /dev/null
@@ -1,40 +0,0 @@
-Lessons Learned from Growing an Open Source Project Too Fast
-======
-![open source project][1]
-
-Are you managing an open source project or considering launching one? If so, it may come as a surprise that one of the challenges you can face is rapid growth. Matt Butcher, Principal Software Development Engineer at Microsoft, addressed this issue in a presentation at Open Source Summit North America. His talk covered everything from teamwork to the importance of knowing your goals and sticking to them.
-
-Butcher is no stranger to managing open source projects. As [Microsoft invests more deeply into open source][2], Butcher has been involved with many projects, including toolkits for Kubernetes and QueryPath, the jQuery-like library for PHP.
-
-Butcher described a case study involving Kubernetes Helm, a package system for Kubernetes. Helm arose from a company team-building hackathon, with an original team of three people giving birth to it. Within 18 months, the project had hundreds of contributors and thousands of active users.
-
-### Teamwork
-
-“We were stretched to our limits as we learned to grow,” Butcher said. “When you’re trying to set up your team of core maintainers and they’re all trying to work together, you want to spend some actual time trying to optimize for a process that lets you be cooperative. You have to adjust some expectations regarding how you treat each other. When you’re working as a group of open source collaborators, the relationship is not employer/employee necessarily. It’s a collaborative effort.”
-
-In addition to focusing on the right kinds of teamwork, Butcher and his collaborators learned that managing governance and standards is an ongoing challenge. “You want people to understand who makes decisions, how they make decisions and why they make the decisions that they make,” he said. “When we were a small project, there might have been two paragraphs in one of our documents on standards, but as a project grows and you get growing pains, these documented things gain a life of their own. They get their very own repositories, and they just keep getting bigger along with the project.”
-
-Should all discussion surrounding a open source project go on in public, bathed in the hot lights of community scrutiny? Not necessarily, Butcher noted. “A minor thing can get blown into catastrophic proportions in a short time because of misunderstandings and because something that should have been done in private ended up being public,” he said. “Sometimes we actually make architectural recommendations as a closed group. The reason we do this is that we don’t want to miscue the community. The people who are your core maintainers are core maintainers because they’re experts, right? These are the people that have been selected from the community because they understand the project. They understand what people are trying to do with it. They understand the frustrations and concerns of users.”
-
-### Acknowledge Contributions
-
-Butcher added that it is essential to acknowledge people’s contributions to keep the environment surrounding a fast-growing project from becoming toxic. “We actually have an internal rule in our core maintainers guide that says, ‘Make sure that at least one comment that you leave on a code review, if you’re asking for changes, is a positive one,” he said. “It sounds really juvenile, right? But it serves a specific purpose. It lets somebody know, ‘I acknowledge that you just made a gift of your time and your resources.”
-
-Want more tips on successfully launching and managing open source projects? Stay tuned for more insight from Matt Butcher’s talk, in which he provides specific project management issues faced by Kubernetes Helm.
-
-For more information, be sure to check out [The Linux Foundation’s growing list of Open Source Guides for the Enterprise][3], covering topics such as starting an open source project, improving your open source impact, and participating in open source communities.
-
---------------------------------------------------------------------------------
-
-via: https://www.linuxfoundation.org/blog/lessons-learned-from-growing-an-open-source-project-too-fast/
-
-作者:[Sam Dean][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.linuxfoundation.org/author/sdean/
-[1]:https://www.linuxfoundation.org/wp-content/uploads/2018/03/huskies-2279627_1920.jpg
-[2]:https://thenewstack.io/microsoft-shifting-emphasis-open-source/
-[3]:https://www.linuxfoundation.org/resources/open-source-guides/
diff --git a/sources/talk/20180316 How to avoid humiliating newcomers- A guide for advanced developers.md b/sources/talk/20180316 How to avoid humiliating newcomers- A guide for advanced developers.md
deleted file mode 100644
index e433e85d5f..0000000000
--- a/sources/talk/20180316 How to avoid humiliating newcomers- A guide for advanced developers.md
+++ /dev/null
@@ -1,119 +0,0 @@
-How to avoid humiliating newcomers: A guide for advanced developers
-======
-
-
-Every year in New York City, a few thousand young men come to town, dress up like Santa Claus, and do a pub crawl. One year during this SantaCon event, I was walking on the sidewalk and minding my own business, when I saw an extraordinary scene. There was a man dressed up in a red hat and red jacket, and he was talking to a homeless man who was sitting in a wheelchair. The homeless man asked Santa Claus, "Can you spare some change?" Santa dug into his pocket and brought out a $5 bill. He hesitated, then gave it to the homeless man. The homeless man put the bill in his pocket.
-
-In an instant, something went wrong. Santa yelled at the homeless man, "I gave you $5. I wanted to give you one dollar, but five is the smallest I had, so you oughtta be grateful. This is your lucky day, man. You should at least say thank you!"
-
-This was a terrible scene to witness. First, the power difference was terrible: Santa was an able-bodied white man with money and a home, and the other man was black, homeless, and using a wheelchair. It was also terrible because Santa Claus was dressed like the very symbol of generosity! And he was behaving like Santa until, in an instant, something went wrong and he became cruel.
-
-This is not merely a story about Drunk Santa, however; this is a story about technology communities. We, too, try to be generous when we answer new programmers' questions, and every day our generosity turns to rage. Why?
-
-### My cruelty
-
-I'm reminded of my own bad behavior in the past. I was hanging out on my company's Slack when a new colleague asked a question.
-
-> **New Colleague:** Hey, does anyone know how to do such-and-such with MongoDB?
-> **Jesse:** That's going to be implemented in the next release.
-> **New Colleague:** What's the ticket number for that feature?
-> **Jesse:** I memorize all ticket numbers. It's #12345.
-> **New Colleague:** Are you sure? I can't find ticket 12345.
-
-He had missed my sarcasm, and his mistake embarrassed him in front of his peers. I laughed to myself, and then I felt terrible. As one of the most senior programmers at MongoDB, I should not have been setting this example. And yet, such behavior is commonplace among programmers everywhere: We get sarcastic with newcomers, and we humiliate them.
-
-### Why does it matter?
-
-Perhaps you are not here to make friends; you are here to write code. If the code works, does it matter if we are nice to each other or not?
-
-A few months ago on the Stack Overflow blog, David Robinson showed that [Python has been growing dramatically][1], and it is now the top language that people view questions about on Stack Overflow. Even in the most pessimistic forecast, it will far outgrow the other languages this year.
-
-![Projections for programming language popularity][2]
-
-If you are a Python expert, then the line surging up and to the right is good news for you. It does not represent competition, but confirmation. As more new programmers learn Python, our expertise becomes ever more valuable, and we will see that reflected in our salaries, our job opportunities, and our job security.
-
-But there is a danger. There are soon to be more new Python programmers than ever before. To sustain this growth, we must welcome them, and we are not always a welcoming bunch.
-
-### The trouble with Stack Overflow
-
-I searched Stack Overflow for rude answers to beginners' questions, and they were not hard to find.
-
-![An abusive answer on StackOverflow][3]
-
-The message is plain: If you are asking a question this stupid, you are doomed. Get out.
-
-I immediately found another example of bad behavior:
-
-![Another abusive answer on Stack Overflow][4]
-
-Who has never been confused by Unicode in Python? Yet the message is clear: You do not belong here. Get out.
-
-Do you remember how it felt when you needed help and someone insulted you? It feels terrible. And it decimates the community. Some of our best experts leave every day because they see us treating each other this way. Maybe they still program Python, but they are no longer participating in conversations online. This cruelty drives away newcomers, too, particularly members of groups underrepresented in tech who might not be confident they belong. People who could have become the great Python programmers of the next generation, but if they ask a question and somebody is cruel to them, they leave.
-
-This is not in our interest. It hurts our community, and it makes our skills less valuable because we drive people out. So, why do we act against our own interests?
-
-### Why generosity turns to rage
-
-There are a few scenarios that really push my buttons. One is when I act generously but don't get the acknowledgment I expect. (I am not the only person with this resentment: This is probably why Drunk Santa snapped when he gave a $5 bill to a homeless man and did not receive any thanks.)
-
-Another is when answering requires more effort than I expect. An example is when my colleague asked a question on Slack and followed-up with, "What's the ticket number?" I had judged how long it would take to help him, and when he asked for more help, I lost my temper.
-
-These scenarios boil down to one problem: I have expectations for how things are going to go, and when those expectations are violated, I get angry.
-
-I've been studying Buddhism for years, so my understanding of this topic is based in Buddhism. I like to think that the Buddha discussed the problem of expectations in his first tech talk when, in his mid-30s, he experienced a breakthrough after years of meditation and convened a small conference to discuss his findings. He had not rented a venue, so he sat under a tree. The attendees were a handful of meditators the Buddha had met during his wanderings in northern India. The Buddha explained that he had discovered four truths:
-
- * First, that to be alive is to be dissatisfied—to want things to be better than they are now.
- * Second, this dissatisfaction is caused by wants; specifically, by our expectation that if we acquire what we want and eliminate what we do not want, it will make us happy for a long time. This expectation is unrealistic: If I get a promotion or if I delete 10 emails, it is temporarily satisfying, but it does not make me happy over the long-term. We are dissatisfied because every material thing quickly disappoints us.
- * The third truth is that we can be liberated from this dissatisfaction by accepting our lives as they are.
- * The fourth truth is that the way to transform ourselves is to understand our minds and to live a generous and ethical life.
-
-
-
-I still get angry at people on the internet. It happened to me recently, when someone posted a comment on [a video I published about Python co-routines][5]. It had taken me months of research and preparation to create this video, and then a newcomer commented, "I want to master python what should I do."
-
-![Comment on YouTube][6]
-
-This infuriated me. My first impulse was to be sarcastic, "For starters, maybe you could spell Python with a capital P and end a question with a question mark." Fortunately, I recognized my anger before I acted on it, and closed the tab instead. Sometimes liberation is just a Command+W away.
-
-### What to do about it
-
-If you joined a community with the intent to be helpful but on occasion find yourself flying into a rage, I have a method to prevent this. For me, it is the step when I ask myself, "Am I angry?" Knowing is most of the battle. Online, however, we can lose track of our emotions. It is well-established that one reason we are cruel on the internet is because, without seeing or hearing the other person, our natural empathy is not activated. But the other problem with the internet is that, when we use computers, we lose awareness of our bodies. I can be angry and type a sarcastic message without even knowing I am angry. I do not feel my heart pound and my neck grow tense. So, the most important step is to ask myself, "How do I feel?"
-
-If I am too angry to answer, I can usually walk away. As [Thumper learned in Bambi][7], "If you can't say something nice, don't say nothing at all."
-
-### The reward
-
-Helping a newcomer is its own reward, whether you receive thanks or not. But it does not hurt to treat yourself to a glass of whiskey or a chocolate, or just a sigh of satisfaction after your good deed.
-
-But besides our personal rewards, the payoff for the Python community is immense. We keep the line surging up and to the right. Python continues growing, and that makes our own skills more valuable. We welcome new members, people who might not be sure they belong with us, by reassuring them that there is no such thing as a stupid question. We use Python to create an inclusive and diverse community around writing code. And besides, it simply feels good to be part of a community where people treat each other with respect. It is the kind of community that I want to be a member of.
-
-### The three-breath vow
-
-There is one idea I hope you remember from this article: To control our behavior online, we must occasionally pause and notice our feelings. I invite you, if you so choose, to repeat the following vow out loud:
-
-> I vow
-> to take three breaths
-> before I answer a question online.
-
-This article is based on a talk, [Why Generosity Turns To Rage, and What To Do About It][8], that Jesse gave at PyTennessee in February. For more insight for Python developers, attend [PyCon 2018][9], May 9-17 in Cleveland, Ohio.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/3/avoid-humiliating-newcomers
-
-作者:[A. Jesse][a]
-译者:[译者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/emptysquare
-[1]:https://stackoverflow.blog/2017/09/06/incredible-growth-python/
-[2]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/u128651/projections.png?itok=5QTeJ4oe (Projections for programming language popularity)
-[3]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/u128651/abusive-answer-1.jpg?itok=BIWW10Rl (An abusive answer on StackOverflow)
-[4]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/u128651/abusive-answer-2.jpg?itok=0L-n7T-k (Another abusive answer on Stack Overflow)
-[5]:https://www.youtube.com/watch?v=7sCu4gEjH5I
-[6]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/u128651/i-want-to-master-python.png?itok=Y-2u1XwA (Comment on YouTube)
-[7]:https://www.youtube.com/watch?v=nGt9jAkWie4
-[8]:https://www.pytennessee.org/schedule/presentation/175/
-[9]:https://us.pycon.org/2018/
diff --git a/sources/talk/20180320 Easily Fund Open Source Projects With These Platforms.md b/sources/talk/20180320 Easily Fund Open Source Projects With These Platforms.md
deleted file mode 100644
index 8c02ca228b..0000000000
--- a/sources/talk/20180320 Easily Fund Open Source Projects With These Platforms.md
+++ /dev/null
@@ -1,96 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: subject: (Easily Fund Open Source Projects With These Platforms)
-[#]: via: (https://itsfoss.com/open-source-funding-platforms/)
-[#]: author: ([Ambarish Kumar](https://itsfoss.com/author/ambarish/))
-[#]: url: ( )
-
-Easily Fund Open Source Projects With These Platforms
-======
-
-**Brief: We list out some funding platforms you can use to financially support open source projects. **
-
-Financial support is one of the many ways to [help Linux and Open Source community][1]. This is why you see “Donate” option on the websites of most open source projects.
-
-While the big corporations have the necessary funding and resources, most open source projects are developed by individuals in their spare time. However, it does require one’s efforts, time and probably includes some overhead costs too. Monetary supports surely help drive the project development.
-
-If you would like to support open source projects financially, let me show you some platforms dedicated to open source and/or Linux.
-
-### Funding platforms for Open Source projects
-
-![Open Source funding platforms][2]
-
-Just to clarify, we are not associated with any of the funding platforms mentioned here.
-
-#### 1\. Liberapay
-
-[Gratipay][3] was probably the biggest platform for funding open source projects and people associated with the project, which got shut down at the end of the year 2017. However, there’s a fork – Liberapay that works as a recurrent donation platform for the open source projects and the contributors.
-
-[Liberapay][4] is a non-profit, open source organization that helps in a periodic donation to a project. You can create an account as a contributor and ask the people who would really like to help (usually the consumer of your products) to donate.
-
-To receive a donation, you will have to create an account on Liberapay, brief what you do and about your project, reasons for asking for the donation and what will be done with the money you receive.
-
-For someone who would like to donate, they would have to add money to their accounts and set up a period for payment that can be weekly, monthly or yearly to someone. There’s a mail triggered when there is not much left to donate.
-
-The currency supported are dollars and Euro as of now and you can always put up a badge on Github, your Twitter profile or website for a donation.
-
-#### 2\. Bountysource
-
-[Bountysource][5] is a funding platform for open source software that has a unique way of paying a developer for his time and work int he name of Bounties.
-
-There are basically two campaigns, bounties and salt campaign.
-
-Under the Bounties, users declare bounties aka cash prizes on open issues that they believe should be fixed or any new features which they want to see in the software they are using. A developer can then go and fix it to receive the cash prize.
-
-Salt Campaign is like any other funding, anyone can pay a recurring amount to a project or an individual working for an open source project for as long as they want.
-
-Bountysource accepts any software that is approved by Free Software Foundation or Open Source Initiatives. The bounties can be placed using PayPal, Bitcoin or the bounty itself if owned previously. Bountysource supports a no. of issue tracker currently like GitHub, Bugzilla, Google Code, Jira, Launchpad etc.
-
-#### 3\. Open Collective
-
-[Open Collective][6] is another popular funding initiative where a person who is willing to receive the donation for the work he is doing in Open Source world can create a page. He can submit the expense reports for the project he is working on. A contributor can add money to his account and pay him for his expenses.
-
-The complete process is transparent and everyone can track whoever is associated with Open Collective. The contributions are visible along with the unpaid expenses. There is also the option to contribute on a recurring basis.
-
-Open Collective currently has more than 500 collectives being backed up by more than 5000 users.
-
-The fact that it is transparent and you know what you are contributing to, drives more accountability. Some common example of collective include hosting costs, community maintenance, travel expenses etc.
-
-Though Open Collective keeps 10% of all the transactions, it is still a nice way to get your expenses covered in the process of contributing towards an open source project.
-
-#### 4\. Open Source Grants
-
-[Open Source Grants][7] is still in its beta stage and has not matured yet. They are looking for projects that do not have any stable funding and adds value to open source community. Most open source projects are run by a small community in a free time and they are trying to fund them so that the developers can work full time on the projects.
-
-They are equally searching for companies that want to help open source enthusiasts. The process of submitting a project is still being worked upon, and hopefully, in coming days we will see a working way of funding.
-
-### Final Words
-
-In the end, I would also like to mention [Patreon][8]. This funding platform is not exclusive to open source but is focused on creators of all kinds. Some projects like [elementary OS have created their accounts on Patreon][9] so that you can support the project on a recurring basis.
-
-Think Free Speech, not Free Beer. Your small contribution to a project can help it sustain in the long run. For the developers, the above platform can provide a good way to cover up their expenses.
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/open-source-funding-platforms/
-
-作者:[Ambarish Kumar][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://itsfoss.com/author/ambarish/
-[b]: https://github.com/lujun9972
-[1]: https://itsfoss.com/help-linux-grow/
-[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/03/Fund-Open-Source-projects.png?resize=800%2C450&ssl=1
-[3]: https://itsfoss.com/gratipay-open-source/
-[4]: https://liberapay.com/
-[5]: https://www.bountysource.com/
-[6]: https://opencollective.com/
-[7]: https://foundation.travis-ci.org/grants/
-[8]: https://www.patreon.com/
-[9]: https://www.patreon.com/elementary
diff --git a/sources/talk/20180321 8 tips for better agile retrospective meetings.md b/sources/talk/20180321 8 tips for better agile retrospective meetings.md
deleted file mode 100644
index ec45bf17f0..0000000000
--- a/sources/talk/20180321 8 tips for better agile retrospective meetings.md
+++ /dev/null
@@ -1,66 +0,0 @@
-8 tips for better agile retrospective meetings
-======
-
-
-I’ve often thought that retrospectives should be called prospectives, as that term concerns the future rather than focusing on the past. The retro itself is truly future-looking: It’s the space where we can ask the question, “With what we know now, what’s the next experiment we need to try for improving our lives, and the lives of our customers?”
-
-### What’s a retro supposed to look like?
-
-There are two significant loops in product development: One produces the desired potentially shippable nugget. The other is where we examine how we’re working—not only to avoid doing what didn’t work so well, but also to determine how we can amplify the stuff we do well—and devise an experiment to pull into the next production loop to improve how our team is delighting our customers. This is the loop on the right side of this diagram:
-
-
-![Retrospective 1][2]
-
-### When retros implode
-
-While attending various teams' iteration retrospective meetings, I saw a common thread of malcontent associated with a relentless focus on continuous improvement.
-
-One of the engineers put it bluntly: “[Our] continuous improvement feels like we are constantly failing.”
-
-The teams talked about what worked, restated the stuff that didn’t work (perhaps already feeling like they were constantly failing), nodded to one another, and gave long sighs. Then one of the engineers (already late for another meeting) finally summed up the meeting: “Ok, let’s try not to submit all of the code on the last day of the sprint.” There was no opportunity to amplify the good, as the good was not discussed.
-
-In effect, here’s what the retrospective felt like:
-
-
-
-The anti-pattern is where retrospectives become dreaded sessions where we look back at the last iteration, make two columns—what worked and what didn’t work—and quickly come to some solution for the next iteration. There is no [scientific method][3] involved. There is no data gathering and research, no hypothesis, and very little deep thought. The result? You don’t get an experiment or a potential improvement to pull into the next iteration.
-
-### 8 tips for better retrospectives
-
- 1. Amplify the good! Instead of focusing on what didn’t work well, why not begin the retro by having everyone mention one positive item first?
- 2. Don’t jump to a solution. Thinking about a problem deeply instead of trying to solve it right away might be a better option.
- 3. If the retrospective doesn’t make you feel excited about an experiment, maybe you shouldn’t try it in the next iteration.
- 4. If you’re not analyzing how to improve, ([5 Whys][4], [force-field analysis][5], [impact mapping][6], or [fish-boning][7]), you might be jumping to solutions too quickly.
- 5. Vary your methods. If every time you do a retrospective you ask, “What worked, what didn’t work?” and then vote on the top item from either column, your team will quickly get bored. [Retromat][8] is a great free retrospective tool to help vary your methods.
- 6. End each retrospective by asking for feedback on the retro itself. This might seem a bit meta, but it works: Continually improving the retrospective is recursively improving as a team.
- 7. Remove the impediments. Ask how you are enabling the team's search for improvement, and be prepared to act on any feedback.
- 8. There are no "iteration police." Take breaks as needed. Deriving hypotheses from analysis and coming up with experiments involves creativity, and it can be taxing. Every once in a while, go out as a team and enjoy a nice retrospective lunch.
-
-
-
-This article was inspired by [Retrospective anti-pattern: continuous improvement should not feel like constantly failing][9], posted at [Podojo.com][10].
-
-**[See our related story,[How to build a business case for DevOps transformation][11].]**
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/3/tips-better-agile-retrospective-meetings
-
-作者:[Catherine Louis][a]
-译者:[译者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/catherinelouis
-[1]:/file/389021
-[2]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/retro_1.jpg?itok=bggmHN1Q (Retrospective 1)
-[3]:https://en.wikipedia.org/wiki/Scientific_method
-[4]:https://en.wikipedia.org/wiki/5_Whys
-[5]:https://en.wikipedia.org/wiki/Force-field_analysis
-[6]:https://opensource.com/open-organization/17/6/experiment-impact-mapping
-[7]:https://en.wikipedia.org/wiki/Ishikawa_diagram
-[8]:https://plans-for-retrospectives.com/en/?id=28
-[9]:http://www.podojo.com/retrospective-anti-pattern-continuous-improvement-should-not-feel-like-constantly-failing/
-[10]:http://www.podojo.com/
-[11]:https://opensource.com/article/18/2/how-build-business-case-devops-transformation
diff --git a/sources/talk/20180323 7 steps to DevOps hiring success.md b/sources/talk/20180323 7 steps to DevOps hiring success.md
deleted file mode 100644
index cdea0c65ac..0000000000
--- a/sources/talk/20180323 7 steps to DevOps hiring success.md
+++ /dev/null
@@ -1,56 +0,0 @@
-7 steps to DevOps hiring success
-======
-
-
-As many of us in the DevOps scene know, most companies are hiring, or, at least, trying to do so. The required skills and job descriptions can change entirely from company to company. As a broad overview, most teams are looking for a candidate from either an operations and infrastructure background or someone from a software engineering and development background, then combined with key skills relating to continuous integration, configuration management, continuous delivery/deployment, and cloud infrastructure. Currently in high-demand is knowledge of container orchestration.
-
-In the ideal world, the two backgrounds will meet somewhere in the middle to form Dev and Ops, but in most cases, there is a lean toward one side or the other while maintaining sufficient skills to understand the needs and demands of their counterparts to work collaboratively and achieve the end goal of continuous delivery/deployment. Every company is different and there isn’t necessarily a right or wrong here. It all depends on your infrastructure, tech stack, other team members’ skills, and the individual goals you hope to achieve by hiring this individual.
-
-### Focus your hiring
-
-Now, given the various routes to becoming a DevOps practitioner, how do hiring managers focus their search and selection process to ensure that they’re hitting the mark?
-
-#### Decide on the background
-
-Assess the strengths of your existing team. Do you already have some amazing software engineers but you’re lacking the infrastructure knowledge? Aim to close these gaps in skills. You may have been given the budget to hire for DevOps, but you don’t have to spend weeks/months searching for the best software engineer who happens to use Docker and Kubernetes because they are the current hot trends in this space. Find the person who will provide the most value in your environment and go from there.
-
-#### Contractor or permanent employee?
-
-Many hiring managers will automatically start searching for a full-time permanent employee when their needs may suggest that they have other options. Sometimes a contractor is your best bet or maybe contract-hire. If you’re aiming to design, implement and build a new DevOps environment, why not find a senior person who has done this a number of times already? Try hiring a senior contractor and bring on a junior full-time hire in parallel; this way, you’ll be able to retain the external contractor knowledge by having them work alongside the junior hire. Contractors can be expensive, but the knowledge they bring can be invaluable, especially if the work can be completed over a shorter time frame. Again, this is just another point of view and you might be best off with a full-time hire to grow the team.
-
-#### CTRL F is not the solution
-
-Focus on their understanding of DevOps and CI/CD-related processes over specific tools. I believe the best approach is to focus on finding someone who understands the methodologies over the tools. Does your candidate understand the concept of continuous integration or the concept of continuous delivery? That’s more important than asking whether your candidate uses Jenkins versus Bamboo versus TeamCity and so on. Try not to get caught up in the exact tool chain. The focus should be on the candidates’ ability to solve problems. Are they obsessed with increasing efficiency, saving time, automating manual processes and constantly searching for flaws in the system? They might be the person you were looking for, but you missed them because you didn’t see the word "Puppet" on the resume.
-
-#### Work closely with your internal talent acquisition team and/or an external recruiter
-
-Be clear and precise with what you’re looking for and have an ongoing, open communication with recruiters. They can and will help you if used effectively. The job of these recruiters is to save you time by sourcing candidates while you’re focusing on your day-to-day role. Work closely with them and deliver in the same way that you would expect them to deliver for you. If you say you will review a candidate by X time, do it. If they say they’ll have a candidate in your inbox by Y time, make sure they do it, too. Start by setting up an initial call to talk through your requirement, lay out a timeline in which you expect candidates by a specific time, and explain your process in terms of when you will interview, how many interview rounds, and how soon after you will be able to make a final decision on whether to offer or reject the candidates. If you can get this relationship working well, you’ll save lots of time. And make sure your internal teams are focused on supporting your process, not blocking it.
-
-#### $$$
-
-Decide how much you want to pay. It’s not all about the money, but you can waste a lot of your and other people’s time if you don’t lock down the ballpark salary or hourly rate that you can afford. If your budget doesn’t stretch as far as your competitors’, you need to consider what else can help sell the opportunity. Flexible working hours and remote working options are some great ways to do this. Most companies have snacks, beer, and cool offices nowadays, so focus on the real value such as the innovative work your team is doing and how awesome your game-changing product might be.
-
-#### Drop the ego
-
-You may have an amazing company and/or product, but you also have some hot competition. Everyone is hiring in this space and candidates have a lot of the buying power. It is no longer as simple as saying, "We are hiring" and the awesome candidates come flowing in. You need to sell your opportunities. Maintaining a reputation as a great place to work is also important. A poor hiring process, such as interviewing without giving feedback, can contribute to bad rumors being spread across the industry. It only takes a few minutes to leave a sour review on Glassdoor.
-
-#### A smooth process is a successful One
-
-"Let’s get every single person within the company to do a one-hour interview with the new DevOps person we are hiring!" No, let’s not do that. Two or three stages should be sufficient. You have managers and directors for a reason. Trust your instinct and use your experience to make decisions on who will fit into your organization. Some of the most successful companies can do one phone screen followed by an in-person meeting. During the in-person interview, spend a morning or afternoon allowing the candidate to meet the relevant leaders and senior members of their direct team, then take them for lunch, dinner, or drinks where you can see how they are on a social level. If you can’t have a simple conversation with them, then you probably won’t enjoy working with them. If the thumbs are up, make the hire and don’t wait around. A good candidate will usually have numerous offers on the table at the same time.
-
-If all goes well, you should be inviting your shiny new employee or contractor into the office in the next few weeks and hopefully many more throughout the year.
-
-This article was originally published on [DevOps.com][1] and republished with author permission.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/3/7-steps-devops-hiring-success
-
-作者:[Conor Delanbanque][a]
-译者:[译者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/cdelanbanque
-[1]:https://devops.com/7-steps-devops-hiring-success/
diff --git a/sources/talk/20180330 Meet OpenAuto, an Android Auto emulator for Raspberry Pi.md b/sources/talk/20180330 Meet OpenAuto, an Android Auto emulator for Raspberry Pi.md
deleted file mode 100644
index bac0819e74..0000000000
--- a/sources/talk/20180330 Meet OpenAuto, an Android Auto emulator for Raspberry Pi.md
+++ /dev/null
@@ -1,81 +0,0 @@
-Meet OpenAuto, an Android Auto emulator for Raspberry Pi
-======
-
-
-In 2015, Google introduced [Android Auto][1], a system that allows users to project certain apps from their Android smartphones onto a car's infotainment display. Android Auto's driver-friendly interface, with larger touchscreen buttons and voice commands, aims to make it easier and safer for drivers to control navigation, music, podcasts, radio, phone calls, and more while keeping their eyes on the road. Android Auto can also run as an app on an Android smartphone, enabling owners of older-model vehicles without modern head unit displays to take advantage of these features.
-
-While there are many [apps][2] available for Android Auto, developers are working to add to its catalog. A new, open source tool named [OpenAuto][3] is hoping to make that easier by giving developers a way to emulate Android Auto on a Raspberry Pi. With OpenAuto, developers can test their applications in conditions similar to how they'll work on an actual car head unit.
-
-OpenAuto's creator, Michal Szwaj, answered some questions about his project for Opensource.com. Some responses have been edited for conciseness and clarity.
-
-### What is OpenAuto?
-
-In a nutshell, OpenAuto is an emulator for the Android Auto head unit. It emulates the head unit software and allows you to use Android Auto on your PC or on any other embedded platform like Raspberry Pi 3.
-
-Head unit software is a frontend for the Android Auto projection. All magic related to the Android Auto, like navigation, Google Voice Assistant, or music playback, is done on the Android device. Projection of Android Auto on the head unit is accomplished using the [H.264][4] codec for video and [PCM][5] codec for audio streaming. This is what the head unit software mostly does—it decodes the H.264 video stream and PCM audio streams and plays them back together. Another function of the head unit is providing user inputs. OpenAuto supports both touch events and hard keys.
-
-### What platforms does OpenAuto run on?
-
-My target platform for deployment of the OpenAuto is Raspberry Pi 3 computer. For successful deployment, I needed to implement support of video hardware acceleration using the Raspberry Pi 3 GPU (VideoCore 4). Thanks to this, Android Auto projection on the Raspberry Pi 3 computer can be handled even using 1080p@60 fps resolution. I used [OpenMAX IL][6] and IL client libraries delivered together with the Raspberry Pi firmware to implement video hardware acceleration.
-
-Taking advantage of the fact that the Raspberry Pi operating system is Raspbian based on Debian Linux, OpenAuto can be also built for any other Linux-based platform that provides support for hardware video decoding. Most of the Linux-based platforms provide support for hardware video decoding directly in GStreamer. Thanks to highly portable libraries like Boost and [Qt][7], OpenAuto can be built and run on the Windows platform. Support of MacOS is being implemented by the community and should be available soon.
-
-![][https://www.youtube.com/embed/k9tKRqIkQs8?origin=https://opensource.com&enablejsapi=1]
-
-### What software libraries does the project use?
-
-The core of the OpenAuto is the [aasdk][8] library, which provides support for all Android Auto features. aasdk library is built on top of the Boost, libusb, and OpenSSL libraries. [libusb][9] implements communication between the head unit and an Android device (via USB bus). [Boost][10] provides support for the asynchronous mechanisms for communication. It is required for high efficiency and scalability of the head unit software. [OpenSSL][11] is used for encrypting communication.
-
-The aasdk library is designed to be fully reusable for any purposes related to implementation of the head unit software. You can use it to build your own head unit software for your desired platform.
-
-Another very important library used in OpenAuto is Qt. It provides support for OpenAuto's multimedia, user input, and graphical interface. And the build system OpenAuto is using is [CMake][12].
-
-Note: The Android Auto protocol is taken from another great Android Auto head unit project called [HeadUnit][13]. The people working on this project did an amazing job in reverse engineering the AndroidAuto protocol and creating the protocol buffers that structurize all messages.
-
-### What equipment do you need to run OpenAuto on Raspberry Pi?
-
-In addition to a Raspberry Pi 3 computer and an Android device, you need:
-
- * **USB sound card:** The Raspberry Pi 3 doesn't have a microphone input, which is required to use Google Voice Assistant
- * **Video output device:** You can use either a touchscreen or any other video output device connected to HDMI or composite output (RCA)
- * **Input device:** For example, a touchscreen or a USB keyboard
-
-
-
-### What else do you need to get started?
-
-In order to use OpenAuto, you must build it first. On the OpenAuto's wiki page you can find [detailed instructions][14] for how to build it for the Raspberry Pi 3 platform. On other Linux-based platforms, the build process will look very similar.
-
-On the wiki page you can also find other useful instructions, such as how to configure the Bluetooth Hands-Free Profile (HFP) and Advanced Audio Distribution Profile (A2DP) and PulseAudio.
-
-### What else should we know about OpenAuto?
-
-OpenAuto allows anyone to create a head unit based on the Raspberry Pi 3 hardware. Nevertheless, you should always be careful about safety and keep in mind that OpenAuto is just an emulator. It was not certified by any authority and was not tested in a driving environment, so using it in a car is not recommended.
-
-OpenAuto is licensed under GPLv3. For more information, visit the [project's GitHub page][3], where you can find its source code and other information.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/3/openauto-emulator-Raspberry-Pi
-
-作者:[Michal Szwaj][a]
-译者:[译者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/michalszwaj
-[1]:https://www.android.com/auto/faq/
-[2]:https://play.google.com/store/apps/collection/promotion_3001303_android_auto_all
-[3]:https://github.com/f1xpl/openauto
-[4]:https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC
-[5]:https://en.wikipedia.org/wiki/Pulse-code_modulation
-[6]:https://www.khronos.org/openmaxil
-[7]:https://www.qt.io/
-[8]:https://github.com/f1xpl/aasdk
-[9]:http://libusb.info/
-[10]:http://www.boost.org/
-[11]:https://www.openssl.org/
-[12]:https://cmake.org/
-[13]:https://github.com/gartnera/headunit
-[14]:https://github.com/f1xpl/
diff --git a/sources/talk/20180403 3 pitfalls everyone should avoid with hybrid multicloud.md b/sources/talk/20180403 3 pitfalls everyone should avoid with hybrid multicloud.md
deleted file mode 100644
index b128be62f0..0000000000
--- a/sources/talk/20180403 3 pitfalls everyone should avoid with hybrid multicloud.md
+++ /dev/null
@@ -1,87 +0,0 @@
-3 pitfalls everyone should avoid with hybrid multicloud
-======
-
-
-This article was co-written with [Roel Hodzelmans][1].
-
-We're all told the cloud is the way to ensure a digital future for our businesses. But which cloud? From cloud to hybrid cloud to hybrid multi-cloud, you need to make choices, and these choices don't preclude the daily work of enhancing your customers' experience or agile delivery of the applications they need.
-
-This article is the first in a four-part series on avoiding pitfalls in hybrid multi-cloud computing. Let's start by examining multi-cloud, hybrid cloud, and hybrid multi-cloud and what makes them different from one another.
-
-### Hybrid vs. multi-cloud
-
-There are many conversations you may be having in your business around moving to the cloud. For example, you may want to take your on-premises computing capacity and turn it into your own private cloud. You may wish to provide developers with a cloud-like experience using the same resources you already have. A more traditional reason for expansion is to use external computing resources to augment those in your own data centers. The latter leads you to the various public cloud providers, as well as to our first definition, multi-cloud.
-
-#### Multi-cloud
-
-Multi-cloud means using multiple clouds from multiple providers for multiple tasks.
-
-![Multi-cloud][3]
-
-Figure 1. Multi-cloud IT with multiple isolated cloud environments
-
-Typically, multi-cloud refers to the use of several different public clouds in order to achieve greater flexibility, lower costs, avoid vendor lock-in, or use specific regional cloud providers.
-
-A challenge of the multi-cloud approach is achieving consistent policies, compliance, and management with different providers involved.
-
-Multi-cloud is mainly a strategy to expand your business while leveraging multi-vendor cloud solutions and spreading the risk of lock-in. Figure 1 shows the isolated nature of cloud services in this model, without any sort of coordination between the services and business applications. Each is managed separately, and applications are isolated to services found in their environments.
-
-#### Hybrid cloud
-
-Hybrid cloud solves issues where isolation and coordination are central to the solution. It is a combination of one or more public and private clouds with at least a degree of workload portability, integration, orchestration, and unified management.
-
-![Hybrid cloud][5]
-
-Figure 2. Hybrid clouds may be on or off premises, but must have a degree of interoperability
-
-The key issue here is that there is an element of interoperability, migration potential, and a connection between tasks running in public clouds and on-premises infrastructure, even if it's not always seamless or otherwise fully implemented.
-
-If your cloud model is missing portability, integration, orchestration, and management, then it's just a bunch of clouds, not a hybrid cloud.
-
-The cloud environments in Fig. 2 include at least one private and public cloud. They can be off or on premises, but they have some degree of the following:
-
- * Interoperability
- * Application portability
- * Data portability
- * Common management
-
-
-
-As you can probably guess, combining multi-cloud and hybrid cloud results in a hybrid multi-cloud. But what does that look like?
-
-### Hybrid multi-cloud
-
-Hybrid multi-cloud pulls together multiple clouds and provides the tools to ensure interoperability between the various services in hybrid and multi-cloud solutions.
-
-![Hybrid multi-cloud][7]
-
-Figure 3. Hybrid multi-cloud solutions using open technologies
-
-Bringing these together can be a serious challenge, but the result ensures better use of resources without isolation in their respective clouds.
-
-Fig. 3 shows an example of hybrid multi-cloud based on open technologies for interoperability, workload portability, and management.
-
-### Moving forward: Pitfalls of hybrid multi-cloud
-
-In part two of this series, we'll look at the first of three pitfalls to avoid with hybrid multi-cloud. Namely, why cost is not always the obvious motivator when determining how to transition your business to the cloud.
-
-This article is based on "[3 pitfalls everyone should avoid with hybrid multi-cloud][8]," a talk the authors will be giving at [Red Hat Summit 2018][9], which will be held May 8-10 in San Francisco. [Register by May 7][9] to save US$ 500 off of registration. Use discount code **OPEN18** on the payment page to apply the discount.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/4/pitfalls-hybrid-multi-cloud
-
-作者:[Eric D.Schabell][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/eschabell
-[1]:https://opensource.com/users/roelh
-[3]:https://opensource.com/sites/default/files/u128651/multi-cloud.png (Multi-cloud)
-[5]:https://opensource.com/sites/default/files/u128651/hybrid-cloud.png (Hybrid cloud)
-[7]:https://opensource.com/sites/default/files/u128651/hybrid-multicloud.png (Hybrid multi-cloud)
-[8]:https://agenda.summit.redhat.com/SessionDetail.aspx?id=153892
-[9]:https://www.redhat.com/en/summit/2018
diff --git a/sources/talk/20180404 Is the term DevSecOps necessary.md b/sources/talk/20180404 Is the term DevSecOps necessary.md
deleted file mode 100644
index 96b544e7c4..0000000000
--- a/sources/talk/20180404 Is the term DevSecOps necessary.md
+++ /dev/null
@@ -1,51 +0,0 @@
-Is the term DevSecOps necessary?
-======
-
-
-First came the term "DevOps."
-
-It has many different aspects. For some, [DevOps][1] is mostly about a culture valuing collaboration, openness, and transparency. Others focus more on key practices and principles such as automating everything, constantly iterating, and instrumenting heavily. And while DevOps isn’t about specific tools, certain platforms and tooling make it a more practical proposition. Think containers and associated open source cloud-native technologies like [Kubernetes][2] and CI/CD pipeline tools like [Jenkins][3]—as well as native Linux capabilities.
-
-However, one of the earliest articulated concepts around DevOps was the breaking down of the “wall of confusion” specifically between developers and operations teams. This was rooted in the idea that developers didn’t think much about operational concerns and operators didn’t think much about application development. Add the fact that developers want to move quickly and operators care more about (and tend to be measured on) stability than speed, and it’s easy to see why it was difficult to get the two groups on the same page. Hence, DevOps came to symbolize developers and operators working more closely together, or even merging roles to some degree.
-
-Of course, calls for improved communications and better-integrated workflows were never just about dev and ops. Business owners should be part of conversations as well. And there are the actual users of the software. Indeed, you can write up an almost arbitrarily long list of stakeholders concerned with the functionality, cost, reliability, and other aspects of software and its associated infrastructure. Which raises the question that many have asked: “What’s so special about security that we need a DevSecOps term?”
-
-I’m glad you asked.
-
-The first is simply that it serves as a useful reminder. If developers and operations were historically two of the most common silos in IT organizations, security was (and often still is) another. Security people are often thought of as conservative gatekeepers for whom “no” often seems the safest response to new software releases and technologies. Security’s job is to protect the company, even if that means putting the brakes on a speedy development process.
-
-Many aspects of traditional security, and even its vocabulary, can also seem arcane to non-specialists. This has also contributed to the notion that security is something apart from mainstream IT. I often share the following anecdote: A year or two ago I was leading a security discussion at a [DevOpsDays][4] event in London in which we were talking about traditional security roles. One of the participants raised his hand and admitted that he was one of those security gatekeepers. He went on to say that this was the first time in his career that he had ever been to a conference that wasn’t a traditional security conference like RSA. (He also noted that he was going to broaden both his and his team’s horizons more.)
-
-So DevSecOps perhaps shouldn’t be a needed term. But explicitly calling it out seems like a good practice at a time when software security threats are escalating.
-
-The second reason is that the widespread introduction of cloud-native technologies, particularly those built around containers, are closely tied to DevOps practices. These new technologies are both leading to and enabling greater scale and more dynamic infrastructures. Static security policies and checklists no longer suffice. Security must become a continuous activity. And it must be considered at every stage of your application and infrastructure lifecycle.
-
-**Here are a few examples:**
-
-You need to secure the pipeline and applications. You need to use trusted sources for content so that you know who has signed off on container images and that they’re up-to-date with the most recent patches. Your continuous integration system must integrate automated security testing. You’ll sometimes hear people talking about “shifting security left,” which means earlier in the process so that problems can be dealt with sooner. But it’s actually better to think about embedding security throughout the entire pipeline at each step of the testing, integration, deployment, and ongoing management process.
-
-You need to secure the underlying infrastructure. This means securing the host Linux kernel from container escapes and securing containers from each other. It means using a container orchestration platform with integrated security features. It means defending the network by using network namespaces to isolate applications from other applications within a cluster and isolate environments (such as dev, test, and production) from each other.
-
-And it means taking advantage of the broader security ecosystem such as container content scanners and vulnerability management tools.
-
-In short, it’s DevSecOps because modern application development and container platforms require a new type of Dev and a new type of Ops. But they also require a new type of Sec. Thus, DevSecOps.
-
-**[See our related story,[Security and the SRE: How chaos engineering can play a key role][5].]**
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/4/devsecops
-
-作者:[Gordon Haff][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-选题:[lujun9972](https://github.com/lujun9972)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/ghaff
-[1]:https://opensource.com/resources/devops
-[2]:https://kubernetes.io/
-[3]:https://jenkins.io/
-[4]:https://www.devopsdays.org/
-[5]:https://opensource.com/article/18/3/through-looking-glass-security-sre
diff --git a/sources/talk/20180405 Rethinking -ownership- across the organization.md b/sources/talk/20180405 Rethinking -ownership- across the organization.md
deleted file mode 100644
index d41a3a86dc..0000000000
--- a/sources/talk/20180405 Rethinking -ownership- across the organization.md
+++ /dev/null
@@ -1,125 +0,0 @@
-Rethinking "ownership" across the organization
-======
-
-
-Differences in organizational design don't necessarily make some organizations better than others—just better suited to different purposes. Any style of organization must account for its models of ownership (the way tasks get delegated, assumed, executed) and responsibility (the way accountability for those tasks gets distributed and enforced). Conventional organizations and open organizations treat these issues differently, however, and those difference can be jarring for anyone hopping transitioning from one organizational model to another. But transitions are ripe for stumbling over—oops, I mean, learning from.
-
-Let's do that.
-
-### Ownership explained
-
-In most organizations (and according to typical project management standards), work on projects proceeds in five phases:
-
- * Initiation: Assess project feasibility, identify deliverables and stakeholders, assess benefits
- * Planning (Design): Craft project requirements, scope, and schedule; develop communication and quality plans
- * Executing: Manage task execution, implement plans, maintain stakeholder relationships
- * Monitoring/Controlling: Manage project performance, risk, and quality of deliverables
- * Closing: Sign-off on completion requirements, release resources
-
-
-
-The list above is not exhaustive, but I'd like to add one phase that is often overlooked: the "Adoption" phase, frequently needed for strategic projects where a change to the culture or organization is required for "closing" or completion.
-
- * Adoption: Socializing the work of the project; providing communication, training, or integration into processes and standard workflows.
-
-
-
-Examining project phases is one way contrast the expression of ownership and responsibility in organizations.
-
-### Two models, contrasted
-
-In my experience, "ownership" in a traditional software organization works like this.
-
-A manager or senior technical associate initiates a project with senior stakeholders and, with the authority to champion and guide the project, they bestow the project on an associate at some point during the planning and execution stages. Frequently, but not always, the groundwork or fundamental design of the work has already been defined and approved—sometimes even partially solved. Employees are expected to see the project through execution and monitoring to completion.
-
-Employees cut their teeth on a "starter project," where they prove their abilities to a management chain (for example, I recall several such starter projects that were already defined by a manager and architect, and I was assigned to help implement them). Employees doing a good job on a project for which they're responsible get rewarded with additional opportunities, like a coveted assignment, a new project, or increased responsibility.
-
-An associate acting as "owner" of work is responsible and accountable for that work (if someone, somewhere, doesn't do their job, then the responsible employee either does the necessary work herself or alerts a manager to the problem.) A sense of ownership begins to feel stable over time: Employees generally work on the same projects, and in the same areas for an extended period. For some employees, it means the development of deep expertise. That's because the social network has tighter integration between people and the work they do, so moving around and changing roles and projects is rather difficult.
-
-This process works differently in an open organization.
-
-Associates continually define the parameters of responsibility and ownership in an open organization—typically in light of their interests and passions. Associates have more agency to perform all the stages of the project themselves, rather than have pre-defined projects assigned to them. This places additional emphasis on leadership skills in an open organization, because the process is less about one group of people making decisions for others, and more about how an associate manages responsibilities and ownership (whether or not they roughly follow the project phases while being inclusive, adaptable, and community-focused, for example).
-
-Being responsible for all project phases can make ownership feel more risky for associates in an open organization. Proposing a new project, designing it, and leading its implementation takes initiative and courage—especially when none of this is pre-defined by leadership. It's important to get continuous buy-in, which comes with questions, criticisms, and resistance not only from leaders but also from peers. By default, in open organizations this makes associates leaders; they do much the same work that higher-level leaders do in conventional organizations. And incidentally, this is why Jim Whitehurst, in The Open Organization, cautions us about the full power of "transparency" and the trickiness of getting people's real opinions and thoughts whether we like them or not. The risk is not as high in a traditional organization, because in those organizations leaders manage some of it by shielding associates from heady discussions that arise.
-
-The reward in an Open Organization is more opportunity—offers of new roles, promotions, raises, etc., much like in a conventional organization. Yet in the case of open organizations, associates have developed reputations of excellence based on their own initiatives, rather than on pre-sanctioned opportunities from leadership.
-
-### Thinking about adoption
-
-Any discussion of ownership and responsibility involves addressing the issue of buy-in, because owning a project means we are accountable to our sponsors and users—our stakeholders. We need our stakeholders to buy-into our idea and direction, or we need users to adopt an innovation we've created with our stakeholders. Achieving buy-in for ideas and work is important in each type of organization, and it's difficult in both traditional and open systems—but for different reasons.
-
-Open organizations better allow highly motivated associates, who are ambitious and skilled, to drive their careers. But support for their ideas is required across the organization, rather than from leadership alone.
-
-Penetrating a traditional organization's closely knit social ties can be difficult, and it takes time. In such "command-and-control" environments, one would think that employees are simply "forced" to do whatever leaders want them to do. In some cases that's true (e.g., a travel reimbursement system). However, with more innovative programs, this may not be the case; the adoption of a program, tool, or process can be difficult to achieve by fiat, just like in an open organization. And yet these organizations tend to reduce redundancies of work and effort, because "ownership" here involves leaders exerting responsibility over clearly defined "domains" (and because those domains don't change frequently, knowing "who's who"—who's in charge, who to contact with a request or inquiry or idea—can be easier).
-
-Open organizations better allow highly motivated associates, who are ambitious and skilled, to drive their careers. But support for their ideas is required across the organization, rather than from leadership alone. Points of contact and sources of immediate support can be less obvious, and this means achieving ownership of a project or acquiring new responsibility takes more time. And even then someone's idea may never get adopted. A project's owner can change—and the idea of "ownership" itself is more flexible. Ideas that don't get adopted can even be abandoned, leaving a great idea unimplemented or incomplete. Because any associate can "own" an idea in an open organization, these organizations tend to exhibit more redundancy. (Some people immediately think this means "wasted effort," but I think it can augment the implementation and adoption of innovative solutions. By comparing these organizations, we can also see why Jim Whitehurst calls this kind of culture "chaotic" in The Open Organization).
-
-### Two models of ownership
-
-In my experience, I've seen very clear differences between conventional and open organizations when it comes to the issues of ownership and responsibility.
-
-In an traditional organization:
-
- * I couldn't "own" things as easily
- * I felt frustrated, wanting to take initiative and always needing permission
- * I could more easily see who was responsible because stakeholder responsibility was more clearly sanctioned and defined
- * I could more easily "find" people, because the organizational network was more fixed and stable
- * I more clearly saw what needed to happen (because leadership was more involved in telling me).
-
-
-
-Over time, I've learned the following about ownership and responsibility in an open organization:
-
- * People can feel good about what they are doing because the structure rewards behavior that's more self-driven
- * Responsibility is less clear, especially in situations where there's no leader
- * In cases where open organizations have "shared responsibility," there is the possibility that no one in the group identified with being responsible; often there is lack of role clarity ("who should own this?")
- * More people participate
- * Someone's leadership skills must be stronger because everyone is "on their own"; you are the leader.
-
-
-
-### Making it work
-
-On the subject of ownership, each type of organization can learn from the other. The important thing to remember here: Don't make changes to one open or conventional value without considering all the values in both organizations.
-
-Sound confusing? Maybe these tips will help.
-
-If you're a more conventional organization trying to act more openly:
-
- * Allow associates to take ownership out of passion or interest that align with the strategic goals of the organization. This enactment of meritocracy can help them build a reputation for excellence and execution.
- * But don't be afraid sprinkle in a bit of "high-level perspective" in the spirit of transparency; that is, an associate should clearly communicate plans to their leadership, so the initiative doesn't create irrelevant or unneeded projects.
- * Involving an entire community (as when, for example, the associate gathers feedback from multiple stakeholders and user groups) aids buy-in and creates beneficial feedback from the diversity of perspectives, and this helps direct the work.
- * Exploring the work with the community [doesn't mean having to come to consensus with thousands of people][1]. Use the [Open Decision Framework][2] to set limits and be transparent about what those limits are so that feedback and participation is organized ad boundaries are understood.
-
-
-
-If you're already an open organization, then you should remember:
-
- * Although associates initiate projects from "the bottom up," leadership needs to be involved to provide guidance, input to the vision, and circulate centralized knowledge about ownership and responsibility creating a synchronicity of engagement that is transparent to the community.
- * Ownership creates responsibility, and the definition and degree of these should be something both associates and leaders agree upon, increasing the transparency of expectations and accountability during the project. Don't make this a matter of oversight or babysitting, but rather [a collaboration where both parties give and take][3]—associates initiate, leaders guide; associates own, leaders support.
-
-
-
-Leadership education and mentorship, as it pertains to a particular organization, needs to be available to proactive associates, especially since there is often a huge difference between supporting individual contributors and guiding and coordinating a multiplicity of contributions.
-
-["Owning your own career"][4] can be difficult when "ownership" isn't a concept an organization completely understands.
-
-[Subscribe to our weekly newsletter][5] to learn more about open organizations.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/open-organization/18/4/rethinking-ownership-across-organization
-
-作者:[Heidi Hess von Ludewig][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-选题:[lujun9972](https://github.com/lujun9972)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/heidi-hess-von-ludewig
-[1]:https://opensource.com/open-organization/17/8/achieving-alignment-in-openorg
-[2]:https://opensource.com/open-organization/resources/open-decision-framework
-[3]:https://opensource.com/open-organization/17/11/what-is-collaboration
-[4]:https://opensource.com/open-organization/17/12/drive-open-career-forward
-[5]:https://opensource.com/open-organization/resources/newsletter
diff --git a/sources/talk/20180410 Microservices Explained.md b/sources/talk/20180410 Microservices Explained.md
deleted file mode 100644
index 1d7e946a12..0000000000
--- a/sources/talk/20180410 Microservices Explained.md
+++ /dev/null
@@ -1,61 +0,0 @@
-Microservices Explained
-======
-
-
-Microservices is not a new term. Like containers, the concept been around for a while, but it’s become a buzzword recently as many companies embark on their cloud native journey. But, what exactly does the term microservices mean? Who should care about it? In this article, we’ll take a deep dive into the microservices architecture.
-
-### Evolution of microservices
-
-Patrick Chanezon, Chief Developer Advocate for Docker provided a brief history lesson during our conversation: In the late 1990s, developers started to structure their applications into monoliths where massive apps hadall features and functionalities baked into them. Monoliths were easy to write and manage. Companies could have a team of developers who built their applications based on customer feedback through sales and marketing teams. The entire developer team would work together to build tightly glued pieces as an app that can be run on their own app servers. It was a popular way of writing and delivering web applications.
-
-There is a flip side to the monolithic coin. Monoliths slow everything and everyone down. It’s not easy to update one service or feature of the application. The entire app needs to be updated and a new version released. It takes time. There is a direct impact on businesses. Organizations could not respond quickly to keep up with new trends and changing market dynamics. Additionally, scalability was challenging.
-
-Around 2011, SOA (Service Oriented Architecture) became popular where developers could cram multi-tier web applications as software services inside a VM (virtual machine). It did allow them to add or update services independent of each other. However, scalability still remained a problem.
-
-“The scale out strategy then was to deploy multiple copies of the virtual machine behind a load balancer. The problems with this model are several. Your services can not scale or be upgraded independently as the VM is your lowest granularity for scale. VMs are bulky as they carry extra weight of an operating system, so you need to be careful about simply deploying multiple copies of VMs for scaling,” said Madhura Maskasky, co-founder and VP of Product at Platform9.
-
-Some five years ago when Docker hit the scene and containers became popular, SOA faded out in favor of “microservices” architecture. “Containers and microservices fix a lot of these problems. Containers enable deployment of microservices that are focused and independent, as containers are lightweight. The Microservices paradigm, combined with a powerful framework with native support for the paradigm, enables easy deployment of independent services as one or more containers as well as easy scale out and upgrade of these,” said Maskasky.
-
-### What’s are microservices?
-
-Basically, a microservice architecture is a way of structuring applications. With the rise of containers, people have started to break monoliths into microservices. “The idea is that you are building your application as a set of loosely coupled services that can be updated and scaled separately under the container infrastructure,” said Chanezon.
-
-“Microservices seem to have evolved from the more strictly defined service-oriented architecture (SOA), which in turn can be seen as an expression object oriented programming concepts for networked applications. Some would call it just a rebranding of SOA, but the term “microservices” often implies the use of even smaller functional components than SOA, RESTful APIs exchanging JSON, lighter-weight servers (often containerized, and modern web technologies and protocols,” said Troy Topnik, SUSE Senior Product Manager, Cloud Application Platform.
-
-Microservices provides a way to scale development and delivery of large, complex applications by breaking them down that allows the individual components to evolve independently from each other.
-
-“Microservices architecture brings more flexibility through the independence of services, enabling organizations to become more agile in how they deliver new business capabilities or respond to changing market conditions. Microservices allows for using the ‘right tool for the right task’, meaning that apps can be developed and delivered by the technology that will be best for the task, rather than being locked into a single technology, runtime or framework,” said Christian Posta, senior principal application platform specialist, Red Hat.
-
-### Who consumes microservices?
-
-“The main consumers of microservices architecture patterns are developers and application architects,” said Topnik. As far as admins and DevOps engineers are concerned their role is to build and maintain the infrastructure and processes that support microservices.
-
-“Developers have been building their applications traditionally using various design patterns for efficient scale out, high availability and lifecycle management of their applications. Microservices done along with the right orchestration framework help simplify their lives by providing a lot of these features out of the box. A well-designed application built using microservices will showcase its benefits to the customers by being easy to scale, upgrade, debug, but without exposing the end customer to complex details of the microservices architecture,” said Maskasky.
-
-### Who needs microservices?
-
-Everyone. Microservices is the modern approach to writing and deploying applications more efficiently. If an organization cares about being able to write and deploy its services at a faster rate they should care about it. If you want to stay ahead of your competitors, microservices is the fastest route. Security is another major benefit of the microservices architecture, as this approach allows developers to keep up with security and bug fixes, without having to worry about downtime.
-
-“Application developers have always known that they should build their applications in a modular and flexible way, but now that enough of them are actually doing this, those that don’t risk being left behind by their competitors,” said Topnik.
-
-If you are building a new application, you should design it as microservices. You never have to hold up a release if one team is late. New functionalities are available when they're ready, and the overall system never breaks.
-
-“We see customers using this as an opportunity to also fix other problems around their application deployment -- such as end-to-end security, better observability, deployment and upgrade issues,” said Maskasky.
-
-Failing to do so means you would be stuck in the traditional stack, which means microservices won’t be able to add any value to it. If you are building new applications, microservices is the way to go.
-
-Learn more about cloud-native at [KubeCon + CloudNativeCon Europe][1], coming up May 2-4 in Copenhagen, Denmark.
-
---------------------------------------------------------------------------------
-
-via: https://www.linux.com/blog/2018/4/microservices-explained
-
-作者:[SWAPNIL BHARTIYA][a]
-译者:[runningwater](https://github.com/runningwater)
-校对:[校对者ID](https://github.com/校对者ID)
-选题:[lujun9972](https://github.com/lujun9972)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.linux.com/users/arnieswap
-[1]:https://events.linuxfoundation.org/events/kubecon-cloudnativecon-europe-2018/attend/register/
diff --git a/sources/talk/20180412 Management, from coordination to collaboration.md b/sources/talk/20180412 Management, from coordination to collaboration.md
deleted file mode 100644
index 1262f88300..0000000000
--- a/sources/talk/20180412 Management, from coordination to collaboration.md
+++ /dev/null
@@ -1,71 +0,0 @@
-Management, from coordination to collaboration
-======
-
-
-
-Any organization is fundamentally a pattern of interactions between people. The nature of those interactions—their quality, their frequency, their outcomes—is the most important product an organization can create. Perhaps counterintuitively, recognizing this fact has never been more important than it is today—a time when digital technologies are reshaping not only how we work but also what we do when we come together.
-
-
-And yet many organizational leaders treat those interactions between people as obstacles or hindrances to avoid or eliminate, rather than as the powerful sources of innovation they really are.
-
-That's why we're observing that some of the most successful organizations today are those capable of shifting the way they think about the value of the interactions in the workplace. And to do that, they've radically altered their approach to management and leadership.
-
-### Moving beyond mechanical management
-
-Simply put, traditionally managed organizations treat unanticipated interactions between stakeholders as potentially destructive forces—and therefore as costs to be mitigated.
-
-This view has a long, storied history in the field of economics. But it's perhaps nowhere more clear than in the early writing of Nobel Prize-winning economist[Ronald Coase][1]. In 1937, Coase published "[The Nature of the Firm][2]," an essay about the reasons people organized into firms to work on large-scale projects—rather than tackle those projects alone. Coase argued that when the cost of coordinating workers together inside a firm is less than that of similar market transactions outside, people will tend to organize so they can reap the benefits of lower operating costs.
-
-But at some point, Coase's theory goes, the work of coordinating interactions between so many people inside the firm actually outweighs the benefits of having an organization in the first place. The complexity of those interactions becomes too difficult to handle. Management, then, should serve the function of decreasing this complexity. Its primary goal is coordination, eliminating the costs associated with messy interpersonal interactions that could slow the firm and reduce its efficiency. As one Fortune 100 CEO recently told me, "Failures happen most often around organizational handoffs."
-
-This makes sense to people practicing what I've called "[mechanical management][3]," where managing people is the act of keeping them focused on specific, repeatable, specialized tasks. Here, management's key function is optimizing coordination costs—ensuring that every specialized component of the finely-tuned organizational machine doesn't impinge on the others and slow them down. Managers work to avoid failures by coordinating different functions across the organization (accounts payable, research and development, engineering, human resources, sales, and so on) to get them to operate toward a common goal. And managers create value by controlling information flows, intervening only when functions become misaligned.
-
-Today, when so many of these traditionally well-defined tasks have become automated, value creation is much more a result of novel innovation and problem solving—not finding new ways to drive efficiency from repeatable processes. But numerous studies demonstrate that innovative, problem-solving activity occurs much more regularly when people work in cross-functional teams—not as isolated individuals or groups constrained by single-functional silos. This kind of activity can lead to what some call "accidental integration": the serendipitous innovation that occurs when old elements combine in new and unforeseen ways.
-
-That's why working collaboratively has now become a necessity that managers need to foster, not eliminate.
-
-### From coordination to collaboration
-
-Reframing the value of the firm—from something that coordinated individual transactions to something that produces novel innovations—means rethinking the value of the relations at the core of our organizations. And that begins with reimagining the task of management, which is no longer concerned primarily with minimizing coordination costs but maximizing cooperation opportunities.
-
-Too few of our tried-and-true management practices have this goal. If they're seeking greater innovation, managers need to encourage more interactions between people in different functional areas, not fewer. A cross-functional team may not be as efficient as one composed of people with the same skill sets. But a cross-functional team is more likely to be the one connecting points between elements in your organization that no one had ever thought to connect (the one more likely, in other words, to achieve accidental integration).
-
-Working collaboratively has now become a necessity that managers need to foster, not eliminate.
-
-I have three suggestions for leaders interested in making this shift:
-
-First, define organizations around processes, not functions. We've seen this strategy work in enterprise IT, for example, in the case of [DevOps][4], where teams emerge around end goals (like a mobile application or a website), not singular functions (like developing, testing, and production). In DevOps environments, the same team that writes the code is responsible for maintaining it once it's in production. (We've found that when the same people who write the code are the ones woken up when it fails at 3 a.m., we get better code.)
-
-Second, define work around the optimal organization rather than the organization around the work. Amazon is a good example of this strategy. Teams usually stick to the "[Two Pizza Rule][5]" when establishing optimal conditions for collaboration. In other words, Amazon leaders have determined that the best-sized team for maximum innovation is about 10 people, or a group they can feed with two pizzas. If the problem gets bigger than that two-pizza team can handle, they split the problem into two simpler problems, dividing the work between multiple teams rather than adding more people to the single team.
-
-And third, to foster creative behavior and really get people cooperating with one another, do whatever you can to cultivate a culture of honest and direct feedback. Be straightforward and, as I wrote in The Open Organization, let the sparks fly; have frank conversations and let the best ideas win.
-
-### Let it go
-
-I realize that asking managers to significantly shift the way they think about their roles can lead to fear and skepticism. Some managers define their performance (and their very identities) by the control they exert over information and people. But the more you dictate the specific ways your organization should do something, the more static and brittle that activity becomes. Agility requires letting go—giving up a certain degree of control.
-
-Front-line managers will see their roles morph from dictating and monitoring to enabling and supporting. Instead of setting individual-oriented goals, they'll need to set group-oriented goals. Instead of developing individual incentives, they'll need to consider group-oriented incentives.
-
-Because ultimately, their goal should be to[create the context in which their teams can do their best work][6].
-
-[Subscribe to our weekly newsletter][7] to learn more about open organizations.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/open-organization/18/4/management-coordination-collaboration
-
-作者:[Jim Whitehurst][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-选题:[lujun9972](https://github.com/lujun9972)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/remyd
-[1]:https://news.uchicago.edu/article/2013/09/02/ronald-h-coase-founding-scholar-law-and-economics-1910-2013
-[2]:http://onlinelibrary.wiley.com/doi/10.1111/j.1468-0335.1937.tb00002.x/full
-[3]:https://opensource.com/open-organization/18/2/try-learn-modify
-[4]:https://enterprisersproject.com/devops
-[5]:https://www.fastcompany.com/3037542/productivity-hack-of-the-week-the-two-pizza-approach-to-productive-teamwork
-[6]:https://opensource.com/open-organization/16/3/what-it-means-be-open-source-leader
-[7]:https://opensource.com/open-organization/resources/newsletter
diff --git a/sources/talk/20180416 For project safety back up your people, not just your data.md b/sources/talk/20180416 For project safety back up your people, not just your data.md
deleted file mode 100644
index 0dc6d41fa5..0000000000
--- a/sources/talk/20180416 For project safety back up your people, not just your data.md
+++ /dev/null
@@ -1,79 +0,0 @@
-For project safety back up your people, not just your data
-======
-
-
-The [FSF][1] was founded in 1985, Perl in 1987 ([happy 30th birthday, Perl][2]!), and Linux in 1991. The [term open source][3] and the [Open Source Initiative][4] both came into being in 1998 (and [turn 20 years old][5] in 2018). Since then, free and open source software has grown to become the default choice for software development, enabling incredible innovation.
-
-We, the greater open source community, have come of age. Millions of open source projects exist today, and each year the [GitHub Octoverse][6] reports millions of new public repositories. We rely on these projects every day, and many of us could not operate our services or our businesses without them.
-
-So what happens when the leaders of these projects move on? How can we help ease those transitions while ensuring that the projects thrive? By teaching and encouraging **succession planning**.
-
-### What is succession planning?
-
-Succession planning is a popular topic among business executives, boards of directors, and human resources professionals, but it doesn't often come up with maintainers of free and open source projects. Because the concept is common in business contexts, that's where you'll find most resources and advice about establishing a succession plan. As you might expect, most of these articles aren't directly applicable to FOSS, but they do form a springboard from which we can launch our own ideas about succession planning.
-
-According to [Wikipedia][7]:
-
-> Succession planning is a process for identifying and developing new leaders who can replace old leaders when they leave, retire, or die.
-
-In my opinion, this definition doesn't apply very well to free and open source software projects. I primarily object to the use of the term leaders. For the collaborative projects of FOSS, everyone can be some form of leader. Roles other than "project founder" or "benevolent dictator for life" are just as important. Any project role that is measured by bus factor is one that can benefit from succession planning.
-
-> A project's bus factor is the number of team members who, if hit by a bus, would endanger the smooth operation of the project. The smallest and worst bus factor is 1: when only a single person's loss would put the project in jeopardy. It's a somewhat grim but still very useful concept.
-
-I propose that instead of viewing succession planning as a leadership pipeline, free and open source projects should view it as a skills pipeline. What sorts of skills does your project need to continue functioning well, and how can you make sure those skills always exist in your community?
-
-### Benefits of succession planning
-
-When I talk to project maintainers about succession planning, they often respond with something like, "We've been pretty successful so far without having to think about this. Why should we start now?"
-
-Aside from the fact that the phrase, "We've always done it this way" is probably one of the most dangerous in the English language, and hearing (or saying) it should send up red flags in any community, succession planning provides plenty of very real benefits:
-
- * **Continuity** : When someone leaves, what happens to the tasks they were performing? Succession planning helps ensure those tasks continue uninterrupted and no one is left hanging.
- * **Avoiding a power vacuum** : When a person leaves a role with no replacement, it can lead to confusion, delays, and often most damaging, political woes. After all, it's much easier to fix delays than hurt feelings. A succession plan helps alleviate the insecure and unstable time when someone in a vital role moves on.
- * **Increased project/organization longevity** : The thinking required for succession planning is the same sort of thinking that contributes to project longevity. Ensuring continuity in leadership, culture, and productivity also helps ensure the project will continue. It will evolve, but it will survive.
- * **Reduced workload/pressure on current leaders** : When a single team member performs a critical role in the project, they often feel pressure to be constantly "on." This can lead to burnout and worse, resignations. A succession plan ensures that all important individuals have a backup or successor. The knowledge that someone can take over is often enough to reduce the pressure, but it also means that key players can take breaks or vacations without worrying that their role will be neglected in their absence.
- * **Talent development** : Members of the FOSS community talk a lot about mentoring these days, and that's great. However, most of the conversation is around mentoring people to contribute code to a project. There are many different ways to contribute to free and open source software projects beyond programming. A robust succession plan recognizes these other forms of contribution and provides mentoring to prepare people to step into critical non-programming roles.
- * **Inspiration for new members** : It can be very motivational for new or prospective community members to see that a project uses its succession plan. Not only does it show them that the project is well-organized and considers its own health and welfare as well as that of its members, but it also clearly shows new members how they can grow in the community. An obvious path to critical roles and leadership positions inspires new members to stick around to walk that path.
- * **Diversity of thoughts/get out of a rut** : Succession plans provide excellent opportunities to bring in new people and ideas to the critical roles of a project. [Studies show][8] that diverse leadership teams are more effective and the projects they lead are more innovative. Using your project's succession plan to mentor people from different backgrounds and with different perspectives will help strengthen and evolve the project in a healthy way.
- * **Enabling meritocracy** : Unfortunately, what often passes for meritocracy in many free and open source projects is thinly veiled hostility toward new contributors and diverse opinions—hostility that's delivered from within an echo chamber. Meritocracy without a mentoring program and healthy governance structure is simply an excuse to practice subjective discrimination while hiding behind unexpressed biases. A well-executed succession plan helps teams reach the goal of a true meritocracy. What counts as merit for any given role, and how to reach that level of merit, are openly, honestly, and completely documented. The entire community will be able to see and judge which members are on the path or deserve to take on a particular critical role.
-
-
-
-### Why it doesn't happen
-
-Succession planning isn't a panacea, and it won't solve all problems for all projects, but as described above, it offers a lot of worthwhile benefits to your project.
-
-Despite that, very few free and open source projects or organizations put much thought into it. I was curious why that might be, so I asked around. I learned that the reasons for not having a succession plan fall into one of five different buckets:
-
- * **Too busy** : Many people recognize succession planning (or lack thereof) as a problem for their project but just "hadn't ever gotten around to it" because there's "always something more important to work on." I understand and sympathize with this, but I suspect the problem may have more to do with prioritization than with time availability.
- * **Don't think of it** : Some people are so busy and preoccupied that they haven't considered, "Hey, what would happen if Jen had to leave the project?" This never occurs to them. After all, Jen's always been there when they need her, right? And that will always be the case, right?
- * **Don't want to think of it** : Succession planning shares a trait with estate planning: It's associated with negative feelings like loss and can make people address their own mortality. Some people are uncomfortable with this and would rather not consider it at all than take the time to make the inevitable easier for those they leave behind.
- * **Attitude of current leaders** : A few of the people with whom I spoke didn't want to recognize that they're replaceable, or to consider that they may one day give up their power and influence on the project. While this was (thankfully) not a common response, it was alarming enough to deserve its own bucket. Failure of someone in a critical role to recognize or admit that they won't be around forever can set a project up for failure in the long run.
- * **Don't know where to start** : Many people I interviewed realize that succession planning is something that their project should be doing. They were even willing to carve out the time to tackle this very large task. What they lacked was any guidance on how to start the process of creating a succession plan.
-
-
-
-As you can imagine, something as important and people-focused as a succession plan isn't easy to create, and it doesn't happen overnight. Also, there are many different ways to do it. Each project has its own needs and critical roles. One size does not fit all where succession plans are concerned.
-
-There are, however, some guidelines for how every project could proceed with the succession plan creation process. I'll cover these guidelines in my next article.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/4/passing-baton-succession-planning-foss-leadership
-
-作者:[VM(Vicky) Brasseur][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-选题:[lujun9972](https://github.com/lujun9972)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/vmbrasseur
-[1]:http://www.fsf.org
-[2]:https://opensource.com/article/17/10/perl-turns-30
-[3]:https://opensource.com/article/18/2/coining-term-open-source-software
-[4]:https://opensource.org
-[5]:https://opensource.org/node/910
-[6]:https://octoverse.github.com
-[7]:https://en.wikipedia.org/wiki/Succession_planning
-[8]:https://hbr.org/2016/11/why-diverse-teams-are-smarter
diff --git a/sources/talk/20180417 How to develop the FOSS leaders of the future.md b/sources/talk/20180417 How to develop the FOSS leaders of the future.md
deleted file mode 100644
index a65dc9dabd..0000000000
--- a/sources/talk/20180417 How to develop the FOSS leaders of the future.md
+++ /dev/null
@@ -1,93 +0,0 @@
-How to develop the FOSS leaders of the future
-======
-
-Do you hold a critical role in a free and open source software project? Would you like to make it easier for the next person to step into your shoes, while also giving yourself the freedom to take breaks and avoid burnout?
-
-Of course you would! But how do you get started?
-
-Before you do anything, remember that this is a free or open source project. As with all things in FOSS, your succession planning should happen in collaboration with others. The [Principle of Least Astonishment][1] also applies: Don't work on your plan in isolation, then spring it on the entire community. Work together and publicly, so no one is caught off guard when the cultural or governance changes start happening.
-
-### Identify and analyse critical roles
-
-As a project leader, your first step is to identify the critical roles in your community. While it can help to ask each community members what role they perform, it's important to realize that most people perform multiple roles. Make sure you consider every role that each community member plays in the project.
-
-Once you've identified the roles and determined which ones are critical to your project, the next step is to list all of the duties and responsibilities for each of those critical roles. Be very honest here. List the duties and responsibilities you think each role has, then ask the person who performs that role to list the duties the role actually has. You'll almost certainly find that the second list is longer than the first.
-
-### Refactor large roles
-
-During this process, have you discovered any roles that encompass a large number of duties and responsibilities? Large roles are like large methods in your code: They're a sign of a problem, and they need to be refactored to make them easier to maintain. One of the easiest and most effective steps in succession planning for FOSS projects is to split up each large role into two or more smaller roles and distribute these to other community members. With that one step, you've greatly improved the [bus factor][2] for your project. Even better, you've made each one of those new, smaller roles much more accessible and less intimidating for new community members. People are much more likely to volunteer for a role if it's not a massive burden.
-
-### Limit role tenure
-
-Another way to make a role more enticing is to limit its tenure. Community members will be more willing to step into roles that aren't open-ended. They can look at their life and work plans and ask themselves, "Can I take on this role for the next eighteen months?" (or whatever term limit you set).
-
-Setting term limits also helps those who are currently performing the role. They know when they can set aside those duties and move on to something else, which can help alleviate burnout. Also, setting a term limit creates a pool of people who have performed the role and are qualified to step in if needed, which can also mitigate burnout.
-
-### Knowledge transfer
-
-Once you've identified and defined the critical roles in your project, most of what remains is knowledge transfer. Even small projects involve a lot of moving parts and knowledge that needs to be where everyone can see, share, use, and contribute to it. What sort of knowledge should you be collecting? The answer will vary by project, needs, and role, but here are some of the most common (and commonly overlooked) types of information needed to implement a succession plan:
-
- * **Roles and their duties** : You've spent a lot of time identifying, analyzing, and potentially refactoring roles and their duties. Make sure this information doesn't get lost.
- * **Policies and procedures** : None of those duties occur in a vacuum. Each duty must be performed in a particular way (procedures) when particular conditions are met (policies). Take stock of these details for every duty of every role.
- * **Resources** : What accounts are associated with the project, or are necessary for it to operate? Who helps you with meetup space, sponsorship, or in-kind services? Such information is vital to project operation but can be easily lost when the responsible community member moves on.
- * **Credentials** : Ideally, every external service required by the project will use a login that goes to an email address designated for a specific role (`sre@project.org`) rather than to a personal address. Every role's address should include multiple people on the distribution list to ensure that important messages (such as downtime or bogus "forgot password" requests) aren't missed. The credentials for every service should be kept in a secure keystore, with access limited to the fewest number of people possible.
- * **Project history** : All community members benefit greatly from learning the history of the project. Collecting project history information can clarify why decisions were made in the past, for example, and reveal otherwise unexpressed requirements and values of the community. Project histories can also help new community members understand "inside jokes," jargon, and other cultural factors.
- * **Transition plans** : A succession plan doesn't do much good if project leaders haven't thought through how to transition a role from one person to another. How will you locate and prepare people to take over a critical role? Since the project has already done a lot of thinking and knowledge transfer, transition plans for each role may be easier to put together.
-
-
-
-Doing a complete knowledge transfer for all roles in a project can be an enormous undertaking, but the effort is worth it. To avoid being overwhelmed by such a daunting task, approach it one role at a time, finishing each one before you move onto the next. Limiting the scope in this way makes both progress and success much more likely.
-
-### Document, document, document!
-
-Succession planning takes time. The community will be making a lot of decisions and collecting a lot of information, so make sure nothing gets lost. It's important to document everything (not just in email threads). Where knowledge is concerned, documentation scales and people do not. Include even the things that you think are obvious—what's obvious to a more seasoned community member may be less so to a newbie, so don't skip steps or information.
-
-Gather these decisions, processes, policies, and other bits of information into a single place, even if it's just a collection of markdown files in the main project repository. The "how" and "where" of the documentation can be sorted out later. It's better to capture key information first and spend time [bike-shedding][3] a documentation system later.
-
-Once you've collected all of this information, you should understand that it's unlikely that anyone will read it. I know, it seems unfair, but that's just how things usually work out. The reason? There is simply too much documentation and too little time. To address this, add an abstract, or summary, at the top of each item. Often that's all a person needs, and if not, the complete document is there for a deep dive. Recognizing and adapting to how most people use documentation increases the likelihood that they will use yours.
-
-Above all, don't skip the documentation process. Without documentation, succession plans are impossible.
-
-### New leaders
-
-If you don't yet perform a critical role but would like to, you can contribute to the succession planning process while apprenticing your way into one of those roles.
-
-For starters, actively look for opportunities to learn and contribute. Shadow people in critical roles. You'll learn how the role is done, and you can document it to help with the succession planning process. You'll also get the opportunity to see whether it's a role you're interested in pursuing further.
-
-Asking for mentorship is a great way to get yourself closer to taking on a critical role in the project. Even if you haven't heard that mentoring is available, it's perfectly OK to ask about it. The people already in those roles are usually happy to mentor others, but often are too busy to think about offering mentorship. Asking is a helpful reminder to them that they should be helping to train people to take over their role when they need a break.
-
-As you perform your own tasks, actively seek out feedback. This will not only improve your skills, but it shows that you're interested in doing a better job for the community. This commitment will pay off when your project needs people to step into critical roles.
-
-Finally, as you communicate with more experienced community members, take note of anecdotes about the history of the project and how it operates. This history is very important, especially for new contributors or people stepping into critical roles. It provides the context necessary for new contributors to understand what things do or don't work and why. As you hear these stories, document them so they can be passed on to those who come after you.
-
-### Succession planning examples
-
-While too few FOSS projects are actively considering succession planning, some are doing a great job of trying to reduce their bus factor and prevent maintainer burnout.
-
-[Exercism][4] isn't just an excellent tool for gaining fluency in programming languages. It's also an [open source project][5] that goes out of its way to help contributors [land their first patch][6]. In 2016, the project reviewed the health of each language track and [discovered that many were woefully maintained][7]. There simply weren't enough people covering each language, so maintainers were burning out. The Exercism community recognized the risk this created and pushed to find new maintainers for as many language tracks as possible. As a result, the project was able to revive several tracks from near-death and develop a structure for inviting people to become maintainers.
-
-The purpose of the [Vox Pupuli][8] project is to serve as a sort of succession plan for the [Puppet module][9] community. When a maintainer no longer wishes or is able to work on their module, they can bequeath it to the Vox Pupuli community. This community of 30 collaborators shares responsibility for maintaining all the modules it accepts into the project. The large number of collaborators ensures that no single person bears the burden of maintenance while also providing a long and fruitful life for every module in the project.
-
-These are just two examples of how some FOSS projects are tackling succession planning. Share your stories in the comments below.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/4/succession-planning-how-develop-foss-leaders-future
-
-作者:[VM(Vicky) Brasseur)][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-选题:[lujun9972](https://github.com/lujun9972)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/vmbrasseur
-[1]:https://en.wikipedia.org/wiki/Principle_of_least_astonishment
-[2]:https://en.wikipedia.org/wiki/Bus_factor
-[3]:https://en.wikipedia.org/wiki/Law_of_triviality
-[4]:http://exercism.io
-[5]:https://github.com/exercism/exercism.io
-[6]:https://github.com/exercism/exercism.io/blob/master/CONTRIBUTING.md
-[7]:https://tinyletter.com/exercism/letters/exercism-track-health-check-new-maintainers
-[8]:https://voxpupuli.org
-[9]:https://forge.puppet.com
diff --git a/sources/talk/20180418 Is DevOps compatible with part-time community teams.md b/sources/talk/20180418 Is DevOps compatible with part-time community teams.md
deleted file mode 100644
index e78b96959f..0000000000
--- a/sources/talk/20180418 Is DevOps compatible with part-time community teams.md
+++ /dev/null
@@ -1,73 +0,0 @@
-Is DevOps compatible with part-time community teams?
-======
-
-
-DevOps seems to be the talk of the IT world of late—and for good reason. DevOps has streamlined the process and production of IT development and operations. However, there is also an upfront cost to embracing a DevOps ideology, in terms of time, effort, knowledge, and financial investment. Larger companies may have the bandwidth, budget, and time to make the necessary changes, but is it feasible for part-time, resource-strapped communities?
-
-Part-time communities are teams of like-minded people who take on projects outside of their normal work schedules. The members of these communities are driven by passion and a shared purpose. For instance, one such community is the [ALM | DevOps Rangers][1]. With 100 rangers engaged across the globe, a DevOps solution may seem daunting; nonetheless, they took on the challenge and embraced the ideology. Through their example, we've learned that DevOps is not only feasible but desirable in smaller teams. To read about their transformation, check out [How DevOps eliminates development bottlenecks][2].
-
-> “DevOps is the union of people, process, and products to enable continuous delivery of value to our end customers.” - Donovan Brown
-
-### The cost of DevOps
-
-As stated above, there is an upfront "cost" to DevOps. The cost manifests itself in many forms, such as the time and collaboration between development, operations, and other stakeholders, planning a smooth-flowing process that delivers continuous value, finding the best DevOps products, and training the team in new technologies, to name a few. This aligns directly with Donovan's definition of DevOps, in fact—a **process** for delivering **continuous value** and the **people** who make that happen.
-
-Streamlined DevOps takes a lot of planning and training just to create the process, and that doesn't even consider the testing phase. We also can't forget the existing in-flight projects that need to be converted into the new system. While the cost increases the more pervasive the transformation—for instance, if an organization aims to unify its entire development organization under a single process, then that would cost more versus transforming a single pilot or subset of the entire portfolio—these upfront costs must be addressed regardless of their scale. There are a lot of resources and products already out there that can be implemented for a smoother transition—but again, we face the time and effort that will be necessary just to research which ones might work best.
-
-In the case of the ALM | DevOps Rangers, they had to halt all projects for a couple of sprints to set up the initial process. Many organizations would not be able to do that. Even part-time groups might have very good reasons to keep things moving, which only adds to the complexity. In such scenarios, additional cutover planning (and therefore additional cost) is needed, and the overall state of the community is one of flux and change, which adds risk, which—you guessed it—requires more cost to mitigate.
-
-There is also an ongoing "cost" that teams will face with a DevOps mindset: Simple maintenance of the system, training and transitioning new team members, and keeping up with new, improved technologies are all a part of the process.
-
-### DevOps for a part-time community
-
-Whereas larger companies can dedicate a single manager or even a team to the task over overseeing the continuous integration and continuous deployment (CI/CD) pipelines, part-time community teams don't have the bandwidth to give. With such a massive undertaking we must ask: Is it even worth it for groups with fewer resources to take on DevOps for their community? Or should they abandon the idea of DevOps altogether?
-
-The answer to that is dependent on a few variables, such as the ability of the teams to be self-managing, the time and effort each member is willing to put into the transformation, and the dedication of the community to the process.
-
-### Example: Benefits of DevOps in a part-time community
-
-Luckily, we aren't without examples to demonstrate just how DevOps can benefit a smaller group. Let's take a quick look at the ALM Rangers again. The results from their transformation help us understand how DevOps changed their community:
-
-
-
-As illustrated, there are some huge benefits for part-time community teams. Planning goes from long, arduous design sessions to a quick prototyping and storyboarding process. Builds become automated, reliable, and resilient. Testing and bug detection are proactive instead of reactive, which turns into a happier clientele. Multiple full-time program managers are replaced with self-managing teams with a single part-time manager to oversee projects. Teams become smaller and more efficient, which equates to higher production rates and higher-quality project delivery. With results like these, it's hard to argue against DevOps.
-
-Still, the upfront and ongoing costs aren't right for every community. The number-one most important aspect of any DevOps transformation is the mindset of the people involved. Adopting the idea of self-managing teams who work in autonomy instead of the traditional chain-of-command scheme can be a challenge for any group. The members must be willing to work independently without a lot of oversight and take ownership of their features and user experience, but at the same time, work in a setting that is fully transparent to the rest of the community. **The success or failure of a DevOps strategy lies on the team.**
-
-### Making the DevOps transition in 4 steps
-
-Another important question to ask: How can a low-bandwidth group make such a massive transition? The good news is that a DevOps transformation doesn’t need to happen all at once. Taken in smaller, more manageable steps, organizations of any size can embrace DevOps.
-
- 1. Determine why DevOps may be the solution you need. Are your projects bottlenecking? Are they running over budget and over time? Of course, these concerns are common for any community, big or small. Answering these questions leads us to step two:
- 2. Develop the right framework to improve the engineering process. DevOps is all about automation, collaboration, and streamlining. Rather than trying to fit everyone into the same process box, the framework should support the work habits, preferences, and delivery needs of the community. Some broad standards should be established (for example, that all teams use a particular version control system). Beyond that, however, let the teams decide their own best process.
- 3. Use the current products that are already available if they meet your needs. Why reinvent the wheel?
- 4. Finally, implement and test the actual DevOps solution. This is, of course, where the actual value of DevOps is realized. There will likely be a few issues and some heartburn, but it will all be worth it in the end because, once established, the products of the community’s work will be nimbler and faster for the users.
-
-
-
-### Reuse DevOps solutions
-
-One benefit to creating effective CI/CD pipelines is the reusability of those pipelines. Although there is no one-size fits all solution, anyone can adopt a process. There are several pre-made templates available for you to examine, such as build templates on VSTS, ARM templates to deploy Azure resources, and "cookbook"-style textbooks from technical publishers. Once it identifies a process that works well, a community can also create its own template by defining and establishing standards and making that template easily discoverable by the entire community. For more information on DevOps journeys and tools, check out [this site][3].
-
-### Summary
-
-Overall, the success or failure of DevOps relies on the culture of a community. It doesn't matter if the community is a large, resource-rich enterprise or a small, resource-sparse, part-time group. DevOps will still bring solid benefits. The difference is in the approach for adoption and the scale of that adoption. There are both upfront and ongoing costs, but the value greatly outweighs those costs. Communities can use any of the powerful tools available today for their pipelines, and they can also leverage reusability, such as templates, to reduce upfront implementation costs. DevOps is most certainly feasible—and even critical—for the success of part-time community teams.
-
-**[See our related story,[How DevOps eliminates development bottlenecks][4].]**
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/4/devops-compatible-part-time-community-teams
-
-作者:[Edward Fry][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/edwardf
-[1]:https://github.com/ALM-Rangers
-[2]:https://opensource.com/article/17/11/devops-rangers-transformation
-[3]:https://www.visualstudio.com/devops/
-[4]:https://opensource.com/article/17/11/devops-rangers-transformation
diff --git a/sources/talk/20180419 3 tips for organizing your open source project-s workflow on GitHub.md b/sources/talk/20180419 3 tips for organizing your open source project-s workflow on GitHub.md
deleted file mode 100644
index 29e4ea2f48..0000000000
--- a/sources/talk/20180419 3 tips for organizing your open source project-s workflow on GitHub.md
+++ /dev/null
@@ -1,109 +0,0 @@
-3 tips for organizing your open source project's workflow on GitHub
-======
-
-
-
-Managing an open source project is challenging work, and the challenges grow as a project grows. Eventually, a project may need to meet different requirements and span multiple repositories. These problems aren't technical, but they are important to solve to scale a technical project. [Business process management][1] methodologies such as agile and [kanban][2] bring a method to the madness. Developers and managers can make realistic decisions for estimating deadlines and team bandwidth with an organized development focus.
-
-At the [UNICEF Office of Innovation][3], we use GitHub project boards to organize development on the MagicBox project. [MagicBox][4] is a full-stack application and open source platform to serve and visualize data for decision-making in humanitarian crises and emergencies. The project spans multiple GitHub repositories and works with multiple developers. With GitHub project boards, we organize our work across multiple repositories to better understand development focus and team bandwidth.
-
-Here are three tips from the UNICEF Office of Innovation on how to organize your open source projects with the built-in project boards on GitHub.
-
-### 1\. Bring development discussion to issues and pull requests
-
-Transparency is a critical part of an open source community. When mapping out new features or milestones for a project, the community needs to see and understand a decision or why a specific direction was chosen. Filing new GitHub issues for features and milestones is an easy way for someone to follow the project direction. GitHub issues and pull requests are the cards (or building blocks) of project boards. To be successful with GitHub project boards, you need to use issues and pull requests.
-
-
-![GitHub issues for magicbox-maps, MagicBox's front-end application][6]
-
-GitHub issues for magicbox-maps, MagicBox's front-end application.
-
-The UNICEF MagicBox team uses GitHub issues to track ongoing development milestones and other tasks to revisit. The team files new GitHub issues for development goals, feature requests, or bugs. These goals or features may come from external stakeholders or the community. We also use the issues as a place for discussion on those tasks. This makes it easy to cross-reference in the future and visualize upcoming work on one of our projects.
-
-Once you begin using GitHub issues and pull requests as a way of discussing and using your project, organizing with project boards becomes easier.
-
-### 2\. Set up kanban-style project boards
-
-GitHub issues and pull requests are the first step. After you begin using them, it may become harder to visualize what work is in progress and what work is yet to begin. [GitHub's project boards][7] give you a platform to visualize and organize cards into different columns.
-
-There are two types of project boards available:
-
- * **Repository** : Boards for use in a single repository
- * **Organization** : Boards for use in a GitHub organization across multiple repositories (but private to organization members)
-
-
-
-The choice you make depends on the structure and size of your projects. The UNICEF MagicBox team uses boards for development and documentation at the organization level, and then repository-specific boards for focused work (like our [community management board][8]).
-
-#### Creating your first board
-
-Project boards are found on your GitHub organization page or on a specific repository. You will see the Projects tab in the same row as Issues and Pull requests. From the page, you'll see a green button to create a new project.
-
-There, you can set a name and description for the project. You can also choose templates to set up basic columns and sorting for your board. Currently, the only options are for kanban-style boards.
-
-
-![Creating a new GitHub project board.][10]
-
-Creating a new GitHub project board.
-
-After creating the project board, you can make adjustments to it as needed. You can create new columns, [set up automation][11], and add pre-existing GitHub issues and pull requests to the project board.
-
-You may notice new options for the metadata in each GitHub issue and pull request. Inside of an issue or pull request, you can add it to a project board. If you use automation, it will automatically enter a column you configured.
-
-### 3\. Build project boards into your workflow
-
-After you set up a project board and populate it with issues and pull requests, you need to integrate it into your workflow. Project boards are effective only when actively used. The UNICEF MagicBox team uses the project boards as a way to track our progress as a team, update external stakeholders on development, and estimate team bandwidth for reaching our milestones.
-
-
-![Tracking progress][13]
-
-Tracking progress with GitHub project boards.
-
-If you are an open source project and community, consider using the project boards for development-focused meetings. It also helps remind you and other core contributors to spend five minutes each day updating progress as needed. If you're at a company using GitHub to do open source work, consider using project boards to update other team members and encourage participation inside of GitHub issues and pull requests.
-
-Once you begin using the project board, yours may look like this:
-
-
-![Development progress board][15]
-
-Development progress board for all UNICEF MagicBox repositories in organization-wide GitHub project boards.
-
-### Open alternatives
-
-GitHub project boards require your project to be on GitHub to take advantage of this functionality. While GitHub is a popular repository for open source projects, it's not an open source platform itself. Fortunately, there are open source alternatives to GitHub with tools to replicate the workflow explained above. [GitLab Issue Boards][16] and [Taiga][17] are good alternatives that offer similar functionality.
-
-### Go forth and organize!
-
-With these tools, you can bring a method to the madness of organizing your open source project. These three tips for using GitHub project boards encourage transparency in your open source project and make it easier to track progress and milestones in the open.
-
-Do you use GitHub project boards for your open source project? Have any tips for success that aren't mentioned in the article? Leave a comment below to share how you make sense of your open source projects.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/4/keep-your-project-organized-git-repo
-
-作者:[Justin W.Flory][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/jflory
-[1]:https://en.wikipedia.org/wiki/Business_process_management
-[2]:https://en.wikipedia.org/wiki/Kanban_(development)
-[3]:http://unicefstories.org/about/
-[4]:http://unicefstories.org/magicbox/
-[5]:/file/393356
-[6]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/u128651/github-open-issues.png?itok=OcWPX575 (GitHub issues for magicbox-maps, MagicBox's front-end application)
-[7]:https://help.github.com/articles/about-project-boards/
-[8]:https://github.com/unicef/magicbox/projects/3?fullscreen=true
-[9]:/file/393361
-[10]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/u128651/github-project-boards-create-board.png?itok=pp7SXH9g (Creating a new GitHub project board.)
-[11]:https://help.github.com/articles/about-automation-for-project-boards/
-[12]:/file/393351
-[13]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/u128651/github-issues-metadata.png?itok=xp5auxCQ (Tracking progress)
-[14]:/file/393366
-[15]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/u128651/github-project-boards-overview.png?itok=QSbOOOkF (Development progress board)
-[16]:https://about.gitlab.com/features/issueboard/
-[17]:https://taiga.io/
diff --git a/sources/talk/20180420 What You Don-t Know About Linux Open Source Could Be Costing to More Than You Think.md b/sources/talk/20180420 What You Don-t Know About Linux Open Source Could Be Costing to More Than You Think.md
deleted file mode 100644
index 10511c3a7d..0000000000
--- a/sources/talk/20180420 What You Don-t Know About Linux Open Source Could Be Costing to More Than You Think.md
+++ /dev/null
@@ -1,39 +0,0 @@
-What You Don’t Know About Linux Open Source Could Be Costing to More Than You Think
-======
-
-If you would like to test out Linux before completely switching it as your everyday driver, there are a number of means by which you can do it. Linux was not intended to run on Windows, and Windows was not meant to host Linux. To begin with, and perhaps most of all, Linux is open source computer software. In any event, Linux outperforms Windows on all your hardware.
-
-If you’ve always wished to try out Linux but were never certain where to begin, have a look at our how to begin guide for Linux. Linux is not any different than Windows or Mac OS, it’s basically an Operating System but the leading different is the fact that it is Free for everyone. Employing Linux today isn’t any more challenging than switching from one sort of smartphone platform to another.
-
-You’re most likely already using Linux, whether you are aware of it or not. Linux has a lot of distinct versions to suit nearly any sort of user. Today, Linux is a small no-brainer. Linux plays an essential part in keeping our world going.
-
-Even then, it is dependent on the build of Linux that you’re using. Linux runs a lot of the underbelly of cloud operations. Linux is also different in that, even though the core pieces of the Linux operating system are usually common, there are lots of distributions of Linux, like different software alternatives. While Linux might seem intimidatingly intricate and technical to the ordinary user, contemporary Linux distros are in reality very user-friendly, and it’s no longer the case you have to have advanced skills to get started using them. Linux was the very first major Internet-centred open-source undertaking. Linux is beginning to increase the range of patches it pushes automatically, but several of the security patches continue to be opt-in only.
-
-You are able to remove Linux later in case you need to. Linux plays a vital part in keeping our world going. Linux supplies a huge library of functionality which can be leveraged to accelerate development.
-
-Even then, it’s dependent on the build of Linux that you’re using. Linux is also different in that, even though the core pieces of the Linux operating system are typically common, there are lots of distributions of Linux, like different software alternatives. While Linux might seem intimidatingly intricate and technical to the ordinary user, contemporary Linux distros are in fact very user-friendly, and it’s no longer the case you require to have advanced skills to get started using them. Linux runs a lot of the underbelly of cloud operations. Linux is beginning to increase the range of patches it pushes automatically, but several of the security patches continue to be opt-in only. Read More, open source projects including Linux are incredibly capable because of the contributions that all these individuals have added over time.
-
-### Life After Linux Open Source
-
-The development edition of the manual typically has more documentation, but might also document new characteristics that aren’t in the released version. Fortunately, it’s so lightweight you can just jump to some other version in case you don’t like it. It’s extremely hard to modify the compiled version of the majority of applications and nearly not possible to see exactly the way the developer created different sections of the program.
-
-On the challenges of bottoms-up go-to-market It’s really really hard to grasp the difference between your organic product the product your developers use and love and your company product, which ought to be, effectively, a different product. As stated by the report, it’s going to be hard for developers to switch. Developers are now incredibly important and influential in the purchasing procedure. Some OpenWrt developers will attend the event and get ready to reply to your questions!
-
-When the program is installed, it has to be configured. Suppose you discover that the software you bought actually does not do what you would like it to do. Open source software is much more common than you believe, and an amazing philosophy to live by. Employing open source software gives an inexpensive method to bootstrap a business. It’s more difficult to deal with closed source software generally. So regarding Application and Software, you’re all set if you are prepared to learn an alternate software or finding a means to make it run on Linux. Possibly the most famous copyleft software is Linux.
-
-Article sponsored by [Vegas Palms online slots][1]
-
-
---------------------------------------------------------------------------------
-
-via: https://linuxaria.com/article/what-you-dont-know-about-linux-open-source-could-be-costing-to-more-than-you-think
-
-作者:[Marc Fisher][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://linuxaria.com
-[1]:https://www.vegaspalmscasino.com/casino-games/slots/
diff --git a/sources/talk/20180424 There-s a Server in Every Serverless Platform.md b/sources/talk/20180424 There-s a Server in Every Serverless Platform.md
deleted file mode 100644
index 9bc935c06d..0000000000
--- a/sources/talk/20180424 There-s a Server in Every Serverless Platform.md
+++ /dev/null
@@ -1,87 +0,0 @@
-There’s a Server in Every Serverless Platform
-======
-
-
-Serverless computing or Function as a Service (FaaS) is a new buzzword created by an industry that loves to coin new terms as market dynamics change and technologies evolve. But what exactly does it mean? What is serverless computing?
-
-Before getting into the definition, let’s take a brief history lesson from Sirish Raghuram, CEO and co-founder of Platform9, to understand the evolution of serverless computing.
-
-“In the 90s, we used to build applications and run them on hardware. Then came virtual machines that allowed users to run multiple applications on the same hardware. But you were still running the full-fledged OS for each application. The arrival of containers got rid of OS duplication and process level isolation which made it lightweight and agile,” said Raghuram.
-
-Serverless, specifically, Function as a Service, takes it to the next level as users are now able to code functions and run them at the granularity of build, ship and run. There is no complexity of underlying machinery needed to run those functions. No need to worry about spinning containers using Kubernetes. Everything is hidden behind the scenes.
-
-“That’s what is driving a lot of interest in function as a service,” said Raghuram.
-
-### What exactly is serverless?
-
-There is no single definition of the term, but to build some consensus around the idea, the [Cloud Native Computing Foundation (CNCF)][1] Serverless Working Group wrote a [white paper][2] to define serverless computing.
-
-According to the white paper, “Serverless computing refers to the concept of building and running applications that do not require server management. It describes a finer-grained deployment model where applications, bundled as one or more functions, are uploaded to a platform and then executed, scaled, and billed in response to the exact demand needed at the moment.”
-
-Ken Owens, a member of the Technical Oversight Committee at CNCF said that the primary goal of serverless computing is to help users build and run their applications without having to worry about the cost and complexity of servers in terms of provisioning, management and scaling.
-
-“Serverless is a natural evolution of cloud-native computing. The CNCF is advancing serverless adoption through collaboration and community-driven initiatives that will enable interoperability,” [said][3] Chris Aniszczyk, COO, CNCF.
-
-### It’s not without servers
-
-First things first, don’t get fooled by the term “serverless.” There are still servers in serverless computing. Remember what Raghuram said: all the machinery is hidden; it’s not gone.
-
-The clear benefit here is that developers need not concern themselves with tasks that don’t add any value to their deliverables. Instead of worrying about managing the function, they can dedicate their time to adding featured and building apps that add business value. Time is money and every minute saved in management goes toward innovation. Developers don’t have to worry about scaling based on peaks and valleys; it’s automated. Because cloud providers charge only for the duration that functions are run, developers cut costs by not having to pay for blinking lights.
-
-But… someone still has to do the work behind the scenes. There are still servers offering FaaS platforms.
-
-In the case of public cloud offerings like Google Cloud Platform, AWS, and Microsoft Azure, these companies manage the servers and charge customers for running those functions. In the case of private cloud or datacenters, where developers don’t have to worry about provisioning or interacting with such servers, there are other teams who do.
-
-The CNCF white paper identifies two groups of professionals that are involved in the serverless movement: developers and providers. We have already talked about developers. But, there are also providers that offer serverless platforms; they deal with all the work involved in keeping that server running.
-
-That’s why many companies, like SUSE, refrain from using the term “serverless” and prefer the term function as a service, because they offer products that run those “serverless” servers. But what kind of functions are these? Is it the ultimate future of app delivery?
-
-### Event-driven computing
-
-Many see serverless computing as an umbrella that offers FaaS among many other potential services. According to CNCF, FaaS provides event-driven computing where functions are triggered by events or HTTP requests. “Developers run and manage application code with functions that are triggered by events or HTTP requests. Developers deploy small units of code to the FaaS, which are executed as needed as discrete actions, scaling without the need to manage servers or any other underlying infrastructure,” said the white paper.
-
-Does that mean FaaS is the silver bullet that solves all problems for developing and deploying applications? Not really. At least not at the moment. FaaS does solve problems in several use cases and its scope is expanding. A good use case of FaaS could be the functions that an application needs to run when an event takes place.
-
-Let’s take an example: a user takes a picture from a phone and uploads it to the cloud. Many things happen when the picture is uploaded - it’s scanned (exif data is read), a thumbnail is created, based on deep learning/machine learning the content of the image is analyzed, the information of the image is stored in the database. That one event of uploading that picture triggers all those functions. Those functions die once the event is over. That’s what FaaS does. It runs code quickly to perform all those tasks and then disappears.
-
-That’s just one example. Another example could be an IoT device where a motion sensor triggers an event that instructs the camera to start recording and sends the clip to the designated contant. Your thermostat may trigger the fan when the sensor detects a change in temperature. These are some of the many use cases where function as a service make more sense than the traditional approach. Which also says that not all applications (at least at the moment, but that will change as more organizations embrace the serverless platform) can be run as function as service.
-
-According to CNCF, serverless computing should be considered if you have these kinds of workloads:
-
- * Asynchronous, concurrent, easy to parallelize into independent units of work
-
- * Infrequent or has sporadic demand, with large, unpredictable variance in scaling requirements
-
- * Stateless, ephemeral, without a major need for instantaneous cold start time
-
- * Highly dynamic in terms of changing business requirements that drive a need for accelerated developer velocity
-
-
-
-
-### Why should you care?
-
-Serverless is a very new technology and paradigm, just the way VMs and containers transformed the app development and delivery models, FaaS can also bring dramatic changes. We are still in the early days of serverless computing. As the market evolves, consensus is created and new technologies evolve, and FaaS may grow beyond the workloads and use cases mentioned here.
-
-What is becoming quite clear is that companies who are embarking on their cloud native journey must have serverless computing as part of their strategy. The only way to stay ahead of competitors is by keeping up with the latest technologies and trends.
-
-It’s about time to put serverless into servers.
-
-For more information, check out the CNCF Working Group's serverless whitepaper [here][2]. And, you can learn more at [KubeCon + CloudNativeCon Europe][4], coming up May 2-4 in Copenhagen, Denmark.
-
---------------------------------------------------------------------------------
-
-via: https://www.linux.com/blog/2018/4/theres-server-every-serverless-platform
-
-作者:[SWAPNIL BHARTIYA][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.linux.com/users/arnieswap
-[1]:https://www.cncf.io/
-[2]:https://github.com/cncf/wg-serverless/blob/master/whitepaper/cncf_serverless_whitepaper_v1.0.pdf
-[3]:https://www.cncf.io/blog/2018/02/14/cncf-takes-first-step-towards-serverless-computing/
-[4]:https://events.linuxfoundation.org/events/kubecon-cloudnativecon-europe-2018/attend/register/
diff --git a/sources/talk/20180511 Looking at the Lispy side of Perl.md b/sources/talk/20180511 Looking at the Lispy side of Perl.md
deleted file mode 100644
index 1fa51b314c..0000000000
--- a/sources/talk/20180511 Looking at the Lispy side of Perl.md
+++ /dev/null
@@ -1,357 +0,0 @@
-Looking at the Lispy side of Perl
-======
-
-Some programming languages (e.g., C) have named functions only, whereas others (e.g., Lisp, Java, and Perl) have both named and unnamed functions. A lambda is an unnamed function, with Lisp as the language that popularized the term. Lambdas have various uses, but they are particularly well-suited for data-rich applications. Consider this depiction of a data pipeline, with two processing stages shown:
-
-
-
-### Lambdas and higher-order functions
-
-The filter and transform stages can be implemented as higher-order functions—that is, functions that can take a function as an argument. Suppose that the depicted pipeline is part of an accounts-receivable application. The filter stage could consist of a function named `filter_data`, whose single argument is another function—for example, a `high_buyers` function that filters out amounts that fall below a threshold. The transform stage might convert amounts in U.S. dollars to equivalent amounts in euros or some other currency, depending on the function plugged in as the argument to the higher-order `transform_data` function. Changing the filter or the transform behavior requires only plugging in a different function argument to the higher order `filter_data` or `transform_data` functions.
-
-Lambdas serve nicely as arguments to higher-order functions for two reasons. First, lambdas can be crafted on the fly, and even written in place as arguments. Second, lambdas encourage the coding of pure functions, which are functions whose behavior depends solely on the argument(s) passed in; such functions have no side effects and thereby promote safe concurrent programs.
-
-Perl has a straightforward syntax and semantics for lambdas and higher-order functions, as shown in the following example:
-
-### A first look at lambdas in Perl
-
-```
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-## References to lambdas that increment, decrement, and do nothing.
-## $_[0] is the argument passed to each lambda.
-my $inc = sub { $_[0] + 1 }; ## could use 'return $_[0] + 1' for clarity
-my $dec = sub { $_[0] - 1 }; ## ditto
-my $nop = sub { $_[0] }; ## ditto
-
-sub trace {
- my ($val, $func, @rest) = @_;
- print $val, " ", $func, " ", @rest, "\nHit RETURN to continue...\n";
- <STDIN>;
-}
-
-## Apply an operation to a value. The base case occurs when there are
-## no further operations in the list named @rest.
-sub apply {
- my ($val, $first, @rest) = @_;
- trace($val, $first, @rest) if 1; ## 0 to stop tracing
-
- return ($val, apply($first->($val), @rest)) if @rest; ## recursive case
- return ($val, $first->($val)); ## base case
-}
-
-my $init_val = 0;
-my @ops = ( ## list of lambda references
- $inc, $dec, $dec, $inc,
- $inc, $inc, $inc, $dec,
- $nop, $dec, $dec, $nop,
- $nop, $inc, $inc, $nop
- );
-
-## Execute.
-print join(' ', apply($init_val, @ops)), "\n";
-## Final line of output: 0 1 0 -1 0 1 2 3 2 2 1 0 0 0 1 2 2strictwarningstraceSTDINapplytraceapplyapply
-```
-
-The lispy program shown above highlights the basics of Perl lambdas and higher-order functions. Named functions in Perl start with the keyword `sub` followed by a name:
-```
-sub increment { ... } # named function
-
-```
-
-An unnamed or anonymous function omits the name:
-```
-sub {...} # lambda, or unnamed function
-
-```
-
-In the lispy example, there are three lambdas, and each has a reference to it for convenience. Here, for review, is the `$inc` reference and the lambda referred to:
-```
-my $inc = sub { $_[0] + 1 };
-
-```
-
-The lambda itself, the code block to the right of the assignment operator `=`, increments its argument `$_[0]` by 1. The lambda’s body is written in Lisp style; that is, without either an explicit `return` or a semicolon after the incrementing expression. In Perl, as in Lisp, the value of the last expression in a function’s body becomes the returned value if there is no explicit `return` statement. In this example, each lambda has only one expression in its body—a simplification that befits the spirit of lambda programming.
-
-The `trace` function in the lispy program helps to clarify how the program works (as I'll illustrate below). The higher-order function `apply`, a nod to a Lisp function of the same name, takes a numeric value as its first argument and a list of lambda references as its second argument. The `apply` function is called initially, at the bottom of the program, with zero as the first argument and the list named `@ops` as the second argument. This list consists of 16 lambda references from among `$inc` (increment a value), `$dec` (decrement a value), and `$nop` (do nothing). The list could contain the lambdas themselves, but the code is easier to write and to understand with the more concise lambda references.
-
-The logic of the higher-order `apply` function can be clarified as follows:
-
- 1. The argument list passed to `apply` in typical Perl fashion is separated into three pieces:
-```
-my ($val, $first, @rest) = @_; ## break the argument list into three elements
-
-```
-
-The first element `$val` is a numeric value, initially `0`. The second element `$first` is a lambda reference, one of `$inc` `$dec`, or `$nop`. The third element `@rest` is a list of any remaining lambda references after the first such reference is extracted as `$first`.
-
- 2. If the list `@rest` is not empty after its first element is removed, then `apply` is called recursively. The two arguments to the recursively invoked `apply` are:
-
- * The value generated by applying lambda operation `$first` to numeric value `$val`. For example, if `$first` is the incrementing lambda to which `$inc` refers, and `$val` is 2, then the new first argument to `apply` would be 3.
- * The list of remaining lambda references. Eventually, this list becomes empty because each call to `apply` shortens the list by extracting its first element.
-
-
-
-Here is some output from a sample run of the lispy program, with `%` as the command-line prompt:
-```
-% ./lispy.pl
-
-0 CODE(0x8f6820) CODE(0x8f68c8)CODE(0x8f68c8)CODE(0x8f6820)CODE(0x8f6820)CODE(0x8f6820)...
-Hit RETURN to continue...
-
-1 CODE(0x8f68c8) CODE(0x8f68c8)CODE(0x8f6820)CODE(0x8f6820)CODE(0x8f6820)CODE(0x8f6820)...
-Hit RETURN to continue
-```
-
-The first output line can be clarified as follows:
-
- * The `0` is the numeric value passed as an argument in the initial (and thus non-recursive) call to function `apply`. The argument name is `$val` in `apply`.
- * The `CODE(0x8f6820)` is a reference to one of the lambdas, in this case the lambda to which `$inc` refers. The second argument is thus the address of some lambda code. The argument name is `$first` in `apply`
- * The third piece, the series of `CODE` references, is the list of lambda references beyond the first. The argument name is `@rest` in `apply`.
-
-
-
-The second line of output shown above also deserves a look. The numeric value is now `1`, the result of incrementing `0`: the initial lambda is `$inc` and the initial value is `0`. The extracted reference `CODE(0x8f68c8)` is now `$first`, as this reference is the first element in the `@rest` list after `$inc` has been extracted earlier.
-
-Eventually, the `@rest` list becomes empty, which ends the recursive calls to `apply`. In this case, the function `apply` simply returns a list with two elements:
-
- 1. The numeric value taken in as an argument (in the sample run, 2).
- 2. This argument transformed by the lambda (also 2 because the last lambda reference happens to be `$nop` for do nothing).
-
-
-
-The lispy example underscores that Perl supports lambdas without any special fussy syntax: A lambda is just an unnamed code block, perhaps with a reference to it for convenience. Lambdas themselves, or references to them, can be passed straightforwardly as arguments to higher-order functions such as `apply` in the lispy example. Invoking a lambda through a reference is likewise straightforward. In the `apply` function, the call is:
-```
-$first->($val) ## $first is a lambda reference, $val a numeric argument passed to the lambda
-
-```
-
-### A richer code example
-
-The next code example puts a lambda and a higher-order function to practical use. The example implements Conway’s Game of Life, a cellular automaton that can be represented as a matrix of cells. Such a matrix goes through various transformations, each yielding a new generation of cells. The Game of Life is fascinating because even relatively simple initial configurations can lead to quite complex behavior. A quick look at the rules governing cell birth, survival, and death is in order.
-
-Consider this 5x5 matrix, with a star representing a live cell and a dash representing a dead one:
-```
- ----- ## initial configuration
- --*--
- --*--
- --*--
- -----
-```
-
-The next generation becomes:
-```
- ----- ## next generation
- -----
- -***-
- ----
- -----
-```
-
-As life continues, the generations oscillate between these two configurations.
-
-Here are the rules determining birth, death, and survival for a cell. A given cell has between three neighbors (a corner cell) and eight neighbors (an interior cell):
-
- * A dead cell with exactly three live neighbors comes to life.
- * A live cell with more than three live neighbors dies from over-crowding.
- * A live cell with two or three live neighbors survives; hence, a live cell with fewer than two live neighbors dies from loneliness.
-
-
-
-In the initial configuration shown above, the top and bottom live cells die because neither has two or three live neighbors. By contrast, the middle live cell in the initial configuration gains two live neighbors, one on either side, in the next generation.
-
-## Conway’s Game of Life
-```
-#!/usr/bin/perl
-
-### A simple implementation of Conway's game of life.
-# Usage: ./gol.pl [input file] ;; If no file name given, DefaultInfile is used.
-
-use constant Dead => "-";
-use constant Alive => "*";
-use constant DefaultInfile => 'conway.in';
-
-use strict;
-use warnings;
-
-my $dimension = undef;
-my @matrix = ();
-my $generation = 1;
-
-sub read_data {
- my $datafile = DefaultInfile;
- $datafile = shift @ARGV if @ARGV;
- die "File $datafile does not exist.\n" if !-f $datafile;
- open(INFILE, "<$datafile");
-
- ## Check 1st line for dimension;
- $dimension = <INFILE>;
- die "1st line of input file $datafile not an integer.\n" if $dimension !~ /\d+/;
-
- my $record_count = 0;
- while (<INFILE>) {
- chomp($_);
- last if $record_count++ == $dimension;
- die "$_: bad input record -- incorrect length\n" if length($_) != $dimension;
- my @cells = split(//, $_);
- push @matrix, @cells;
- }
- close(INFILE);
- draw_matrix();
-}
-
-sub draw_matrix {
- my $n = $dimension * $dimension;
- print "\n\tGeneration $generation\n";
- for (my $i = 0; $i < $n; $i++) {
- print "\n\t" if ($i % $dimension) == 0;
- print $matrix[$i];
- }
- print "\n\n";
- $generation++;
-}
-
-sub has_left_neighbor {
- my ($ind) = @_;
- return ($ind % $dimension) != 0;
-}
-
-sub has_right_neighbor {
- my ($ind) = @_;
- return (($ind + 1) % $dimension) != 0;
-}
-
-sub has_up_neighbor {
- my ($ind) = @_;
- return (int($ind / $dimension)) != 0;
-}
-
-sub has_down_neighbor {
- my ($ind) = @_;
- return (int($ind / $dimension) + 1) != $dimension;
-}
-
-sub has_left_up_neighbor {
- my ($ind) = @_;
- ($ind) && has_up_neighbor($ind);
-}
-
-sub has_right_up_neighbor {
- my ($ind) = @_;
- ($ind) && has_up_neighbor($ind);
-}
-
-sub has_left_down_neighbor {
- my ($ind) = @_;
- ($ind) && has_down_neighbor($ind);
-}
-
-sub has_right_down_neighbor {
- my ($ind) = @_;
- ($ind) && has_down_neighbor($ind);
-}
-
-sub compute_cell {
- my ($ind) = @_;
- my @neighbors;
-
- # 8 possible neighbors
- push(@neighbors, $ind - 1) if has_left_neighbor($ind);
- push(@neighbors, $ind + 1) if has_right_neighbor($ind);
- push(@neighbors, $ind - $dimension) if has_up_neighbor($ind);
- push(@neighbors, $ind + $dimension) if has_down_neighbor($ind);
- push(@neighbors, $ind - $dimension - 1) if has_left_up_neighbor($ind);
- push(@neighbors, $ind - $dimension + 1) if has_right_up_neighbor($ind);
- push(@neighbors, $ind + $dimension - 1) if has_left_down_neighbor($ind);
- push(@neighbors, $ind + $dimension + 1) if has_right_down_neighbor($ind);
-
- my $count = 0;
- foreach my $n (@neighbors) {
- $count++ if $matrix[$n] eq Alive;
- }
-
- if ($matrix[$ind] eq Alive) && (($count == 2) || ($count == 3)); ## survival
- if ($matrix[$ind] eq Dead) && ($count == 3); ## birth
- ; ## death
-}
-
-sub again_or_quit {
- print "RETURN to continue, 'q' to quit.\n";
- my $flag = <STDIN>;
- chomp($flag);
- return ($flag eq 'q') ? 1 : 0;
-}
-
-sub animate {
- my @new_matrix;
- my $n = $dimension * $dimension - 1;
-
- while (1) { ## loop until user signals stop
- @new_matrix = map {compute_cell($_)} (0..$n); ## generate next matrix
-
- splice @matrix; ## empty current matrix
- push @matrix, @new_matrix; ## repopulate matrix
- draw_matrix(); ## display the current matrix
-
- last if again_or_quit(); ## continue?
- splice @new_matrix; ## empty temp matrix
- }
-}
-
-### Execute
-read_data(); ## read initial configuration from input file
-animate(); ## display and recompute the matrix until user tires
-```
-
-The gol program (see [Conway’s Game of Life][1]) has almost 140 lines of code, but most of these involve reading the input file, displaying the matrix, and bookkeeping tasks such as determining the number of live neighbors for a given cell. Input files should be configured as follows:
-```
- 5
- -----
- --*--
- --*--
- --*--
- -----
-```
-
-The first record gives the matrix side, in this case 5 for a 5x5 matrix. The remaining rows are the contents, with stars for live cells and spaces for dead ones.
-
-The code of primary interest resides in two functions, `animate` and `compute_cell`. The `animate` function constructs the next generation, and this function needs to call `compute_cell` on every cell in order to determine the cell’s new status as either alive or dead. How should the `animate` function be structured?
-
-The `animate` function has a `while` loop that iterates until the user decides to terminate the program. Within this `while` loop the high-level logic is straightforward:
-
- 1. Create the next generation by iterating over the matrix cells, calling function `compute_cell` on each cell to determine its new status. At issue is how best to do the iteration. A loop nested inside the `while `loop would do, of course, but nested loops can be clunky. Another way is to use a higher-order function, as clarified shortly.
- 2. Replace the current matrix with the new one.
- 3. Display the next generation.
- 4. Check if the user wants to continue: if so, continue; otherwise, terminate.
-
-
-
-Here, for review, is the call to Perl’s higher-order `map` function, with the function’s name again a nod to Lisp. This call occurs as the first statement within the `while` loop in `animate`:
-```
-while (1) {
- @new_matrix = map {compute_cell($_)} (0..$n); ## generate next matrixcompute_cell
-```
-
-The `map` function takes two arguments: an unnamed code block (a lambda!), and a list of values passed to this code block one at a time. In this example, the code block calls the `compute_cell` function with one of the matrix indexes, 0 through the matrix size - 1. Although the matrix is displayed as two-dimensional, it is implemented as a one-dimensional list.
-
-Higher-order functions such as `map` encourage the code brevity for which Perl is famous. My view is that such functions also make code easier to write and to understand, as they dispense with the required but messy details of loops. In any case, lambdas and higher-order functions make up the Lispy side of Perl.
-
-If you're interested in more detail, I recommend Mark Jason Dominus's book, [Higher-Order Perl][2].
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/5/looking-lispy-side-perl
-
-作者:[Marty Kalin][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/mkalindepauledu
-[1]:https://trello-attachments.s3.amazonaws.com/575088ec94ca6ac38b49b30e/5ad4daf12f6b6a3ac2318d28/c0700c7379983ddf61f5ab5ab4891f0c/lispyPerl.html#gol (Conway’s Game of Life)
-[2]:https://www.elsevier.com/books/higher-order-perl/dominus/978-1-55860-701-9
diff --git a/sources/talk/20180527 Whatever Happened to the Semantic Web.md b/sources/talk/20180527 Whatever Happened to the Semantic Web.md
deleted file mode 100644
index 22d48c150a..0000000000
--- a/sources/talk/20180527 Whatever Happened to the Semantic Web.md
+++ /dev/null
@@ -1,106 +0,0 @@
-Whatever Happened to the Semantic Web?
-======
-In 2001, Tim Berners-Lee, inventor of the World Wide Web, published an article in Scientific American. Berners-Lee, along with two other researchers, Ora Lassila and James Hendler, wanted to give the world a preview of the revolutionary new changes they saw coming to the web. Since its introduction only a decade before, the web had fast become the world’s best means for sharing documents with other people. Now, the authors promised, the web would evolve to encompass not just documents but every kind of data one could imagine.
-
-They called this new web the Semantic Web. The great promise of the Semantic Web was that it would be readable not just by humans but also by machines. Pages on the web would be meaningful to software programs—they would have semantics—allowing programs to interact with the web the same way that people do. Programs could exchange data across the Semantic Web without having to be explicitly engineered to talk to each other. According to Berners-Lee, Lassila, and Hendler, a typical day living with the myriad conveniences of the Semantic Web might look something like this:
-
-> The entertainment system was belting out the Beatles’ “We Can Work It Out” when the phone rang. When Pete answered, his phone turned the sound down by sending a message to all the other local devices that had a volume control. His sister, Lucy, was on the line from the doctor’s office: “Mom needs to see a specialist and then has to have a series of physical therapy sessions. Biweekly or something. I’m going to have my agent set up the appointments.” Pete immediately agreed to share the chauffeuring. At the doctor’s office, Lucy instructed her Semantic Web agent through her handheld Web browser. The agent promptly retrieved the information about Mom’s prescribed treatment within a 20-mile radius of her home and with a rating of excellent or very good on trusted rating services. It then began trying to find a match between available appointment times (supplied by the agents of individual providers through their Web sites) and Pete’s and Lucy’s busy schedules.
-
-The vision was that the Semantic Web would become a playground for intelligent “agents.” These agents would automate much of the work that the world had only just learned to do on the web.
-
-![][1]
-
-For a while, this vision enticed a lot of people. After new technologies such as AJAX led to the rise of what Silicon Valley called Web 2.0, Berners-Lee began referring to the Semantic Web as Web 3.0. Many thought that the Semantic Web was indeed the inevitable next step. A New York Times article published in 2006 quotes a speech Berners-Lee gave at a conference in which he said that the extant web would, twenty years in the future, be seen as only the “embryonic” form of something far greater. A venture capitalist, also quoted in the article, claimed that the Semantic Web would be “profound,” and ultimately “as obvious as the web seems obvious to us today.”
-
-Of course, the Semantic Web we were promised has yet to be delivered. In 2018, we have “agents” like Siri that can do certain tasks for us. But Siri can only do what it can because engineers at Apple have manually hooked it up to a medley of web services each capable of answering only a narrow category of questions. An important consequence is that, without being large and important enough for Apple to care, you cannot advertise your services directly to Siri from your own website. Unlike the physical therapists that Berners-Lee and his co-authors imagined would be able to hang out their shingles on the web, today we are stuck with giant, centralized repositories of information. Today’s physical therapists must enter information about their practice into Google or Yelp, because those are the only services that the smartphone agents know how to use and the only ones human beings will bother to check. The key difference between our current reality and the promised Semantic future is best captured by this throwaway aside in the excerpt above: “…appointment times (supplied by the agents of individual providers through **their** Web sites)…”
-
-In fact, over the last decade, the web has not only failed to become the Semantic Web but also threatened to recede as an idea altogether. We now hardly ever talk about “the web” and instead talk about “the internet,” which as of 2016 has become such a common term that newspapers no longer capitalize it. (To be fair, they stopped capitalizing “web” too.) Some might still protest that the web and the internet are two different things, but the distinction gets less clear all the time. The web we have today is slowly becoming a glorified app store, just the easiest way among many to download software that communicates with distant servers using closed protocols and schemas, making it functionally identical to the software ecosystem that existed before the web. How did we get here? If the effort to build a Semantic Web had succeeded, would the web have looked different today? Or have there been so many forces working against a decentralized web for so long that the Semantic Web was always going to be stillborn?
-
-### Semweb Hucksters and Their Metacrap
-
-To some more practically minded engineers, the Semantic Web was, from the outset, a utopian dream.
-
-The basic idea behind the Semantic Web was that everyone would use a new set of standards to annotate their webpages with little bits of XML. These little bits of XML would have no effect on the presentation of the webpage, but they could be read by software programs to divine meaning that otherwise would only be available to humans.
-
-The bits of XML were a way of expressing metadata about the webpage. We are all familiar with metadata in the context of a file system: When we look at a file on our computers, we can see when it was created, when it was last updated, and whom it was originally created by. Likewise, webpages on the Semantic Web would be able to tell your browser who authored the page and perhaps even where that person went to school, or where that person is currently employed. In theory, this information would allow Semantic Web browsers to answer queries across a large collection of webpages. In their article for Scientific American, Berners-Lee and his co-authors explain that you could, for example, use the Semantic Web to look up a person you met at a conference whose name you only partially remember.
-
-Cory Doctorow, a blogger and digital rights activist, published an influential essay in 2001 that pointed out the many problems with depending on voluntarily supplied metadata. A world of “exhaustive, reliable” metadata would be wonderful, he argued, but such a world was “a pipe-dream, founded on self-delusion, nerd hubris, and hysterically inflated market opportunities.” Doctorow had found himself in a series of debates over the Semantic Web at tech conferences and wanted to catalog the serious issues that the Semantic Web enthusiasts (Doctorow calls them “semweb hucksters”) were overlooking. The essay, titled “Metacrap,” identifies seven problems, among them the obvious fact that most web users were likely to provide either no metadata at all or else lots of misleading metadata meant to draw clicks. Even if users were universally diligent and well-intentioned, in order for the metadata to be robust and reliable, users would all have to agree on a single representation for each important concept. Doctorow argued that in some cases a single representation might not be appropriate, desirable, or fair to all users.
-
-Indeed, the web had already seen people abusing the HTML `` tag (introduced at least as early as HTML 4) in an attempt to improve the visibility of their webpages in search results. In a 2004 paper, Ben Munat, then an academic at Evergreen State College, explains how search engines once experimented with using keywords supplied via the `` tag to index results, but soon discovered that unscrupulous webpage authors were including tags unrelated to the actual content of their webpage. As a result, search engines came to ignore the `` tag in favor of using complex algorithms to analyze the actual content of a webpage. Munat concludes that a general-purpose Semantic Web is unworkable, and that the focus should be on specific domains within medicine and science.
-
-Others have also seen the Semantic Web project as tragically flawed, though they have located the flaw elsewhere. Aaron Swartz, the famous programmer and another digital rights activist, wrote in an unfinished book about the Semantic Web published after his death that Doctorow was “attacking a strawman.” Nobody expected that metadata on the web would be thoroughly accurate and reliable, but the Semantic Web, or at least a more realistically scoped version of it, remained possible. The problem, in Swartz’ view, was the “formalizing mindset of mathematics and the institutional structure of academics” that the “semantic Webheads” brought to bear on the challenge. In forums like the World Wide Web Consortium (W3C), a huge amount of effort and discussion went into creating standards before there were any applications out there to standardize. And the standards that emerged from these “Talmudic debates” were so abstract that few of them ever saw widespread adoption. The few that did, like XML, were “uniformly scourges on the planet, offenses against hardworking programmers that have pushed out sensible formats (like JSON) in favor of overly-complicated hairballs with no basis in reality.” The Semantic Web might have thrived if, like the original web, its standards were eagerly adopted by everyone. But that never happened because—as [has been discussed][2] on this blog before—the putative benefits of something like XML are not easy to sell to a programmer when the alternatives are both entirely sufficient and much easier to understand.
-
-### Building the Semantic Web
-
-If the Semantic Web was not an outright impossibility, it was always going to require the contributions of lots of clever people working in concert.
-
-The long effort to build the Semantic Web has been said to consist of four phases. The first phase, which lasted from 2001 to 2005, was the golden age of Semantic Web activity. Between 2001 and 2005, the W3C issued a slew of new standards laying out the foundational technologies of the Semantic future.
-
-The most important of these was the Resource Description Framework (RDF). The W3C issued the first version of the RDF standard in 2004, but RDF had been floating around since 1997, when a W3C working group introduced it in a draft specification. RDF was originally conceived of as a tool for modeling metadata and was partly based on earlier attempts by Ramanathan Guha, an Apple engineer, to develop a metadata system for files stored on Apple computers. The Semantic Web working groups at W3C repurposed RDF to represent arbitrary kinds of general knowledge.
-
-RDF would be the grammar in which Semantic webpages expressed information. The grammar is a simple one: Facts about the world are expressed in RDF as triplets of subject, predicate, and object. Tim Bray, who worked with Ramanathan Guha on an early version of RDF, gives the following example, describing TV shows and movies:
-
-```
-@prefix rdf: .
-
-@prefix ex: .
-
-
-ex:vincent_donofrio ex:starred_in ex:law_and_order_ci .
-
-ex:law_and_order_ci rdf:type ex:tv_show .
-
-ex:the_thirteenth_floor ex:similar_plot_as ex:the_matrix .
-```
-
-The syntax is not important, especially since RDF can be represented in a number of formats, including XML and JSON. This example is in a format called Turtle, which expresses RDF triplets as straightforward sentences terminated by periods. The three essential sentences, which appear above after the `@prefix` preamble, state three facts: Vincent Donofrio starred in Law and Order, Law and Order is a type of TV Show, and the movie The Thirteenth Floor has a similar plot as The Matrix. (If you don’t know who Vincent Donofrio is and have never seen The Thirteenth Floor, I, too, was watching Nickelodeon and sipping Capri Suns in 1999.)
-
-Other specifications finalized and drafted during this first era of Semantic Web development describe all the ways in which RDF can be used. RDF in Attributes (RDFa) defines how RDF can be embedded in HTML so that browsers, search engines, and other programs can glean meaning from a webpage. RDF Schema and another standard called OWL allows RDF authors to demarcate the boundary between valid and invalid RDF statements in their RDF documents. RDF Schema and OWL, in other words, are tools for creating what are known as ontologies, explicit specifications of what can and cannot be said within a specific domain. An ontology might include a rule, for example, expressing that no person can be the mother of another person without also being a parent of that person. The hope was that these ontologies would be widely used not only to check the accuracy of RDF found in the wild but also to make inferences about omitted information.
-
-In 2006, Tim Berners-Lee posted a short article in which he argued that the existing work on Semantic Web standards needed to be supplemented by a concerted effort to make semantic data available on the web. Furthermore, once on the web, it was important that semantic data link to other kinds of semantic data, ensuring the rise of a data-based web as interconnected as the existing web. Berners-Lee used the term “linked data” to describe this ideal scenario. Though “linked data” was in one sense just a recapitulation of the original vision for the Semantic Web, it became a term that people could rally around and thus amounted to a rebranding of the Semantic Web project.
-
-Berners-Lee’s article launched the second phase of the Semantic Web’s development, where the focus shifted from setting standards and building toy examples to creating and popularizing large RDF datasets. Perhaps the most successful of these datasets was [DBpedia][3], a giant repository of RDF triplets extracted from Wikipedia articles. DBpedia, which made heavy use of the Semantic Web standards that had been developed in the first half of the 2000s, was a standout example of what could be accomplished using the W3C’s new formats. Today DBpedia describes 4.58 million entities and is used by organizations like the NY Times, BBC, and IBM, which employed DBpedia as a knowledge source for IBM Watson, the Jeopardy-winning artificial intelligence system.
-
-![][4]
-
-The third phase of the Semantic Web’s development involved adapting the W3C’s standards to fit the actual practices and preferences of web developers. By 2008, JSON had begun its meteoric rise to popularity. Whereas XML came packaged with a bunch of associated technologies of indeterminate purpose (XLST, XPath, XQuery, XLink), JSON was just JSON. It was less verbose and more readable. Manu Sporny, an entrepreneur and member of the W3C, had already started using JSON at his company and wanted to find an easy way for RDFa and JSON to work together. The result would be JSON-LD, which in essence was RDF reimagined for a world that had chosen JSON over XML. Sporny, together with his CTO, Dave Longley, issued a draft specification of JSON-LD in 2010. For the next few years, JSON-LD and an updated RDF specification would be the primary focus of Semantic Web work at the W3C. JSON-LD could be used on its own or it could be embedded within a ``
+```
+
+With:
+
+
+```
+``
+```
+
+Now the HTML5 version of your project runs in a web browser, whether the user is online or not.
+
+JClic also provides a reports function that can store test scores in an ODBC-compliant database. I have not explored this feature, as my tests and puzzles are mostly used for self-assessment and to prompt reflection by the learner, rather than as part of a formal scheme, so the scores are not very important. If you would like to learn about it, there is [documentation][14] on running JClic Reports Server with Tomcat and MySQL (or [mariaDB][15]).
+
+### Conclusion
+
+JClic offers a wide range of activity types that provide plenty of room to be creative in designing content to fit your subject area and type of learner. JClic is a valuable addition for anyone who needs a quick and easy way to develop educational resources.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/5/jclic-games-kids
+
+作者:[Peter Cheer][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/petercheer
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/family_learning_kids_night_reading.png?itok=6K7sJVb1 (Family learning and reading together at night in a room)
+[2]: https://opensource.com/article/18/5/exelearning
+[3]: https://clic.xtec.cat/legacy/en/jclic/index.html
+[4]: https://clic.xtec.cat/legacy/en/index.html
+[5]: https://github.com/projectestac/jclic
+[6]: https://adoptopenjdk.net/installation.html
+[7]: https://clic.xtec.cat/repo/
+[8]: https://github.com/projectestac/jclic/wiki/JClic_Guide
+[9]: https://opensource.com/sites/default/files/uploads/metadata.png (JClic metadata)
+[10]: https://opensource.com/sites/default/files/uploads/media.png (JClic media)
+[11]: https://opensource.com/sites/default/files/uploads/activities.png (JClic activities)
+[12]: https://opensource.com/sites/default/files/uploads/sequence.png (JClic timeline)
+[13]: http://projectestac.github.io/jclic.js/
+[14]: https://github.com/projectestac/jclic/wiki/Jclic-Reports-Server-with-Tomcat-and-MySQL-on-Ubuntu
+[15]: https://mariadb.org/
diff --git a/sources/tech/20200504 Define and optimize data partitions in Apache Cassandra.md b/sources/tech/20200504 Define and optimize data partitions in Apache Cassandra.md
new file mode 100644
index 0000000000..d28f0daee0
--- /dev/null
+++ b/sources/tech/20200504 Define and optimize data partitions in Apache Cassandra.md
@@ -0,0 +1,150 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Define and optimize data partitions in Apache Cassandra)
+[#]: via: (https://opensource.com/article/20/5/apache-cassandra)
+[#]: author: (Anil Inamdar https://opensource.com/users/anil-inamdar)
+
+Define and optimize data partitions in Apache Cassandra
+======
+Apache Cassandra is built for speed and scalability; here's how to get
+the most out of those benefits.
+![Person standing in front of a giant computer screen with numbers, data][1]
+
+Apache Cassandra is a database. But it's not just any database; it's a replicating database designed and tuned for scalability, high availability, low-latency, and performance. Cassandra can help your data survive regional outages, hardware failure, and what many admins would consider excessive amounts of data.
+
+Having a thorough command of data partitions enables you to achieve superior Cassandra cluster design, performance, and scalability. In this article, I'll examine how to define partitions and how Cassandra uses them, as well as the most critical best practices and known issues you ought to be aware of.
+
+To set the scene: partitions are chunks of data that serve as the atomic unit for key database-related functions like data distribution, replication, and indexing. Distributed data systems commonly distribute incoming data into these partitions, performing the partitioning with simple mathematical functions such as identity or hashing, and using a "partition key" to group data by partition. For example, consider a case where server logs arrive as incoming data. Using the "identity" partitioning function and the timestamps of each log (rounded to the hour value) for the partition key, we can partition this data such that each partition holds one hour of the logs.
+
+### Data partitions in Cassandra
+
+Cassandra operates as a distributed system and adheres to the data partitioning principles described above. With Cassandra, data partitioning relies on an algorithm configured at the cluster level, and a partition key configured at the table level.
+
+![Cassandra data partition][2]
+
+Cassandra Query Language (CQL) uses the familiar SQL table, row, and column terminologies. In the example diagram above, the table configuration includes the partition key within its primary key, with the format: Primary Key = Partition Key + [Clustering Columns].
+
+A primary key in Cassandra represents both a unique data partition and a data arrangement inside a partition. Data arrangement information is provided by optional clustering columns. Each unique partition key represents a set of table rows managed in a server, as well as all servers that manage its replicas.
+
+### Defining primary keys in CQL
+
+The following four examples demonstrate how a primary key can be represented in CQL syntax. The sets of rows produced by these definitions are generally considered a partition.
+
+#### Definition 1 (partition key: log_hour, clustering columns: none)
+
+
+```
+CREATE TABLE server_logs(
+ log_hour TIMESTAMP PRIMARYKEY,
+ log_level text,
+ message text,
+ server text
+ )
+```
+
+Here, all rows that share a **log_hour** go into the same partition.
+
+#### Definition 2 (partition key: log_hour, clustering columns: log_level)
+
+
+```
+CREATE TABLE server_logs(
+ log_hour TIMESTAMP,
+ log_level text,
+ message text,
+ server text,
+ PRIMARY KEY (log_hour, log_level)
+ )
+```
+
+This definition uses the same partition key as Definition 1, but here all rows in each partition are arranged in ascending order by **log_level**.
+
+#### Definition 3 (partition key: log_hour, server, clustering columns: none)
+
+
+```
+CREATE TABLE server_logs(
+ log_hour TIMESTAMP,
+ log_level text,
+ message text,
+ server text,
+ PRIMARY KEY ((log_hour, server))
+ )
+```
+
+In this definition, all rows share a **log_hour** for each distinct **server** as a single partition.
+
+#### Definition 4 (partition key: log_hour, server, clustering columns: log_level)
+
+
+```
+CREATE TABLE server_logs(
+ log_hour TIMESTAMP,
+ log_level text,
+ message text,
+ server text,
+ PRIMARY KEY ((log_hour, server),log_level)
+ )WITH CLUSTERING ORDER BY (column3 DESC);
+```
+
+This definition uses the same partition as Definition 3 but arranges the rows within a partition in descending order by **log_level**.
+
+### How Cassandra uses the partition key
+
+Cassandra relies on the partition key to determine which node to store data on and where to locate data when it's needed. Cassandra performs these read and write operations by looking at a partition key in a table, and using tokens (a long value out of range -2^63 to +2^63-1) for data distribution and indexing. These tokens are mapped to partition keys by using a partitioner, which applies a partitioning function that converts any partition key to a token. Through this token mechanism, every node of a Cassandra cluster owns a set of data partitions. The partition key then enables data indexing on each node.
+
+![Cassandra cluster with 3 nodes and token-based ownership][3]
+
+A Cassandra cluster with three nodes and token-based ownership. This is a simplistic representation: the actual implementation uses [Vnodes][4].
+
+### Data partition impacts on Cassandra clusters
+
+Careful partition key design is crucial to achieving the ideal partition size for the use case. Getting it right allows for even data distribution and strong I/O performance. Partition size has several impacts on Cassandra clusters you need to be aware of:
+
+ * Read performance—In order to find partitions in SSTables files on disk, Cassandra uses data structures that include caches, indexes, and index summaries. Partitions that are too large reduce the efficiency of maintaining these data structures – and will negatively impact performance as a result. Cassandra releases have made strides in this area: in particular, version 3.6 and above of the Cassandra engine introduce storage improvements that deliver better performance for large partitions and resilience against memory issues and crashes.
+ * Memory usage— Large partitions place greater pressure on the JVM heap, increasing its size while also making the garbage collection mechanism less efficient.
+ * Cassandra repairs—Large partitions make it more difficult for Cassandra to perform its repair maintenance operations, which keep data consistent by comparing data across replicas.
+ * Tombstone eviction—Not as mean as it sounds, Cassandra uses unique markers known as "tombstones" to mark data for deletion. Large partitions can make that deletion process more difficult if there isn't an appropriate data deletion pattern and compaction strategy in place.
+
+
+
+While these impacts may make it tempting to simply design partition keys that yield especially small partitions, the data access pattern is also highly influential on ideal partition size (for more information, read this in-depth guide to [Cassandra data modeling][5]). The data access pattern can be defined as how a table is queried, including all of the table's **select** queries. Ideally, CQL select queries should have just one partition key in the **where** clause—that is to say, Cassandra is most efficient when queries can get needed data from a single partition, instead of many smaller ones.
+
+### Best practices for partition key design
+
+Following best practices for partition key design helps you get to an ideal partition size. As a rule of thumb, the maximum partition size in Cassandra should stay under 100MB. Ideally, it should be under 10MB. While Cassandra versions 3.6 and newer make larger partition sizes more viable, careful testing and benchmarking must be performed for each workload to ensure a partition key design supports desired cluster performance.
+
+Specifically, these best practices should be considered as part of any partition key design:
+
+ * The goal for a partition key must be to fit an ideal amount of data into each partition for supporting the needs of its access pattern.
+ * A partition key should disallow unbounded partitions: those that may grow indefinitely in size over time. For instance, in the **server_logs** examples above, using the server column as a partition key would create unbounded partitions as the number of server logs continues to increase. In contrast, using **log_hour** limits each partition to an hour of data.
+ * A partition key should also avoid creating a partition skew, in which partitions grow unevenly, and some are able to grow without limit over time. In the **server_logs** examples, using the server column in a scenario where one server generates considerably more logs than others would produce a partition skew. To avoid this, a useful technique is to introduce another attribute from the table to force an even distribution, even if it's necessary to create a dummy column to do so.
+ * It's helpful to partition time-series data with a partition key that uses a time element as well as other attributes. This protects against unbounded partitions, enables access patterns to use the time attribute in querying specific data, and allows for time-bound data deletion. The examples above each demonstrate this by using the **log_hour** time attribute.
+
+
+
+Several tools are available to help test, analyze, and monitor Cassandra partitions to check that a chosen schema is efficient and effective. By carefully designing partition keys to align well with the data and needs of the solution at hand, and following best practices to optimize partition size, you can utilize data partitions that more fully deliver on the scalability and performance potential of a Cassandra deployment.
+
+Dani and Jon will give a three hour tutorial at OSCON this year called: Becoming friends with...
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/5/apache-cassandra
+
+作者:[Anil Inamdar][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/anil-inamdar
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data)
+[2]: https://opensource.com/sites/default/files/uploads/apache_cassandra_1_0.png (Cassandra data partition)
+[3]: https://opensource.com/sites/default/files/uploads/apache_cassandra_2_0.png (Cassandra cluster with 3 nodes and token-based ownership)
+[4]: https://www.instaclustr.com/cassandra-vnodes-how-many-should-i-use/
+[5]: https://www.instaclustr.com/resource/6-step-guide-to-apache-cassandra-data-modelling-white-paper/
diff --git a/sources/tech/20200504 Understanding systemd at startup on Linux.md b/sources/tech/20200504 Understanding systemd at startup on Linux.md
new file mode 100644
index 0000000000..2d0a5ef7b6
--- /dev/null
+++ b/sources/tech/20200504 Understanding systemd at startup on Linux.md
@@ -0,0 +1,445 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Understanding systemd at startup on Linux)
+[#]: via: (https://opensource.com/article/20/5/systemd-startup)
+[#]: author: (David Both https://opensource.com/users/dboth)
+
+Understanding systemd at startup on Linux
+======
+systemd's startup provides important clues to help you solve problems
+when they occur.
+![People at the start line of a race][1]
+
+In [_Learning to love systemd_][2], the first article in this series, I looked at systemd's functions and architecture and the controversy around its role as a replacement for the old SystemV init program and startup scripts. In this second article, I'll start exploring the files and tools that manage the Linux startup sequence. I'll explain the systemd startup sequence, how to change the default startup target (runlevel in SystemV terms), and how to manually switch to a different target without going through a reboot.
+
+I'll also look at two important systemd tools. The first is the **systemctl** command, which is the primary means of interacting with and sending commands to systemd. The second is **journalctl**, which provides access to the systemd journals that contain huge amounts of system history data such as kernel and service messages (both informational and error messages).
+
+Be sure to use a non-production system for testing and experimentation in this and future articles. Your test system needs to have a GUI desktop (such as Xfce, LXDE, Gnome, KDE, or another) installed.
+
+I wrote in my previous article that I planned to look at creating a systemd unit and adding it to the startup sequence in this article. Because this article became longer than I anticipated, I will hold that for the next article in this series.
+
+### Exploring Linux startup with systemd
+
+Before you can observe the startup sequence, you need to do a couple of things to make the boot and startup sequences open and visible. Normally, most distributions use a startup animation or splash screen to hide the detailed messages that would otherwise be displayed during a Linux host's startup and shutdown. This is called the Plymouth boot screen on Red Hat-based distros. Those hidden messages can provide a great deal of information about startup and shutdown to a sysadmin looking for information to troubleshoot a bug or to just learn about the startup sequence. You can change this using the GRUB (Grand Unified Boot Loader) configuration.
+
+The main GRUB configuration file is **/boot/grub2/grub.cfg**, but, because this file can be overwritten when the kernel version is updated, you do not want to change it. Instead, modify the **/etc/default/grub** file, which is used to modify the default settings of **grub.cfg**.
+
+Start by looking at the current, unmodified version of the **/etc/default/grub** file:
+
+
+```
+[root@testvm1 ~]# cd /etc/default ; cat grub
+GRUB_TIMEOUT=5
+GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
+GRUB_DEFAULT=saved
+GRUB_DISABLE_SUBMENU=true
+GRUB_TERMINAL_OUTPUT="console"
+GRUB_CMDLINE_LINUX="resume=/dev/mapper/fedora_testvm1-swap rd.lvm.
+lv=fedora_testvm1/root rd.lvm.lv=fedora_testvm1/swap rd.lvm.lv=fedora_
+testvm1/usr rhgb quiet"
+GRUB_DISABLE_RECOVERY="true"
+[root@testvm1 default]#
+```
+
+Chapter 6 of the [GRUB documentation][3] contains a list of all the possible entries in the **/etc/default/grub** file, but I focus on the following:
+
+ * I change **GRUB_TIMEOUT**, the number of seconds for the GRUB menu countdown, from five to 10 to give a bit more time to respond to the GRUB menu before the countdown hits zero.
+ * I delete the last two parameters on **GRUB_CMDLINE_LINUX**, which lists the command-line parameters that are passed to the kernel at boot time. One of these parameters, **rhgb** stands for Red Hat Graphical Boot, and it displays the little Fedora icon animation during the kernel initialization instead of showing boot-time messages. The other, the **quiet** parameter, prevents displaying the startup messages that document the progress of the startup and any errors that occur. I delete both **rhgb** and **quiet** because sysadmins need to see these messages. If something goes wrong during boot, the messages displayed on the screen can point to the cause of the problem.
+
+
+
+After you make these changes, your GRUB file will look like:
+
+
+```
+[root@testvm1 default]# cat grub
+GRUB_TIMEOUT=10
+GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
+GRUB_DEFAULT=saved
+GRUB_DISABLE_SUBMENU=true
+GRUB_TERMINAL_OUTPUT="console"
+GRUB_CMDLINE_LINUX="resume=/dev/mapper/fedora_testvm1-swap rd.lvm.
+lv=fedora_testvm1/root rd.lvm.lv=fedora_testvm1/swap rd.lvm.lv=fedora_
+testvm1/usr"
+GRUB_DISABLE_RECOVERY="false"
+[root@testvm1 default]#
+```
+
+The **grub2-mkconfig** program generates the **grub.cfg** configuration file using the contents of the **/etc/default/grub** file to modify some of the default GRUB settings. The **grub2-mkconfig** program sends its output to **STDOUT**. It has a **-o** option that allows you to specify a file to send the datastream to, but it is just as easy to use redirection. Run the following command to update the **/boot/grub2/grub.cfg** configuration file:
+
+
+```
+[root@testvm1 grub2]# grub2-mkconfig > /boot/grub2/grub.cfg
+Generating grub configuration file ...
+Found linux image: /boot/vmlinuz-4.18.9-200.fc28.x86_64
+Found initrd image: /boot/initramfs-4.18.9-200.fc28.x86_64.img
+Found linux image: /boot/vmlinuz-4.17.14-202.fc28.x86_64
+Found initrd image: /boot/initramfs-4.17.14-202.fc28.x86_64.img
+Found linux image: /boot/vmlinuz-4.16.3-301.fc28.x86_64
+Found initrd image: /boot/initramfs-4.16.3-301.fc28.x86_64.img
+Found linux image: /boot/vmlinuz-0-rescue-7f12524278bd40e9b10a085bc82dc504
+Found initrd image: /boot/initramfs-0-rescue-7f12524278bd40e9b10a085bc82dc504.img
+done
+[root@testvm1 grub2]#
+```
+
+Reboot your test system to view the startup messages that would otherwise be hidden behind the Plymouth boot animation. But what if you need to view the startup messages and have not disabled the Plymouth boot animation? Or you have, but the messages stream by too fast to read? (Which they do.)
+
+There are a couple of options, and both involve log files and systemd journals—which are your friends. You can use the **less** command to view the contents of the **/var/log/messages** file. This file contains boot and startup messages as well as messages generated by the operating system during normal operation. You can also use the **journalctl** command without any options to view the systemd journal, which contains essentially the same information:
+
+
+```
+[root@testvm1 grub2]# journalctl
+\-- Logs begin at Sat 2020-01-11 21:48:08 EST, end at Fri 2020-04-03 08:54:30 EDT. --
+Jan 11 21:48:08 f31vm.both.org kernel: Linux version 5.3.7-301.fc31.x86_64 ([mockbuild@bkernel03.phx2.fedoraproject.org][4]) (gcc version 9.2.1 20190827 (Red Hat 9.2.1-1) (GCC)) #1 SMP Mon Oct >
+Jan 11 21:48:08 f31vm.both.org kernel: Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.3.7-301.fc31.x86_64 root=/dev/mapper/VG01-root ro resume=/dev/mapper/VG01-swap rd.lvm.lv=VG01/root rd>
+Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
+Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
+Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
+Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256
+Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
+Jan 11 21:48:08 f31vm.both.org kernel: BIOS-provided physical RAM map:
+Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
+Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved
+Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
+Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000000100000-0x00000000dffeffff] usable
+Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000dfff0000-0x00000000dfffffff] ACPI data
+Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
+Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
+Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved
+Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000100000000-0x000000041fffffff] usable
+Jan 11 21:48:08 f31vm.both.org kernel: NX (Execute Disable) protection: active
+Jan 11 21:48:08 f31vm.both.org kernel: SMBIOS 2.5 present.
+Jan 11 21:48:08 f31vm.both.org kernel: DMI: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
+Jan 11 21:48:08 f31vm.both.org kernel: Hypervisor detected: KVM
+Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: Using msrs 4b564d01 and 4b564d00
+Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: cpu 0, msr 30ae01001, primary cpu clock
+Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: using sched offset of 8250734066 cycles
+Jan 11 21:48:08 f31vm.both.org kernel: clocksource: kvm-clock: mask: 0xffffffffffffffff max_cycles: 0x1cd42e4dffb, max_idle_ns: 881590591483 ns
+Jan 11 21:48:08 f31vm.both.org kernel: tsc: Detected 2807.992 MHz processor
+Jan 11 21:48:08 f31vm.both.org kernel: e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
+Jan 11 21:48:08 f31vm.both.org kernel: e820: remove [mem 0x000a0000-0x000fffff] usable
+<snip>
+```
+
+I truncated this datastream because it can be hundreds of thousands or even millions of lines long. (The journal listing on my primary workstation is 1,188,482 lines long.) Be sure to try this on your test system. If it has been running for some time—even if it has been rebooted many times—huge amounts of data will be displayed. Explore this journal data because it contains a lot of information that can be very useful when doing problem determination. Knowing what this data looks like for a normal boot and startup can help you locate problems when they occur.
+
+I will discuss systemd journals, the **journalctl** command, and how to sort through all of that data to find what you want in more detail in a future article in this series.
+
+After GRUB loads the kernel into memory, it must first extract itself from the compressed version of the file before it can perform any useful work. After the kernel has extracted itself and started running, it loads systemd and turns control over to it.
+
+This is the end of the boot process. At this point, the Linux kernel and systemd are running but unable to perform any productive tasks for the end user because nothing else is running, there's no shell to provide a command line, no background processes to manage the network or other communication links, and nothing that enables the computer to perform any productive function.
+
+Systemd can now load the functional units required to bring the system up to a selected target run state.
+
+### Targets
+
+A systemd target represents a Linux system's current or desired run state. Much like SystemV start scripts, targets define the services that must be present for the system to run and be active in that state. Figure 1 shows the possible run-state targets of a Linux system using systemd. As seen in the first article of this series and in the systemd bootup man page (man bootup), there are other intermediate targets that are required to enable various necessary services. These can include **swap.target**, **timers.target**, **local-fs.target**, and more. Some targets (like **basic.target**) are used as checkpoints to ensure that all the required services are up and running before moving on to the next-higher level target.
+
+Unless otherwise changed at boot time in the GRUB menu, systemd always starts the **default.target**. The **default.target** file is a symbolic link to the true target file. For a desktop workstation, this is typically going to be the **graphical.target**, which is equivalent to runlevel 5 in SystemV. For a server, the default is more likely to be the **multi-user.target**, which is like runlevel 3 in SystemV. The **emergency.target** file is similar to single-user mode. Targets and services are systemd units.
+
+The following table, which I included in the previous article in this series, compares the systemd targets with the old SystemV startup runlevels. The systemd target aliases are provided by systemd for backward compatibility. The target aliases allow scripts—and sysadmins—to use SystemV commands like **init 3** to change runlevels. Of course, the SystemV commands are forwarded to systemd for interpretation and execution.
+
+**systemd targets** | **SystemV runlevel** | **target aliases** | **Description**
+---|---|---|---
+default.target | | | This target is always aliased with a symbolic link to either **multi-user.target** or **graphical.target**. systemd always uses the **default.target** to start the system. The **default.target** should never be aliased to **halt.target**, **poweroff.target**, or **reboot.target**.
+graphical.target | 5 | runlevel5.target | **Multi-user.target** with a GUI
+| 4 | runlevel4.target | Unused. Runlevel 4 was identical to runlevel 3 in the SystemV world. This target could be created and customized to start local services without changing the default **multi-user.target**.
+multi-user.target | 3 | runlevel3.target | All services running, but command-line interface (CLI) only
+| 2 | runlevel2.target | Multi-user, without NFS, but all other non-GUI services running
+rescue.target | 1 | runlevel1.target | A basic system, including mounting the filesystems with only the most basic services running and a rescue shell on the main console
+emergency.target | S | | Single-user mode—no services are running; filesystems are not mounted. This is the most basic level of operation with only an emergency shell running on the main console for the user to interact with the system.
+halt.target | | | Halts the system without powering it down
+reboot.target | 6 | runlevel6.target | Reboot
+poweroff.target | 0 | runlevel0.target | Halts the system and turns the power off
+
+Each target has a set of dependencies described in its configuration file. systemd starts the required dependencies, which are the services required to run the Linux host at a specific level of functionality. When all of the dependencies listed in the target configuration files are loaded and running, the system is running at that target level. If you want, you can review the systemd startup sequence and runtime targets in the first article in this series, [_Learning to love systemd_][2].
+
+### Exploring the current target
+
+Many Linux distributions default to installing a GUI desktop interface so that the installed systems can be used as workstations. I always install from a Fedora Live boot USB drive with an Xfce or LXDE desktop. Even when I'm installing a server or other infrastructure type of host (such as the ones I use for routers and firewalls), I use one of these installations that installs a GUI desktop.
+
+I could install a server without a desktop (and that would be typical for data centers), but that does not meet my needs. It is not that I need the GUI desktop itself, but the LXDE installation includes many of the other tools I use that are not in a default server installation. This means less work for me after the initial installation.
+
+But just because I have a GUI desktop does not mean it makes sense to use it. I have a 16-port KVM that I can use to access the KVM interfaces of most of my Linux systems, but the vast majority of my interaction with them is via a remote SSH connection from my primary workstation. This way is more secure and uses fewer system resources to run **multi-user.target** compared to **graphical.target.**
+
+To begin, check the default target to verify that it is the **graphical.target**:
+
+
+```
+[root@testvm1 ~]# systemctl get-default
+graphical.target
+[root@testvm1 ~]#
+```
+
+Now verify the currently running target. It should be the same as the default target. You can still use the old method, which displays the old SystemV runlevels. Note that the previous runlevel is on the left; it is **N** (which means None), indicating that the runlevel has not changed since the host was booted. The number 5 indicates the current target, as defined in the old SystemV terminology:
+
+
+```
+[root@testvm1 ~]# runlevel
+N 5
+[root@testvm1 ~]#
+```
+
+Note that the runlevel man page indicates that runlevels are obsolete and provides a conversion table.
+
+You can also use the systemd method. There is no one-line answer here, but it does provide the answer in systemd terms:
+
+
+```
+[root@testvm1 ~]# systemctl list-units --type target
+UNIT LOAD ACTIVE SUB DESCRIPTION
+basic.target loaded active active Basic System
+cryptsetup.target loaded active active Local Encrypted Volumes
+getty.target loaded active active Login Prompts
+graphical.target loaded active active Graphical Interface
+local-fs-pre.target loaded active active Local File Systems (Pre)
+local-fs.target loaded active active Local File Systems
+multi-user.target loaded active active Multi-User System
+network-online.target loaded active active Network is Online
+network.target loaded active active Network
+nfs-client.target loaded active active NFS client services
+nss-user-lookup.target loaded active active User and Group Name Lookups
+paths.target loaded active active Paths
+remote-fs-pre.target loaded active active Remote File Systems (Pre)
+remote-fs.target loaded active active Remote File Systems
+rpc_pipefs.target loaded active active rpc_pipefs.target
+slices.target loaded active active Slices
+sockets.target loaded active active Sockets
+sshd-keygen.target loaded active active sshd-keygen.target
+swap.target loaded active active Swap
+sysinit.target loaded active active System Initialization
+timers.target loaded active active Timers
+
+LOAD = Reflects whether the unit definition was properly loaded.
+ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
+SUB = The low-level unit activation state, values depend on unit type.
+
+21 loaded units listed. Pass --all to see loaded but inactive units, too.
+To show all installed unit files use 'systemctl list-unit-files'.
+```
+
+This shows all of the currently loaded and active targets. You can also see the **graphical.target** and the **multi-user.target**. The **multi-user.target** is required before the **graphical.target** can be loaded. In this example, the **graphical.target** is active.
+
+### Switching to a different target
+
+Making the switch to the **multi-user.target** is easy:
+
+
+```
+`[root@testvm1 ~]# systemctl isolate multi-user.target`
+```
+
+The display should now change from the GUI desktop or login screen to a virtual console. Log in and list the currently active systemd units to verify that **graphical.target** is no longer running:
+
+
+```
+`[root@testvm1 ~]# systemctl list-units --type target`
+```
+
+Be sure to use the **runlevel** command to verify that it shows both previous and current "runlevels":
+
+
+```
+[root@testvm1 ~]# runlevel
+5 3
+```
+
+### Changing the default target
+
+Now, change the default target to the **multi-user.target** so that it will always boot into the **multi-user.target** for a console command-line interface rather than a GUI desktop interface. As the root user on your test host, change to the directory where the systemd configuration is maintained and do a quick listing:
+
+
+```
+[root@testvm1 ~]# cd /etc/systemd/system/ ; ll
+drwxr-xr-x. 2 root root 4096 Apr 25 2018 basic.target.wants
+<snip>
+lrwxrwxrwx. 1 root root 36 Aug 13 16:23 default.target -> /lib/systemd/system/graphical.target
+lrwxrwxrwx. 1 root root 39 Apr 25 2018 display-manager.service -> /usr/lib/systemd/system/lightdm.service
+drwxr-xr-x. 2 root root 4096 Apr 25 2018 getty.target.wants
+drwxr-xr-x. 2 root root 4096 Aug 18 10:16 graphical.target.wants
+drwxr-xr-x. 2 root root 4096 Apr 25 2018 local-fs.target.wants
+drwxr-xr-x. 2 root root 4096 Oct 30 16:54 multi-user.target.wants
+<snip>
+[root@testvm1 system]#
+```
+
+I shortened this listing to highlight a few important things that will help explain how systemd manages the boot process. You should be able to see the entire list of directories and links on your virtual machine.
+
+The **default.target** entry is a symbolic link (symlink, soft link) to the directory **/lib/systemd/system/graphical.target**. List that directory to see what else is there:
+
+
+```
+`[root@testvm1 system]# ll /lib/systemd/system/ | less`
+```
+
+You should see files, directories, and more links in this listing, but look specifically for **multi-user.target** and **graphical.target**. Now display the contents of **default.target**, which is a link to **/lib/systemd/system/graphical.target**:
+
+
+```
+[root@testvm1 system]# cat default.target
+# SPDX-License-Identifier: LGPL-2.1+
+#
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Graphical Interface
+Documentation=man:systemd.special(7)
+Requires=multi-user.target
+Wants=display-manager.service
+Conflicts=rescue.service rescue.target
+After=multi-user.target rescue.service rescue.target display-manager.service
+AllowIsolate=yes
+[root@testvm1 system]#
+```
+
+This link to the **graphical.target** file describes all of the prerequisites and requirements that the graphical user interface requires. I will explore at least some of these options in the next article in this series.
+
+To enable the host to boot to multi-user mode, you need to delete the existing link and create a new one that points to the correct target. Make the [PWD][5] **/etc/systemd/system**, if it is not already:
+
+
+```
+[root@testvm1 system]# rm -f default.target
+[root@testvm1 system]# ln -s /lib/systemd/system/multi-user.target default.target
+```
+
+List the **default.target** link to verify that it links to the correct file:
+
+
+```
+[root@testvm1 system]# ll default.target
+lrwxrwxrwx 1 root root 37 Nov 28 16:08 default.target -> /lib/systemd/system/multi-user.target
+[root@testvm1 system]#
+```
+
+If your link does not look exactly like this, delete it and try again. List the content of the **default.target** link:
+
+
+```
+[root@testvm1 system]# cat default.target
+# SPDX-License-Identifier: LGPL-2.1+
+#
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Multi-User System
+Documentation=man:systemd.special(7)
+Requires=basic.target
+Conflicts=rescue.service rescue.target
+After=basic.target rescue.service rescue.target
+AllowIsolate=yes
+[root@testvm1 system]#
+```
+
+The **default.target**—which is really a link to the **multi-user.target** at this point—now has different requirements in the **[Unit]** section. It does not require the graphical display manager.
+
+Reboot. Your virtual machine should boot to the console login for virtual console 1, which is identified on the display as tty1. Now that you know how to change the default target, change it back to the **graphical.target** using a command designed for the purpose.
+
+First, check the current default target:
+
+
+```
+[root@testvm1 ~]# systemctl get-default
+multi-user.target
+[root@testvm1 ~]# systemctl set-default graphical.target
+Removed /etc/systemd/system/default.target.
+Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/graphical.target.
+[root@testvm1 ~]#
+```
+
+Enter the following command to go directly to the **graphical.target** and the display manager login page without having to reboot:
+
+
+```
+`[root@testvm1 system]# systemctl isolate default.target`
+```
+
+I do not know why the term "isolate" was chosen for this sub-command by systemd's developers. My research indicates that it may refer to running the specified target but "isolating" and terminating all other targets that are not required to support the target. However, the effect is to switch targets from one run target to another—in this case, from the multi-user target to the graphical target. The command above is equivalent to the old init 5 command in SystemV start scripts and the init program.
+
+Log into the GUI desktop, and verify that it is working as it should.
+
+### Summing up
+
+This article explored the Linux systemd startup sequence and started to explore two important systemd tools, **systemctl** and **journalctl**. It also explained how to switch from one target to another and to change the default target.
+
+The next article in this series will create a new systemd unit and configure it to run during startup. It will also look at some of the configuration options that help determine where in the sequence a particular unit will start, for example, after networking is up and running.
+
+### Resources
+
+There is a great deal of information about systemd available on the internet, but much is terse, obtuse, or even misleading. In addition to the resources mentioned in this article, the following webpages offer more detailed and reliable information about systemd startup.
+
+ * The Fedora Project has a good, practical [guide][6] [to systemd][6]. It has pretty much everything you need to know in order to configure, manage, and maintain a Fedora computer using systemd.
+ * The Fedora Project also has a good [cheat sheet][7] that cross-references the old SystemV commands to comparable systemd ones.
+ * For detailed technical information about systemd and the reasons for creating it, check out [Freedesktop.org][8]'s [description of systemd][9].
+ * [Linux.com][10]'s "More systemd fun" offers more advanced systemd [information and tips][11].
+
+
+
+There is also a series of deeply technical articles for Linux sysadmins by Lennart Poettering, the designer and primary developer of systemd. These articles were written between April 2010 and September 2011, but they are just as relevant now as they were then. Much of everything else good that has been written about systemd and its ecosystem is based on these papers.
+
+ * [Rethinking PID 1][12]
+ * [systemd for Administrators, Part I][13]
+ * [systemd for Administrators, Part II][14]
+ * [systemd for Administrators, Part III][15]
+ * [systemd for Administrators, Part IV][16]
+ * [systemd for Administrators, Part V][17]
+ * [systemd for Administrators, Part VI][18]
+ * [systemd for Administrators, Part VII][19]
+ * [systemd for Administrators, Part VIII][20]
+ * [systemd for Administrators, Part IX][21]
+ * [systemd for Administrators, Part X][22]
+ * [systemd for Administrators, Part XI][23]
+
+
+
+Alison Chiaken, a Linux kernel and systems programmer at Mentor Graphics, offers a preview of her...
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/5/systemd-startup
+
+作者:[David Both][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/dboth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/start_line.jpg?itok=9reaaW6m (People at the start line of a race)
+[2]: https://opensource.com/article/20/4/systemd
+[3]: http://www.gnu.org/software/grub/manual/grub
+[4]: mailto:mockbuild@bkernel03.phx2.fedoraproject.org
+[5]: https://en.wikipedia.org/wiki/Pwd
+[6]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html
+[7]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet
+[8]: http://Freedesktop.org
+[9]: http://www.freedesktop.org/wiki/Software/systemd
+[10]: http://Linux.com
+[11]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/
+[12]: http://0pointer.de/blog/projects/systemd.html
+[13]: http://0pointer.de/blog/projects/systemd-for-admins-1.html
+[14]: http://0pointer.de/blog/projects/systemd-for-admins-2.html
+[15]: http://0pointer.de/blog/projects/systemd-for-admins-3.html
+[16]: http://0pointer.de/blog/projects/systemd-for-admins-4.html
+[17]: http://0pointer.de/blog/projects/three-levels-of-off.html
+[18]: http://0pointer.de/blog/projects/changing-roots
+[19]: http://0pointer.de/blog/projects/blame-game.html
+[20]: http://0pointer.de/blog/projects/the-new-configuration-files.html
+[21]: http://0pointer.de/blog/projects/on-etc-sysinit.html
+[22]: http://0pointer.de/blog/projects/instances.html
+[23]: http://0pointer.de/blog/projects/inetd.html
diff --git a/sources/tech/20200505 8 open source video games to play.md b/sources/tech/20200505 8 open source video games to play.md
new file mode 100644
index 0000000000..ac0577d96b
--- /dev/null
+++ b/sources/tech/20200505 8 open source video games to play.md
@@ -0,0 +1,116 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (8 open source video games to play)
+[#]: via: (https://opensource.com/article/20/5/open-source-fps-games)
+[#]: author: (Aman Gaur https://opensource.com/users/amangaur)
+
+8 open source video games to play
+======
+These games are fun and free to play, a way to connect with friends, and
+an opportunity to make an old favorite even better.
+![Gaming on a grid with penguin pawns][1]
+
+Video games are a big business. That's great for the industry's longevity—not to mention for all the people working in programming and graphics. But it can take a lot of work, time, and money to keep up with all the latest gaming crazes. If you feel like playing a few quick rounds of a video game without investing in a new console or game franchise, then you'll be happy to know that there are plenty of open source combat games you can download, play, share, and even modify (if you're inclined to programming) for free.
+
+First-person shooters (FPS) are one of the most popular categories of video games. They are centered around the perspective of the protagonist (the player), and they often offer weapon-based advancement. As you get better at the game, you survive longer, you get better weapons, and you increase your power. FPS games have a distinct look and feel, which is reflected in the category's name: players see everything—their weapons and the game world—in first person, as if they're looking through their player character's eyes.
+
+If you want to give one a try, check out the following eight great open source FPS games.
+
+### Xonotic
+
+![Xonotic][2]
+
+[Xonotic][3] is a fast-paced, arena-based FPS game. It is a popular game in the open source world. One reason could be the fact that it has never been a mainstream game. It offers a variety of weapons and enemies that are thrown right at you mercilessly from the start. Demanding quick action and response, it is an experience that will keep you on the edge of your seats. The game is available under the GPLv3+ license.
+
+### Wolfenstein Enemy Territory
+
+![Wolfenstein Enemy Territory][4]
+
+Wolfenstein has been a major franchise in gaming for many years. If you are a fan of gore and glory, then you've probably already heard of this game (if not, you'll love it once you try it). [Wolfenstein Enemy Territory][5] is an early iteration of the popular World War II game. It became free to play in 2003, and its [source code][6] is provided under the GPLv3. To play, however, you must own the game data (or recreate it yourself) separately (which remains under its original EULA).
+
+### Doom
+
+![Doom][7]
+
+[Doom][8] is a wildly popular game that was also an early example of games on Linux—way back in 2004. There are many iterations of the game, many of which have been released as open source. The game is about acquiring a teleportation device that's been captured by demons, so the violence, while gory, is low on realism. The source code for the game was provided under the GPL, but many versions require that you own the game for the game assets. There are dozens of ports and adaptations, including [Freedoom][9] (with free assets), [Dhewm3][10], [RBDoom-3-BFG][11], and many more. Try a few and pick your favorite!
+
+### Smokin' Guns
+
+![Smokin' Guns][12]
+
+If you're a fan of the Old West and six-shooters, this FPS is for you. From cowboys to gunslingers and with a captivating background score, [Smokin' Guns][13] has it all. It's a semi-realistic simulation of the old spaghetti western. On your way through the game, you face multiple enemies and get multiple weapons, so there's always the promise of excitement and danger around the corner. The game is free and open source under the terms of the GPLv2.
+
+### Nexuiz
+
+![Nexuiz][14]
+
+[Nexuiz][15] (classic) is another great FPS that's free to play on multiple platforms. The game is based on the Quake engine and has been made open source under the GNU GPLv2. The game offers multiple modes, including online, LAN party, and bot training. The game features sophisticated weapons and fast action. It's brutal and exciting, with an objective: kill as many opponents as possible before they get you.
+
+Note that the open source version of Nexuiz is not the same as the version built on CryEngine3 that is sold on Steam.
+
+### .kkrieger
+
+![kkrieger][16]
+
+[.Kkrieger][17] was developed in 2004 by .theprodukkt, a German demogroup. The game was developed using an unreleased (at the time) engine known as Werkkzeug. This game might feel a little slow to many, but it still offers an intense experience. The approaching enemies are slow, but their sheer number makes it confusing to know which one to take down first. It's an onslaught, and you have to shoot through layers of enemies before you reach the final boss. It was released in a rather raw form on [GitHub][18] by its creators under a BSD license with some public domain components.
+
+### Warsow
+
+![Warsow][19]
+
+If you've ever played Borderlands 2, then imagine [Warsow][20] as an arena-style Borderlands. The game is built on a modernized Quake II engine, and its plot takes a simple approach: Kill as many opponents as possible. The team with the most number of kills wins. Despite its simplicity, it features amazing weaponry and lots of great trick moves, like circle jumping, bunny hopping, double jumping, ramp sliding, and so on. It makes for an engaging multiplayer session, and it's been recognized by multiple online leagues as a worthy game for their competitions. Get the source code from [GitHub][21] or install the game from your software repository.
+
+### World of Padman
+
+![World of Padman][22]
+
+[The World of Padman][23] may be the last game on this list, but it's one of the most unique. Designed by PadWorld Entertainment, World of Padman takes a different twist graphically and introduces you to quirky and whimsical characters in a colorful (albeit cartoonishly violent) world. It's based on the ioquake3 engine, and its unique style and uproarious gameplay have earned it a featured place in multiple gaming magazines. You can download the source code from [GitHub][24].
+
+### Give one a shot
+
+A game that becomes open source can act as a template for something great, whether it's a wholly open source version of an old classic, a remix of a beloved game, or an entirely new platform built on an old reliable engine.
+
+Open source gaming is important for many reasons: it provides users with a fun diversion, a way to connect with friends, and an opportunity for programmers and designers to hack within an existing framework. If titles like Doom weren't made open source, a little bit of video game history would be lost. Instead, it endures and has the opportunity to grow even more.
+
+Try an open source game, and watch your six.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/5/open-source-fps-games
+
+作者:[Aman Gaur][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/amangaur
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/game_pawn_grid_linux.png?itok=4gERzRkg (Gaming on a grid with penguin pawns)
+[2]: https://opensource.com/sites/default/files/uploads/xonotic.jpg (Xonotic)
+[3]: https://www.xonotic.org/download/
+[4]: https://opensource.com/sites/default/files/uploads/wolfensteinenemyterritory.jpg (Wolfenstein Enemy Territory)
+[5]: https://www.splashdamage.com/games/wolfenstein-enemy-territory/
+[6]: https://github.com/id-Software/Enemy-Territory
+[7]: https://opensource.com/sites/default/files/uploads/doom.jpg (Doom)
+[8]: https://github.com/id-Software/DOOM
+[9]: https://freedoom.github.io/
+[10]: https://dhewm3.org/
+[11]: https://github.com/RobertBeckebans/RBDOOM-3-BFG/
+[12]: https://opensource.com/sites/default/files/uploads/smokinguns.jpg (Smokin' Guns)
+[13]: https://www.smokin-guns.org/downloads
+[14]: https://opensource.com/sites/default/files/uploads/nexuiz.jpg (Nexuiz)
+[15]: https://sourceforge.net/projects/nexuiz/
+[16]: https://opensource.com/sites/default/files/uploads/kkrieger.jpg (kkrieger)
+[17]: https://web.archive.org/web/20120204065621/http://www.theprodukkt.com/kkrieger
+[18]: https://github.com/farbrausch/fr_public
+[19]: https://opensource.com/sites/default/files/uploads/warsow.jpg (Warsow)
+[20]: https://www.warsow.net/download
+[21]: https://github.com/Warsow
+[22]: https://opensource.com/sites/default/files/uploads/padman.jpg (World of Padman)
+[23]: https://worldofpadman.net/en/
+[24]: https://github.com/PadWorld-Entertainment
diff --git a/sources/tech/20200505 Analyzing data science code with R and Emacs.md b/sources/tech/20200505 Analyzing data science code with R and Emacs.md
new file mode 100644
index 0000000000..ebcfadbe92
--- /dev/null
+++ b/sources/tech/20200505 Analyzing data science code with R and Emacs.md
@@ -0,0 +1,133 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Analyzing data science code with R and Emacs)
+[#]: via: (https://opensource.com/article/20/5/r-emacs-data-science)
+[#]: author: (Peter Prevos https://opensource.com/users/danderzei)
+
+Analyzing data science code with R and Emacs
+======
+Emacs' versatility and extensibility bring the editor's full power into
+play for writing data science code.
+![metrics and data shown on a computer screen][1]
+
+Way back in 2012, _Harvard Business Review_ published an article that proclaimed "data scientist" to be the [sexiest job][2] of the 21st century. Interest in data science has exploded since then. Many great open source projects, such as [Python][3] and the [R language][4] for statistical computing, have facilitated the rapid developments in how we analyze data.
+
+I started my career using pencil and paper and moved to spreadsheets. Now the R language is my weapon of choice when I need to create value from data. Emacs is another one of my favorite tools. This article briefly explains how to use the [Emacs Speaks Statistics][5] (ESS) package to get started with developing R projects in this venerable editor.
+
+The vast majority of R developers use the [RStudio][6] IDE to manage their projects. RStudio is a powerful open source editor with specialized functionality to develop data science projects. RStudio is a great integrated development environment (IDE), but its editing functions are limited.
+
+Using Emacs to write data science code means that you have access to the full power of this extensible editor. I prefer using Emacs for my data science projects because I can do many other tasks within the same application, leveraging the multifunctionality of this venerable editor. If you are just getting started with Emacs, then please first read Seth Kenlon's [Emacs getting started][7] article.
+
+### Setting up Emacs for R
+
+Emacs is an almost infinitely extensible text editor, which unfortunately means that many things don't work the way you want them to out of the box. Before you can write and execute R scripts, you need to install some packages and configure them. The ESS package provides an interface between Emacs and R. Other packages, such as [Company][8] and [highlight-parentheses][9] help with completion and balancing parentheses.
+
+Emacs uses a version of Lisp for configuration. The lines of [Emacs Lisp][10] code below install the required extensions and define a minimal configuration to get you started. These lines were tested for GNU Emacs version 26.3.
+
+Copy these lines and save them in a file named **init.el** in your **.emacs.d** folder. This is the folder that Emacs uses to store configurations, including the [init file][11]. If you already have an init file, then you can append these lines to your config. This minimal configuration is enough to get you started.
+
+
+```
+;; Elisp file for R coding with Emacs
+
+;; Add MELPA repository and initialise the package manager
+(require 'package)
+(add-to-list 'package-archives
+ '("melpa" . ""))
+(package-initialize)
+
+;; Install use-package,in case it does not exist yet
+;; The use-package software will install all other packages as required
+(unless (package-installed-p 'use-package)
+ (package-refresh-contents)
+ (package-install 'use-package))
+
+;; ESS configurationEmacs Speaks Statistics
+(use-package ess
+ :ensure t
+)
+
+;; Auto completion
+(use-package company
+ :ensure t
+ :config
+ (setq company-idle-delay 0)
+ (setq company-minimum-prefix-length 2)
+ (global-company-mode t)
+)
+
+; Parentheses
+(use-package highlight-parentheses
+ :ensure t
+ :config
+ (progn
+ (highlight-parentheses-mode)
+ (global-highlight-parentheses-mode))
+ )
+```
+
+### Using the R console
+
+To start an R console session, press **M-x R** and hit **Enter** (**M** is the Emacs way to denote the **Alt** or **Command** key). ESS will ask you to nominate a working directory, which defaults to the folder of the current buffer. You can use more than one console in the same Emacs session by repeating the R command.
+
+Emacs opens a new buffer for your new R console. You can also use the **Up** and **Down** arrow keys to go to previous lines and re-run them. Use the **Ctrl** and **Up/Down** arrow keys to recycle old commands.
+
+The Company ("complete anything") package manages autocompletion in both the console and R scripts. When entering a function, the mini-buffer at the bottom of the screen shows the relevant parameters. When the autocompletion dropdown menu appears, you can press **F1** to view the chosen option's Help file before you select it.
+
+The [highlight-parentheses][9] package does what its name suggests. Several other Emacs packages are available to help you balance parentheses and other structural elements in your code.
+
+### Writing R scripts
+
+Emacs recognizes R mode for any buffer with a **.R** extension (the file extension is case-sensitive). Open or create a new file with the **C-x C-f** shortcut and type the path and file name. You can start writing your code and use all of the powerful editing techniques that Emacs provides.
+
+Several functions are available to evaluate the code. You can evaluate each line separately with **C-<return>**, while **C-c C-c** will evaluate a contiguous region. Keying **C-c C-b** will evaluate the whole buffer.
+
+When you evaluate some code, Emacs will use any running console or ask you to open a new console to run the code.
+
+The output of any plotting functions appears in a window outside of Emacs. If you prefer to view the output within Emacs, then you need to save the output to disk and open the resulting file in a separate buffer.
+
+![Literate programming in Org mode, the ESS buffer, and graphics output.][12]
+
+Literate programming in Org mode, the ESS buffer, and graphics output.
+
+### Advanced use
+
+This article provides a brief introduction to using R in Emacs. Many parameters can be fine-tuned to make Emacs behave according to your preferences, but it would take too much space to cover them here. The [ESS manual][13] describes these in detail. You can also extend functionality with additional packages.
+
+Org mode can integrate R code, providing a productive platform for literate programming. If you prefer to use RMarkdown, the [Polymode][14] package has you covered.
+
+Emacs has various packages to make your editing experience more efficient. The best part of using Emacs to write R code is that the program is more than just an IDE; it is a malleable computer system that you can configure to match your favorite workflow.
+
+Learning how to configure Emacs can be daunting. The best way to learn quickly is to copy ideas from people who share their configurations. Miles McBain manages a [list of Emacs configurations][15] that could be useful if you want to explore using the R language in Emacs further.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/5/r-emacs-data-science
+
+作者:[Peter Prevos][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/danderzei
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_data_dashboard_system_computer_analytics.png?itok=oxAeIEI- (metrics and data shown on a computer screen)
+[2]: https://hbr.org/2012/10/data-scientist-the-sexiest-job-of-the-21st-century
+[3]: https://www.python.org/
+[4]: https://www.r-project.org/
+[5]: https://ess.r-project.org/
+[6]: https://opensource.com/article/18/2/getting-started-RStudio-IDE
+[7]: https://opensource.com/article/20/3/getting-started-emacs
+[8]: https://company-mode.github.io/
+[9]: https://github.com/tsdh/highlight-parentheses.el
+[10]: https://en.wikipedia.org/wiki/Emacs_Lisp
+[11]: https://www.gnu.org/software/emacs/manual/html_node/emacs/Init-File.html
+[12]: https://opensource.com/sites/default/files/uploads/r-ess-screenshot.jpg (Literate programming in Org mode, the ESS buffer, and graphics output.)
+[13]: https://ess.r-project.org/index.php?Section=documentation&subSection=manuals
+[14]: https://github.com/polymode/polymode
+[15]: https://github.com/MilesMcBain/esscss
diff --git a/sources/tech/20200507 Using the systemctl command to manage systemd units.md b/sources/tech/20200507 Using the systemctl command to manage systemd units.md
new file mode 100644
index 0000000000..e305cee36c
--- /dev/null
+++ b/sources/tech/20200507 Using the systemctl command to manage systemd units.md
@@ -0,0 +1,618 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Using the systemctl command to manage systemd units)
+[#]: via: (https://opensource.com/article/20/5/systemd-units)
+[#]: author: (David Both https://opensource.com/users/dboth)
+
+Using the systemctl command to manage systemd units
+======
+Units are the basis of everything in systemd.
+![woman on laptop sitting at the window][1]
+
+In the first two articles in this series, I explored the Linux systemd startup sequence. In the [first article][2], I looked at systemd's functions and architecture and the controversy around its role as a replacement for the old SystemV init program and startup scripts. And in the [second article][3], I examined two important systemd tools, systemctl and journalctl, and explained how to switch from one target to another and to change the default target.
+
+In this third article, I'll look at systemd units in more detail and how to use the systemctl command to explore and manage units. I'll also explain how to stop and disable units and how to create a new systemd mount unit to mount a new filesystem and enable it to initiate during startup.
+
+### Preparation
+
+All of the experiments in this article should be done as the root user (unless otherwise specified). Some of the commands that simply list various systemd units can be performed by non-root users, but the commands that make changes cannot. Make sure to do all of these experiments only on non-production hosts or virtual machines (VMs).
+
+One of these experiments requires the sysstat package, so install it before you move on. For Fedora and other Red Hat-based distributions you can install sysstat with:
+
+
+```
+`dnf -y install sysstat`
+```
+
+The sysstat RPM installs several statistical tools that can be used for problem determination. One is [System Activity Report][4] (SAR), which records many system performance data points at regular intervals (every 10 minutes by default). Rather than run as a daemon in the background, the sysstat package installs two systemd timers. One timer runs every 10 minutes to collect data, and the other runs once a day to aggregate the daily data. In this article, I will look briefly at these timers but wait to explain how to create a timer in a future article.
+
+### systemd suite
+
+The fact is, systemd is more than just one program. It is a large suite of programs all designed to work together to manage nearly every aspect of a running Linux system. A full exposition of systemd would take a book on its own. Most of us do not need to understand all of the details about how all of systemd's components fit together, so I will focus on the programs and components that enable you to manage various Linux services and deal with log files and journals.
+
+### Practical structure
+
+The structure of systemd—outside of its executable files—is contained in its many configuration files. Although these files have different names and identifier extensions, they are all called "unit" files. Units are the basis of everything systemd.
+
+Unit files are ASCII plain-text files that are accessible to and can be created or modified by a sysadmin. There are a number of unit file types, and each has its own man page. Figure 1 lists some of these unit file types by their filename extensions and a short description of each.
+
+systemd unit | Description
+---|---
+.automount | The **.automount** units are used to implement on-demand (i.e., plug and play) and mounting of filesystem units in parallel during startup.
+.device | The **.device** unit files define hardware and virtual devices that are exposed to the sysadmin in the **/dev/directory**. Not all devices have unit files; typically, block devices such as hard drives, network devices, and some others have unit files.
+.mount | The **.mount** unit defines a mount point on the Linux filesystem directory structure.
+.scope | The **.scope** unit defines and manages a set of system processes. This unit is not configured using unit files, rather it is created programmatically. Per the **systemd.scope** man page, “The main purpose of scope units is grouping worker processes of a system service for organization and for managing resources.”
+.service | The **.service** unit files define processes that are managed by systemd. These include services such as crond cups (Common Unix Printing System), iptables, multiple logical volume management (LVM) services, NetworkManager, and more.
+.slice | The **.slice** unit defines a “slice,” which is a conceptual division of system resources that are related to a group of processes. You can think of all system resources as a pie and this subset of resources as a “slice” out of that pie.
+.socket | The **.socket** units define interprocess communication sockets, such as network sockets.
+.swap | The **.swap** units define swap devices or files.
+.target | The **.target** units define groups of unit files that define startup synchronization points, runlevels, and services. Target units define the services and other units that must be active in order to start successfully.
+.timer | The **.timer** unit defines timers that can initiate program execution at specified times.
+
+### systemctl
+
+I looked at systemd's startup functions in the [second article][3], and here I'll explore its service management functions a bit further. systemd provides the **systemctl** command that is used to start and stop services, configure them to launch (or not) at system startup, and monitor the current status of running services.
+
+In a terminal session as the root user, ensure that root's home directory ( **~** ) is the [PWD][5]. To begin looking at units in various ways, list all of the loaded and active systemd units. systemctl automatically pipes its [stdout][6] data stream through the **less** pager, so you don't have to:
+
+
+```
+[root@testvm1 ~]# systemctl
+UNIT LOAD ACTIVE SUB DESCRIPTION
+proc-sys-fs-binfmt_misc.automount loaded active running Arbitrary Executable File>
+sys-devices-pci0000:00-0000:00:01.1-ata7-host6-target6:0:0-6:0:0:0-block-sr0.device loaded a>
+sys-devices-pci0000:00-0000:00:03.0-net-enp0s3.device loaded active plugged 82540EM Gigabi>
+sys-devices-pci0000:00-0000:00:05.0-sound-card0.device loaded active plugged 82801AA AC'97>
+sys-devices-pci0000:00-0000:00:08.0-net-enp0s8.device loaded active plugged 82540EM Gigabi>
+sys-devices-pci0000:00-0000:00:0d.0-ata1-host0-target0:0:0-0:0:0:0-block-sda-sda1.device loa>
+sys-devices-pci0000:00-0000:00:0d.0-ata1-host0-target0:0:0-0:0:0:0-block-sda-sda2.device loa>
+<snip – removed lots of lines of data from here>
+
+LOAD = Reflects whether the unit definition was properly loaded.
+ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
+SUB = The low-level unit activation state, values depend on unit type.
+
+206 loaded units listed. Pass --all to see loaded but inactive units, too.
+To show all installed unit files use 'systemctl list-unit-files'.
+```
+
+As you scroll through the data in your terminal session, look for some specific things. The first section lists devices such as hard drives, sound cards, network interface cards, and TTY devices. Another section shows the filesystem mount points. Other sections include various services and a list of all loaded and active targets.
+
+The sysstat timers at the bottom of the output are used to collect and generate daily system activity summaries for SAR. SAR is a very useful problem-solving tool. (You can learn more about it in Chapter 13 of my book [_Using and Administering Linux: Volume 1, Zero to SysAdmin: Getting Started_][7].)
+
+Near the very bottom, three lines describe the meanings of the statuses (loaded, active, and sub). Press **q** to exit the pager.
+
+Use the following command (as suggested in the last line of the output above) to see all the units that are installed, whether or not they are loaded. I won't reproduce the output here, because you can scroll through it on your own. The systemctl program has an excellent tab-completion facility that makes it easy to enter complex commands without needing to memorize all the options:
+
+
+```
+`[root@testvm1 ~]# systemctl list-unit-files`
+```
+
+You can see that some units are disabled. Table 1 in the man page for systemctl lists and provides short descriptions of the entries you might see in this listing. Use the **-t** (type) option to view just the timer units:
+
+
+```
+[root@testvm1 ~]# systemctl list-unit-files -t timer
+UNIT FILE STATE
+[chrony-dnssrv@.timer][8] disabled
+dnf-makecache.timer enabled
+fstrim.timer disabled
+logrotate.timer disabled
+logwatch.timer disabled
+[mdadm-last-resort@.timer][9] static
+mlocate-updatedb.timer enabled
+sysstat-collect.timer enabled
+sysstat-summary.timer enabled
+systemd-tmpfiles-clean.timer static
+unbound-anchor.timer enabled
+```
+
+You could do the same thing with this alternative, which provides considerably more detail:
+
+
+```
+[root@testvm1 ~]# systemctl list-timers
+Thu 2020-04-16 09:06:20 EDT 3min 59s left n/a n/a systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
+Thu 2020-04-16 10:02:01 EDT 59min left Thu 2020-04-16 09:01:32 EDT 49s ago dnf-makecache.timer dnf-makecache.service
+Thu 2020-04-16 13:00:00 EDT 3h 57min left n/a n/a sysstat-collect.timer sysstat-collect.service
+Fri 2020-04-17 00:00:00 EDT 14h left Thu 2020-04-16 12:51:37 EDT 3h 49min left mlocate-updatedb.timer mlocate-updatedb.service
+Fri 2020-04-17 00:00:00 EDT 14h left Thu 2020-04-16 12:51:37 EDT 3h 49min left unbound-anchor.timer unbound-anchor.service
+Fri 2020-04-17 00:07:00 EDT 15h left n/a n/a sysstat-summary.timer sysstat-summary.service
+
+6 timers listed.
+Pass --all to see loaded but inactive timers, too.
+[root@testvm1 ~]#
+```
+
+Although there is no option to do systemctl list-mounts, you can list the mount point unit files:
+
+
+```
+[root@testvm1 ~]# systemctl list-unit-files -t mount
+UNIT FILE STATE
+-.mount generated
+boot.mount generated
+dev-hugepages.mount static
+dev-mqueue.mount static
+home.mount generated
+proc-fs-nfsd.mount static
+proc-sys-fs-binfmt_misc.mount disabled
+run-vmblock\x2dfuse.mount disabled
+sys-fs-fuse-connections.mount static
+sys-kernel-config.mount static
+sys-kernel-debug.mount static
+tmp.mount generated
+usr.mount generated
+var-lib-nfs-rpc_pipefs.mount static
+var.mount generated
+
+15 unit files listed.
+[root@testvm1 ~]#
+```
+
+The STATE column in this data stream is interesting and requires a bit of explanation. The "generated" states indicate that the mount unit was generated on the fly during startup using the information in **/etc/fstab**. The program that generates these mount units is **/lib/systemd/system-generators/systemd-fstab-generator,** along with other tools that generate a number of other unit types. The "static" mount units are for filesystems like **/proc** and **/sys**, and the files for these are located in the **/usr/lib/systemd/system** directory.
+
+Now, look at the service units. This command will show all services installed on the host, whether or not they are active:
+
+
+```
+`[root@testvm1 ~]# systemctl --all -t service`
+```
+
+The bottom of this listing of service units displays 166 as the total number of loaded units on my host. Your number will probably differ.
+
+Unit files do not have a filename extension (such as **.unit**) to help identify them, so you can generalize that most configuration files that belong to systemd are unit files of one type or another. The few remaining files are mostly **.conf** files located in **/etc/systemd**.
+
+Unit files are stored in the **/usr/lib/systemd** directory and its subdirectories, while the **/etc/systemd/** directory and its subdirectories contain symbolic links to the unit files necessary to the local configuration of this host.
+
+To explore this, make **/etc/systemd** the PWD and list its contents. Then make **/etc/systemd/system** the PWD and list its contents, and list the contents of at least a couple of the current PWD's subdirectories.
+
+Take a look at the **default.target** file, which determines which runlevel target the system will boot to. In the second article in this series, I explained how to change the default target from the GUI (**graphical.target**) to the command-line only (**multi-user.target**) target. The **default.target** file on my test VM is simply a symlink to **/usr/lib/systemd/system/graphical.target**.
+
+Take a few minutes to examine the contents of the **/etc/systemd/system/default.target** file:
+
+
+```
+[root@testvm1 system]# cat default.target
+# SPDX-License-Identifier: LGPL-2.1+
+#
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Graphical Interface
+Documentation=man:systemd.special(7)
+Requires=multi-user.target
+Wants=display-manager.service
+Conflicts=rescue.service rescue.target
+After=multi-user.target rescue.service rescue.target display-manager.service
+AllowIsolate=yes
+```
+
+Note that this requires the **multi-user.target**; the **graphical.target** cannot start if the **multi-user.target** is not already up and running. It also says it "wants" the **display-manager.service** unit. A "want" does not need to be fulfilled in order for the unit to start successfully. If the "want" cannot be fulfilled, it will be ignored by systemd, and the rest of the target will start regardless.
+
+The subdirectories in **/etc/systemd/system** are lists of wants for various targets. Take a few minutes to explore the files and their contents in the **/etc/systemd/system/graphical.target.wants** directory.
+
+The **systemd.unit** man page contains a lot of good information about unit files, their structure, the sections they can be divided into, and the options that can be used. It also lists many of the unit types, all of which have their own man pages. If you want to interpret a unit file, this would be a good place to start.
+
+### Service units
+
+A Fedora installation usually installs and enables services that particular hosts do not need for normal operation. Conversely, sometimes it doesn't include services that need to be installed, enabled, and started. Services that are not needed for the Linux host to function as desired, but which are installed and possibly running, represent a security risk and should—at minimum—be stopped and disabled and—at best—should be uninstalled.
+
+The systemctl command is used to manage systemd units, including services, targets, mounts, and more. Take a closer look at the list of services to identify services that will never be used:
+
+
+```
+[root@testvm1 ~]# systemctl --all -t service
+UNIT LOAD ACTIVE SUB DESCRIPTION
+<snip>
+chronyd.service loaded active running NTP client/server
+crond.service loaded active running Command Scheduler
+cups.service loaded active running CUPS Scheduler
+dbus-daemon.service loaded active running D-Bus System Message Bus
+<snip>
+● ip6tables.service not-found inactive dead ip6tables.service
+● ipset.service not-found inactive dead ipset.service
+● iptables.service not-found inactive dead iptables.service
+<snip>
+firewalld.service loaded active running firewalld - dynamic firewall daemon
+<snip>
+● ntpd.service not-found inactive dead ntpd.service
+● ntpdate.service not-found inactive dead ntpdate.service
+pcscd.service loaded active running PC/SC Smart Card Daemon
+```
+
+I have pruned out most of the output from the command to save space. The services that show "loaded active running" are obvious. The "not-found" services are ones that systemd is aware of but are not installed on the Linux host. If you want to run those services, you must install the packages that contain them.
+
+Note the **pcscd.service** unit. This is the PC/SC smart-card daemon. Its function is to communicate with smart-card readers. Many Linux hosts—including VMs—have no need for this reader nor the service that is loaded and taking up memory and CPU resources. You can stop this service and disable it, so it will not restart on the next boot. First, check its status:
+
+
+```
+[root@testvm1 ~]# systemctl status pcscd.service
+● pcscd.service - PC/SC Smart Card Daemon
+ Loaded: loaded (/usr/lib/systemd/system/pcscd.service; indirect; vendor preset: disabled)
+ Active: active (running) since Fri 2019-05-10 11:28:42 EDT; 3 days ago
+ Docs: man:pcscd(8)
+ Main PID: 24706 (pcscd)
+ Tasks: 6 (limit: 4694)
+ Memory: 1.6M
+ CGroup: /system.slice/pcscd.service
+ └─24706 /usr/sbin/pcscd --foreground --auto-exit
+
+May 10 11:28:42 testvm1 systemd[1]: Started PC/SC Smart Card Daemon.
+```
+
+This data illustrates the additional information systemd provides versus SystemV, which only reports whether or not the service is running. Note that specifying the **.service** unit type is optional. Now stop and disable the service, then re-check its status:
+
+
+```
+[root@testvm1 ~]# systemctl stop pcscd ; systemctl disable pcscd
+Warning: Stopping pcscd.service, but it can still be activated by:
+ pcscd.socket
+Removed /etc/systemd/system/sockets.target.wants/pcscd.socket.
+[root@testvm1 ~]# systemctl status pcscd
+● pcscd.service - PC/SC Smart Card Daemon
+ Loaded: loaded (/usr/lib/systemd/system/pcscd.service; indirect; vendor preset: disabled)
+ Active: failed (Result: exit-code) since Mon 2019-05-13 15:23:15 EDT; 48s ago
+ Docs: man:pcscd(8)
+ Main PID: 24706 (code=exited, status=1/FAILURE)
+
+May 10 11:28:42 testvm1 systemd[1]: Started PC/SC Smart Card Daemon.
+May 13 15:23:15 testvm1 systemd[1]: Stopping PC/SC Smart Card Daemon...
+May 13 15:23:15 testvm1 systemd[1]: pcscd.service: Main process exited, code=exited, status=1/FAIL>
+May 13 15:23:15 testvm1 systemd[1]: pcscd.service: Failed with result 'exit-code'.
+May 13 15:23:15 testvm1 systemd[1]: Stopped PC/SC Smart Card Daemon.
+```
+
+The short log entry display for most services prevents having to search through various log files to locate this type of information. Check the status of the system runlevel targets—specifying the "target" unit type is required:
+
+
+```
+[root@testvm1 ~]# systemctl status multi-user.target
+● multi-user.target - Multi-User System
+ Loaded: loaded (/usr/lib/systemd/system/multi-user.target; static; vendor preset: disabled)
+ Active: active since Thu 2019-05-09 13:27:22 EDT; 4 days ago
+ Docs: man:systemd.special(7)
+
+May 09 13:27:22 testvm1 systemd[1]: Reached target Multi-User System.
+[root@testvm1 ~]# systemctl status graphical.target
+● graphical.target - Graphical Interface
+ Loaded: loaded (/usr/lib/systemd/system/graphical.target; indirect; vendor preset: disabled)
+ Active: active since Thu 2019-05-09 13:27:22 EDT; 4 days ago
+ Docs: man:systemd.special(7)
+
+May 09 13:27:22 testvm1 systemd[1]: Reached target Graphical Interface.
+[root@testvm1 ~]# systemctl status default.target
+● graphical.target - Graphical Interface
+ Loaded: loaded (/usr/lib/systemd/system/graphical.target; indirect; vendor preset: disabled)
+ Active: active since Thu 2019-05-09 13:27:22 EDT; 4 days ago
+ Docs: man:systemd.special(7)
+
+May 09 13:27:22 testvm1 systemd[1]: Reached target Graphical Interface.
+```
+
+The default target is the graphical target. The status of any unit can be checked in this way.
+
+### Mounts the old way
+
+A mount unit defines all of the parameters required to mount a filesystem on a designated mount point. systemd can manage mount units with more flexibility than those using the **/etc/fstab** filesystem configuration file. Despite this, systemd still uses the **/etc/fstab** file for filesystem configuration and mounting purposes. systemd uses the **systemd-fstab-generator** tool to create transient mount units from the data in the **fstab** file.
+
+I will create a new filesystem and a systemd mount unit to mount it. If you have some available disk space on your test system, you can do it along with me.
+
+_Note that the volume group and logical volume names may be different on your test system. Be sure to use the names that are pertinent to your system._
+
+You will need to create a partition or logical volume, then make an EXT4 filesystem on it. Add a label to the filesystem, **TestFS**, and create a directory for a mount point **/TestFS**.
+
+To try this on your own, first, verify that you have free space on the volume group. Here is what that looks like on my VM where I have some space available on the volume group to create a new logical volume:
+
+
+```
+[root@testvm1 ~]# lsblk
+NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
+sda 8:0 0 120G 0 disk
+├─sda1 8:1 0 4G 0 part /boot
+└─sda2 8:2 0 116G 0 part
+ ├─VG01-root 253:0 0 5G 0 lvm /
+ ├─VG01-swap 253:1 0 8G 0 lvm [SWAP]
+ ├─VG01-usr 253:2 0 30G 0 lvm /usr
+ ├─VG01-home 253:3 0 20G 0 lvm /home
+ ├─VG01-var 253:4 0 20G 0 lvm /var
+ └─VG01-tmp 253:5 0 10G 0 lvm /tmp
+sr0 11:0 1 1024M 0 rom
+[root@testvm1 ~]# vgs
+ VG #PV #LV #SN Attr VSize VFree
+ VG01 1 6 0 wz--n- <116.00g <23.00g
+```
+
+Then create a new volume on **VG01** named **TestFS**. It does not need to be large; 1GB is fine. Then create a filesystem, add the filesystem label, and create the mount point:
+
+
+```
+[root@testvm1 ~]# lvcreate -L 1G -n TestFS VG01
+ Logical volume "TestFS" created.
+[root@testvm1 ~]# mkfs -t ext4 /dev/mapper/VG01-TestFS
+mke2fs 1.45.3 (14-Jul-2019)
+Creating filesystem with 262144 4k blocks and 65536 inodes
+Filesystem UUID: 8718fba9-419f-4915-ab2d-8edf811b5d23
+Superblock backups stored on blocks:
+ 32768, 98304, 163840, 229376
+
+Allocating group tables: done
+Writing inode tables: done
+Creating journal (8192 blocks): done
+Writing superblocks and filesystem accounting information: done
+
+[root@testvm1 ~]# e2label /dev/mapper/VG01-TestFS TestFS
+[root@testvm1 ~]# mkdir /TestFS
+```
+
+Now, mount the new filesystem:
+
+
+```
+[root@testvm1 ~]# mount /TestFS/
+mount: /TestFS/: can't find in /etc/fstab.
+```
+
+This will not work because you do not have an entry in **/etc/fstab**. You can mount the new filesystem even without the entry in **/etc/fstab** using both the device name (as it appears in **/dev**) and the mount point. Mounting in this manner is simpler than it used to be—it used to require the filesystem type as an argument. The mount command is now smart enough to detect the filesystem type and mount it accordingly.
+
+Try it again:
+
+
+```
+[root@testvm1 ~]# mount /dev/mapper/VG01-TestFS /TestFS/
+[root@testvm1 ~]# lsblk
+NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
+sda 8:0 0 120G 0 disk
+├─sda1 8:1 0 4G 0 part /boot
+└─sda2 8:2 0 116G 0 part
+ ├─VG01-root 253:0 0 5G 0 lvm /
+ ├─VG01-swap 253:1 0 8G 0 lvm [SWAP]
+ ├─VG01-usr 253:2 0 30G 0 lvm /usr
+ ├─VG01-home 253:3 0 20G 0 lvm /home
+ ├─VG01-var 253:4 0 20G 0 lvm /var
+ ├─VG01-tmp 253:5 0 10G 0 lvm /tmp
+ └─VG01-TestFS 253:6 0 1G 0 lvm /TestFS
+sr0 11:0 1 1024M 0 rom
+[root@testvm1 ~]#
+```
+
+Now the new filesystem is mounted in the proper location. List the mount unit files:
+
+
+```
+`[root@testvm1 ~]# systemctl list-unit-files -t mount`
+```
+
+This command does not show a file for the **/TestFS** filesystem because no file exists for it. The command **systemctl status TestFS.mount** does not display any information about the new filesystem either. You can try it using wildcards with the **systemctl status** command:
+
+
+```
+[root@testvm1 ~]# systemctl status *mount
+● usr.mount - /usr
+ Loaded: loaded (/etc/fstab; generated)
+ Active: active (mounted)
+ Where: /usr
+ What: /dev/mapper/VG01-usr
+ Docs: man:fstab(5)
+ man:systemd-fstab-generator(8)
+
+<SNIP>
+● TestFS.mount - /TestFS
+ Loaded: loaded (/proc/self/mountinfo)
+ Active: active (mounted) since Fri 2020-04-17 16:02:26 EDT; 1min 18s ago
+ Where: /TestFS
+ What: /dev/mapper/VG01-TestFS
+
+● run-user-0.mount - /run/user/0
+ Loaded: loaded (/proc/self/mountinfo)
+ Active: active (mounted) since Thu 2020-04-16 08:52:29 EDT; 1 day 5h ago
+ Where: /run/user/0
+ What: tmpfs
+
+● var.mount - /var
+ Loaded: loaded (/etc/fstab; generated)
+ Active: active (mounted) since Thu 2020-04-16 12:51:34 EDT; 1 day 1h ago
+ Where: /var
+ What: /dev/mapper/VG01-var
+ Docs: man:fstab(5)
+ man:systemd-fstab-generator(8)
+ Tasks: 0 (limit: 19166)
+ Memory: 212.0K
+ CPU: 5ms
+ CGroup: /system.slice/var.mount
+```
+
+This command provides some very interesting information about your system's mounts, and your new filesystem shows up. The **/var** and **/usr** filesystems are identified as being generated from **/etc/fstab**, while your new filesystem simply shows that it is loaded and provides the location of the info file in the **/proc/self/mountinfo** file.
+
+Next, automate this mount. First, do it the old-fashioned way by adding an entry in **/etc/fstab**. Later, I'll show you how to do it the new way, which will teach you about creating units and integrating them into the startup sequence.
+
+Unmount **/TestFS** and add the following line to the **/etc/fstab** file:
+
+
+```
+`/dev/mapper/VG01-TestFS /TestFS ext4 defaults 1 2`
+```
+
+Now, mount the filesystem with the simpler **mount** command and list the mount units again:
+
+
+```
+[root@testvm1 ~]# mount /TestFS
+[root@testvm1 ~]# systemctl status *mount
+<SNIP>
+● TestFS.mount - /TestFS
+ Loaded: loaded (/proc/self/mountinfo)
+ Active: active (mounted) since Fri 2020-04-17 16:26:44 EDT; 1min 14s ago
+ Where: /TestFS
+ What: /dev/mapper/VG01-TestFS
+<SNIP>
+```
+
+This did not change the information for this mount because the filesystem was manually mounted. Reboot and run the command again, and this time specify **TestFS.mount** rather than using the wildcard. The results for this mount are now consistent with it being mounted at startup:
+
+
+```
+[root@testvm1 ~]# systemctl status TestFS.mount
+● TestFS.mount - /TestFS
+ Loaded: loaded (/etc/fstab; generated)
+ Active: active (mounted) since Fri 2020-04-17 16:30:21 EDT; 1min 38s ago
+ Where: /TestFS
+ What: /dev/mapper/VG01-TestFS
+ Docs: man:fstab(5)
+ man:systemd-fstab-generator(8)
+ Tasks: 0 (limit: 19166)
+ Memory: 72.0K
+ CPU: 6ms
+ CGroup: /system.slice/TestFS.mount
+
+Apr 17 16:30:21 testvm1 systemd[1]: Mounting /TestFS...
+Apr 17 16:30:21 testvm1 systemd[1]: Mounted /TestFS.
+```
+
+### Creating a mount unit
+
+Mount units may be configured either with the traditional **/etc/fstab** file or with systemd units. Fedora uses the **fstab** file as it is created during the installation. However, systemd uses the **systemd-fstab-generator** program to translate the **fstab** file into systemd units for each entry in the **fstab** file. Now that you know you can use systemd **.mount** unit files for filesystem mounting, try it out by creating a mount unit for this filesystem.
+
+First, unmount **/TestFS**. Edit the **/etc/fstab** file and delete or comment out the **TestFS** line. Now, create a new file with the name **TestFS.mount** in the **/etc/systemd/system** directory. Edit it to contain the configuration data below. The unit file name and the name of the mount point _must_ be identical, or the mount will fail:
+
+
+```
+# This mount unit is for the TestFS filesystem
+# By David Both
+# Licensed under GPL V2
+# This file should be located in the /etc/systemd/system directory
+
+[Unit]
+Description=TestFS Mount
+
+[Mount]
+What=/dev/mapper/VG01-TestFS
+Where=/TestFS
+Type=ext4
+Options=defaults
+
+[Install]
+WantedBy=multi-user.target
+```
+
+The **Description** line in the **[Unit]** section is for us humans, and it provides the name that's shown when you list mount units with **systemctl -t mount**. The data in the **[Mount]** section of this file contains essentially the same data that would be found in the **fstab** file.
+
+Now enable the mount unit:
+
+
+```
+[root@testvm1 etc]# systemctl enable TestFS.mount
+Created symlink /etc/systemd/system/multi-user.target.wants/TestFS.mount → /etc/systemd/system/TestFS.mount.
+```
+
+This creates the symlink in the **/etc/systemd/system** directory, which will cause this mount unit to be mounted on all subsequent boots. The filesystem has not yet been mounted, so you must "start" it:
+
+
+```
+`[root@testvm1 ~]# systemctl start TestFS.mount`
+```
+
+Verify that the filesystem has been mounted:
+
+
+```
+[root@testvm1 ~]# systemctl status TestFS.mount
+● TestFS.mount - TestFS Mount
+ Loaded: loaded (/etc/systemd/system/TestFS.mount; enabled; vendor preset: disabled)
+ Active: active (mounted) since Sat 2020-04-18 09:59:53 EDT; 14s ago
+ Where: /TestFS
+ What: /dev/mapper/VG01-TestFS
+ Tasks: 0 (limit: 19166)
+ Memory: 76.0K
+ CPU: 3ms
+ CGroup: /system.slice/TestFS.mount
+
+Apr 18 09:59:53 testvm1 systemd[1]: Mounting TestFS Mount...
+Apr 18 09:59:53 testvm1 systemd[1]: Mounted TestFS Mount.
+```
+
+This experiment has been specifically about creating a unit file for a mount, but it can be applied to other types of unit files as well. The details will be different, but the concepts are the same. Yes, I know it is still easier to add a line to the **/etc/fstab** file than it is to create a mount unit. But this is a good example of how to create a unit file because systemd does not have generators for every type of unit.
+
+### In summary
+
+This article looked at systemd units in more detail and how to use the systemctl command to explore and manage units. It also showed how to stop and disable units and create a new systemd mount unit to mount a new filesystem and enable it to initiate during startup.
+
+In the next article in this series, I will take you through a recent problem I had during startup and show you how I circumvented it using systemd.
+
+### Resources
+
+There is a great deal of information about systemd available on the internet, but much is terse, obtuse, or even misleading. In addition to the resources mentioned in this article, the following webpages offer more detailed and reliable information about systemd startup.
+
+ * The Fedora Project has a good, practical [guide][10] [to systemd][10]. It has pretty much everything you need to know in order to configure, manage, and maintain a Fedora computer using systemd.
+ * The Fedora Project also has a good [cheat sheet][11] that cross-references the old SystemV commands to comparable systemd ones.
+ * For detailed technical information about systemd and the reasons for creating it, check out [Freedesktop.org][12]'s [description of systemd][13].
+ * [Linux.com][14]'s "More systemd fun" offers more advanced systemd [information and tips][15].
+
+
+
+There is also a series of deeply technical articles for Linux sysadmins by Lennart Poettering, the designer and primary developer of systemd. These articles were written between April 2010 and September 2011, but they are just as relevant now as they were then. Much of everything else good that has been written about systemd and its ecosystem is based on these papers.
+
+ * [Rethinking PID 1][16]
+ * [systemd for Administrators, Part I][17]
+ * [systemd for Administrators, Part II][18]
+ * [systemd for Administrators, Part III][19]
+ * [systemd for Administrators, Part IV][20]
+ * [systemd for Administrators, Part V][21]
+ * [systemd for Administrators, Part VI][22]
+ * [systemd for Administrators, Part VII][23]
+ * [systemd for Administrators, Part VIII][24]
+ * [systemd for Administrators, Part IX][25]
+ * [systemd for Administrators, Part X][26]
+ * [systemd for Administrators, Part XI][27]
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/5/systemd-units
+
+作者:[David Both][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/dboth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lenovo-thinkpad-laptop-window-focus.png?itok=g0xPm2kD (young woman working on a laptop)
+[2]: https://opensource.com/article/20/4/systemd
+[3]: https://opensource.com/article/20/4/systemd-startup
+[4]: https://en.wikipedia.org/wiki/Sar_%28Unix%29
+[5]: https://en.wikipedia.org/wiki/Pwd
+[6]: https://en.wikipedia.org/wiki/Standard_streams#Standard_output_(stdout)
+[7]: http://www.both.org/?page_id=1183
+[8]: mailto:chrony-dnssrv@.timer
+[9]: mailto:mdadm-last-resort@.timer
+[10]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html
+[11]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet
+[12]: http://Freedesktop.org
+[13]: http://www.freedesktop.org/wiki/Software/systemd
+[14]: http://Linux.com
+[15]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/
+[16]: http://0pointer.de/blog/projects/systemd.html
+[17]: http://0pointer.de/blog/projects/systemd-for-admins-1.html
+[18]: http://0pointer.de/blog/projects/systemd-for-admins-2.html
+[19]: http://0pointer.de/blog/projects/systemd-for-admins-3.html
+[20]: http://0pointer.de/blog/projects/systemd-for-admins-4.html
+[21]: http://0pointer.de/blog/projects/three-levels-of-off.html
+[22]: http://0pointer.de/blog/projects/changing-roots
+[23]: http://0pointer.de/blog/projects/blame-game.html
+[24]: http://0pointer.de/blog/projects/the-new-configuration-files.html
+[25]: http://0pointer.de/blog/projects/on-etc-sysinit.html
+[26]: http://0pointer.de/blog/projects/instances.html
+[27]: http://0pointer.de/blog/projects/inetd.html
diff --git a/sources/tech/20200508 A guide to setting up your Open Source Program Office (OSPO) for success.md b/sources/tech/20200508 A guide to setting up your Open Source Program Office (OSPO) for success.md
new file mode 100644
index 0000000000..ea3aa01866
--- /dev/null
+++ b/sources/tech/20200508 A guide to setting up your Open Source Program Office (OSPO) for success.md
@@ -0,0 +1,193 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (A guide to setting up your Open Source Program Office (OSPO) for success)
+[#]: via: (https://opensource.com/article/20/5/open-source-program-office)
+[#]: author: (J. Manrique Lopez de la Fuente https://opensource.com/users/jsmanrique)
+
+A guide to setting up your Open Source Program Office (OSPO) for success
+======
+Learn how to best grow and maintain your open source communities and
+allies.
+![community team brainstorming ideas][1]
+
+Companies create Open Source Program Offices (OSPO) to manage their relationship with the open source ecosystems they depend on. By understanding the company's open source ecosystem, an OSPO is able to maximize the company's return on investment and reduce the risks of consuming, contributing to, and releasing open source software. Additionally, since the company depends on its open source ecosystem, ensuring its health and sustainability shall ensure the company's health, sustainable growth, and evolution.
+
+### How has OSPO become vital to companies and their open source ecosystem?
+
+Marc Andreessen has said that "software is eating the world," and more recently, it could be said that open source is eating the software world. But how is that process happening?
+
+Companies get involved with open source projects in several ways. These projects comprise the company's open source ecosystem, and their relationships and interactions can be seen through Open Source Software's (OSS) inbound and outbound processes.
+
+From the OSS inbound point of view, companies use it to build their own solutions and their own infrastructure. OSS gets introduced because it's part of the code their technology providers use, or because their own developers add open source components to the company's information technology (IT) infrastructure.
+
+From the OSS outbound point of view, some companies contribute to OSS projects. That contribution could be part of the company's requirements for their solutions that need certain fixes in upstream projects. For example, Samsung contributes to certain graphics-related projects to ensure its hardware has software support once it gets into the market. In some other cases, contributing to OSS is a mechanism to retain talent by allowing the people to contribute to projects different from their daily work.
+
+Some companies release their own open source projects as an outbound OSS process. For companies like Red Hat or GitLab, it would be expected. But, there are increasingly more non-software companies releasing a lot of OSS, like Lyft.
+
+![OSS inbound and outbound processes][2]
+
+OSS inbound and outbound processes
+
+Ultimately, all of these projects involved in the inbound and outbound OSS flow are the company's OSS ecosystem. And like any living being, the company's health and sustainability depend on the ecosystem that surrounds it.
+
+### OSPO responsibilities
+
+Following the species and their ecosystem, people working in the OSPO team could be seen as the rangers in the organization's OSS ecosystem. They take care of the ecosystem and its relationship with the company, to keep everything healthy and sustainable.
+
+When the company consumes open source software projects, they need to be aware of licenses and compliance, to check the project's health, to ensure there are no security flaws, and, in some cases, to identify talented community members for potential hiring processes.
+
+When the company contributes to open source software projects, they need to be sure there are no Intellectual Property (IP) issues, to ensure the company contributions' footprint and its leadership in the projects, and sometimes, also to help talented people stay engaged with the company through their contributions.
+
+And when the company releases and maintains open source projects, they are responsible for ensuring community engagement and growth, for checking there are no IP issues, that the company maintains its footprint and leadership, and perhaps, to attract new talent to the company.
+
+Have you realized the whole set of skills required in an OSPO team? When I've asked people working in OSPO about the size of their teams, the number is around 1 to 5 people per 1,000 developers in the company. That's a small team to monitor a lot of people and their potential OSS related activity.
+
+### How to manage an OSPO
+
+With all these activities in OSPO people's minds and all the resources they need to worry about, how are they able to manage all of this?
+
+There are at least a couple of open source communities with valuable knowledge and resources available for them:
+
+ * The [TODO Group][3] is "an open group of companies who want to collaborate on practices, tools, and other ways to run successful and effective open source projects and programs." For example, they have a complete set of [guides][4] with best practices for and from companies running OSPOS.
+ * The [CHAOSS (Community Health Analytics for Open Source Software)][5] community develops metrics, methodologies, and software for managing open source project health and sustainability. (See more on CHAOSS' active communities and working groups below).
+
+
+
+OSPO managers need to report a lot of information to the rest of the company to answer many questions related to their OSS inbound and outbound processes, i.e., Which projects are we using in our organization? What's the health of those projects? Who are the key people in those projects? Which projects are we contributing to? Which projects are we releasing? How are we dealing with community contributions? Who are the key contributors?
+
+### Data-driven OSPO
+
+As William Edwards Deming said, "Without data, you are just a person with an opinion."
+
+Having opinions is not a bad thing, but having opinions based on data certainly makes it easier to understand, discuss, and determine the processes best suited to your company and its goals. CHAOSS is the recommended community to look to for guidance about metrics strategies and tools.
+
+Recently, the CHAOSS community has released [a new set of metric definitions][6]. These metrics are only subsets of all the ones being discussed in the focus areas of each working group (WG):
+
+ * [Common WG][7]: Defines the metrics that are used by both working groups or are important for community health, but that do not cleanly fit into one of the other existing working groups. Areas of interest include organizational affiliation, responsiveness, and geographic coverage.
+ * [Diversity and Inclusion WG][8]: Gathers experiences regarding diversity and inclusion in open source projects with the goal of understanding, from a qualitative and quantitative point of view, how diversity and inclusion can be measured.
+ * [Evolution WG][9]: Refines the metrics that inform evolution and works with software implementations.
+ * [Risk WG][10]: Refines the metrics that inform risk and works with software implementations.
+ * [Value WG][11]: Focuses on industry-standard metrics for economic value in open source. Their main goal is to publish trusted industry-standard value metrics—a kind of S&P for software development and an authoritative source for metrics significance and industry norms.
+
+
+
+On the tooling side, projects like [Augur][12], [Cregit][13], and [GrimoireLab][14] are the reference tools that report these metrics, but also many others related to OSPO activities. They are also the seed for new tools and solutions provided by the OSS community like [Cauldron.io][15], a SaaS open source solution to ease OSS ecosystem analysis.
+
+![CHAOSS Metrics for 15 years of Unity OSS activity. Source: cauldron.io][16]
+
+CHAOSS Metrics for 15 years of Unity OSS activity. Source: cauldron.io
+
+All these metrics and data are useless without a metrics strategy. Usually, the first approach is to try to measure as much as possible, producing overwhelming reports and dashboards full of charts and data. What is the value of that?
+
+Experience has shown that a very valid approach is the [Goal, Questions, Metrics (GQM)][17] strategy. But how do we put that in practice in an OSPO?
+
+First of all, we need to understand the company's goals when using, consuming, contributing to, or releasing and maintaining OSS projects. The usual goals are related to market positioning, required upstream features development, and talent attraction or retention. Based on these goals, we should write down related questions that can be answered with numbers, like the following:
+
+#### Who/how many are the core maintainers of my OSS ecosystem projects?
+
+![Uber OSS code core, regular, and casual contributors evolution. Source: uber.biterg.io][18]
+
+Uber OSS code core, regular, and casual contributors evolution. Source: uber.biterg.io
+
+People contribute through different mechanisms or tools (code, issues, comments, tests, etc.). Measuring the core contributors (those that have done 80% of the contributions), the regular ones (those that have done 15% of the contributions), and the casual ones (those have made 5% of the contributions) can answer questions related to participation over time, but also how people move between the different buckets. Adding affiliation information helps to identify external core contributors.
+
+#### Where are the contributions happening?
+
+![Uber OSS activity based on location. Source: uber.biterg.io][19]
+
+Uber OSS activity based on location. Source: uber.biterg.io
+
+The growth of OSS ecosystems is also related to OSS projects spread across the world. Understanding that spread helps OSPO, and the company, to manage actions that improve support for people from different countries and regions.
+
+#### What is the company's OSS network?
+
+![Uber OSS network. Source: uber.biterg.io][20]
+
+Uber OSS network. Source: uber.biterg.io
+
+The company's OSS ecosystem includes those projects that the company's people contribute to. Understanding which projects they contribute to offers insight into which technologies or OSS components are interesting to people, and which companies or organizations the company collaborates with.
+
+#### How is the company dealing with contributions?
+
+![Github Pull Requests backlog management index and time to close analysis. Source: uber.biterg.io][21]
+
+Github Pull Requests backlog management index and time to close analysis. Source: uber.biterg.io
+
+One of the goals when releasing OSS projects is to grow the community around them. Measuring how the company handles contributions to its projects from outside its boundaries helps to understand how "welcoming" it is and identifies mentors (or bottlenecks) and opportunities to lower the barrier to contribute.
+
+#### Consumers vs. maintainers
+
+Over the last months, we have been hearing that corporations are taking OSS for free without contributing back. The typical arguments are that these corporations are making millions of dollars thanks to free work, plus the issue of OSS project maintainer burnout due to users' complaints and requests for free support.
+
+The system is unbalanced; usually, the number of users exceeds the number of maintainers. Is that good or bad? Having users for our software is (or should be) good. But we need to manage expectations on both sides.
+
+From the corporation's point of view, consuming OSS without care is very, very risky.
+
+OSPO can play an important role in educating the company about the risks they are facing, and how to reduce them by contributing back to their OSS ecosystem. Remember, a company's overall sustainability could rely heavily on its ecosystem sustainability.
+
+A good strategy is to start shifting your company from being pure OSS consumers to becoming contributors to their OSS inbound projects. From just submitting issues and asking questions to help solve issues, answering questions, and even sending patches, contributing helps grow and maintain the project while giving back to the community. It doesn't happen immediately, but over time, the company will be perceived as an OSS ecosystem citizen. Eventually, some people from the company could end up helping to maintain those projects too.
+
+And what about money? There are plenty of ways to support the OSS ecosystem financially. Some examples:
+
+ * Business initiatives like [Tidelift][22], or [OpenCollective][23]
+ * Foundations and their supporting mechanisms, like [Software Freedom Conservancy][24], or [CommunityBridge][25] from the Linux Foundation
+ * Self-funding programs (like [Indeed][26] and [Salesforce][27] have done)
+ * Emerging gig development approaches like [Github Sponsors][28] or [Patreon][29]
+
+
+
+Last but not least, companies need to avoid the "not invented here" syndrome. For some OSS projects, there might be companies providing consulting, customization, maintenance, and/or support services. Instead of taking OSS and spending time and people to self-host, self-customize, or try to bring those kinds of services in-house, it might be smarter and more efficient to hire some of those companies to do the thought work.
+
+As a final remark, I would like to emphasize the importance of an OSPO for a company to succeed and grow in the current market. As shepherds of the company's OSS ecosystem, they are the best people in the organization to understand how the ecosystem works and flows, and they should be empowered to manage, monitor, and make recommendations and decisions to ensure sustainability and growth.
+
+Does your organization have an OSPO yet?
+
+Six common traits of successful open source programs, and a look back at how the open source...
+
+Why would a company not in the business of software development create an open source program...
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/5/open-source-program-office
+
+作者:[J. Manrique Lopez de la Fuente][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/jsmanrique
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/meeting_discussion_brainstorm.png?itok=7_m4CC8S (community team brainstorming ideas)
+[2]: https://opensource.com/sites/default/files/uploads/ospo_1.png (OSS inbound and outbound processes)
+[3]: https://todogroup.org/
+[4]: https://todogroup.org/guides/
+[5]: https://chaoss.community/
+[6]: https://chaoss.community/metrics/
+[7]: https://github.com/chaoss/wg-common
+[8]: https://github.com/chaoss/wg-diversity-inclusion
+[9]: https://github.com/chaoss/wg-evolution
+[10]: https://github.com/chaoss/wg-risk
+[11]: https://github.com/chaoss/wg-value
+[12]: https://github.com/chaoss/augur
+[13]: https://github.com/cregit
+[14]: https://chaoss.github.io/grimoirelab/
+[15]: https://cauldron.io/
+[16]: https://opensource.com/sites/default/files/uploads/ospo_2.png (CHAOSS Metrics for 15 years of Unity OSS activity. Source: cauldron.io)
+[17]: https://en.wikipedia.org/wiki/GQM
+[18]: https://opensource.com/sites/default/files/uploads/ospo_3.png (Uber OSS code core, regular, and casual contributors evolution. Source: uber.biterg.io)
+[19]: https://opensource.com/sites/default/files/uploads/ospo_4.png (Uber OSS activity based on location. Source: uber.biterg.io)
+[20]: https://opensource.com/sites/default/files/uploads/ospo_5_0.png (Uber OSS network. Source: uber.biterg.io)
+[21]: https://opensource.com/sites/default/files/uploads/ospo_6.png (Github Pull Requests backlog management index and time to close analysis. Source: uber.biterg.io)
+[22]: https://tidelift.com/
+[23]: https://opencollective.com/
+[24]: https://sfconservancy.org/
+[25]: https://funding.communitybridge.org/
+[26]: https://engineering.indeedblog.com/blog/2019/02/sponsoring-osi/
+[27]: https://sustain.codefund.fm/23
+[28]: https://help.github.com/en/github/supporting-the-open-source-community-with-github-sponsors
+[29]: https://www.patreon.com/
diff --git a/sources/tech/20200510 Open source underpins coronavirus IoT and robotics solutions.md b/sources/tech/20200510 Open source underpins coronavirus IoT and robotics solutions.md
new file mode 100644
index 0000000000..5ce9ce0a1f
--- /dev/null
+++ b/sources/tech/20200510 Open source underpins coronavirus IoT and robotics solutions.md
@@ -0,0 +1,86 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Open source underpins coronavirus IoT and robotics solutions)
+[#]: via: (https://opensource.com/article/20/5/robotics-covid19)
+[#]: author: (Sam Bocetta https://opensource.com/users/sambocetta)
+
+Open source underpins coronavirus IoT and robotics solutions
+======
+From sanitization of equipment and facilities to plotting the spread of
+the virus, robots are playing an active role in combating COVID-19.
+![Three giant robots and a person][1]
+
+The tech sector is quietly having a boom during the COVID-19 pandemic. Open source developers are getting involved with many aspects of the fight against the coronavirus, [using Python to visualize its spread][2] and helping to repurpose data acquisition systems to perform contact tracing.
+
+However, one of the most exciting areas of current research is the use of robotics to contain the spread of the coronavirus. In the last few weeks, robots have been deployed in critical environments—particularly in hospitals and on airplanes—to help staff sterilize surfaces and objects.
+
+Most of these robots are produced by tech startups, who have seen an opportunity to prove the worth of their proprietary systems. Many of them, however, rely on [open source cloud and IoT tools][3] that have been developed by the open source community.
+
+In this article, we'll take a look at how robotics are being used to fight the disease, the IoT infrastructure that underpins these systems, and finally, the security and privacy concerns that their increased use is highlighting.
+
+### Robots and COVID-19
+
+Around the world, robots are being deployed to help the fight against COVID-19. The most direct use of robots has been in healthcare facilities, and China has taken the lead when it comes to deploying robots in hospitals.
+
+For example, a field hospital that recently opened in Wuhan—where the virus originated—is [making extensive use of robots][4] to help healthcare workers care for patients. Some of these robots provide food, drink, and medicine to patients, and others are used to clean parts of the hospital.
+
+Other companies, such as the Texas startup Xenex Disinfection Services, are using robots and UV light to deactivate viruses, bacteria, and spores on surfaces in airports. Still others, like Dimer UVC Innovations, are focusing on making robots that can [improve aircraft hygiene][5].
+
+Not all of the "robots" deployed against the disease are anthropomorphic, though. The same field hospital in Wuhan that is using human-like robots is also making extensive use of less obviously "robotic" IoT devices.
+
+Patients entering the hospital are screened by networked 5G thermometers to alert staff for anyone showing a high fever, and patients wear smart bracelets and rings equipped with sensors. These are synced with CloudMinds' AI platform, and patients' vital signs, including temperature, heart rate, and blood oxygen levels, can be monitored.
+
+### Robots and the IoT
+
+Even when these robots appear to be independent entities, they make [extensive use of the IoT][6]. In other words, although patients may feel that they are being cared for by a robot that can make its own decisions, in reality, these robots are controlled by large, distributed sensing and data processing systems.
+
+Although many of the robots being deployed are the proprietary property of the tech firms who produce their hardware, their functioning is based on an ecosystem of software that is largely open source.
+
+This observation is an important one because it overturns one of the primary misconceptions about the [way that AI is used today][7][,][7] whether in a healthcare setting or elsewhere. Most research into robotics today does not seek to embed fully intelligent AI systems into robots themselves but, instead, uses centralized AI systems to control a wide variety of far less "smart" IoT devices.
+
+This observation, in turn, highlights two key points about the robots currently being developed and used to fight COVID-19. One is that they rely on a software ecosystem—much of it open source—that has been developed in a truly collaborative process involving thousands of engineers. The second is that the networked nature of these robots makes them vulnerable to exploitation.
+
+### Security and privacy
+
+This vulnerability to cybersecurity threats has led some analysts to raise questions about the wisdom of widespread deployment of IoT-driven robotics, whether in the healthcare system or anywhere else. Spyware in the IoT [remains a huge problem][8], and some fear that by integrating IoT systems into healthcare, we may be exposing more data—and more sensitive data—to intruders.
+
+Even where developers are careful to build security into these devices, the sheer number of components they rely on makes DevSecOps processes difficult to implement. Especially in this current time of crisis, many software engineers have been forced to accelerate the release of new components, and this could lead to them being vulnerable. If a company is rushing to bring a healthcare robot onto the market in response to COVID-19, it's unlikely that the open source code that these devices run on will be [properly audited][9].
+
+And even if companies are able to maintain the integrity of their DevSecOps processes while still accelerating development, it's far from certain that patients themselves understand the privacy implications of delegating their care to IoT devices. Many lack the open source privacy tools [necessary to keep their data private][10] when browsing the internet, let alone those that should be deployed to protect sensitive healthcare data.
+
+### The future
+
+In short, the deployment of robots in the fight against COVID-19 is highlighting long-standing concerns about the integrity, security, and privacy of IoT systems more generally. Professionals in this field have long argued that [IoT audits][11] and [embedded Linux systems][12] should be the standard for IoT development, but in the current crisis, their warnings are likely to be ignored.
+
+This is worrying because it's likely that IoT systems will be increasingly used in healthcare in the coming decade. So whilst the COVID-19 pandemic will provide a proof of their utility in this sector, it should also not be used as an excuse to roll out poorly secured, poorly audited IoT software in highly sensitive environments.
+
+Open source isn’t just changing the way we interact with the world, it’s changing the way the world...
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/5/robotics-covid19
+
+作者:[Sam Bocetta][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/sambocetta
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_robots.png?itok=TOZgajrd (Three giant robots and a person)
+[2]: https://opensource.com/article/20/4/python-data-covid-19
+[3]: https://opensource.com/article/18/7/digital-transformation-strategy-think-cloud
+[4]: https://www.cnbc.com/2020/03/18/how-china-is-using-robots-and-telemedicine-to-combat-the-coronavirus.html
+[5]: https://www.therobotreport.com/company-offers-germ-killing-robot-to-airports-to-address-coronavirus-outbreak/
+[6]: https://www.cloudwards.net/what-is-the-internet-of-things/
+[7]: https://opensource.com/article/17/3/5-big-ways-ai-rapidly-invading-our-lives
+[8]: https://blog.eccouncil.org/spyware-in-the-iot-what-does-it-mean-for-your-online-privacy/
+[9]: https://opensource.com/article/17/10/doc-audits
+[10]: https://privacyaustralia.net/privacy-tools/
+[11]: https://opensource.com/article/19/11/how-many-iot-devices
+[12]: https://opensource.com/article/17/3/embedded-linux-iot-ecosystem
diff --git a/sources/tech/20200511 How I track my home-s energy consumption with open source.md b/sources/tech/20200511 How I track my home-s energy consumption with open source.md
new file mode 100644
index 0000000000..10dfaa5f8e
--- /dev/null
+++ b/sources/tech/20200511 How I track my home-s energy consumption with open source.md
@@ -0,0 +1,144 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How I track my home's energy consumption with open source)
+[#]: via: (https://opensource.com/article/20/5/energy-monitoring)
+[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99)
+
+How I track my home's energy consumption with open source
+======
+These open source components help you find ways to save money and
+conserve resources.
+![lightbulb drawing outline][1]
+
+An important step towards optimizing energy consumption is knowing your actual consumption. My house was built during the oil crisis in the 1970s, and due to the lack of a natural gas connection, the builders decided to use electricity to do all of the heating (water and home heating). This is not unusual for this area of Germany, and it remains an appropriate solution in countries that depend highly on nuclear power.
+
+Electricity prices here are quite high (around € 0.28/kWh), so I decided to monitor my home's energy consumption to get a feel for areas where I could save some energy.
+
+I used to work for a company that sold energy-monitoring systems for industrial customers. While this company mostly used proprietary software, you can set up a similar smart monitoring and logging solution for your home based on open source components. This article will show you how.
+
+In Germany, the grid operator owns the electricity meter. The grid operator is obliged to provide an interface on its metering device to enable the customer to access the meter reading. Here is the metering device on my home:
+
+![Actaris ACE3000 electricity meter][2]
+
+Actaris ACE3000 Type 110 (dry contact located behind the marked cover)
+
+Generally, almost every metering device has at least a [dry contact][3]—as my electricity meter does—that you can use to log metering. As you can see, my electricity meter has two counters: The upper one is for the day tariff (6am to 10pm), and the lower one is for the night tariff (10pm to 6am). The night tariff is a bit cheaper. Two-tariff meters are usually found only in houses with electric heating.
+
+### Design
+
+A reliable energy-monitoring solution for private use should meet the following requirements:
+
+ * Logging of metering impulses (dry contact)
+ * 24/7 operation
+ * Energy-saving operation
+ * Visualization of consumption data
+ * Long-term recording of consumption data
+ * Connectivity (e.g., Ethernet, USB, WiFi, etc.)
+ * Affordability
+
+
+
+I choose the Siemens SIMATIC IOT2020 as my hardware platform. This industrial-proven device is based on an Intel Quark x86 CPU, has programmable interrupts, and is compatible with many Arduino shields.
+
+![Siemens SIMATIC IOT2020][4]
+
+Siemens SIMATIC IOT2020
+
+The Siemens device comes without an SD card and, therefore, without an operating system. Luckily, you can find a current Yocto-based Linux OS image and instructions on how to flash the SD card in the [Siemens forum][5].
+
+In addition to the hardware platform, you also need some accessories. The following materials list shows the minimum components you need. Each item includes links to the parts I purchased, so you can get a sense of the project's costs.
+
+#### Materials list
+
+ * [Siemens SIMATIC IoT2020 unit][6]
+ * [Siemens I/O Shield for SIMATIC IoT2000 series][7]
+ * [microSD card][8] (2GB or more)
+ * [CSL 300Mbit USB-WLAN adapter][9]
+ * 24V power supply (I used a 2.1A [TDK-Lambda DRB50-24-1][10], which I already owned). You could use a less expensive power supply with less power: the SIMATIC IOT2020 has a maximum current of 1.4A, and the dry contact needs an additional 0.1A (24V / 220Ω).
+ * 5 terminal blocks ([Weidmueller WDU 2.5mm][11])
+ * 2 terminal cross-connecting bridges ([Weidmueller WQV][12])
+ * [DIN rail][13] (~300 mm)
+ * [220Ω / 3W resistor][14]
+ * Wire
+
+
+
+Here is the assembled result:
+
+![Mounted and hooked up energy logger][15]
+
+Energy logger mounted and hooked up
+
+Unfortunately, I didn't have enough space at the rear wall of the cabinet; therefore, the DIN rail with the mounted parts lies on the ground.
+
+The connections between the meter and the Siemens device look like this:
+
+![Wiring between meter and energy logger][16]
+
+### How it works
+
+A dry contact is a current interface. When the electricity meter triggers, a current of 0.1A starts flowing between **s0+** and **s0-**. On **DI0**, the voltage rises to 24V and triggers an interrupt. When the electricity meter disconnects **s0+** and **s0-**, **DI0** is grounded over the resistor.
+
+On my device, the contact closes 1,000 times per kWh (this value varies between metering devices).
+
+To count these peaks reliably, I created [a C program][17] that registers an interrupt service routine on the DI0 input and counts upwards in memory. Once a minute, the values from memory are written to an [SQLite][18] database.
+
+The overall meter reading is also written to a text file and can be preset with a starting value. This acts as a copy of the overall metering value of the meter in the cabinet.
+
+![Energy logger architecture][19]
+
+Energy logger architecture
+
+The data is visualized using [Node-RED][20], and I can access overviews, like the daily consumption dashboard below, over a web-based GUI.
+
+![Node-RED based GUI][21]
+
+Daily overview in the Node-RED GUI
+
+For the daily overview, I calculate the hourly costs based on the consumption data (the large bar chart). On the top-left of the dashboard you can see the actual power; below that is the daily consumption (energy and costs). The water heater for the shower causes the large peak in the bar chart.
+
+### A reliable system
+
+Aside from a lost timestamp during a power failure (the real-time clock in the Siemens device is not backed by a battery by default), everything has been working fine for more than one-and-a-half years.
+
+If you can set up the whole Linux system completely from the command line, you'll get a reliable and flexible system with the ability to link interrupt service routines to the I/O level.
+
+Because the I/O Shield runs on standard control voltage (24V), you can extend its functionality with the whole range of standardized industrial components (e.g., relays, sensors, actors, etc.). And, due to its open architecture, this system can be extended easily and applied to other applications, like for monitoring gas or water consumption or as a weather station, a simple controller for tasks, and more.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/5/energy-monitoring
+
+作者:[Stephan Avenwedde][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/hansic99
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/Collaboration%20for%20health%20innovation.png?itok=s4O5EX2w (lightbulb drawing outline)
+[2]: https://opensource.com/sites/default/files/uploads/openenergylogger_1_electricity_meter.jpg (Actaris ACE3000 electricity meter)
+[3]: https://en.wikipedia.org/wiki/Dry_contact
+[4]: https://opensource.com/sites/default/files/uploads/openenergylogger_2_siemens_device.jpg (Siemens SIMATIC IOT2020)
+[5]: https://support.industry.siemens.com/tf/ww/en/posts/new-example-image-version-online/189090/?page=0&pageSize=10
+[6]: https://de.rs-online.com/web/p/products/1244037
+[7]: https://de.rs-online.com/web/p/products/1354133
+[8]: https://de.rs-online.com/web/p/micro-sd-karten/7582584/
+[9]: https://www.amazon.de/300Mbit-WLAN-Adapter-Hochleistungs-Antennen-Dual-Band/dp/B00LLIOT34
+[10]: https://de.rs-online.com/web/p/products/8153133
+[11]: https://de.rs-online.com/web/p/din-schienenklemmen-ohne-sicherung/0425190/
+[12]: https://de.rs-online.com/web/p/din-schienenklemmen-zubehor/0202574/
+[13]: https://de.rs-online.com/web/p/din-schienen/2835729/
+[14]: https://de.rs-online.com/web/p/widerstande-durchsteckmontage/2142673/
+[15]: https://opensource.com/sites/default/files/uploads/openenergylogger_3_assembled_device.jpg (Mounted and hooked up energy logger)
+[16]: https://opensource.com/sites/default/files/uploads/openenergylogger_4_wiring.png (Wiring between meter and energy logger)
+[17]: https://github.com/hANSIc99/OpenEnergyLogger
+[18]: https://www.sqlite.org/index.html
+[19]: https://opensource.com/sites/default/files/uploads/openenergylogger_5_architecure.png (Energy logger architecture)
+[20]: https://nodered.org/
+[21]: https://opensource.com/sites/default/files/uploads/openenergylogger_6_dashboard.png (Node-RED based GUI)
diff --git a/sources/tech/20200511 Start using systemd as a troubleshooting tool.md b/sources/tech/20200511 Start using systemd as a troubleshooting tool.md
new file mode 100644
index 0000000000..372be7660e
--- /dev/null
+++ b/sources/tech/20200511 Start using systemd as a troubleshooting tool.md
@@ -0,0 +1,269 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Start using systemd as a troubleshooting tool)
+[#]: via: (https://opensource.com/article/20/5/systemd-troubleshooting-tool)
+[#]: author: (David Both https://opensource.com/users/dboth)
+
+Start using systemd as a troubleshooting tool
+======
+While systemd is not really a troubleshooting tool, the information in
+its output points the way toward solving problems.
+![Magnifying glass on code][1]
+
+No one would really consider systemd to be a troubleshooting tool, but when I encountered a problem on my webserver, my growing knowledge of systemd and some of its features helped me locate and circumvent the problem.
+
+The problem was that my server, yorktown, which provides name services, DHCP, NTP, HTTPD, and SendMail email services for my home office network, failed to start the Apache HTTPD daemon during normal startup. I had to start it manually after I realized that it was not running. The problem had been going on for some time, and I recently got around to trying to fix it.
+
+Some of you will say that systemd itself is the cause of this problem, and, based on what I know now, I agree with you. However, I had similar types of problems with SystemV. (In the [first article][2] in this series, I looked at the controversy around systemd as a replacement for the old SystemV init program and startup scripts. If you're interested in learning more about systemd, read the [second][3] and [third][4] articles, too.) No software is perfect, and neither systemd nor SystemV is an exception, but systemd provides far more information for problem-solving than SystemV ever offered.
+
+### Determining the problem
+
+The first step to finding the source of this problem is to determine the httpd service's status:
+
+
+```
+[root@yorktown ~]# systemctl status httpd
+● httpd.service - The Apache HTTP Server
+ Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
+ Active: failed (Result: exit-code) since Thu 2020-04-16 11:54:37 EDT; 15min ago
+ Docs: man:httpd.service(8)
+ Process: 1101 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
+ Main PID: 1101 (code=exited, status=1/FAILURE)
+ Status: "Reading configuration..."
+ CPU: 60ms
+
+Apr 16 11:54:35 yorktown.both.org systemd[1]: Starting The Apache HTTP Server...
+Apr 16 11:54:37 yorktown.both.org httpd[1101]: (99)Cannot assign requested address: AH00072: make_sock: could not bind to address 192.168.0.52:80
+Apr 16 11:54:37 yorktown.both.org httpd[1101]: no listening sockets available, shutting down
+Apr 16 11:54:37 yorktown.both.org httpd[1101]: AH00015: Unable to open logs
+Apr 16 11:54:37 yorktown.both.org systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE
+Apr 16 11:54:37 yorktown.both.org systemd[1]: httpd.service: Failed with result 'exit-code'.
+Apr 16 11:54:37 yorktown.both.org systemd[1]: Failed to start The Apache HTTP Server.
+[root@yorktown ~]#
+```
+
+This status information is one of the systemd features that I find much more useful than anything SystemV offers. The amount of helpful information here leads me easily to a logical conclusion that takes me in the right direction. All I ever got from the old **chkconfig** command is whether or not the service is running and the process ID (PID) if it is. That is not very helpful.
+
+The key entry in this status report shows that HTTPD cannot bind to the IP address, which means it cannot accept incoming requests. This indicates that the network is not starting fast enough to be ready for the HTTPD service to bind to the IP address because the IP address has not yet been set. This is not supposed to happen, so I explored my network service systemd startup configuration files; all appeared to be correct with the right "after" and "requires" statements. Here is the **/lib/systemd/system/httpd.service** file from my server:
+
+
+```
+# Modifying this file in-place is not recommended, because changes
+# will be overwritten during package upgrades. To customize the
+# behaviour, run "systemctl edit httpd" to create an override unit.
+
+# For example, to pass additional options (such as -D definitions) to
+# the httpd binary at startup, create an override unit (as is done by
+# systemctl edit) and enter the following:
+
+# [Service]
+# Environment=OPTIONS=-DMY_DEFINE
+
+[Unit]
+Description=The Apache HTTP Server
+Wants=httpd-init.service
+After=network.target remote-fs.target nss-lookup.target httpd-init.service
+Documentation=man:httpd.service(8)
+
+[Service]
+Type=notify
+Environment=LANG=C
+
+ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
+ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
+# Send SIGWINCH for graceful stop
+KillSignal=SIGWINCH
+KillMode=mixed
+PrivateTmp=true
+
+[Install]
+WantedBy=multi-user.target
+```
+
+The **httpd.service** unit file explicitly specifies that it should load after the **network.target** and the **httpd-init.service** (among others). I tried to find all of these services using the **systemctl list-units** command and searching for them in the resulting data stream. All were present and should have ensured that the httpd service did not load before the network IP address was set.
+
+### First solution
+
+A bit of searching on the internet confirmed that others had encountered similar problems with httpd and other services. This appears to happen because one of the required services indicates to systemd that it has finished its startup—but it actually spins off a child process that has not finished. After a bit more searching, I came up with a circumvention.
+
+I could not figure out why the IP address was taking so long to be assigned to the network interface card. So, I thought that if I could delay the start of the HTTPD service by a reasonable amount of time, the IP address would be assigned by that time.
+
+Fortunately, the **/lib/systemd/system/httpd.service** file above provides some direction. Although it says not to alter it, it does indicate how to proceed: Use the command **systemctl edit httpd**, which automatically creates a new file (**/etc/systemd/system/httpd.service.d/override.conf**) and opens the [GNU Nano][5] editor. (If you are not familiar with Nano, be sure to look at the hints at the bottom of the Nano interface.)
+
+Add the following text to the new file and save it:
+
+
+```
+[root@yorktown ~]# cd /etc/systemd/system/httpd.service.d/
+[root@yorktown httpd.service.d]# ll
+total 4
+-rw-r--r-- 1 root root 243 Apr 16 11:43 override.conf
+[root@yorktown httpd.service.d]# cat override.conf
+# Trying to delay the startup of httpd so that the network is
+# fully up and running so that httpd can bind to the correct
+# IP address
+#
+# By David Both, 2020-04-16
+
+[Service]
+ExecStartPre=/bin/sleep 30
+```
+
+The **[Service]** section of this override file contains a single line that delays the start of the HTTPD service by 30 seconds. The following status command shows the service status during the wait time:
+
+
+```
+[root@yorktown ~]# systemctl status httpd
+● httpd.service - The Apache HTTP Server
+ Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
+ Drop-In: /etc/systemd/system/httpd.service.d
+ └─override.conf
+ /usr/lib/systemd/system/httpd.service.d
+ └─php-fpm.conf
+ Active: activating (start-pre) since Thu 2020-04-16 12:14:29 EDT; 28s ago
+ Docs: man:httpd.service(8)
+Cntrl PID: 1102 (sleep)
+ Tasks: 1 (limit: 38363)
+ Memory: 260.0K
+ CPU: 2ms
+ CGroup: /system.slice/httpd.service
+ └─1102 /bin/sleep 30
+
+Apr 16 12:14:29 yorktown.both.org systemd[1]: Starting The Apache HTTP Server...
+Apr 16 12:15:01 yorktown.both.org systemd[1]: Started The Apache HTTP Server.
+[root@yorktown ~]#
+```
+
+And this command shows the status of the HTTPD service after the 30-second delay expires. The service is up and running correctly:
+
+
+```
+[root@yorktown ~]# systemctl status httpd
+● httpd.service - The Apache HTTP Server
+ Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
+ Drop-In: /etc/systemd/system/httpd.service.d
+ └─override.conf
+ /usr/lib/systemd/system/httpd.service.d
+ └─php-fpm.conf
+ Active: active (running) since Thu 2020-04-16 12:15:01 EDT; 1min 18s ago
+ Docs: man:httpd.service(8)
+ Process: 1102 ExecStartPre=/bin/sleep 30 (code=exited, status=0/SUCCESS)
+ Main PID: 1567 (httpd)
+ Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec: 0 B/sec"
+ Tasks: 213 (limit: 38363)
+ Memory: 21.8M
+ CPU: 82ms
+ CGroup: /system.slice/httpd.service
+ ├─1567 /usr/sbin/httpd -DFOREGROUND
+ ├─1569 /usr/sbin/httpd -DFOREGROUND
+ ├─1570 /usr/sbin/httpd -DFOREGROUND
+ ├─1571 /usr/sbin/httpd -DFOREGROUND
+ └─1572 /usr/sbin/httpd -DFOREGROUND
+
+Apr 16 12:14:29 yorktown.both.org systemd[1]: Starting The Apache HTTP Server...
+Apr 16 12:15:01 yorktown.both.org systemd[1]: Started The Apache HTTP Server.
+```
+
+I could have experimented to see if a shorter delay would work as well, but my system is not that critical, so I decided not to. It works reliably as it is, so I am happy.
+
+Because I gathered all this information, I reported it to Red Hat Bugzilla as Bug [1825554][6]. I believe that it is much more productive to report bugs than it is to complain about them.
+
+### The better solution
+
+A couple of days after reporting this as a bug, I received a response indicating that systemd is just the manager, and if httpd needs to be ordered after some requirements are met, it needs to be expressed in the unit file. The response pointed me to the **httpd.service** man page. I wish I had found this earlier because it is a better solution than the one I came up with. This solution is explicitly targeted to the prerequisite target unit rather than a somewhat random delay.
+
+From the [**httpd.service** man page][7]:
+
+> **Starting the service at boot time**
+>
+> The httpd.service and httpd.socket units are _disabled_ by default. To start the httpd service at boot time, run: **systemctl enable httpd.service**. In the default configuration, the httpd daemon will accept connections on port 80 (and, if mod_ssl is installed, TLS connections on port 443) for any configured IPv4 or IPv6 address.
+>
+> If httpd is configured to depend on any specific IP address (for example, with a "Listen" directive) which may only become available during start-up, or if httpd depends on other services (such as a database daemon), the service _must_ be configured to ensure correct start-up ordering.
+>
+> For example, to ensure httpd is only running after all configured network interfaces are configured, create a drop-in file (as described above) with the following section:
+>
+> [Unit]
+> After=network-online.target
+> Wants=network-online.target
+
+I still think this is a bug because it is quite common—at least in my experience—to use a **Listen** directive in the **httpd.conf** configuration file. I have always used **Listen** directives, even on hosts with only a single IP address, and it is clearly necessary on hosts with multiple network interface cards (NICs) and internet protocol (IP) addresses. Adding the lines above to the **/usr/lib/systemd/system/httpd.service** default file would not cause problems for configurations that do not use a **Listen** directive and would prevent this problem for those that do.
+
+In the meantime, I will use the suggested solution.
+
+### Next steps
+
+This article describes a problem I had with starting the Apache HTTPD service on my server. It leads you through the problem determination steps I took and shows how I used systemd to assist. I also covered the circumvention I implemented using systemd and the better solution that followed from my bug report.
+
+As I mentioned at the start, it is very likely that this is the result of a problem with systemd, specifically the configuration for httpd startup. Nevertheless, systemd provided me with the tools to locate the likely source of the problem and to formulate and implement a circumvention. Neither solution really resolves the problem to my satisfaction. For now, the root cause of the problem still exists and must be fixed. If that is simply adding the recommended lines to the **/usr/lib/systemd/system/httpd.service** file, that would work for me.
+
+One of the things I discovered during this is process is that I need to learn more about defining the sequences in which things start. I will explore that in my next article, the fifth in this series.
+
+### Resources
+
+There is a great deal of information about systemd available on the internet, but much is terse, obtuse, or even misleading. In addition to the resources mentioned in this article, the following webpages offer more detailed and reliable information about systemd startup.
+
+ * The Fedora Project has a good, practical [guide][8] [to systemd][8]. It has pretty much everything you need to know in order to configure, manage, and maintain a Fedora computer using systemd.
+ * The Fedora Project also has a good [cheat sheet][9] that cross-references the old SystemV commands to comparable systemd ones.
+ * For detailed technical information about systemd and the reasons for creating it, check out [Freedesktop.org][10]'s [description of systemd][11].
+ * [Linux.com][12]'s "More systemd fun" offers more advanced systemd [information and tips][13].
+
+
+
+There is also a series of deeply technical articles for Linux sysadmins by Lennart Poettering, the designer and primary developer of systemd. These articles were written between April 2010 and September 2011, but they are just as relevant now as they were then. Much of everything else good that has been written about systemd and its ecosystem is based on these papers.
+
+ * [Rethinking PID 1][14]
+ * [systemd for Administrators, Part I][15]
+ * [systemd for Administrators, Part II][16]
+ * [systemd for Administrators, Part III][17]
+ * [systemd for Administrators, Part IV][18]
+ * [systemd for Administrators, Part V][19]
+ * [systemd for Administrators, Part VI][20]
+ * [systemd for Administrators, Part VII][21]
+ * [systemd for Administrators, Part VIII][22]
+ * [systemd for Administrators, Part IX][23]
+ * [systemd for Administrators, Part X][24]
+ * [systemd for Administrators, Part XI][25]
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/5/systemd-troubleshooting-tool
+
+作者:[David Both][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/dboth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/find-file-linux-code_magnifying_glass_zero.png?itok=E2HoPDg0 (Magnifying glass on code)
+[2]: https://opensource.com/article/20/4/systemd
+[3]: https://opensource.com/article/20/4/systemd-startup
+[4]: https://opensource.com/article/20/4/understanding-and-using-systemd-units
+[5]: https://www.nano-editor.org/
+[6]: https://bugzilla.redhat.com/show_bug.cgi?id=1825554
+[7]: https://www.mankier.com/8/httpd.service#Description-Starting_the_service_at_boot_time
+[8]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html
+[9]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet
+[10]: http://Freedesktop.org
+[11]: http://www.freedesktop.org/wiki/Software/systemd
+[12]: http://Linux.com
+[13]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/
+[14]: http://0pointer.de/blog/projects/systemd.html
+[15]: http://0pointer.de/blog/projects/systemd-for-admins-1.html
+[16]: http://0pointer.de/blog/projects/systemd-for-admins-2.html
+[17]: http://0pointer.de/blog/projects/systemd-for-admins-3.html
+[18]: http://0pointer.de/blog/projects/systemd-for-admins-4.html
+[19]: http://0pointer.de/blog/projects/three-levels-of-off.html
+[20]: http://0pointer.de/blog/projects/changing-roots
+[21]: http://0pointer.de/blog/projects/blame-game.html
+[22]: http://0pointer.de/blog/projects/the-new-configuration-files.html
+[23]: http://0pointer.de/blog/projects/on-etc-sysinit.html
+[24]: http://0pointer.de/blog/projects/instances.html
+[25]: http://0pointer.de/blog/projects/inetd.html
diff --git a/sources/tech/20200511 Tips and tricks for optimizing container builds.md b/sources/tech/20200511 Tips and tricks for optimizing container builds.md
new file mode 100644
index 0000000000..0a4fbed8cb
--- /dev/null
+++ b/sources/tech/20200511 Tips and tricks for optimizing container builds.md
@@ -0,0 +1,201 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Tips and tricks for optimizing container builds)
+[#]: via: (https://opensource.com/article/20/5/optimize-container-builds)
+[#]: author: (Ravi Chandran https://opensource.com/users/ravichandran)
+
+Tips and tricks for optimizing container builds
+======
+Try these techniques to minimize the number and length of your container
+build iterations.
+![Toolbox drawing of a container][1]
+
+How many iterations does it take to get a container configuration just right? And how long does each iteration take? Well, if you answered "too many times and too long," then my experiences are similar to yours. On the surface, creating a configuration file seems like a straightforward exercise: implement the same steps in a configuration file that you would perform if you were installing the system by hand. Unfortunately, I've found that it usually doesn't quite work that way, and a few "tricks" are handy for such DevOps exercises.
+
+In this article, I'll share some techniques I've found that help minimize the number and length of iterations. In addition, I'll outline a few good practices beyond the [standard ones][2].
+
+In the [tutorial repository][3] from my previous article about [containerizing build systems][4], I've added a folder called **/tutorial2_docker_tricks** with an example covering some of the tricks that I'll walk through in this post. If you want to follow along and you have Git installed, you can pull it locally with:
+
+
+```
+`$ git clone https://github.com/ravi-chandran/dockerize-tutorial`
+```
+
+The tutorial has been tested with Docker Desktop Edition, although it should work with any compatible Linux container system (like [Podman][5]).
+
+### Save time on container image build iterations
+
+If the Dockerfile involves downloading and installing a 5GB file, each iteration of **docker image build** could take a lot of time even with good network speeds. And forgetting to include one item to be installed can mean rebuilding all the layers after that point.
+
+One way around that challenge is to use a local HTTP server to avoid downloading large files from the internet multiple times during **docker image build** iterations. To illustrate this by example, say you need to create a container image with Anaconda 3 under Ubuntu 18.04. The Anaconda 3 installer is a ~0.5GB file, so this will be the "large" file for this example.
+
+Note that you don't want to use the **COPY** instruction, as it creates a new layer. You should also delete the large installer after using it to minimize the container image size. You could use [multi-stage builds][6], but I've found the following approach sufficient and quite effective.
+
+The basic idea is to use a Python-based HTTP server locally to serve the large file(s) and have the Dockerfile **wget** the large file(s) from this local server. Let's explore the details of how to set this up effectively. As a reminder, you can access the [full example][7].
+
+The necessary contents of the folder **tutorial2_docker_tricks/** in this example repository are:
+
+
+```
+tutorial2_docker_tricks/
+├── build_docker_image.sh # builds the docker image
+├── run_container.sh # instantiates a container from the image
+├── install_anaconda.dockerfile # Dockerfile for creating our target docker image
+├── .dockerignore # used to ignore contents of the installer/ folder from the docker context
+├── installer # folder with all our large files required for creating the docker image
+│ └── Anaconda3-2019.10-Linux-x86_64.sh # from
+└── workdir # example folder used as a volume in the running container
+```
+
+The key steps of the approach are:
+
+ * Place the large file(s) in the **installer/** folder. In this example, I have the large Anaconda installer file **Anaconda3-2019.10-Linux-x86_64.sh**. You won't find this file if you clone my [Git repository][8] because only you, as the container image creator, need this source file. The end users of the image don't. [Download the installer][9] to follow along with the example.
+ * Create the **.dockerignore** file and have it ignore the **installer/** folder to avoid Docker copying all the large files into the build context.
+ * In a terminal, **cd** into the **tutorial2_docker_tricks/** folder and execute the build script as **./build_docker_image.sh**.
+ * In **build_docker_image.sh**, start the Python HTTP server to serve any files from the **installer/** folder: [code] cd installer
+python3 -m http.server --bind 10.0.2.15 8888 &
+cd ..
+```
+* If you're wondering about the strange internet protocol (IP) address, I'm working with a VirtualBox Linux VM, and **10.0.2.15** shows up as the address of the Ethernet adapter when I run **ifconfig**. This IP seems to be the convention used by VirtualBox. If your setup is different, you'll need to update this IP address to match your environment and then update **build_docker_image.sh** and **install_anaconda.dockerfile**. The server's port number is set to **8888** for this example. Note that the IP and port numbers could be passed in as build arguments, but I've hard-coded them for brevity.
+* Since the HTTP server is set to run in the background, stop the server near the end of the script with the **kill -9** command using an [elegant approach][10] I found: [code]`kill -9 `ps -ef | grep http.server | grep 8888 | awk '{print $2}'`
+```
+ * Note that this same **kill -9** is also used earlier in the script (before starting the HTTP server). In general, when I iterate on any build script that I might deliberately interrupt, this ensures a clean start of the HTTP server each time.
+ * In the [Dockerfile][11], there is a **RUN wget** instruction that downloads the Anaconda installer from the local HTTP server. It also deletes the installer file and cleans up after the installation. Most importantly, all these actions are performed within the same layer to keep the image size to a minimum: [code] # install Anaconda by downloading the installer via the local http server
+ARG ANACONDA
+RUN wget --no-proxy -O ~/anaconda.sh \
+ && /bin/bash ~/anaconda.sh -b -p /opt/conda \
+ && rm ~/anaconda.sh \
+ && rm -fr /var/lib/apt/lists/{apt,dpkg,cache,log} /tmp/* /var/tmp/*
+```
+ * This file runs the wrapper script, **anaconda.sh**, and cleans up large files by removing them with **rm**.
+ * After the build is complete, you should see an image **anaconda_ubuntu1804:v1**. (You can list the images with **docker image ls**.)
+ * You can instantiate a container from this image using **./run_container.sh** at the terminal while in the folder **tutorial2_docker_tricks/**. You can verify that Anaconda is installed with: [code] $ ./run_container.sh
+$ python --version
+Python 3.7.5
+$ conda --version
+conda 4.8.0
+$ anaconda --version
+anaconda Command line client (version 1.7.2)
+```
+ * You'll note that **run_container.sh** sets up a volume **workdir**. In this example repository, the folder **workdir/** is empty. This is a convention I use to set up a volume where I can have my Python and other scripts that are independent of the container image.
+
+
+
+### Minimize container image size
+
+Each **RUN** command is equivalent to executing a new shell, and each **RUN** command creates a layer. The naive approach of mimicking installation instructions with separate **RUN** commands may eventually break at one or more interdependent steps. If it happens to work, it will typically result in a larger image. Chaining multiple installation steps in one **RUN** command and including the **autoremove**, **autoclean**, and **rm** commands (as in the example below) is useful to minimize the size of each layer. Some of these steps may not be needed, depending on what's being installed. However, since these steps take an insignificant amount of time, I always throw them in for good measure at the end of **RUN** commands invoking **apt-get**:
+
+
+```
+RUN apt-get update \
+ && DEBIAN_FRONTEND=noninteractive \
+ apt-get -y --quiet --no-install-recommends install \
+ # list of packages being installed go here \
+ && apt-get -y autoremove \
+ && apt-get clean autoclean \
+ && rm -fr /var/lib/apt/lists/{apt,dpkg,cache,log} /tmp/* /var/tmp/*
+```
+
+Also, ensure that you have a **.dockerignore** file in place to ignore items that don't need to be sent to the Docker build context (such as the Anaconda installer file in the earlier example).
+
+### Organize the build tool I/O
+
+For software build systems, the build inputs and outputs—all the scripts that configure and invoke the tools—should be outside the image and the eventually running container. The container itself should remain stateless so that different users will have identical results with it. I covered this extensively in my [previous article][4] but wanted to emphasize it because it's been a useful convention for my work. These inputs and outputs are best accessed by setting up container volumes.
+
+I've had to use a container image that provides data in the form of source code and large pre-built binaries. As a software developer, I was expected to edit the code in the container. This was problematic, because containers are by default stateless: they don't save data within the container, because they're designed to be disposable. But I worked on it, and at the end of each day, I stopped the container and had to be careful not to remove it, because the state had to be maintained so I could continue work the next day. The disadvantage of this approach was that there would be a divergence of development state had there been more than one person working on the project. The value of having identical build systems across developers is somewhat lost with this approach.
+
+### Generate output as non-root user
+
+An important aspect of I/O concerns the ownership of the output files generated when running the tools in the container. By default, since Docker runs as **root**, the output files would be owned by **root**, which is unpleasant. You typically want to work as a non-root user. Changing the ownership after the build output is generated can be done with scripts, but it is an additional and unnecessary step. It's best to set the [**USER**][12] argument in the Dockerfile at the earliest point possible:
+
+
+```
+ARG USERNAME
+# other commands...
+USER ${USERNAME}
+```
+
+The **USERNAME** can be passed in as a build argument (**\--build-arg**) when executing the **docker image build**. You can see an example of this in the example [Dockerfile][11] and corresponding [build script][13].
+
+Some portions of the tools may also need to be installed as a non-root user. So the sequence of installations in the Dockerfile may need to be different from the way it's done if you are installing manually and directly under Linux.
+
+### Non-interactive installation
+
+Interactivity is the opposite of container automation. I've found the
+
+
+```
+`DEBIAN_FRONTEND=noninteractive apt-get -y --quiet --no-install-recommends`
+```
+
+options for the **apt-get install** instruction (as in the example above) necessary to prevent the installer from opening dialog boxes. Note that these options should be used as part of the **RUN** instruction. The **DEBIAN_FRONTEND=noninteractive** should not be set as an environment variable (**ENV**) in the Dockerfile, as this [FAQ explains][14], as it will be inherited by the containers.
+
+### Log your build and run output
+
+Debugging why a build failed is a common task, and logs are a great way to do this. Save a TypeScript of everything that happened during the container image build or container run session using the **tee** utility in a Bash script. In other words, add **|& tee $BASH_SOURCE.log** to the end of the **docker image build** and the **docker image run** commands in your scripts. See the examples in the [image build][13] and [container run][15] scripts.
+
+What this **tee**-ing technique does is generate a file with the same name as the Bash script but with a **.log** extension appended to it so that you know which script it originated from. Everything you see printed to the terminal when running the script will get logged to this file with a similar name.
+
+This is especially valuable for users of your container images to report issues to you when something doesn't work. You can ask them to send you the log file to help diagnose the issue. Many tools generate so much output that it easily overwhelms the default size of the terminal's buffer. Relying only on the terminal's buffer capacity to copy-paste error messages may not be sufficient for diagnosing issues because earlier errors may have been lost.
+
+I've found this to be useful, even in the container image-building scripts, especially when using the Python-based HTTP server discussed above. The server generates so many lines during a download that it typically overwhelms the terminal's buffer.
+
+### Deal with proxies elegantly
+
+In my work environment, proxies are required to reach the internet for downloading the resources in **RUN apt-get** and **RUN wget** commands. The proxies are typically inferred from the environment variables **http_proxy** or **https_proxy**. While **ENV** commands can be used to hard-code such proxy settings in the Dockerfile, there are multiple issues with using **ENV** for proxies directly.
+
+If you are the only one who will ever build the container, then perhaps this will work. But the Dockerfile couldn't be used by someone else at a different location with a different proxy setting. Another issue is that the IT department could change the proxy at some point, resulting in a Dockerfile that won't work any longer. Furthermore, the Dockerfile is a precise document specifying a configuration-controlled system, and every change will be scrutinized by quality assurance.
+
+One simple approach to avoid hard-coding the proxy is to pass your local proxy setting as a build argument in the **docker image build** command:
+
+
+```
+docker image build \
+ --build-arg MY_PROXY=
+```
+
+And then, in the Dockerfile, set the environment variables based on the build argument. In the example shown here, you can still set a default proxy value that can be overridden by the build argument above:
+
+
+```
+# set a default proxy
+ARG MY_PROXY=MY_PROXY=
+ENV http_proxy=$MY_PROXY
+ENV https_proxy=$MY_PROXY
+```
+
+### Summary
+
+These techniques have helped me significantly reduce the time it takes to create container images and debug them when they go wrong. I continue to be on the lookout for additional best practices to add to my list. I hope you find the above techniques useful.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/5/optimize-container-builds
+
+作者:[Ravi Chandran][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/ravichandran
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/toolbox-learn-draw-container-yearbook.png?itok=xDbwz1pP (Toolbox drawing of a container)
+[2]: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
+[3]: https://github.com/ravi-chandran/dockerize-tutorial
+[4]: https://opensource.com/article/20/4/how-containerize-build-system
+[5]: https://podman.io/getting-started/installation
+[6]: https://docs.docker.com/develop/develop-images/multistage-build/
+[7]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/tutorial2_docker_tricks/
+[8]: https://github.com/ravi-chandran/dockerize-tutorial/
+[9]: https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh
+[10]: https://stackoverflow.com/a/37214138
+[11]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/tutorial2_docker_tricks/install_anaconda.dockerfile
+[12]: https://docs.docker.com/engine/reference/builder/#user
+[13]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/tutorial2_docker_tricks/build_docker_image.sh
+[14]: https://docs.docker.com/engine/faq/
+[15]: https://github.com/ravi-chandran/dockerize-tutorial/blob/master/tutorial2_docker_tricks/run_container.sh
diff --git a/sources/tech/20200515 How to examine processes running on Linux.md b/sources/tech/20200515 How to examine processes running on Linux.md
new file mode 100644
index 0000000000..0659ab04f9
--- /dev/null
+++ b/sources/tech/20200515 How to examine processes running on Linux.md
@@ -0,0 +1,232 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to examine processes running on Linux)
+[#]: via: (https://www.networkworld.com/article/3543232/how-to-examine-processes-running-on-linux.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+How to examine processes running on Linux
+======
+
+Thinkstock
+
+There are quite a number of ways to look at running processes on Linux systems – to see what’s running, the resources that processes are using, how the system is affected by the load and how memory is being used. Each command gives you a different view, and the range of details is considerable. In this post, we’ll run through a series of commands that can help you view process details in a number of different ways.
+
+### ps
+
+While the **ps** command is the most obvious command for examining processes, the arguments that you use when running **ps** will make a big difference in how much information will be provided. With no arguments, **ps** will only show processes associated with your current login session. Add a **-u** and you'll see extended details.
+
+Here is a comparison:
+
+```
+nemo$ ps
+ PID TTY TIME CMD
+ 45867 pts/1 00:00:00 bash
+ 46140 pts/1 00:00:00 ps
+nemo$ ps -u
+USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
+nemo 45867 0.0 0.0 11232 5636 pts/1 Ss 19:04 0:00 -bash
+nemo 46141 0.0 0.0 11700 3648 pts/1 R+ 19:16 0:00 ps -u
+```
+
+Using **ps -ef** will display details on all of the processes running on the system but **ps -eF** will add some additional details.
+
+```
+$ ps -ef | head -2
+UID PID PPID C STIME TTY TIME CMD
+root 1 0 0 May10 ? 00:00:06 /sbin/init splash
+$ ps -eF | head -2
+UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
+root 1 0 0 42108 12524 0 May10 ? 00:00:06 /sbin/init splash
+```
+
+Both commands show who is running the process, the process and parent process IDs, process start time, accumulated run time and the task being run. The additional fields shown when you use **F** instead of **f** include:
+
+ * SZ: the process **size** in physical pages for the core image of the process
+ * RSS: the **resident set size** which shows how much memory is allocated to those parts of the process in RAM. It does not include memory that is swapped out, but does include memory from shared libraries as long as the pages from those libraries are currently in memory. It also includes stack and heap memory.
+ * PSR: the **processor** the process is using
+
+
+
+##### ps -fU
+
+You can list processes for some particular user with a command like "ps -ef | grep USERNAME", but with **ps -fU** command, you’re going to see considerably more data. This is because details of processes that are being run on the user's behalf are also included. In fact, nearly all these processes shown have been kicked off by system simply to support this user’s online session. Nemo has only just logged in and is not yet running any commands or scripts.
+
+```
+$ ps -fU nemo
+UID PID PPID C STIME TTY TIME CMD
+nemo 45726 1 0 19:04 ? 00:00:00 /lib/systemd/systemd --user
+nemo 45732 45726 0 19:04 ? 00:00:00 (sd-pam)
+nemo 45738 45726 0 19:04 ? 00:00:00 /usr/bin/pulseaudio --daemon
+nemo 45740 45726 0 19:04 ? 00:00:00 /usr/libexec/tracker-miner-f
+nemo 45754 45726 0 19:04 ? 00:00:00 /usr/bin/dbus-daemon --sessi
+nemo 45829 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfsd
+nemo 45856 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfsd-fuse /run
+nemo 45862 45706 0 19:04 ? 00:00:00 sshd: nemo@pts/1
+nemo 45864 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfs-udisks2-vo
+nemo 45867 45862 0 19:04 pts/1 00:00:00 -bash
+nemo 45878 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfs-afc-volume
+nemo 45883 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfs-goa-volume
+nemo 45887 45726 0 19:04 ? 00:00:00 /usr/libexec/goa-daemon
+nemo 45895 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfs-mtp-volume
+nemo 45896 45726 0 19:04 ? 00:00:00 /usr/libexec/goa-identity-se
+nemo 45903 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfs-gphoto2-vo
+nemo 45946 45726 0 19:04 ? 00:00:00 /usr/libexec/gvfsd-metadata
+```
+
+Note that the only process with an assigned TTY is Nemo's shell and that the parent of all of the other processes is **systemd**.
+
+You can supply a comma-separated list of usernames instead of a single name. Just be prepared to be looking at quite a bit more data.
+
+#### top and ntop
+
+The **top** and **ntop** commands will help when you want to get an idea which processes are using the most resources and allow you to reorder your view depending on what criteria you want to use to rank the processes (e.g., highest CPU or memory use).
+
+```
+top - 11:51:27 up 1 day, 21:40, 1 user, load average: 0.08, 0.02, 0.01
+Tasks: 211 total, 1 running, 210 sleeping, 0 stopped, 0 zombie
+%Cpu(s): 5.0 us, 0.5 sy, 0.0 ni, 94.3 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
+MiB Mem : 5944.4 total, 3527.4 free, 565.1 used, 1851.9 buff/cache
+MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 5084.3 avail Mem
+
+ PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
+ 999 root 20 0 394660 14380 10912 S 8.0 0.2 0:46.54 udisksd
+ 65224 shs 20 0 314268 9824 8084 S 1.7 0.2 0:00.34 gvfs-ud+
+ 2034 gdm 20 0 314264 9820 7992 S 1.3 0.2 0:06.25 gvfs-ud+
+ 67909 root 20 0 0 0 0 I 0.3 0.0 0:00.09 kworker+
+ 1 root 20 0 168432 12532 8564 S 0.0 0.2 0:09.93 systemd
+ 2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd
+```
+
+Use **shift+m** to sort by memory use and **shift+p** to go back to sorting by CPU usage (the default).
+
+#### /proc
+
+A tremendous amount of information is available on running processes in the **/proc** directory. In fact, if you haven't visited **/proc** quite a few times, you might be astounded by the amount of details available. Just keep in mind that **/proc** is a very different kind of file system. As an interface to kernel data, it provides a view of process details that are currently being used by the system.
+
+Some of the more useful **/proc** files for viewing include **cmdline**, **environ**, **fd**, **limits** and **status**. The following views provide some samples of what you might see.
+
+The **status** file shows the process that is running (bash), its status, the user and group ID for the person running bash, a full list of the groups the user is a member of and the process ID and parent process ID.
+
+```
+$ head -11 /proc/65333/status
+Name: bash
+Umask: 0002
+State: S (sleeping)
+Tgid: 65333
+Ngid: 0
+Pid: 65333
+PPid: 65320
+TracerPid: 0
+Uid: 1000 1000 1000 1000
+Gid: 1000 1000 1000 1000
+FDSize: 256
+Groups: 4 11 24 27 30 46 118 128 500 1000
+...
+```
+
+The **cmdline** file shows the command line used to start the process.
+
+```
+$ cat /proc/65333/cmdline
+-bash
+```
+
+The **environ** file shows the environment variables that are in effect.
+
+```
+$ cat environ
+USER=shsLOGNAME=shsHOME=/home/shsPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/gamesSHELL=/bin/bashTERM=xtermXDG_SESSION_ID=626XDG_RUNTIME_DIR=/run/user/1000DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/busXDG_SESSION_TYPE=ttyXDG_SESSION_CLASS=userMOTD_SHOWN=pamLANG=en_US.UTF-8SSH_CLIENT=192.168.0.19 9385 22SSH_CONNECTION=192.168.0.19 9385 192.168.0.11 22SSH_TTY=/dev/pts/0$
+```
+
+The **fd** file shows the file descriptors. Note how they reflect the pseudo-tty that is being used (pts/0).
+
+```
+$ ls -l /proc/65333/fd
+total 0
+lrwx------ 1 shs shs 64 May 12 09:45 0 -> /dev/pts/0
+lrwx------ 1 shs shs 64 May 12 09:45 1 -> /dev/pts/0
+lrwx------ 1 shs shs 64 May 12 09:45 2 -> /dev/pts/0
+lrwx------ 1 shs shs 64 May 12 09:56 255 -> /dev/pts/0
+$ who
+shs pts/0 2020-05-12 09:45 (192.168.0.19)
+```
+
+The **limits** file contains information about the limits imposed on the process.
+
+```
+$ cat limits
+Limit Soft Limit Hard Limit Units
+Max cpu time unlimited unlimited seconds
+Max file size unlimited unlimited bytes
+Max data size unlimited unlimited bytes
+Max stack size 8388608 unlimited bytes
+Max core file size 0 unlimited bytes
+Max resident set unlimited unlimited bytes
+Max processes 23554 23554 processes
+Max open files 1024 1048576 files
+Max locked memory 67108864 67108864 bytes
+Max address space unlimited unlimited bytes
+Max file locks unlimited unlimited locks
+Max pending signals 23554 23554 signals
+Max msgqueue size 819200 819200 bytes
+Max nice priority 0 0
+Max realtime priority 0 0
+Max realtime timeout unlimited unlimited us
+```
+
+#### pmap
+
+The **pmap** command takes you in an entirely different direction when it comes to memory use. It provides a detailed map of a process’s memory usage. To make sense of this, you need to keep in mind that processes do not run entirely on their own. Instead, they make use of a wide range of system resources. The truncated **pmap** output below shows a portion of the memory map for a single user’s bash login along with some memory usage totals at the bottom.
+
+```
+$ pmap -x 43120
+43120: -bash
+Address Kbytes RSS Dirty Mode Mapping
+000055887655b000 180 180 0 r---- bash
+0000558876588000 708 708 0 r-x-- bash
+0000558876639000 220 148 0 r---- bash
+0000558876670000 16 16 16 r---- bash
+0000558876674000 36 36 36 rw--- bash
+000055887667d000 40 28 28 rw--- [ anon ]
+0000558876b96000 1328 1312 1312 rw--- [ anon ]
+00007f0bd9a7e000 28 28 0 r---- libpthread-2.31.so
+00007f0bd9a85000 68 68 0 r-x-- libpthread-2.31.so
+00007f0bd9a96000 20 0 0 r---- libpthread-2.31.so
+00007f0bd9a9b000 4 4 4 r---- libpthread-2.31.so
+00007f0bd9a9c000 4 4 4 rw--- libpthread-2.31.so
+00007f0bd9a9d000 16 4 4 rw--- [ anon ]
+00007f0bd9aa1000 20 20 0 r---- libnss_systemd.so.2
+00007f0bd9aa6000 148 148 0 r-x-- libnss_systemd.so.2
+...
+ffffffffff600000 4 0 0 --x-- [ anon ]
+---------------- ------- ------- -------
+total kB 11368 5664 1656
+
+Kbytes: size of map in kilobytes
+RSS: resident set size in kilobytes
+Dirty: dirty pages (both shared and private) in kilobytes
+```
+```
+
+```
+
+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/3543232/how-to-examine-processes-running-on-linux.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/20200515 The pieces of Fedora Silverblue.md b/sources/tech/20200515 The pieces of Fedora Silverblue.md
new file mode 100644
index 0000000000..04bd4e1643
--- /dev/null
+++ b/sources/tech/20200515 The pieces of Fedora Silverblue.md
@@ -0,0 +1,172 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (The pieces of Fedora Silverblue)
+[#]: via: (https://fedoramagazine.org/pieces-of-fedora-silverblue/)
+[#]: author: (Nick Hardiman https://fedoramagazine.org/author/nickhardiman/)
+
+The pieces of Fedora Silverblue
+======
+
+![][1]
+
+Fedora Silverblue provides a useful workstation build on an immutable operating system. In “[What is Silverblue?][2]“, you learned about the benefits that an immutable OS provides. But what pieces go into making it? This article examines some of the technology that powers Silverblue.
+
+### The filesystem
+
+Fedora Workstation users may find the idea of an immutable OS to be the most brain-melting part of Silverblue. What does that mean? Find some answers by taking a look at the filesystem.
+
+At first glance, the layout looks pretty much the same as a regular Fedora file system. It has some differences, like making _/home_ a symbolic link to _/var/home_. And you can get more answers by looking at how libostree works. libostree treats the whole tree like it’s an object, checks it into a code repository, and checks out a copy for your machine to use.
+
+#### libostree
+
+The [libostree project][3] supplies the goods for managing Silverblue’s file system. It is an upgrade system that the user can control using [rpm-ostree commands][4].
+
+libostree knows nothing about packages—an upgrade means replacing one complete file system with another complete file system. libostree treats the file system tree as one atomic object (an unbreakable unit). In fact, the forerunner to Silverblue was named [Project Atomic][5].
+
+The libostree project provides a library and set of tools. It’s an upgrade system that carries out these tasks.
+
+ 1. Pull in a new file system
+ 2. Store the new file system
+ 3. Deploy the new file system
+
+
+
+##### Pull in a new file system
+
+Pulling in a new file system means copying an object (the entire file system) from a remote source to its own store. If you’ve worked with virtual machine image files, you already understand the concept of a file system object that you can copy.
+
+##### Store the new file system
+
+The libostree store has some source code control qualities—it stores many file system objects, and checks one out to be used as the root file system. libostree’s store has two parts:
+
+ * a repository database at _/sysroot/ostree/repo/_
+ * file systems in _/sysroot/ostree/deploy/fedora/deploy/_
+
+
+
+libostree keeps track of what’s been checked in using commit IDs. Each commit ID can be found in a directory name, nested deep inside _/sysroot_ .A libostree commit ID is a long checksum, and looks similar to a git commit ID.
+
+```
+$ ls -d /sysroot/ostree/deploy/fedora/deploy/*/
+/sysroot/ostree/deploy/fedora/deploy/c4bf7a6339e6be97d0ca48a117a1a35c9c5e3256ae2db9e706b0147c5845fac4.0/
+```
+
+_rpm-ostree status_ gives a little more information about that commit ID. The output is a little confusing; it can take a while to see this file system is Fedora 31.
+
+```
+$ rpm-ostree status
+State: idle
+AutomaticUpdates: disabled
+Deployments:
+● ostree://fedora:fedora/31/x86_64/silverblue
+ Version: 31.1.9 (2019-10-23T21:44:48Z)
+ Commit: c4bf7a6339e6be97d0ca48a117a1a35c9c5e3256ae2db9e706b0147c5845fac4
+ GPGSignature: Valid signature by 7D22D5867F2A4236474BF7B850CB390B3C3359C4
+```
+
+##### Deploy the new filesystem
+
+libostree deploys a new file system by checking out the new object from its store. libostree doesn’t check out a file system by copying all the files—it uses hard links instead. If you look inside the commit ID directory, you see something that looks suspiciously like the root directory. That’s because it _is_ the root directory. You can see these two directories are pointing to the same place by checking their inodes.
+
+```
+$ ls -di1 / /sysroot/ostree/deploy/fedora/deploy/*/
+260102 /
+260102 /sysroot/ostree/deploy/fedora/deploy/c4bf7a6339e6be97d0ca48a117a1a35c9c5e3256ae2db9e706b0147c5845fac4.0/
+```
+
+This is a fresh install, so there’s only one commit ID. After a system update, there will be two. If more copies of the file system are checked into libostree’s repo, more commit IDs appear here.
+
+##### Upgrade process
+
+Putting the pieces together, the update process looks like this:
+
+ 1. libostree checks out a copy of the file system object from the repository
+ 2. DNF installs packages into the copy
+ 3. libostree checks in the copy as a new object
+ 4. libostree checks out the copy to become the new file system
+ 5. You reboot to pick up the new system files
+
+
+
+In addition to more safety, there is more flexibility. You can do new things with libostree’s repo, like store a few different file systems and check out whichever one you feel like using.
+
+#### Silverblue’s root file system
+
+Fedora keeps its system files in all the usual Linux places, such as _/boot_ for boot files, _/etc_ for configuration files, and _/home_ for user home directories. The root directory in Silverblue looks much like the root directory in traditional Fedora, but there are some differences.
+
+ * The filesystem has been checked out by libostree
+ * Some directories are now symbolic links to new locations. For example, _/home_ is a symbolic link to _/var/home_
+ * _/usr_ is a read-only directory
+ * There’s a new directory named _/sysroot_. This is libostree’s new home
+
+
+
+#### Juggling file systems
+
+You can store many file systems and switch between them. This is called _rebasing_, and it’s similar to git rebasing. In fact, upgrading Silverblue to the next Fedora version is not a big package install—it’s a pull from a remote repository and a rebase.
+
+You could store three copies with three different desktops: one KDE, one GNOME, and one XFCE. Or three different OS versions: how about keeping the current version, the nightly build, and an old classic? Switching between them is a matter of rebasing to the appropriate file system object.
+
+Rebasing is also how you upgrade from one Fedora release to the next. See “[How to rebase to Fedora 32 on Silverblue][6]” for more information.
+
+### Flatpak
+
+The [Flatpak project][7] provides a way of installing applications like LibreOffice. Applications are pulled from remote repositories like [Flathub][8]. It’s a kind of package manager, although you won’t find the word _package_ in the [docs][9]. Traditional Fedora variants like Fedora Workstation can also use Flatpak, but the sandboxed nature of flatpaks make it particularly good for Silverblue. This way you do not have to do the entire ostree update process every time you wish to install an application.
+
+Flatpak is well-suited to desktop applications, but also works for command line applications. You can install the [vim][10] editor with the command _flatpak install flathub org.vim.Vim_ and run it with _flatpak run org.vim.Vim_.
+
+### toolbox
+
+The [toolbox project][11] provides a traditional operating system inside a container. The idea is that you can mess with the mutable OS inside your toolbox (the Fedora container) as much as you like, and leave the immutable OS outside your toolbox untouched. You pack as many toolboxes as you want on your system, so you can keep work separated. Behind the scenes, the executable _/usr/bin/toolbox_ is a shell script that uses [podman][12].
+
+A fresh install does not include a default toolbox. The _toolbox create_ command checks the OS version (by reading _/usr/lib/os-release_), looks for a matching version at the Fedora container registry, and downloads the container.
+
+```
+$ toolbox create
+Image required to create toolbox container.
+Download registry.fedoraproject.org/f31/fedora-toolbox:31 (500MB)? [y/N]: y
+Created container: fedora-toolbox-31
+Enter with: toolbox enter
+```
+
+Hundreds of packages are installed inside the toolbox. The _dnf_ command and the usual Fedora repos are set up, ready to install more. The _ostree_ and _rpm-ostree_ commands are not included – no immutable OS here.
+
+Each user’s home directory is mounted on their toolbox, for storing content files outside the container.
+
+### Put the pieces together
+
+Spend some time exploring Fedora Silverblue and it will become clear how these components fit together. Like other Fedora variants, all these of tools come from open source projects. You can get as up close and personal as you want, from reading their docs to contributing code. Or you can [contribute to Silverblue][13] itself.
+
+Join the Fedora Silverblue conversations on [discussion.fedoraproject.org][14] or in [#silverblue on Freenode IRC][15].
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/pieces-of-fedora-silverblue/
+
+作者:[Nick Hardiman][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/nickhardiman/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2020/04/silverblue-pieces-816x345.png
+[2]: https://fedoramagazine.org/what-is-silverblue/
+[3]: https://ostree.readthedocs.io/en/latest/
+[4]: https://rpm-ostree.readthedocs.io/en/latest/manual/administrator-handbook/#administering-an-rpm-ostree-based-system
+[5]: https://www.projectatomic.io/
+[6]: https://fedoramagazine.org/how-to-rebase-to-fedora-32-on-silverblue/
+[7]: https://github.com/flatpak/flatpak
+[8]: https://flathub.org/
+[9]: http://docs.flatpak.org/en/latest/index.html
+[10]: https://www.vim.org/
+[11]: https://github.com/containers/toolbox
+[12]: https://github.com/containers/libpod
+[13]: https://silverblue.fedoraproject.org/contribute
+[14]: https://discussion.fedoraproject.org/c/desktop/silverblue
+[15]: https://webchat.freenode.net/#silverblue
diff --git a/sources/tech/20200516 Fatih-s question.md b/sources/tech/20200516 Fatih-s question.md
new file mode 100644
index 0000000000..1225c624a8
--- /dev/null
+++ b/sources/tech/20200516 Fatih-s question.md
@@ -0,0 +1,214 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Fatih’s question)
+[#]: via: (https://dave.cheney.net/2020/05/16/fatihs-question)
+[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney)
+
+Fatih’s question
+======
+
+A few days ago Fatih posted [this question][1] on twitter.
+
+I’m going to attempt to give my answer, however to do that I need to apply some simplifications as my previous attempts to answer it involved a lot of phrases like _a pointer to a pointer_, and other unhelpful waffling. Hopefully my simplified answer can be useful in building a mental framework to answer Fatih’s original question.
+
+### Restating the question
+
+Fatih’s original tweet showed [four different variations][2] of `json.Unmarshal`. I’m going to focus on the last two, which I’ll rewrite a little:
+
+```
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+)
+
+type Result struct {
+ Foo string `json:"foo"`
+}
+
+func main() {
+ content := []byte(`{"foo": "bar"}`)
+ var result1, result2 *Result
+
+ err := json.Unmarshal(content, &result1)
+ fmt.Println(result1, err) // &{bar}
+
+ err = json.Unmarshal(content, result2)
+ fmt.Println(result2, err) // json: Unmarshal(nil *main.Result)
+}
+```
+
+Restated in words, `result1` and `result2` are the same type; `*Result`. Decoding into `result1` works as expected, whereas decoding into `result2` causes the `json` package to complain that the value passed to `Unmarshal` is `nil`. However, both values were declared without an initialiser so both would have taken on the type’s zero value, `nil`.
+
+Eagle eyed readers will have spotted that the reason for the difference is the first` `invocation is passed `&result1`, while the second is passed `result2`, but this explanation is unsatisfactory because the documentation for `json.Unmarshal` states:
+
+> Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v. **If v is nil or not a pointer**, Unmarshal returns an InvalidUnmarshalError.
+
+Which is confusing because `result1` and `result2` _are_ pointers. Furthermore, without initialisation, both _are_ `nil`. Now, the documentation is correct (as you’d expect from a package that has been hammered on for a decade), but explaining _why_ takes a little more investigation.
+
+### Functions receive a copy of their arguments
+
+Every assignment in Go is a copy, this includes function arguments and return values.
+
+```
+package main
+
+import (
+ "fmt"
+)
+
+func increment(v int) {
+ v++
+}
+
+func main() {
+ v := 1
+ increment(v)
+ fmt.Println(v) // 1
+}
+```
+
+In this example, `increment` is operating on a _copy_ of `main`‘s `v`. This is because the `v` declared in `main` and `increment`‘s `v` parameter have different addresses in memory. Thus changes to `increment`‘s `v` cannot affect the contents of `main`‘s `v`.
+
+```
+package main
+
+import (
+ "fmt"
+)
+
+func increment(v *int) {
+ *v++
+}
+
+func main() {
+ v := 1
+ increment(&v)
+ fmt.Println(v) // 2
+}
+```
+
+If we wanted to write `increment` in a way that it could affect the contents of its caller we would need to pass a reference, a pointer, to `main.v`.[1][3] This example demonstrates why `json.Unmarshal` needs a pointer to the value to decode JSON into.
+
+### Pointers to pointers
+
+Returning to the original question, both `result1` and `result2` are declared as `*Result`, that is, pointers to a `Result` value. We established that you have to pass the address of caller’s value to `json.Unmarshal` otherwise it won’t be able to alter the contents of the caller’s value. Why then must we pass the address of `result1`, a `**Result`, a pointer to a pointer to a `Result`, for the operation to succeed.
+
+To explain this another detour is required. Consider this code:
+
+```
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+)
+
+type Result struct {
+ Foo *string `json:"foo"`
+}
+
+func main() {
+ content := []byte(`{"foo": "bar"}`)
+ var result1 *Result
+
+ err := json.Unmarshal(content, &result1)
+ fmt.Printf("%#v %v", result1, err) // &main.Result{Foo:(*string)(0xc0000102f0)}
+}
+```
+
+In this example `Result` contains a pointer typed field, `Foo *string`. During JSON decoding `Unmarshal` allocated a new `string` value, stored the value `bar` in it, then placed the address of the string in `Result.Foo`. This behaviour is quite handy as it frees the caller from having to initialise `Result.Foo` and makes it easier to detect when a field was not initialised because the JSON did not contain a value. Beyond the convenience this offers for simple examples it would be prohibitively difficult for the caller to properly initialise all the reference type fields in a structure before decoding unknown JSON without first inspecting the incoming JSON which itself may be problematic if the input is coming from an `io.Reader` without the ability to rewind the input.
+
+> To unmarshal JSON into a pointer, Unmarshal first handles the case of the JSON being the JSON literal null. In that case, Unmarshal sets the pointer to nil. Otherwise, Unmarshal unmarshals the JSON into the value pointed at by the pointer. **If the pointer is nil, Unmarshal allocates a new value for it to point to**.
+
+`json.Unmarshal`‘s handling of pointer fields is clearly documented, and works as you would expect, allocating a new value whenever there is a need to decode into a pointer shaped field. It is this behaviour that gives us a hint to what is happening in the original example.
+
+We’ve seen that when `json.Unmarshal` encounters a field which points to `nil` it will allocate a new value of the correct type and assign its address the field before proceeding. Not only is does behaviour is applied recursively–for example in the case of a complex structure which contains pointers to other structures–but it also applies to the _value passed to `Unmarshal`._
+
+```
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+)
+
+func main() {
+ content := []byte(`1`)
+ var result *int
+
+ err := json.Unmarshal(content, &result)
+ fmt.Println(*result, err) // 1
+}
+```
+
+In this example `result` is not a struct, but a simple `*int` which, lacking an initialiser, defaults to `nil`. After JSON decoding, `result` now points to an `int` with the value `1`.
+
+### Putting the pieces together
+
+Now I think I’m ready to take a shot at answering Fatih’s question.
+
+`json.Unmarshal` requires the address of the variable you want to decode into, otherwise it would decode into a temporary copy which would be discard on return. Normally this is done by declaring a value, then passing its address, or explicitly initialising the the value
+
+```
+var result1 Result
+err := json.Unmarshal(content, &result1) // this is fine
+
+var result2 = new(Result)
+err = json.Unmarshal(content, result2) // and this
+
+var result3 = &Result{}
+err = json.Unmarshal(content, result3) // this is also fine
+```
+
+In all three cases the address that the `*Result` points too is not `nil`, it points to initialised memory that `json.Unmarshal` decodes into.
+
+Now consider what happens when `json.Unmarshal` encounters this
+
+```
+var result4 *Result
+err = json.Unmarshal(content, result4) // err json: Unmarshal(nil *main.Result)
+```
+
+`result2`, `result3`, and the expression `&result1` point to a `Result`. However `result4`, even though it has the same type as the previous three, does not point to initialised memory, it points to `nil`. Thus, according to the examples we saw previously, before `json.Unmarshal` can decode into it, the memory `result4` points too must be initialised.
+
+However, because each function receives a copy of its arguments, the caller’s `result4` variable and the copy inside `json.Unmarshal` are unique. `json.Unmarshal` can allocate a new `Result` value and decode into it, but it cannot alter `result4` to point to this new value because it was not provided with a reference to `result4`, only a copy of its contents.
+
+ 1. This does not violate the _everything is a copy_ rule, a copy of a pointer to `main.v` still points to `main.v`.[][4]
+
+
+
+#### Related posts:
+
+ 1. [Should methods be declared on T or *T][5]
+ 2. [Ice cream makers and data races][6]
+ 3. [Understand Go pointers in less than 800 words or your money back][7]
+ 4. [Slices from the ground up][8]
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://dave.cheney.net/2020/05/16/fatihs-question
+
+作者:[Dave Cheney][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://dave.cheney.net/author/davecheney
+[b]: https://github.com/lujun9972
+[1]: https://twitter.com/fatih/status/1260683136842608640
+[2]: https://play.golang.org/p/g2yUIYrV67F
+[3]: tmp.dRxkHxYRQS#easy-footnote-bottom-1-4153 (This does not violate the everything is a copy rule, a copy of a pointer to main.v still points to main.v.)
+[4]: tmp.dRxkHxYRQS#easy-footnote-1-4153
+[5]: https://dave.cheney.net/2016/03/19/should-methods-be-declared-on-t-or-t (Should methods be declared on T or *T)
+[6]: https://dave.cheney.net/2014/06/27/ice-cream-makers-and-data-races (Ice cream makers and data races)
+[7]: https://dave.cheney.net/2017/04/26/understand-go-pointers-in-less-than-800-words-or-your-money-back (Understand Go pointers in less than 800 words or your money back)
+[8]: https://dave.cheney.net/2018/07/12/slices-from-the-ground-up (Slices from the ground up)
diff --git a/sources/tech/20200518 Using Fedora to implement REST API in JavaScript- part 2.md b/sources/tech/20200518 Using Fedora to implement REST API in JavaScript- part 2.md
new file mode 100644
index 0000000000..b02822c4fa
--- /dev/null
+++ b/sources/tech/20200518 Using Fedora to implement REST API in JavaScript- part 2.md
@@ -0,0 +1,208 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Using Fedora to implement REST API in JavaScript: part 2)
+[#]: via: (https://fedoramagazine.org/using-fedora-to-implement-rest-api-in-javascript-part-2/)
+[#]: author: (Vaclav Keil https://fedoramagazine.org/author/vaclavk/)
+
+Using Fedora to implement REST API in JavaScript: part 2
+======
+
+![][1]
+
+In [part 1][2] previously, you saw how to quickly create a simple API service using Fedora Workstation, Express, and JavaScript. This article shows you the simplicity of how to create a new API. This part shows you how to:
+
+ * Install a DB server
+ * Build a new route
+ * Connect a new datasource
+ * Use Fedora terminal to send and receive data
+
+
+
+### Generating an app
+
+Please refer to the [previous article][2] for more details. But to make things simple, change to your work directory and generate an app skeleton.
+```
+
+```
+
+$ cd our-work-directory
+$ npx express-generator –no-view –git /myApp
+$ cd myApp
+$ npm i
+```
+
+```
+
+### Installing a database server
+
+In this part, we’ll install MariaDB database. MariaDB is the Fedora default database.
+
+```
+$ dnf module list mariadb | sort -u ## lists the streams available
+$ sudo dnf module install mariadb:10.3 ##10.4 is the latest
+```
+
+_Note: the default profile is mariadb/server_.
+
+For those who need to spin up a Docker container a ready made container with Fedora 31 is available.
+
+```
+$ docker pull registry.fedoraproject.org/f31/mariadb
+$ docker run -d --name mariadb_database -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -p 3306:3306 registry.fedoraproject.org/f31/mariadb
+```
+
+Now start the MariaDB service.
+
+```
+$ sudo systemctl start mariadb
+```
+
+If you’d like the service to start at boot, you can also enable it in systemd:
+
+```
+$ sudo systemctl enable mariadb ## start at boot
+```
+
+Next, setup the database as needed:
+
+```
+$ mysql -u root -p ## root password is blank
+MariaDB> CREATE DATABASE users;
+MariaDB> create user dbuser identified by ‘123456‘;
+MariaDB> grant select, insert, update, create, drop on users.* to dbuser;
+MariaDB> show grants for dbuser;
+MariaDB> \q
+```
+
+A database connector is needed to use the database with Node.js.
+
+```
+$ npm install mariadb ## installs MariaDB Node.js connector
+```
+
+We’ll leverage Sequelize in this sample API. Sequelize is a promise-based Node.js ORM (Object Relational Mapper) for Postgres, MySQL, MariaDB, SQLite and Microsoft SQL Server.
+
+```
+$ npm install sequelize ## installs Sequelize
+```
+
+### Connecting a new datasource
+
+Now, create a new _db_ folder and create a new file _sequelize.js_ there:
+
+```
+const Sequelize = require('sequelize'),
+ sequelize = new Sequelize(process.env.db_name || 'users', process.env.db_user || 'dbuser', process.env.db_pass || '123456', {
+ host: 'localhost',
+ dialect: 'mariadb',
+ ssl: true
+})
+
+module.exports = sequelize
+```
+
+_Note: For the sake of completeness I‘m including a link to the related Github repo: _
+
+Let‘s create a new file _models/user.js_. A nice feature of a Sequelize model is that it helps us to create the necessary tables and colums automatically. The code snippet responsible for doing this is seen below:
+
+```
+sequelize.sync({
+force: false
+})
+```
+
+Note: never switch to true with a production database – it would _drop your tables at app start_!
+
+We will refer to the earlier created sequelize.js this way:
+
+```
+const sequelize = require('../db/sequelize')
+```
+
+### Building new routes
+
+Next, you’ll create a new file _routes/user.js_. You already have _routes/users.js_ from the previous article. You can copy and paste the code in and proceed with editing it.
+
+You’ll also need a reference to the previously created model.
+
+```
+const User = require('../models/user')
+```
+
+Change the route path to _/users_ and also create a new **post** method route.
+
+Mind the async – await keywords there. An interaction with a database will take some time and this one will do the trick. Yes, an async function returns a promise and this one makes promises easy to use.
+
+_Note: This code is not production ready, since it would also need to include an authentication feature._
+
+We‘ll make the new route working this way:
+
+```
+const userRouter = require('./routes/user')
+app.use(userRouter)
+```
+
+Let‘s also remove the existing _usersRouter_. The _routes/users.js_ can be deleted too.
+
+```
+$ npm start
+```
+
+With the above command, you can launch your new app.
+
+### Using the terminal to send and retrieve data
+
+Let’s create a new database record through the post method:
+
+```
+$ curl -d 'name=Adam' http://localhost:3000/users
+```
+
+To retrieve the data created through the API, do an HTTP GET request:
+
+```
+$ curl http://localhost:3000/users
+```
+
+The console output of the curl command is a JSON array containing data of all the records in the _Users_ table.
+
+_Note: This is not really the usual end result — an application consumes the API finally. The API will usually also have endpoints to update and remove data._
+
+### More automation
+
+Let‘s assume we might want to create an API serving many tables. It‘s possible and very handy to automatically generate models for Sequelize from our database. Sequelize-auto will do the heavy lifting for us. The resulting files (_models.js_) would be placed and imported within the _/models_ directory.
+
+```
+$ npm install sequelize-auto
+```
+
+A node.js connector is needed to use this one and we have it already installed for MariaDB.
+
+### Conclusion
+
+It‘s possible to develop and run an API using Fedora, Fedora default MariaDB, JavaScript and efficiently develop a solution like with a noSQL database. For those used to working with MongoDB or a similar noSQL database, Fedora and MariaDB are important open-source enablers.
+
+* * *
+
+_Photo by [Mazhar Zandsalimi][3] on [Unsplash][4]._
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/using-fedora-to-implement-rest-api-in-javascript-part-2/
+
+作者:[Vaclav Keil][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/vaclavk/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2020/05/javascript-api-2-816x345.jpg
+[2]: https://fedoramagazine.org/using-fedora-to-quickly-implement-rest-api-with-javascript/
+[3]: https://unsplash.com/@m47h4r?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
+[4]: https://unsplash.com/s/photos/javascript?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
diff --git a/sources/tech/20200519 How to use Windows Subsystem for Linux to open Linux on Windows 10 machines.md b/sources/tech/20200519 How to use Windows Subsystem for Linux to open Linux on Windows 10 machines.md
new file mode 100644
index 0000000000..e610f7eb2f
--- /dev/null
+++ b/sources/tech/20200519 How to use Windows Subsystem for Linux to open Linux on Windows 10 machines.md
@@ -0,0 +1,153 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to use Windows Subsystem for Linux to open Linux on Windows 10 machines)
+[#]: via: (https://www.networkworld.com/article/3543845/how-to-use-windows-subsystem-for-linux-to-open-linux-on-windows-10-machines.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+How to use Windows Subsystem for Linux to open Linux on Windows 10 machines
+======
+Opening a Linux terminal on a Windows 10 desktop can help you practice your Linux skills and explore Windows from an entirely different point of view. In this post, we look at Ubuntu 18.04 running through Windows Subsystem for Linux (WSL).
+[Nicolas Solerieu modified by IDG Comm. / Linux][1] [(CC0)][2]
+
+Believe it or not, it's possible to open a Linux terminal on a Windows 10 system and you might be surprised how much Linux functionality you’ll be able to get by doing so.
+
+You can run Linux commands, traipse around the provided Linux file system and even take a novel look at Windows files. The experience isn’t altogether different than opening a terminal window on a Linux desktop, with a few interesting exceptions.
+
+[[Get regularly scheduled insights by signing up for Network World newsletters.]][3]
+
+What is needed to make this happen is something called the Windows Subsystem for Linux (WSL) and a Windows 10 x86 PC.
+
+### Linux versions for WSL
+
+There are a number of options for running Linux on top of Windows. The Linux OS choices include:
+
+ * [Ubuntu 16.04 LTS][4]
+ * [Ubuntu 18.04 LTS][5]
+ * [openSUSE Leap 15.1][6]
+ * [SUSE Linux Enterprise Server 12 SP5][7]
+ * [SUSE Linux Enterprise Server 15 SP1][8]
+ * [Kali Linux][9]
+ * [Debian GNU/Linux][10]
+ * [Fedora Remix for WSL][11]
+ * [Pengwin][12]
+ * [Pengwin Enterprise][13]
+ * [Alpine WSL][14]
+
+
+
+Ubuntu 18.04 LTS is just one option and, in this post, we’ll take a look at how the terminal runs on Windows using this particular distribution and how much it feels like working on a Linux system directly.
+
+If you want to look into the process of putting an Ubuntu distribution on your Windows system, you can start with this page:
+
+
+
+As part of the initial setup of installing your Linux on Windows terminal, you’ll be asked to create your user account. Once you do that and open the terminal, you can start to explore. One of the most noticeable differences between your Linux-on-Windows terminal and a terminal window on a Linux system is that examining processes isn’t going to show you much. After all, Windows will be providing the bulk of the required OS support. You’re likely to see something like this:
+
+```
+myacct@hostname:~$ ps -ef
+UID PID PPID C STIME TTY TIME CMD
+root 1 0 0 12:45 ? 00:00:00 /init
+root 7 1 0 12:45 tty1 00:00:00 /init
+shs 8 7 0 12:45 tty1 00:00:00 -bash
+shs 166 8 0 13:32 tty1 00:00:00 ps -ef
+```
+
+Yes, that's it.
+
+If you’re anything like me, one of your next moves might be to get a handle on the available commands. If you just count the files in the **/bin** and **/usr/bin** directories, you should see that there are a lot of commands:
+
+```
+myacct@hostname:~$ ls /bin | wc -l
+171
+myacct@hostname:~$ ls /usr/bin | wc -l
+707
+```
+
+You can list available commands with commands like these (output truncated for this post):
+
+```
+myacct@hostname:~$ ls /bin | head -25 | column
+bash btrfs-map-logical bunzip2 bzegrep bzip2recover
+btrfs btrfs-select-super busybox bzexe bzless
+btrfs-debug-tree btrfs-zero-log bzcat bzfgrep bzmore
+btrfs-find-root btrfsck bzcmp bzgrep cat
+btrfs-image btrfstune bzdiff bzip2 chacl
+
+myacct@hostname:~$ ls /usr/bin | head -25 | column
+NF aa-exec apport-cli apt apt-extracttempl*
+VGAuthService acpi_listen apport-collect apt-add-repository apt-ftparchive
+X11 add-apt-repository apport-unpack apt-cache apt-get
+[ addpart appres apt-cdrom apt-key
+aa-enabled apport-bug apropos apt-config apt-mark
+```
+
+You can update the system with **apt** commands (sudo apt update, sudo apt upgrade). You can even use Linux commands to move to the Windows disk partitions as you like and . Notice the last three entries in the output below. These represent several drives on the system.
+
+```
+myacct@hostname:~$ df -k
+Filesystem 1K-blocks Used Available Use% Mounted on
+rootfs 973067784 326920584 646147200 34% /
+none 973067784 326920584 646147200 34% /dev
+none 973067784 326920584 646147200 34% /run
+none 973067784 326920584 646147200 34% /run/lock
+none 973067784 326920584 646147200 34% /run/shm
+none 973067784 326920584 646147200 34% /run/user
+cgroup 973067784 326920584 646147200 34% /sys/fs/cgroup
+C:\ 973067784 326920584 646147200 34% /mnt/c <== C drive
+I:\ 976760000 231268208 745491792 24% /mnt/I <== external drive
+L:\ 409599996 159240 409440756 1% /mnt/l <== USB thumb drive
+```
+
+If you’re interested in moving out of the Linux space and into the Windows portion of the file system within your **WSL** session, you can do that easily. Replace “myname” with your Windows account name and a **cd /mnt/c/Users/_myname_/Desktop** will take you to your Windows desktop. From there, don’t be surprised if in listing your files you see **WRL####.tmp** files that don’t seem to exist when you look at your desktop and don’t show up if you look at your files by opening a command prompt. These appear to be temporary files used by Windows for document management. You might also see files listed that look like **‘~$nux notes.docx’** – perhaps ghosts of files that were once located on your desktop. You won’t see those files when you look at your desktop on Windows – even using a **cmd** window.
+
+Note that you’ll also see Windows directories such as **‘Program Files’** in single quotes when listed in your Linux terminal as you would any file with blanks included in their names. You can even start a Windows executable from your Linux terminal. For example:
+
+```
+myacct@hostname: $ cd /mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0
+myacct@hostname: $ powershell.exe
+```
+
+If you do this, type **exit** when you want to end the **powershell** session.
+
+Linux commands all seem to work as expected, though I don’t get any output when I run the **who** command.
+
+Windows **.txt** files will display with **cat** commands, but the last line in a file will likely be displayed on the same line as the following shell prompt. This is because these files won’t end with a linefeed as Linux text files do.
+
+You can create other accounts and switch user to them (e.g., **su – nemo**) if you like, but not log into them directly.
+
+You can also update the system with apt commands (**sudo apt update**, **sudo apt upgrade**).
+
+Join the Network World communities on [Facebook][15] and [LinkedIn][16] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3543845/how-to-use-windows-subsystem-for-linux-to-open-linux-on-windows-10-machines.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://unsplash.com/photos/4gRNmhGzYZE
+[2]: https://creativecommons.org/publicdomain/zero/1.0/
+[3]: https://www.networkworld.com/newsletters/signup.html
+[4]: https://www.microsoft.com/store/apps/9pjn388hp8c9
+[5]: https://www.microsoft.com/store/apps/9N9TNGVNDL3Q
+[6]: https://www.microsoft.com/store/apps/9NJFZK00FGKV
+[7]: https://www.microsoft.com/store/apps/9MZ3D1TRP8T1
+[8]: https://www.microsoft.com/store/apps/9PN498VPMF3Z
+[9]: https://www.microsoft.com/store/apps/9PKR34TNCV07
+[10]: https://www.microsoft.com/store/apps/9MSVKQC78PK6
+[11]: https://www.microsoft.com/store/apps/9n6gdm4k2hnc
+[12]: https://www.microsoft.com/store/apps/9NV1GV1PXZ6P
+[13]: https://www.microsoft.com/store/apps/9N8LP0X93VCP
+[14]: https://www.microsoft.com/store/apps/9p804crf0395
+[15]: https://www.facebook.com/NetworkWorld/
+[16]: https://www.linkedin.com/company/network-world
diff --git a/sources/tech/20200520 Fedora Silverblue, an introduction for developers.md b/sources/tech/20200520 Fedora Silverblue, an introduction for developers.md
new file mode 100644
index 0000000000..a112f4ca6d
--- /dev/null
+++ b/sources/tech/20200520 Fedora Silverblue, an introduction for developers.md
@@ -0,0 +1,140 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Fedora Silverblue, an introduction for developers)
+[#]: via: (https://fedoramagazine.org/fedora-silverblue-brings-future-tech-to-the-desktop/)
+[#]: author: (Nick Hardiman https://fedoramagazine.org/author/nickhardiman/)
+
+Fedora Silverblue, an introduction for developers
+======
+
+![][1]
+
+The Fedora [Silverblue project][2] takes Fedora workstation, libostree and podman, puts them in a blender, and creates a new Immutable Fedora Workstation. Fedora Silverblue is an OS that stops you from changing the core system files arbitrarily, and readily allows you to change the environment system files. The article [What is Silverblue][3] describes the big picture, and this article drills down into details for the developer.
+
+Fedora Silverblue ties together a few different projects to make a system that is a git-like object, capable of layering packages, and has a container focused work flow. Silverblue is not the only distribution going down this road. It is the desktop equivalent of [CoreOS][4], the server OS used by [Red Hat Openshift][5].
+
+Silverblue’s idea of ‘immutable’ has nothing to do with immutable layers in a container. Silverblue keeps system files immutable by making them read-only.
+
+### Why immutable?
+
+Has an upgrade left your system in an unusable state? Have you wondered why one server in a pool of identical machines is being weird? These problems can happen when one system library – one tiny little file out of hundreds – is corrupted, badly configured or the wrong version. Or maybe your upgrade works fine but it’s not what you’d hoped for, and you want to roll back to the previous state.
+
+An immutable OS is intended to stop problems like these biting you. This is not an easy thing to achieve – simple changes, like flipping the file system between read-write and read-only, may only change a fault-finding headache to a maintenance headache.
+
+Freezing the system is good news for sysadmins, but what about developers? Setting up a development environment means heavily customizing the system, and filling it with living code that changes over time. The answer is partly a case of combining components, and partly the ability to swap between OS versions.
+
+### How it works
+
+So how do you get the benefits of immutability without losing the ability to do your work? If you’re thinking ‘containers’, good guess – part of the solution uses [podman][6]. But much of the work happens underneath the container layer, at the OS level.
+
+Fedora Silverblue ties together a few different projects to turn an immutable OS into a usable workstation. Silverblue uses libostree to provide the base system, lets you edit config files in /etc/, and provides three different ways to install packages.
+
+ * [rpm-ostree][7] installs RPM packages, similar to DNF in the traditional Fedora workstation. Use this for things that shouldn’t go in containers, like KVM/libvirt.
+ * [flatpak][8] installs packages from a central flathub repo. This is the one-stop shop for graphical desktop apps like LibreOffice.
+ * The traditional _dnf install_ still works, but only inside a [toolbox][9] (a Fedora container). A developer’s workbench goes in a toolbox.
+
+
+
+If you want to know more about these components, check out [Pieces of Silverblue][10].
+
+### Rolling back and pinning upgrades
+
+All operating systems need upgrades. Features are added, security holes are plugged and bugs are squashed. But sometimes an upgrade is not a developer’s friend.
+
+A developer depends on many things to get the job done. A good development environment is stuffed with libraries, editors, toolchains and apps that are controlled by the OS, not the developer. An upgrade may cause trouble. Have any of these situations happened to you?
+
+ * A new encryption library is too strict, and an upgrade stopped an API working.
+ * Code works well, but has deprecated syntax. An upgrade brought error-throwing misery.
+ * The development environment is lovingly hand-crafted. An upgrade broke dependencies and added conflicts.
+
+
+
+In a traditional environment, unpicking a troublesome upgrade is hard. In Silverblue, it’s easy. Silverblue keeps two copies of the OS – your current upgrade and your previous version. Point the OS at the previous version, reboot, and you’ve got your old system files back.
+
+You aren’t limited to two copies of your file system – you can keep more by pinning your favorite versions. Dusty Mabe, one of the engineers who has been working on the system since the [Project Atomic][11] days, describes how to pin extra copies of the OS in his article [Pinning Deployments in OSTree Based Systems][12].
+
+Your home directory is not affected by rolling back. Rpm-ostree does not touch /etc/ and /var/.
+
+### System updates and package installs
+
+Silverblue’s rpm-ostree treats all the files as one object, stored in a repository. The working file system is a checked-out copy of this object. After a system update, you get two objects in that repository – one current object and one updated object. The updated object is checked out and becomes the new file system.
+
+You install your workhorse applications in toolboxes, which provide container isolation. And you install your desktop applications using Flatpak.
+
+This new OS requires a shift in approach. For instance, you don’t have to keep only one copy of your system files – you can store a few and select which one you use. That means you can swap back and forth between an old Fedora release and the rawhide (development) version in a matter of minutes.
+
+### Build your own Silverblue VM
+
+You can safely install Fedora Silverblue in a VM on your workstation. If you’ve got a hypervisor and half an hour to spare (10 minutes for ISO download, and 20 minutes for the build), you can see for yourself.
+
+ 1. Download Fedora Silverblue ISO from
+ 2. (not Fedora workstation from ).
+ 3. Boot a VM with the Fedora Silverblue ISO. You can squeeze Fedora into compute resources of 1 CPU, 1024MiB of memory and 12GiB of storage, but bigger is better.
+ 4. Answer [Anaconda][13]’s questions.
+ 5. Wait for the [Gnome][14] desktop to appear.
+ 6. Answer [Initial Setup][15]’s questions.
+
+
+
+Then you’re ready to set up your developer’s tools. If you’re looking for an IDE, check these out. Use flatpak on the desktop to install them.
+
+ * [Gnome Builder][16] (Gnome’s official IDE)
+ * [Eclipse][17]
+ * [Code::Blocks][18]
+
+
+
+Finally, use the CLI to create your first toolbox. Load it with modules using [npm][19], [gem][20], [pip][21], [git][22] or your other favorite tools.
+
+### Help!
+
+If you get stuck, ask questions at the [forum][23].
+
+If you’re looking for ideas about how to use Silverblue, read articles in the [magazine][24].
+
+### Is Silverblue for you?
+
+Silverblue is full of shiny new tech. That in itself is enough to attract the cool kids, like moths to a flame. But this OS is not for everyone. It’s a young system, so some bugs will still be lurking in there. And pioneering tech requires a change of habit – that’s extra cognitive load that the new user may not want to take on.
+
+The OS brings immutable benefits, like keeping your system files safe. It also brings some drawbacks, like the need to reboot after adding system packages. Silverblue also enables new ways of working. If you want to explore new directions in the OS, find out if Silverblue brings benefits to your work.
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/fedora-silverblue-brings-future-tech-to-the-desktop/
+
+作者:[Nick Hardiman][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/nickhardiman/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2020/04/silverblue-introfordev-816x345.png
+[2]: https://silverblue.fedoraproject.org/
+[3]: https://fedoramagazine.org/what-is-silverblue/
+[4]: http://coreos.com/
+[5]: https://www.openshift.com/products/container-platform
+[6]: https://github.com/containers/libpod
+[7]: https://rpm-ostree.readthedocs.io/en/latest/
+[8]: https://docs.flatpak.org/en/latest/
+[9]: https://github.com/containers/toolbox
+[10]: https://fedoramagazine.org/pieces-of-fedora-silverblue/
+[11]: https://www.projectatomic.io/
+[12]: https://www.projectatomic.io/blog/2018/05/pinning-deployments-ostree-based-systems/
+[13]: https://fedoraproject.org/wiki/Anaconda
+[14]: https://www.gnome.org/
+[15]: https://fedoraproject.org/wiki/InitialSetup
+[16]: https://wiki.gnome.org/Apps/Builder
+[17]: https://www.eclipse.org/ide/
+[18]: http://www.codeblocks.org/
+[19]: https://www.npmjs.com/package/package
+[20]: https://rubygems.org/
+[21]: https://pypi.org/
+[22]: https://git-scm.com/
+[23]: https://discussion.fedoraproject.org/c/desktop/silverblue/6
+[24]: https://fedoramagazine.org/?s=silverblue
diff --git a/sources/tech/20200521 Glico (Weighted Rock Paper Scissors).md b/sources/tech/20200521 Glico (Weighted Rock Paper Scissors).md
new file mode 100644
index 0000000000..77e3cfb5ed
--- /dev/null
+++ b/sources/tech/20200521 Glico (Weighted Rock Paper Scissors).md
@@ -0,0 +1,141 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Glico (Weighted Rock Paper Scissors))
+[#]: via: (https://theartofmachinery.com/2020/05/21/glico_weighted_rock_paper_scissors.html)
+[#]: author: (Simon Arneaud https://theartofmachinery.com)
+
+Glico (Weighted Rock Paper Scissors)
+======
+
+This still isn’t the blog post I said I was going to write about now, but I figured some game theory would make a good post at the moment, especially when a lot of people I know are working at home with kids who need entertaining. Here’s some stuff about a traditional Japanese kids’ game called Glico, a form of weighted Rock Paper Scissors (RPS).
+
+### Glico
+
+I’ll assume you’re familiar with regular RPS. It’s pretty obvious how to play well: the three plays, “rock”, “paper” and “scissors”, are equally strong, so the only trick is to play them unpredictably enough.
+
+But what happens if the three plays have different values? Weighted RPS, under the name “Glico”, has been a well-known Japanese children’s game since at least before WWII, but let me explain an English adaptation. Traditionally it’s played starting at the bottom of a flight of stairs, and the aim is to get to the top first. Players can climb up steps by winning rounds of RPS. The trick is that the number of steps depends on the winning hand in each round. A player who wins with “rock” gets to climb up four steps by spelling out R-O-C-K, and similarly “paper” is worth five steps and “scissors” worth eight. This simple twist to the game creates whole new layers of offence and defence as players struggle to win with “scissors” as much as possible, without being too predictable and vulnerable.
+
+(The rules for the Japanese version vary by region, but usually “rock” is worth 3 steps, while “paper” and “scissors” are worth 6. The mnemonic is that “rock”, “paper” and “scissors” are referred to as グー, パー and チョキ respectively, and the words spelled out when playing are グリコ (“Glico”, a food/confectionary brand), パイナップル (pineapple) and チョコレート (chocolate).)
+
+Just a few notes before getting into the maths: The game works best with two players, but in the traditional rules for three or more players, each round is handled by having multiple rematches. Each time there’s a clear winning hand (e.g., two players with “paper” beating one with “rock”) the losers are eliminated until there’s one winner. That can take a long time, so cycling systematically between pairs of players might be faster for several players. (I’ll assume two players from now on.) Also, older kids sometimes add an extra challenge by requiring an exact landing at the top of the stairs to win. For example, if you’re five steps from the top, only “paper” will win; “scissors” will overshoot by three steps, and you’ll end up three steps back down from the top. Be warned: that makes gameplay a lot harder.
+
+### Calculating the optimal strategy
+
+Simple strategies like “just play rock” are what game theorists call “pure strategies”. By design, no pure strategy in RPS is better than all others, and an adaptive opponent can quickly learn to exploit any pure strategy (e.g., by always playing “paper” against someone who always plays “rock”). Any decent player will play RPS with something like a “mixed strategy” (selecting from the pure strategies at random, maybe with different probabilities). Game theory tells us that finite, two-player, zero-sum games always have optimal mixed strategies — i.e., a mixed strategy that’s as good or better than any other, even against an adaptive opponent. You might do better by exploiting a weak opponent, but you can’t do better against a perfect one. In plain RPS, the statistically unbeatable strategy is to play each hand with equal probability (\frac{1}{3}).
+
+Glico is made up of multiple rounds of weighted RPS. A truly optimal player won’t just use one set of probabilities (p_{r}), (p_{p}) and (p_{s}) for playing “rock”, “paper” and “scissors” each round. The optimal probabilities will vary depending the position of both players on the stairs. For example, a player who is four steps from winning is either happy with any winning hand, or only wants “rock”, depending on the rules, and (theoretically) both players should recognise that and adapt their probabilities accordingly. However, it’s more practical to play with an optimal greedy strategy — i.e., assuming everyone is just trying to get the maximum step value each round.
+
+I’ll calculate an optimal greedy strategy for weighted RPS in two ways. One way is longer but uses nothing but high school algebra and logical thinking, while the other way uses the power of linear programming.
+
+#### The longer way
+
+The greedy version of Glico has no end goal; the players are just trying to win points. It helps with solving the game if we make it zero sum — any time you win (N) points, your opponent loses (N) points, and vice versa. That just scales and shifts the score per round, so it doesn’t change the optimal strategy. Why do it? We know that optimal players can’t get any advantage over each other because the game is symmetric. If the game is zero sum, that means that no strategy can have an expected value of more than 0 points. That lets us write some equations. For example, playing “rock” might win you 4 points against “scissors”, or lose you 5 against “paper”. Against an optimal opponent, we can say
+
+[4p_{s} - 5p_{p} \leq 0]
+
+Is the inequality necessary? When would a pure strategy have a negative value against a non-adaptive but optimal player? Imagine if we added a fourth pure strategy, “bomb”, that simply gave 1000 points to the opponent. Obviously no optimal player would ever play “bomb”, so (p_{b} = 0). Playing “bomb” against an optimal player would have expected value -1000. We can say that some pure strategies are just _bad_: they have suboptimal value against an optimal opponent, and an optimal player will never play them. Other pure strategies have optimal value against an optimal opponent, and they’re reasonable to include in an optimal strategy.
+
+Bad pure strategies aren’t always as obvious as “bomb”, but we can argue that none of the pure strategies in RPS are bad. “Rock” is the only way to beat “scissors”, and “paper” is the only way to beat “rock”, and “scissors” is the only way to beat “paper”. At least one must be in the optimal strategy, so we can expect them all to be. So let’s make that (\leq) into (=), and add the equations for playing “paper” and “scissors”, plus the fact that these are probabilities that add up to 1:
+
+[\begin{matrix} {4p_{s} - 5p_{p}} & {= 0} \ {5p_{r} - 8p_{s}} & {= 0} \ {8p_{p} - 4p_{r}} & {= 0} \ {p_{r} + p_{p} + p_{s}} & {= 1} \ \end{matrix}]
+
+That’s a system of linear equations that can be solved algorithmically using Gaussian elimination — either by hand or by using any good numerical algorithms software. I won’t go into the details, but here’s the solution:
+
+[\begin{matrix} p_{r} & {= 0.4706} \ p_{p} & {= 0.2353} \ p_{s} & {= 0.2941} \ \end{matrix}]
+
+Even though it’s worth the least, an optimal player will play “rock” almost half the time to counterattack “scissors”. The rest of the time is split between “paper” and “scissors”, with a slight bias towards “scissors”.
+
+#### The powerful way
+
+The previous solution needed special-case analysis: it exploited the symmetry of the game, and made some guesses about how good/bad the pure strategies are. What about games that are more complex, or maybe not even symmetric (say, because one player has a handicap)? There’s a more general solution using what’s called linear programming (which dates to when “programming” just meant “scheduling” or “planning”).
+
+By the way, linear programming (LP) has a funny place in computer science. There are some industries and academic circles where LP and generalisations like mixed integer programming are super hot. Then there are computer science textbooks that never even mention them, so there are industries where the whole topic is pretty much unheard of. It might be because it wasn’t even known for a long time if LP problems can be solved in polynomial time (they can), so LP doesn’t have the same theoretical elegance as, say, shortest path finding, even if it has a lot of practical use.
+
+Anyway, solving weighted RPS with LP is pretty straightforward. We just need to describe the game using a bunch of linear inequalities in multiple variables, and express strategic value as a linear function that can be optimised. That’s very similar to what was done before, but this time we won’t try to guess at the values of any strategies. We’ll just assume we’re choosing values (p_{r}), (p_{p}) and (p_{s}) to play against an opponent who scores an average (v) against us each round. The opponent is smart enough to choose a strategy that’s as least as good as any pure strategy, so we can say
+
+[\begin{matrix} {4p_{s} - 5p_{p}} & {\leq v} \ {5p_{r} - 8p_{s}} & {\leq v} \ {8p_{p} - 4p_{r}} & {\leq v} \ \end{matrix}]
+
+The opponent can only play some combination of “rock”, “paper” and “scissors”, so (v) can’t be strictly greater than all of them — at least one of the inequalities above must be tight. To model the gameplay fully, the only other constraints we need are the rules of probability:
+
+[\begin{matrix} {p_{r} + p_{p} + p_{s}} & {= 1} \ p_{r} & {\geq 0} \ p_{p} & {\geq 0} \ p_{s} & {\geq 0} \ \end{matrix}]
+
+Now we’ve modelled the problem, we just need to express what needs to be optimised. That’s actually dead simple: we just want to minimise (v), the average score the opponent can win from us. An LP solver can find a set of values for all variables that minimises (v) within the constraints, and we can read off the optimal strategy directly.
+
+I’ve tried a few tools, and the [Julia][1] library [JuMP][2] has my current favourite FOSS API for throwaway optimisation problems. Here’s some code:
+
+```
+# You might need Pkg.add("JuMP"); Pkg.add("GLPK")
+using JuMP
+using GLPK
+
+game = Model(GLPK.Optimizer)
+
+@variable(game, 0 <= pr <= 1)
+@variable(game, 0 <= pp <= 1)
+@variable(game, 0 <= ps <= 1)
+@variable(game, v)
+
+@constraint(game, ptotal, pr + pp + ps == 1)
+@constraint(game, rock, 4*ps - 5*pp <= v)
+@constraint(game, paper, 5*pr - 8*ps <= v)
+@constraint(game, scissors, 8*pp - 4*pr <= v)
+
+@objective(game, Min, v)
+
+println(game)
+optimize!(game)
+
+println("Opponent's value: ", value(v))
+println("Rock: ", value(pr))
+println("Paper: ", value(pp))
+println("Scissors: ", value(ps))
+```
+
+Here’s the output:
+
+```
+Min v
+Subject to
+ ptotal : pr + pp + ps = 1.0
+ rock : 4 ps - 5 pp - v ≤ 0.0
+ paper : 5 pr - 8 ps - v ≤ 0.0
+ scissors : 8 pp - 4 pr - v ≤ 0.0
+ pr ≥ 0.0
+ pp ≥ 0.0
+ ps ≥ 0.0
+ pr ≤ 1.0
+ pp ≤ 1.0
+ ps ≤ 1.0
+
+Opponent's value: 0.0
+Rock: 0.47058823529411764
+Paper: 0.23529411764705882
+Scissors: 0.29411764705882354
+```
+
+As argued in the previous solution, the best value the opponent can get against the optimal player is 0.
+
+### What does optimality mean?
+
+The optimal solution was calculated assuming an all-powerful opponent. It guarantees that even the best weighted RPS player can’t get an advantage over you, but it turns out you can’t get an advantage over a terrible player, either, if you insist on playing this “optimal” strategy. That’s because weighted RPS has no bad plays, in the sense that “bomb” is bad. _Any_ strategy played against the above “optimal” strategy will have expected value of 0, so it’s really a defensive, or “safe” strategy. To play truly optimally and win against a bad player, you’ll have to adapt your strategy. For example, if your opponent plays “scissors” too often and “paper” not enough, you should adapt by playing “rock” more often. Of course, your opponent might just be pretending to be weak, and could start taking advantage of your deviation from the safe strategy.
+
+Games don’t always work out like that. For example, in theory, you could derive an optimal safe strategy for more complex games like poker. Such a strategy would tend to win against normal humans because even the best normal humans make bad poker plays. On the other hand, a “shark” at the table might be able to win against the “fish” faster by exploiting their weaknesses more aggressively. If you’re thinking of using LP to directly calculate a strategy for Texas Hold’em, though, sorry, but you’ll hit a combinatorial explosion of pure strategies as you account for all the cases like “if I’m dealt AJ on the big blind and I call a four-blind raise from the button preflop and then the flop is a rainbow 3K9…”. Only heavily simplified toy poker games are solvable with the general approach.
+
+--------------------------------------------------------------------------------
+
+via: https://theartofmachinery.com/2020/05/21/glico_weighted_rock_paper_scissors.html
+
+作者:[Simon Arneaud][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://theartofmachinery.com
+[b]: https://github.com/lujun9972
+[1]: https://julialang.org/
+[2]: https://github.com/JuliaOpt/JuMP.jl
diff --git a/sources/tech/20200521 Use the internet from the command line with curl.md b/sources/tech/20200521 Use the internet from the command line with curl.md
new file mode 100644
index 0000000000..c580ea0879
--- /dev/null
+++ b/sources/tech/20200521 Use the internet from the command line with curl.md
@@ -0,0 +1,186 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Use the internet from the command line with curl)
+[#]: via: (https://opensource.com/article/20/5/curl-cheat-sheet)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+Use the internet from the command line with curl
+======
+Download our new curl cheat sheet. Curl is a fast and efficient way to
+pull the information you need from the internet without using a
+graphical interface.
+![Cheat Sheet cover image][1]
+
+Curl is commonly considered a non-interactive web browser. That means it's able to pull information from the internet and display it in your terminal or save it to a file. This is literally what web browsers, such as Firefox or Chromium, do except they _render_ the information by default, while curl downloads and displays raw information. In reality, the curl command does much more and has the ability to transfer data to or from a server using one of many supported protocols, including HTTP, FTP, SFTP, IMAP, POP3, LDAP, SMB, SMTP, and many more. It's a useful tool for the average terminal user, a vital convenience for the sysadmin, and a quality assurance tool for microservices and cloud developers.
+
+Curl is designed to work without user interaction, so unlike Firefox, you must think about your interaction with online data from start to finish. For instance, if you want to view a web page in Firefox, you launch a Firefox window. After Firefox is open, you type the website you want to visit into the URL field or a search engine. Then you navigate to the site and click on the page you want to see.
+
+The same concepts apply to curl, except you do it all at once: you launch curl at the same time you feed it the internet location you want and tell it whether you want to the data to be saved in your terminal or to a file. The complexity increases when you have to interact with a site that requires authentication or with an API, but once you learn the **curl** command syntax, it becomes second nature. To help you get the hang of it, we collected the pertinent syntax information in a handy [cheat sheet][2].
+
+### Download a file with curl
+
+You can download a file with the **curl** command by providing a link to a specific URL. If you provide a URL that defaults to **index.html**, then the index page is downloaded, and the file you downloaded is displayed on your terminal screen. You can pipe the output to less or tail or any other command:
+
+
+```
+$ curl "" | tail -n 4
+ <h1>Example Domain</h1>
+ <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p>
+ <p><a href="[https://www.iana.org/domains/example"\>More][3] information...</a></p>
+</div></body></html>
+```
+
+Because some URLs contain special characters that your shell normally interprets, it's safest to surround your URL in quotation marks.
+
+Some files don't translate well to being displayed in a terminal. You can use the **\--remote-name** option to cause the file to be saved according to what it's called on the server:
+
+
+```
+$ curl --remote-name ""
+$ ls
+linux-distro.iso
+```
+
+Alternatively, you can use the **\--output** option to name your download whatever you want:
+
+
+```
+`curl "http://example.com/foo.html" --output bar.html`
+```
+
+### List contents of a remote directory with curl
+
+Because curl is non-interactive, it's difficult to browse a page for downloadable elements. Provided that the remote server you're connecting to allows it, you can use **curl** to list the contents of a directory:
+
+
+```
+`$ curl --list-only "https://example.com/foo/"`
+```
+
+### Continue a partial download
+
+If you're downloading a very large file, you might find that you have to interrupt the download. Curl is intelligent enough to determine where you left off and continue the download. That means the next time you're downloading a 4GB Linux distribution ISO and something goes wrong, you never have to go back to the start. The syntax for **\--continue-at** is a little unusual: if you know the byte count where your download was interrupted, you can provide it; otherwise, you can use a lone dash (**-**) to tell curl to detect it automatically:
+
+
+```
+`$ curl --remote-name --continue-at - "https://example.com/linux-distro.iso"`
+```
+
+### Download a sequence of files
+
+If you need to download several files—rather than just one big file—curl can help with that. Assuming you know the location and file-name pattern of the files you want to download, you can use curl's sequencing notation: the start and end point between a range of integers, in brackets. For the output filename, use **#1** to indicate the first variable:
+
+
+```
+`$ curl "https://example.com/file_[1-4].webp" --output "file_#1.webp"`
+```
+
+If you need to use another variable to represent another sequence, denote each variable in the order it appears in the command. For example, in this command, **#1** refers to the directories **images_000** through **images_009**, while **#2** refers to the files **file_1.webp** through **file_4.webp**:
+
+
+```
+$ curl "" \
+\--output "file_#1-#2.webp"
+```
+
+### Download all PNG files from a site
+
+You can do some rudimentary web scraping to find what you want to download, too, using only **curl** and **grep**. For instance, say you need to download all images associated with a web page you're archiving. First, download the page referencing the images. Pipe the page to grep with a search for the image type you're targeting (PNG in this example). Finally, create a **while** loop to construct a download URL and to save the files to your computer:
+
+
+```
+$ curl |\
+grep --only-matching 'src="[^"]*.[png]"' |\
+cut -d\" -f2 |\
+while read i; do \
+curl " -o "${i##*/}"; \
+done
+```
+
+This is just an example, but it demonstrates how flexible curl can be when combined with a Unix pipe and some clever, but basic, parsing.
+
+### Fetch HTML headers
+
+Protocols used for data exchange have a lot of metadata embedded in the packets that computers send to communicate. HTTP headers are components of the initial portion of data. It can be helpful to view these headers (especially the response code) when troubleshooting your connection to a site:
+
+
+```
+curl --head ""
+HTTP/2 200
+accept-ranges: bytes
+age: 485487
+cache-control: max-age=604800
+content-type: text/html; charset=UTF-8
+date: Sun, 26 Apr 2020 09:02:09 GMT
+etag: "3147526947"
+expires: Sun, 03 May 2020 09:02:09 GMT
+last-modified: Thu, 17 Oct 2019 07:18:26 GMT
+server: ECS (sjc/4E76)
+x-cache: HIT
+content-length: 1256
+```
+
+### Fail quickly
+
+A 200 response is the usual HTTP indicator of success, so it's what you usually expect when you contact a server. The famous 404 response indicates that a page can't be found, and 500 means there was a server error.
+
+To see what errors are happening during negotiation, add the **\--show-error** flag:
+
+
+```
+`$ curl --head --show-error "http://opensource.ga"`
+```
+
+These can be difficult for you to fix unless you have access to the server you're contacting, but curl generally tries its best to resolve the location you point it to. Sometimes when testing things over a network, seemingly endless retries just waste time, so you can force curl to exit upon failure quickly with the **\--fail-early** option:
+
+
+```
+`curl --fail-early "http://opensource.ga"`
+```
+
+### Redirect query as specified by a 3xx response
+
+The 300 series of responses, however, are more flexible. Specifically, the 301 response means that a URL has been moved permanently to a different location. It's a common way for a website admin to relocate content while leaving a "trail" so people visiting the old location can still find it. Curl doesn't follow a 301 redirect by default, but you can make it continue on to a 301 destination by using the **\--location** option:
+
+
+```
+$ curl "" | grep title
+<title>301 Moved Permanently</title>
+$ curl --location ""
+<title>Internet Assigned Numbers Authority</title>
+```
+
+### Expand a shortened URL
+
+The **\--location** option is useful when you want to look at shortened URLs before visiting them. Shortened URLs can be useful for social networks with character limits (of course, this may not be an issue if you use a [modern and open source social network][4]) or for print media in which users can't just copy and paste a long URL. However, they can also be a little dangerous because their destination is, by nature, concealed. By combining the **\--head** option to view just the HTTP headers and the **\--location** option to unravel the final destination of a URL, you can peek into a shortened URL without loading the full resource:
+
+
+```
+$ curl --head --location \
+""
+```
+
+### [Download our curl cheat sheet][2]
+
+Once you practice thinking about the process of exploring the web as a single command, curl becomes a fast and efficient way to pull the information you need from the internet without bothering with a graphical interface. To help you build it into your usual workflow, we've created a [curl cheat sheet][2] with common curl uses and syntax, including an overview of using it to query an API.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/5/curl-cheat-sheet
+
+作者:[Seth Kenlon][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/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coverimage_cheat_sheet.png?itok=lYkNKieP (Cheat Sheet cover image)
+[2]: https://opensource.com/downloads/curl-command-cheat-sheet
+[3]: https://www.iana.org/domains/example"\>More
+[4]: https://opensource.com/article/17/4/guide-to-mastodon
diff --git a/sources/tech/20200522 A beginner-s guide to web scraping with Python.md b/sources/tech/20200522 A beginner-s guide to web scraping with Python.md
new file mode 100644
index 0000000000..010744161b
--- /dev/null
+++ b/sources/tech/20200522 A beginner-s guide to web scraping with Python.md
@@ -0,0 +1,493 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (A beginner's guide to web scraping with Python)
+[#]: via: (https://opensource.com/article/20/5/web-scraping-python)
+[#]: author: (Julia Piaskowski https://opensource.com/users/julia-piaskowski)
+
+A beginner's guide to web scraping with Python
+======
+Get some hands-on experience with essential Python tools to scrape
+complete HTML sites.
+![HTML code][1]
+
+There are plenty of great books to help you learn Python, but who actually reads these A to Z? (Spoiler: not me).
+
+Many people find instructional books useful, but I do not typically learn by reading a book front to back. I learn by doing a project, struggling, figuring some things out, and then reading another book. So, throw away your book (for now), and let's learn some Python.
+
+What follows is a guide to my first scraping project in Python. It is very low on assumed knowledge in Python and HTML. This is intended to illustrate how to access web page content with Python library [requests][2] and parse the content using [BeatifulSoup4][3], as well as JSON and [pandas][4]. I will briefly introduce [Selenium][5], but I will not delve deeply into how to use that library—that topic deserves its own tutorial. Ultimately I hope to show you some tricks and tips to make web scraping less overwhelming.
+
+### Installing our dependencies
+
+All the resources from this guide are available at my [GitHub repo][6]. If you need help installing Python 3, check out the tutorials for [Linux][7], [Windows][8], and [Mac][9].
+
+
+```
+$ python3 -m venv
+$ source venv/bin/activate
+$ pip install requests bs4 pandas
+```
+
+If you like using JupyterLab, you can run all the code using this [notebook][10]. There are a lot of ways to [install JupyterLab][11], and this is one of them:
+
+
+```
+# from the same virtual environment as above, run:
+$ pip install jupyterlab
+```
+
+### Setting a goal for our web scraping project
+
+Now we have our dependencies installed, but what does it take to scrape a webpage?
+
+Let's take a step back and be sure to clarify our goal. Here is my list of requirements for a successful web scraping project.
+
+ * We are gathering information that is worth the effort it takes to build a working web scraper.
+ * We are downloading information that can be legally and ethically gathered by a web scraper.
+ * We have some knowledge of how to find the target information in HTML code.
+ * We have the right tools: in this case, it's the libraries **BeautifulSoup** and **requests**.
+ * We know (or are willing to learn) how to parse JSON objects.
+ * We have enough data skills to use **pandas**.
+
+
+
+A comment on HTML: While HTML is the beast that runs the Internet, what we mostly need to understand is how tags work. A tag is a collection of information sandwiched between angle-bracket enclosed labels. For example, here is a pretend tag, called "pro-tip":
+
+
+```
+<pro-tip> All you need to know about html is how tags work </pro-tip>
+```
+
+We can access the information in there ("All you need to know…") by calling its tag "pro-tip." How to find and access a tag will be addressed further in this tutorial. For more of a look at HTML basics, check out [this article][12].
+
+### What to look for in a web scraping project
+
+Some goals for gathering data are more suited for web scraping than others. My guidelines for what qualifies as a good project are as follows.
+
+There is no public API available for the data. It would be much easier to capture structured data through an API, and it would help clarify both the legality and ethics of gathering the data. There needs to be a sizable amount of structured data with a regular, repeatable format to justify this effort. Web scraping can be a pain. BeautifulSoup (bs4) makes this easier, but there is no avoiding the individual idiosyncrasies of websites that will require customization. Identical formatting of the data is not required, but it does make things easier. The more "edge cases" (departures from the norm) present, the more complicated the scraping will be.
+
+Disclaimer: I have zero legal training; the following is not intended to be formal legal advice.
+
+On the note of legality, accessing vast troves of information can be intoxicating, but just because it's possible doesn't mean it should be done.
+
+There is, thankfully, public information that can guide our morals and our web scrapers. Most websites have a [robots.txt][13] file associated with the site, indicating which scraping activities are permitted and which are not. It's largely there for interacting with search engines (the ultimate web scrapers). However, much of the information on websites is considered public information. As such, some consider the robots.txt file as a set of recommendations rather than a legally binding document. The robots.txt file does not address topics such as ethical gathering and usage of the data.
+
+Questions I ask myself before beginning a scraping project:
+
+ * Am I scraping copyrighted material?
+ * Will my scraping activity compromise individual privacy?
+ * Am I making a large number of requests that may overload or damage a server?
+ * Is it possible the scraping will expose intellectual property I do not own?
+ * Are there terms of service governing use of the website, and am I following those?
+ * Will my scraping activities diminish the value of the original data? (for example, do I plan to repackage the data as-is and perhaps siphon off website traffic from the original source)?
+
+
+
+When I scrape a site, I make sure I can answer "no" to all of those questions.
+
+For a deeper look at the legal concerns, see the 2018 publications [Legality and Ethics of Web Scraping by Krotov and Silva][14] and [Twenty Years of Web Scraping and the Computer Fraud and Abuse Act by Sellars][15].
+
+### Now it's time to scrape!
+
+After assessing the above, I came up with a project. My goal was to extract addresses for all Family Dollar stores in Idaho. These stores have an outsized presence in rural areas, so I wanted to understand how many there are in a rather rural state.
+
+The starting point is the [location page for Family Dollar][16].
+
+![Family Dollar Idaho locations page][17]
+
+To begin, let's load up our prerequisites in our Python virtual environment. The code from here is meant to be added to a Python file (_scraper.py_ if you're looking for a name) or be run in a cell in JupyterLab.
+
+
+```
+import requests # for making standard html requests
+from bs4 import BeautifulSoup # magical tool for parsing html data
+import json # for parsing data
+from pandas import DataFrame as df # premier library for data organization
+```
+
+Next, we request data from our target URL.
+
+
+```
+page = requests.get("")
+soup = BeautifulSoup(page.text, 'html.parser')
+```
+
+BeautifulSoup will take HTML or XML content and transform it into a complex tree of objects. Here are several common object types that we will use.
+
+ * **BeautifulSoup**—the parsed content
+ * **Tag**—a standard HTML tag, the main type of bs4 element you will encounter
+ * **NavigableString**—a string of text within a tag
+ * **Comment**—a special type of NavigableString
+
+
+
+There is more to consider when we look at **requests.get()** output. I've only used **page.text()** to translate the requested page into something readable, but there are other output types:
+
+ * **page.text()** for text (most common)
+ * **page.content()** for byte-by-byte output
+ * **page.json()** for JSON objects
+ * **page.raw()** for the raw socket response (no thank you)
+
+
+
+I have only worked on English-only sites using the Latin alphabet. The default encoding settings in **requests** have worked fine for that. However, there is a rich internet world beyond English-only sites. To ensure that **requests** correctly parses the content, you can set the encoding for the text:
+
+
+```
+page = requests.get(URL)
+page.encoding = 'ISO-885901'
+soup = BeautifulSoup(page.text, 'html.parser')
+```
+
+Taking a closer look at BeautifulSoup tags, we see:
+
+ * The bs4 element **tag** is capturing an HTML tag
+ * It has both a name and attributes that can be accessed like a dictionary: **tag['someAttribute']**
+ * If a tag has multiple attributes with the same name, only the first instance is accessed.
+ * A tag's children are accessed via **tag.contents**.
+ * All tag descendants can be accessed with **tag.contents**.
+ * You can always access the full contents as a string with: **re.compile("your_string")** instead of navigating the HTML tree.
+
+
+
+### Determine how to extract relevant content
+
+Warning: this process can be frustrating.
+
+Extraction during web scraping can be a daunting process filled with missteps. I think the best way to approach this is to start with one representative example and then scale up (this principle is true for any programming task). Viewing the page's HTML source code is essential. There are a number of ways to do this.
+
+You can view the entire source code of a page using Python in your terminal (not recommended). Run this code at your own risk:
+
+
+```
+print(soup.prettify())
+```
+
+While printing out the entire source code for a page might work for a toy example shown in some tutorials, most modern websites have a massive amount of content on any one of their pages. Even the 404 page is likely to be filled with code for headers, footers, and so on.
+
+It is usually easiest to browse the source code via **View Page Source** in your favorite browser (right-click, then select "view page source"). That is the most reliable way to find your target content (I will explain why in a moment).
+
+![Family Dollar page source code][18]
+
+
+
+In this instance, I need to find my target content—an address, city, state, and zip code—in this vast HTML ocean. Often, a simple search of the page source (**ctrl + F**) will yield the section where my target location is located. Once I can actually see an example of my target content (the address for at least one store), I look for an attribute or tag that sets this content apart from the rest.
+
+It would appear that first, I need to collect web addresses for different cities in Idaho with Family Dollar stores and visit those websites to get the address information. These web addresses all appear to be enclosed in a **href** tag. Great! I will try searching for that using the **find_all** command:
+
+
+```
+dollar_tree_list = soup.find_all('href')
+dollar_tree_list
+```
+
+Searching for **href** did not yield anything, darn. This might have failed because **href** is nested inside the class **itemlist**. For the next attempt, search on **item_list**. Because "class" is a reserved word in Python, **class_** is used instead. The bs4 function **soup.find_all()** turned out to be the Swiss army knife of bs4 functions.
+
+
+```
+dollar_tree_list = soup.find_all(class_ = 'itemlist')
+for i in dollar_tree_list[:2]:
+ print(i)
+```
+
+Anecdotally, I found that searching for a specific class was often a successful approach. We can learn more about the object by finding out its type and length.
+
+
+```
+type(dollar_tree_list)
+len(dollar_tree_list)
+```
+
+The content from this BeautifulSoup "ResultSet" can be extracted using **.contents**. This is also a good time to create a single representative example.
+
+
+```
+example = dollar_tree_list[2] # a representative example
+example_content = example.contents
+print(example_content)
+```
+
+Use **.attr** to find what attributes are present in the contents of this object. Note: **.contents** usually returns a list of exactly one item, so the first step is to index that item using the bracket notation.
+
+
+```
+example_content = example.contents[0]
+example_content.attrs
+```
+
+Now that I can see that **href** is an attribute, that can be extracted like a dictionary item:
+
+
+```
+example_href = example_content['href']
+print(example_href)
+```
+
+### Putting together our web scraper
+
+All that exploration has given us a path forward. Here's the cleaned-up version of the logic we figured out above.
+
+
+```
+city_hrefs = [] # initialise empty list
+
+for i in dollar_tree_list:
+ cont = i.contents[0]
+ href = cont['href']
+ city_hrefs.append(href)
+
+# check to be sure all went well
+for i in city_hrefs[:2]:
+ print(i)
+```
+
+The output is a list of URLs of Family Dollar stores in Idaho to scrape.
+
+That said, I still don't have address information! Now, each city URL needs to be scraped to get this information. So we restart the process, using a single, representative example.
+
+
+```
+page2 = requests.get(city_hrefs[2]) # again establish a representative example
+soup2 = BeautifulSoup(page2.text, 'html.parser')
+```
+
+![Family Dollar map and code][19]
+
+The address information is nested within **type= "application/ld+json"**. After doing a lot of geolocation scraping, I've come to recognize this as a common structure for storing address information. Fortunately, **soup.find_all()** also enables searching on **type**.
+
+
+```
+arco = soup2.find_all(type="application/ld+json")
+print(arco[1])
+```
+
+The address information is in the second list member! Finally!
+
+I extracted the contents (from the second list item) using **.contents** (this is a good default action after filtering the soup). Again, since the output of contents is a list of one, I indexed that list item:
+
+
+```
+arco_contents = arco[1].contents[0]
+arco_contents
+```
+
+Wow, looking good. The format presented here is consistent with the JSON format (also, the type did have "**json**" in its name). A JSON object can act like a dictionary with nested dictionaries inside. It's actually a nice format to work with once you become familiar with it (and it's certainly much easier to program than a long series of RegEx commands). Although this structurally looks like a JSON object, it is still a bs4 object and needs a formal programmatic conversion to JSON to be accessed as a JSON object:
+
+
+```
+arco_json = json.loads(arco_contents)
+
+[/code] [code]
+
+type(arco_json)
+print(arco_json)
+```
+
+In that content is a key called **address** that has the desired address information in the smaller nested dictionary. This can be retrieved thusly:
+
+
+```
+arco_address = arco_json['address']
+arco_address
+```
+
+Okay, we're serious this time. Now I can iterate over the list store URLs in Idaho:
+
+
+```
+locs_dict = [] # initialise empty list
+
+for link in city_hrefs:
+ locpage = requests.get(link) # request page info
+ locsoup = BeautifulSoup(locpage.text, 'html.parser')
+ # parse the page's content
+ locinfo = locsoup.find_all(type="application/ld+json")
+ # extract specific element
+ loccont = locinfo[1].contents[0]
+ # get contents from the bs4 element set
+ locjson = json.loads(loccont) # convert to json
+ locaddr = locjson['address'] # get address
+ locs_dict.append(locaddr) # add address to list
+```
+
+### Cleaning our web scraping results with pandas
+
+We have loads of data in a dictionary, but we have some additional crud that will make reusing our data more complex than it needs to be. To do some final data organization steps, we convert to a pandas data frame, drop the unneeded columns "**@type**" and "**country**"), and check the top five rows to ensure that everything looks alright.
+
+
+```
+locs_df = df.from_records(locs_dict)
+locs_df.drop(['@type', 'addressCountry'], axis = 1, inplace = True)
+locs_df.head(n = 5)
+```
+
+Make sure to save results!!
+
+
+```
+df.to_csv(locs_df, "family_dollar_ID_locations.csv", sep = ",", index = False)
+```
+
+We did it! There is a comma-separated list of all the Idaho Family Dollar stores. What a wild ride.
+
+### A few words on Selenium and data scraping
+
+[Selenium][5] is a common utility for automatic interaction with a webpage. To explain why it's essential to use at times, let's go through an example using Walgreens' website. **Inspect Element** provides the code for what is displayed in a browser:
+
+![Walgreens location page and code][20]
+
+
+
+While **View Page Source** provides the code for what **requests** will obtain:
+
+![Walgreens source code][21]
+
+When these two don't agree, there are plugins modifying the source code—so, it should be accessed after the page has loaded in a browser. **requests** cannot do that, but **Selenium** can.
+
+Selenium requires a web driver to retrieve the content. It actually opens a web browser, and this page content is collected. Selenium is powerful—it can interact with loaded content in many ways (read the documentation). After getting data with **Selenium**, continue to use **BeautifulSoup** as before:
+
+
+```
+url = "[https://www.walgreens.com/storelistings/storesbycity.jsp?requestType=locator\&state=ID][22]"
+driver = webdriver.Firefox(executable_path = 'mypath/geckodriver.exe')
+driver.get(url)
+soup_ID = BeautifulSoup(driver.page_source, 'html.parser')
+store_link_soup = soup_ID.find_all(class_ = 'col-xl-4 col-lg-4 col-md-4')
+```
+
+I didn't need Selenium in the case of Family Dollar, but I do keep it on hand for those times when rendered content differs from source code.
+
+### Wrapping up
+
+In conclusion, when using web scraping to accomplish a meaningful task:
+
+ * Be patient
+ * Consult the manuals (these are very helpful)
+
+
+
+If you are curious about the answer:
+
+![Family Dollar locations map][23]
+
+There are many many Family Dollar stores in America.
+
+The complete source code is:
+
+
+```
+import requests
+from bs4 import BeautifulSoup
+import json
+from pandas import DataFrame as df
+
+page = requests.get("")
+soup = BeautifulSoup(page.text, 'html.parser')
+
+# find all state links
+state_list = soup.find_all(class_ = 'itemlist')
+
+state_links = []
+
+for i in state_list:
+ cont = i.contents[0]
+ attr = cont.attrs
+ hrefs = attr['href']
+ state_links.append(hrefs)
+
+# find all city links
+city_links = []
+
+for link in state_links:
+ page = requests.get(link)
+ soup = BeautifulSoup(page.text, 'html.parser')
+ familydollar_list = soup.find_all(class_ = 'itemlist')
+ for store in familydollar_list:
+ cont = store.contents[0]
+ attr = cont.attrs
+ city_hrefs = attr['href']
+ city_links.append(city_hrefs)
+# to get individual store links
+store_links = []
+
+for link in city_links:
+ locpage = requests.get(link)
+ locsoup = BeautifulSoup(locpage.text, 'html.parser')
+ locinfo = locsoup.find_all(type="application/ld+json")
+ for i in locinfo:
+ loccont = i.contents[0]
+ locjson = json.loads(loccont)
+ try:
+ store_url = locjson['url']
+ store_links.append(store_url)
+ except:
+ pass
+
+# get address and geolocation information
+stores = []
+
+for store in store_links:
+ storepage = requests.get(store)
+ storesoup = BeautifulSoup(storepage.text, 'html.parser')
+ storeinfo = storesoup.find_all(type="application/ld+json")
+ for i in storeinfo:
+ storecont = i.contents[0]
+ storejson = json.loads(storecont)
+ try:
+ store_addr = storejson['address']
+ store_addr.update(storejson['geo'])
+ stores.append(store_addr)
+ except:
+ pass
+
+# final data parsing
+stores_df = df.from_records(stores)
+stores_df.drop(['@type', 'addressCountry'], axis = 1, inplace = True)
+stores_df['Store'] = "Family Dollar"
+
+df.to_csv(stores_df, "family_dollar_locations.csv", sep = ",", index = False)
+```
+
+\--
+_Author's note: This article is an adaptation of a [talk I gave at PyCascades][24] in Portland, Oregon on February 9, 2020._
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/5/web-scraping-python
+
+作者:[Julia Piaskowski][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/julia-piaskowski
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bus_html_code.png?itok=VjUmGsnl (HTML code)
+[2]: https://requests.readthedocs.io/en/master/
+[3]: https://beautiful-soup-4.readthedocs.io/en/latest/
+[4]: https://pandas.pydata.org/
+[5]: https://www.selenium.dev/
+[6]: https://github.com/jpiaskowski/pycas2020_web_scraping
+[7]: https://opensource.com/article/20/4/install-python-linux
+[8]: https://opensource.com/article/19/8/how-install-python-windows
+[9]: https://opensource.com/article/19/5/python-3-default-mac
+[10]: https://github.com/jpiaskowski/pycas2020_web_scraping/blob/master/example/Familydollar_location_scrape-all-states.ipynb
+[11]: https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html
+[12]: https://opensource.com/article/20/4/build-websites
+[13]: https://www.contentkingapp.com/academy/robotstxt/
+[14]: https://www.researchgate.net/publication/324907302_Legality_and_Ethics_of_Web_Scraping
+[15]: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3221625
+[16]: https://locations.familydollar.com/id/
+[17]: https://opensource.com/sites/default/files/uploads/familydollar1.png (Family Dollar Idaho locations page)
+[18]: https://opensource.com/sites/default/files/uploads/familydollar2.png (Family Dollar page source code)
+[19]: https://opensource.com/sites/default/files/uploads/familydollar3.png (Family Dollar map and code)
+[20]: https://opensource.com/sites/default/files/uploads/walgreens1.png (Walgreens location page and code)
+[21]: https://opensource.com/sites/default/files/uploads/walgreens2.png (Walgreens source code)
+[22]: https://www.walgreens.com/storelistings/storesbycity.jsp?requestType=locator\&state=ID
+[23]: https://opensource.com/sites/default/files/uploads/family_dollar_locations.png (Family Dollar locations map)
+[24]: https://2020.pycascades.com/talks/adventures-in-babysitting-webscraping-for-python-and-html-novices/
diff --git a/sources/tech/20200522 Fast data modeling with JavaScript.md b/sources/tech/20200522 Fast data modeling with JavaScript.md
new file mode 100644
index 0000000000..9c565d6e90
--- /dev/null
+++ b/sources/tech/20200522 Fast data modeling with JavaScript.md
@@ -0,0 +1,452 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Fast data modeling with JavaScript)
+[#]: via: (https://opensource.com/article/20/5/data-modeling-javascript)
+[#]: author: (Szymon https://opensource.com/users/schodevio)
+
+Fast data modeling with JavaScript
+======
+This tutorial showcases a method to model data in just a few minutes.
+![Analytics: Charts and Graphs][1]
+
+As a backend developer at the [Railwaymen][2], a software house in Kraków, Poland, some of my tasks rely on models that manipulate and customize data retrieved from a database. When I wanted to improve my skills in frontend frameworks, I [chose Vue][3], and I thought it would be good to have a similar way to model data in a store. I started with some libraries that I found through [NPM][4], but they offered many more features than I needed.
+
+So I decided to build my own solution, and I was very surprised that the base took less than 15 lines of code and is very flexible. I implemented this solution in an open source application which I developed and called [Evally][5] - a web app that helps businesses keep track of their employees' performance reviews and professional development. It reminds managers or HR representatives about employees' upcoming evaluations and gathers all of the data needed to assess their performance in the fairest way.
+
+### Model and list
+
+The only things you need to do are to create a class and use the defaultsDeep function in the [Lodash][6] JavaScript library:
+
+
+```
+`_.defaultsDeep(object, [sources])`
+```
+
+Arguments:
+
+ * `object (Object)`: The destination object
+ * `[sources] (...Object)`: The source objects
+
+
+
+Returns:
+
+ * `(Object)`: Returns object
+
+
+
+This helper function: [Lodash Docs][7]
+
+> "Assigns recursively own and inherited enumerable string keyed properties of source objects to the destination object for all destination properties that resolve to undefined. Source objects are applied from left to right. Once a property is set, additional values of the same property are ignored."
+
+For example:
+
+
+```
+_.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } })
+ // => { 'a': { 'b': 2, 'c': 3 } }
+```
+
+That's all! To try it out, create a file called **base.js** and import the defaultsDeep function from the Lodash package:
+
+
+```
+ // base.js
+ import defaultsDeep from "lodash/defaultsDeep";
+```
+
+Next, create and export the Model class, where constructor will use the Lodash helper function to assign values to all passed attributes and initialize the attributes that were not received with default values:
+
+
+```
+ // base.js
+ // ...
+
+ export class Model {
+ constructor(attributes = {}) {
+ defaultsDeep(this, attributes, this.defaults);
+ }
+ }
+```
+
+Now, create your first real model, Employee, with attributes for firstName, lastName, position and hiredAt where "position" defines "Programmer" as the default value:
+
+
+```
+ // employee.js
+ import { Model } from "./base.js";
+
+ export class Employee extends Model {
+ get defaults() {
+ return {
+ firstName: "",
+ lastName: "",
+ position: "Programmer",
+ hiredAt: ""
+ };
+ }
+ }
+```
+
+Next, begin creating employees:
+
+
+```
+// app.js
+ import { Employee } from "./employee.js";
+
+ const programmer = new Employee({
+ firstName: "Will",
+ lastName: "Smith"
+ });
+
+ // => Employee {
+ // firstName: "Will",
+ // lastName: "Smith",
+ // position: "Programmer",
+ // hiredAt: "",
+ // constructor: Object
+ // }
+
+ const techLeader = new Employee({
+ firstName: "Charles",
+ lastName: "Bartowski",
+ position: "Tech Leader"
+ });
+
+ // => Employee {
+ // firstName: "Charles",
+ // lastName: "Bartowski",
+ // position: "Tech Leader",
+ // hiredAt: "",
+ // constructor: Object
+ // }
+```
+
+You have two employees, and the first one's position is assigned from the defaults. Here's how multiple employees can be defined:
+
+
+```
+ // base.js
+
+ // ...
+
+ export class List {
+ constructor(items = []) {
+ this.models = items.map(item => new this.model(item));
+ }
+ }
+
+[/code] [code]
+
+ // employee.js
+ import { Model, List } from "./base.js";
+
+ // …
+
+ export class EmployeesList extends List {
+ get model() {
+ return Employee;
+ }
+ }
+```
+
+The List class constructor maps an array of received items into an array of desired models. The only requirement is to provide a correct model class name:
+
+
+```
+ // app.js
+ import { Employee, EmployeesList } from "./employee.js";
+
+ // …
+
+ const employees = new EmployeesList([
+ {
+ firstName: "Will",
+ lastName: "Smith"
+ },
+ {
+ firstName: "Charles",
+ lastName: "Bartowski",
+ position: "Tech Leader"
+ }
+ ]);
+
+ // => EmployeesList {models: Array[2], constructor: Object}
+ // models: Array[2]
+ // 0: Employee
+ // firstName: "Will"
+ // lastName: "Smith"
+ // position: "Programmer"
+ // hiredAt: ""
+ // <constructor>: "Employee"
+ // 1: Employee
+ // firstName: "Charles"
+ // lastName: "Bartowski"
+ // position: "Tech Leader"
+ // hiredAt: ""
+ // <constructor>: "Employee"
+ // <constructor>: "EmployeesList"
+```
+
+### Ways to use this approach
+
+This simple solution allows you to keep your data structure in one place and avoid code repetition. The [DRY][8] principle rocks! You can also customize your models as needed, such as in the following examples.
+
+#### Custom getters
+
+Do you need one attribute to be dependent on the others? No problem; you can do this by improving your Employee model:
+
+
+```
+// employee.js
+ import { Model } from "./base.js";
+
+ export class Employee extends Model {
+ get defaults() {
+ return {
+ firstName: "",
+ lastName: "",
+ position: "Programmer",
+ hiredAt: ""
+ };
+ }
+
+ get fullName() {
+ return [this.firstName, this.lastName].join(' ')
+ }
+
+ }
+
+[/code] [code]
+
+// app.js
+ import { Employee, EmployeesList } from "./employee.js";
+
+ // …
+
+ console.log(techLeader.fullName);
+ // => Charles Bartowski
+```
+
+Now you don't have to repeat the code to do something as simple as displaying the employee's full name.
+
+#### Date formatting
+
+Model is a good place to define other formats for given attributes. The best examples are dates:
+
+
+```
+// employee.js
+ import { Model } from "./base.js";
+ import moment from 'moment';
+
+ export class Employee extends Model {
+ get defaults() {
+ return {
+ firstName: "",
+ lastName: "",
+ position: "Programmer",
+ hiredAt: ""
+ };
+ }
+
+ get formattedHiredDate() {
+ if (!this.hiredAt) return "---";
+
+ return moment(this.hiredAt).format('MMMM DD, YYYY');
+ }
+ }
+
+[/code] [code]
+
+// app.js
+ import { Employee, EmployeesList } from "./employee.js";
+
+ // …
+
+ techLeader.hiredAt = "2020-05-01";
+
+ console.log(techLeader.formattedHiredDate);
+ // => May 01, 2020
+```
+
+Another case related to dates (which I discovered developing the Evally app) is the ability to operate with different date formats. Here's an example that uses datepicker:
+
+ 1. All employees fetched from the database have the hiredAt date in the format:
+YEAR-MONTH-DAY, e.g., 2020-05-01
+ 2. You need to display the hiredAt date in a more friendly format:
+MONTH DAY, YEAR, e.g., May 01, 2020
+ 3. A datepicker uses the format:
+DAY-MONTH-YEAR, e.g., 01-05-2020
+
+
+
+Resolve this issue with:
+
+
+```
+// employee.js
+ import { Model } from "./base.js";
+ import moment from 'moment';
+
+ export class Employee extends Model {
+
+ // …
+
+ get formattedHiredDate() {
+ if (!this.hiredAt) return "---";
+
+ return moment(this.hiredAt).format('MMMM DD, YYYY');
+ }
+
+ get hiredDate() {
+ return (
+ this.hiredAt
+ ? moment(this.hiredAt).format('DD-MM-YYYY')
+ : ''
+ );
+ }
+
+ set hiredDate(date) {
+ const mDate = moment(date, 'DD-MM-YYYY');
+
+ this.hiredAt = (
+ mDate.isValid()
+ ? mDate.format('YYYY-MM-DD')
+ : ''
+ );
+ }
+ }
+```
+
+This adds getter and setter functions to handle datepicker's functionality.
+
+
+```
+ // Get date from server
+ techLeader.hiredAt = '2020-05-01';
+ console.log(techLeader.formattedHiredDate);
+ // => May 01, 2020
+
+ // Datepicker gets date
+ console.log(techLeader.hiredDate);
+ // => 01-05-2020
+
+ // Datepicker sets new date
+ techLeader.hiredDate = '15-06-2020';
+
+ // Display new date
+ console.log(techLeader.formattedHiredDate);
+ // => June 15, 2020
+```
+
+This makes it very simple to manage multiple date formats.
+
+#### Storage for model-related information
+
+Another use for a model class is storing general information related to the model, like paths for routing:
+
+
+```
+// employee.js
+ import { Model } from "./base.js";
+ import moment from 'moment';
+
+ export class Employee extends Model {
+
+ // …
+
+ static get routes() {
+ return {
+ employeesPath: '/api/v1/employees',
+ employeePath: id => `/api/v1/employees/${id}`
+ }
+ }
+
+ }
+
+[/code] [code]
+
+ // Path for POST requests
+ console.log(Employee.routes.employeesPath)
+
+ // Path for GET request
+ console.log(Employee.routes.employeePath(1))
+```
+
+### Customize the list of models
+
+Don't forget about the List class, which you can customize as needed:
+
+
+```
+// employee.js
+ import { Model, List } from "./base.js";
+
+ // …
+
+ export class EmployeesList extends List {
+ get model() {
+ return Employee;
+ }
+
+ findByFirstName(val) {
+ return this.models.find(item => item.firstName === val);
+ }
+
+ filterByPosition(val) {
+ return this.models.filter(item => item.position === val);
+ }
+ }
+
+[/code] [code]
+
+ console.log(employees.findByFirstName('Will'))
+ // => Employee {
+ // firstName: "Will",
+ // lastName: "Smith",
+ // position: "Programmer",
+ // hiredAt: "",
+ // constructor: Object
+ // }
+
+ console.log(employees.filterByPosition('Tech Leader'))
+ // => [Employee]
+ // 0: Employee
+ // firstName: "Charles"
+ // lastName: "Bartowski"
+ // position: "Tech Leader"
+ // hiredAt: ""
+ // <constructor>: "Employee"
+```
+
+### Summary
+
+This simple structure for data modeling in JavaScript should save you some development time. You can add new functions whenever you need them to keep your code cleaner and easier to maintain. All of this code is available in my [CodeSandbox][9], so try it out and let me know how it goes by leaving a comment below.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/5/data-modeling-javascript
+
+作者:[Szymon][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/schodevio
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/analytics-graphs-charts.png?itok=sersoqbV (Analytics: Charts and Graphs)
+[2]: https://railwaymen.org/
+[3]: https://blog.railwaymen.org/vue-vs-react-which-one-is-better-for-your-app-similarities-differences
+[4]: https://www.npmjs.com/
+[5]: https://github.com/railwaymen/evally
+[6]: https://lodash.com/
+[7]: https://lodash.com/docs/4.17.15
+[8]: https://en.wikipedia.org/wiki/Don%27t_repeat_yourself
+[9]: https://codesandbox.io/s/02jsdatamodels-1mhtb
diff --git a/sources/tech/20200524 Diamond interface composition in Go 1.14.md b/sources/tech/20200524 Diamond interface composition in Go 1.14.md
new file mode 100644
index 0000000000..611bb2c39e
--- /dev/null
+++ b/sources/tech/20200524 Diamond interface composition in Go 1.14.md
@@ -0,0 +1,124 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Diamond interface composition in Go 1.14)
+[#]: via: (https://dave.cheney.net/2020/05/24/diamond-interface-composition-in-go-1-14)
+[#]: author: (Dave Cheney https://dave.cheney.net/author/davecheney)
+
+Diamond interface composition in Go 1.14
+======
+
+Per the [overlapping interfaces proposal][1], Go 1.14 now permits embedding of interfaces with overlapping method sets. This is a brief post explain what this change means:
+
+Let’s start with the definition of the three key interfaces from the `io` package; `io.Reader`, `io.Writer`, and `io.Closer`:
+
+```
+package io
+
+type Reader interface {
+ Read([]byte) (int, error)
+}
+
+type Writer interface {
+ Write([]byte) (int, error)
+}
+
+type Closer interface {
+ Close() error
+}
+```
+
+Just as embedding a type inside a struct allows the embedded type’s fields and methods to be accessed as if it were declared on the embedding type[1][2], the process is true for interfaces. Thus there is no difference between explicitly declaring
+
+```
+type ReadCloser interface {
+ Read([]byte) (int, error)
+ Close() error
+}
+```
+
+and using embedding to compose the interface
+
+```
+type ReadCloser interface {
+ Reader
+ Closer
+}
+```
+
+You can even mix and match
+
+```
+type WriteCloser interface {
+ Write([]byte) (int, error)
+ Closer
+}
+```
+
+However, prior to Go 1.14, if you continued to compose interface declarations in this manner you would likely find that something like this,
+
+```
+type ReadWriteCloser interface {
+ ReadCloser
+ WriterCloser
+}
+```
+
+would fail to compile
+
+```
+% go build interfaces.go
+command-line-arguments
+./interfaces.go:27:2: duplicate method Close
+```
+
+Fortunately, with Go 1.14 this is no longer a limitation, thus solving problems that typically occur with diamond-shaped embedding graphs.
+
+However, there is a catch that I ran into attempting to demonstrate this feature to the local user group–this feature is only enabled when the Go compiler uses the 1.14 (or later) spec.
+
+As near as I can make out the rules for which version of the Go spec is used during compilation appear to be:
+
+ 1. If your source code is stored inside `GOPATH` (or you have _disabled_ modules with `GO111MODULE=off`) then the version of the Go spec used to compile with matches the version of the compiler you are using. Said another way, if you have Go 1.13 installed, your Go version is 1.13. If you have Go 1.14 installed, your version is 1.14. No surprises here.
+ 2. If your source code is stored outside `GOPATH` (or you have forced modules on with `GO111MODULE=on`) then the `go` tool will take the Go version from the `go.mod` file.
+ 3. If there is no Go version listed in `go.mod` then the version of the spec will be the version of Go installed. This is identical to point 1.
+ 4. If you are in module mode, either by being outside `GOPATH` or with `GO111MODULE=on`, but there is no `go.mod` file in the current, or any parent, directory then the version of the Go spec used to compile your code defaults to Go 1.13.
+
+
+
+The last point caught me out.
+
+ 1. It is said that embedding promotes the type’s fields and methods.[][3]
+
+
+
+### Related posts:
+
+ 1. [Struct composition with Go][4]
+ 2. [term: low level serial with a high level interface][5]
+ 3. [Accidental method value][6]
+ 4. [How does the go build command work ?][7]
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://dave.cheney.net/2020/05/24/diamond-interface-composition-in-go-1-14
+
+作者:[Dave Cheney][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://dave.cheney.net/author/davecheney
+[b]: https://github.com/lujun9972
+[1]: https://github.com/golang/proposal/blob/master/design/6977-overlapping-interfaces.md
+[2]: tmp.nUQHg5BP9T#easy-footnote-bottom-1-4179 (It is said that embedding promotes the type’s fields and methods.)
+[3]: tmp.nUQHg5BP9T#easy-footnote-1-4179
+[4]: https://dave.cheney.net/2015/05/22/struct-composition-with-go (Struct composition with Go)
+[5]: https://dave.cheney.net/2014/05/08/term-low-level-serial-with-a-high-level-interface (term: low level serial with a high level interface)
+[6]: https://dave.cheney.net/2014/05/19/accidental-method-value (Accidental method value)
+[7]: https://dave.cheney.net/2013/10/15/how-does-the-go-build-command-work (How does the go build command work ?)
diff --git a/sources/tech/20200525 CopyQ Clipboard Manager for Keeping a Track of Clipboard History.md b/sources/tech/20200525 CopyQ Clipboard Manager for Keeping a Track of Clipboard History.md
new file mode 100644
index 0000000000..616ee5971a
--- /dev/null
+++ b/sources/tech/20200525 CopyQ Clipboard Manager for Keeping a Track of Clipboard History.md
@@ -0,0 +1,113 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (CopyQ Clipboard Manager for Keeping a Track of Clipboard History)
+[#]: via: (https://itsfoss.com/copyq-clipboard-manager/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+CopyQ Clipboard Manager for Keeping a Track of Clipboard History
+======
+
+How do you copy-paste text? Let me guess. You either use the right click menu to copy-paste or use Ctrl+C to copy a text and Ctrl+V to paste the text. The text copied this way is saved to ‘clipboard’. The [clipboard][1] is a special location in the memory of your system that stores cut or copied text (and in some cases images).
+
+But have you ever been in a situation where you had a text copied and then you copy another text and then realize you needed the text you copied earlier? Trust me, it happens a lot.
+
+Instead of wondering about finding the previous text to copy again, you can use a clipboard manager.
+
+A clipboard manager is a handy little tool that keeps a history of the text you had copied. If you need to use the earlier copied text, you can use the clipboard manager to copy it again.
+
+![Clipboard][2]
+
+There are several clipboard managers available for Linux. In this article, I’ll cover one such tool that goes by the name CopyQ.
+
+### CopyQ Clipboard Manager
+
+[CopyQ][3] is nifty clipboard manager that has plenty of features to manage your system’s clipboard. It is an open source software available for free for major Linux distributions.
+
+Like any other clipboard manager, CopyQ monitors the system clipboard and saves its content. It can save both text and images from the clipboard.
+
+CopyQ sits in the system tray and you can easily access it from there. From the system tray, just click on the text that you want. It will automatically copy this text and you would notice that the copied text moves on to the top of the saved clipboards.
+
+![][4]
+
+In the system tray, it shows only the five recent clips. You can open the main window using the “Show/hide main window” option in the system tray. CopyQ saves up to 200 clips. You may edit the clipboard items here.
+
+![][5]
+
+You may also set a keyboard shortcut to bring the clipboard with a few key combination. This option is available in Preferences->Shortcuts.
+
+![][6]
+
+If you decide to use it, I advise enabling the autostart so that CopyQ runs automatically when you start your system. By default, it saves 200 items in the history and that’s a lot in my opinion. You may want to change that as well.
+
+![][7]
+
+CopyQ is an advanced clipboard manager with plenty of additional features. You can search for text in the saved clipboard items. You can sort, create, edit or change the order of the clipboard items.
+
+You can ignore clipboard copied from some windows or containing some text. You can also temporarily disable clipboard saving. CopyQ also supports [Vim][8]-like editor and shortcut for Vim fans.
+
+There are many more features that you may explore on your own. For me, the most notable feature is that it gives me easy access to older copied text, and I am happy with that.
+
+### Installing CopyQ on Linux
+
+CopyQ is available for Linux, Windows and macOS. You can get the executable file for Windows and macOS [from its website][3].
+
+For Linux, CopyQ is available in the repositories of all major Linux distributions. Which means that you can find it in your software center or install it using your distribution’s package manager.
+
+Ubuntu users may find it in the software center if [universe repository is enabled][9].
+
+![CopyQ in Ubuntu Software Center][10]
+
+Alternatively, you can use the apt command to install it:
+
+```
+sudo apt install copyq
+```
+
+Ubuntu users also have the option to [use the official PPA][11] and always get the latest stable CopyQ version. For example, at the time of writing this article, CopyQ version in Ubuntu 20.04 is 3.10 while [PPA has newer version][12] 3.11. It’s your choice really.
+
+```
+sudo add-apt-repository ppa:hluk/copyq
+sudo apt update
+sudo apt install copyq
+```
+
+You may also want to know [how to remove PPA][13] later.
+
+### Do you use a clipboard manager?
+
+I find it surprising that many people are not even aware of an essential utility like clipboard manager. For me, it’s one of the [essential productivity tools on Linux][14].
+
+As I mentioned at the beginning of the article, there are several clipboard managers available for Linux. CopyQ is one of such tools. Do you use or know of some other similar clipboard tool? Why not let us know in the comments?
+
+If you started using CopyQ after reading this article, do share your experience with it. What you liked and what you didn’t like? The comment section is all yours.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/copyq-clipboard-manager/
+
+作者:[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.computerhope.com/jargon/c/clipboar.htm
+[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/clipboard.png?ssl=1
+[3]: https://hluk.github.io/CopyQ/
+[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/copyq-system-tray.png?ssl=1
+[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/copyq-main-window.png?ssl=1
+[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/copyq-shortcuts.png?ssl=1
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/copyq-auto-start.png?ssl=1
+[8]: https://itsfoss.com/vim-8-release-install/
+[9]: https://itsfoss.com/ubuntu-repositories/
+[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/copyq-software-center.png?resize=800%2C474&ssl=1
+[11]: https://itsfoss.com/ppa-guide/
+[12]: https://launchpad.net/~hluk/+archive/ubuntu/copyq
+[13]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/
+[14]: https://itsfoss.com/productivity-tips-ubuntu/
diff --git a/sources/tech/20200525 Debian-s Decision to Drop Old Drivers has Upset Vintage Hardware Users.md b/sources/tech/20200525 Debian-s Decision to Drop Old Drivers has Upset Vintage Hardware Users.md
new file mode 100644
index 0000000000..fb2b9005ea
--- /dev/null
+++ b/sources/tech/20200525 Debian-s Decision to Drop Old Drivers has Upset Vintage Hardware Users.md
@@ -0,0 +1,85 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Debian’s Decision to Drop Old Drivers has Upset Vintage Hardware Users)
+[#]: via: (https://itsfoss.com/debian-dropping-old-drivers/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+Debian’s Decision to Drop Old Drivers has Upset Vintage Hardware Users
+======
+
+It is always a tough decision to drop support for older hardware for the latest Linux distribution releases. Just like [Ubuntu decided to drop support for 32-bit systems][1], Debian’s X Strike Force (XFS) team decided to drop a list of input and video drivers.
+
+### Debian is considering to drop support for really old hardware
+
+![][2]
+
+In case you didn’t know, the XFS team is responsible for maintaining packages the [X Window System][3] in [Debian][4]. And, the list of drivers that [they want to remove][5] are:
+
+ * xserver-xorg-input-aiptek
+ * xserver-xorg-input-elographics
+ * xserver-xorg-input-mtrack
+ * xserver-xorg-input-mutouch
+ * xserver-xorg-input-void
+ * server-xorg-video-ast
+ * xserver-xorg-video-mach64
+
+
+ * xserver-xorg-video-neomagic
+ * xserver-xorg-video-r128
+ * xserver-xorg-video-savage
+ * xserver-xorg-video-siliconmotion
+ * xserver-xorg-video-sisusb
+ * xserver-xorg-video-tdfx
+ * xserver-xorg-video-trident
+
+
+
+So, Mach 64, [ATI Rage R128][6], Savage, Silicon Motion, SiS, Trident, and NeoMagic are some of the graphics chipsets that would be affected. The reason (as stated by them) to drop these drivers is:
+
+> They are either unmaintained upstream or provide no value to the distribution.
+
+Now, that could make sense, if the packages are no longer maintained. But, upstream some of these X.org drivers are still **maintained** even if there are no frequent updates to them. For instance, in 2018, a [new display driver update was released for the ATI RAGE 128][7], as reported by Phoronix.
+
+### Vintage hardware owners are going to be upset
+
+Obviously, the vintage hardware users aren’t quite happy with the decision because a handful of people still own (or actively use) old hardware i.e. around 20 years older.
+
+From the original list of drivers mentioned in the [bug report][5], **Geode display driver** was initially decided to be removed but wasn’t dropped.
+
+It was also reported that the “**xserver-xorg-video-r128**” driver is required for older Apple hardware (iMac). And, a user reported about the missing video driver on his iMac.
+
+For most of the users, this decision may not actually affect any “production” systems because I don’t think anyone is probably going to utilize 20-year old hardware for commercial purposes.
+
+The hobbyists and collectors who like to preserve older tech are surely going to be impacted by this decision.
+
+### Wrapping Up
+
+In my opinion, dropping the support for incredibly dated hardware is not entirely a bad move.
+
+But, if there is a demand for the support of vintage hardware, the fair share of users who want the drivers to be added in Debian should help maintain those packages. If not, I don’t think it won’t be a wise choice to have an unmaintained piece of code in Debian.
+
+What do you think about this? Feel free to share your thoughts in the comments below!
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/debian-dropping-old-drivers/
+
+作者:[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/ubuntu-drops-32-bit-desktop/
+[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/debian-bug-report-driver-drop.jpg?ssl=1
+[3]: https://en.wikipedia.org/wiki/X_Window_System
+[4]: https://www.debian.org/
+[5]: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=955603
+[6]: https://en.wikipedia.org/wiki/ATI_Rage_series
+[7]: https://www.phoronix.com/scan.php?page=news_item&px=ATI-RAGE-128-DDX-6.11.0
diff --git a/sources/tech/20200525 EU Parliament Strongly Recommends Developing and Using Open Source Software.md b/sources/tech/20200525 EU Parliament Strongly Recommends Developing and Using Open Source Software.md
new file mode 100644
index 0000000000..bfeb5635ce
--- /dev/null
+++ b/sources/tech/20200525 EU Parliament Strongly Recommends Developing and Using Open Source Software.md
@@ -0,0 +1,84 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (EU Parliament Strongly Recommends Developing and Using Open Source Software)
+[#]: via: (https://itsfoss.com/eu-parliament-recommends-open-source/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+EU Parliament Strongly Recommends Developing and Using Open Source Software
+======
+
+Europe is choosing open source more than ever. Not just limited to [EU Commissions’ decision to use Signal messaging app][1] but also [open science][2] and the [adoption of open source software by European universities][3].
+
+Now, in a recent [press release][4] by the [European Pirate Party][5], it looks like the EU Parliament is urging EU institutions to use open-source software. All thanks to the Pirate amendments for encouraging the use of open-source software.
+
+The EU Parliament not just encourages the use of open-source software, but they have also advised to prioritize development of open-source software by the EU institutions.
+
+So, not just aiming to adopt using open-source software but to develop open-source software. And, that’s definitely good news!
+
+More use of open-source software, why not? To give you some more details, here’s what they mentioned in the press release:
+
+> **In practice, from now on, all IT solutions developed by and for the EU institutions will first need to be assessed against the possibility of using Open Source solutions. Assessments will then have to be reported back to the Budgetary Control Committee of the Parliament on an annual basis, during the discharge procedure. This is a strong call for enhancing our important citizens right to transparent and trustworthy information.**
+
+### Important decision to remove vendor lock-ins
+
+![Public Money Public Code Campaign][6]
+
+No matter who made this happen — this decision of preferring open-source software over proprietary will not just help the open-source community but also helps the EU institutions in a variety of ways.
+
+Especially, relying on open-source software removes the overhead of vendor lock-ins. In other words, an EU institution does not have to rely on vendor to manage/maintain the software.
+
+The press release also addressed this by mentioning:
+
+> It is essential for the European institutions to retain control over its own technical systems, especially in a context of disinformation and foreign interference. Open Source promotes local technical support, leads to rapid development of software and helps to avoid dependency on specific suppliers or vendor lock-in effects, which exist when only one company is in charge of software or even the entire IT infrastructure supply.
+
+Any responsible local organization can take up the task while the community can still help in any way it can. This could also reduce the cost of maintaining the software among other things like improving the security of a software in a collaborative manner.
+
+### Is this a big win for open-source community?
+
+![][7]
+
+Yes, and no. We’ve seen a lot of recommendations made by the governments (or the EU government in general) to choose open-source software to keep things more secure yet transparent.
+
+Pirate’s Vice-President of EU Parliament, **Marcel Kolaja**, mentions some advantages of this decision as well:
+
+_It’s a milestone for transparent and open digitization of the European institutions. From now on, the Open Source ecosystem has a stepping ground for offering Open Source solutions and the Pirates will gladly play the role of the guardians and will try to solve and highlight any attempt to bypass this strong recommendation. It’s a really important step to remove vendor lock-ins in the Parliament“_
+
+So, this will definitely help them earn trust of their citizens by providing digital transparency while also encouraging public participation to improve the software as well. Of course, this will also help introduce the concept of open-source software to many who were unaware of it in some way.
+
+Also, ensuring open-source software for publicly financed software will enhance the meaning of freedom of speech/privacy/press.
+
+In a nutshell, these decisions do have a positive impact in one way or the other.
+
+But, the implementations of these decisions will decide how effective it’s going to be to put the words in action.
+
+### Wrapping Up
+
+I’m happy with the decision by EU Parliament here — even though I’m not a European. I guess, this should encourage other government bodies to take similar decisions or steps to ensure digital transparency while earning the trust of their citizens.
+
+To get more details on the decision, you can refer to the [official press release by the European Pirate Party][4].
+
+What do you think about it? Let me know your thoughts in the comments below!
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/eu-parliament-recommends-open-source/
+
+作者:[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/eu-commission-switches-to-signal/
+[2]: https://ec.europa.eu/research/openscience/index.cfm?pg=openaccess
+[3]: https://opensource.com/article/20/5/open-source-higher-education
+[4]: https://european-pirateparty.eu/european-parliament-strongly-recommends-any-software-developed-by-and-for-the-eu-institutions-to-be-made-publicly-available-under-free-and-open-source-software-licence/
+[5]: https://en.wikipedia.org/wiki/European_Pirate_Party
+[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/public-money-public-code.png?resize=800%2C420&ssl=1
+[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/eu-parliament-open-source.jpg?ssl=1
diff --git a/sources/tech/20200525 Encrypt Your Files Before Uploading it to Cloud With Cryptomator.md b/sources/tech/20200525 Encrypt Your Files Before Uploading it to Cloud With Cryptomator.md
new file mode 100644
index 0000000000..eda3a2990e
--- /dev/null
+++ b/sources/tech/20200525 Encrypt Your Files Before Uploading it to Cloud With Cryptomator.md
@@ -0,0 +1,184 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Encrypt Your Files Before Uploading it to Cloud With Cryptomator)
+[#]: via: (https://itsfoss.com/cryptomator/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+Encrypt Your Files Before Uploading it to Cloud With Cryptomator
+======
+
+_**Open source software highlight of this week is Cryptomator. It is a unique free and open-source encryption software that lets you encrypt your data before uploading it to the cloud.**_
+
+There are several [cloud services available for Linux][1] and almost all of them do not offer [end to end encryption][2], at least not by default.
+
+Usually, the connection between your device and the server is secure. But your data stored on the server is not encrypted. Employees with direct access to the infrastructure at your cloud service providers may access this data.
+
+Of course, these companies have strict policies against such intrusion but a rogue employee can do a lot of damage. Remember the incident when a [departing Twitter employee deactivated the account of US President Donald Trump][3].
+
+If you are one of the privacy cautious people, you would want the ease of cloud storage but with the added security layer of encrypted storage.
+
+Now some [services like pCloud do provide end to end encryption][4] but that comes at an additional cost. If you could afford that, well and good. If not, you can use a free and open source tool like [Cryptomator][5].
+
+Cryptomator helps you secure your data by encrypting it before uploading it to any cloud storage services. In this article, I’m going to highlight the key features of Cryptomator along with instructions to use it.
+
+### Cryptomator: Add an encryption layer to your cloud data
+
+![][6]
+
+Cryptomator is a solution to encrypt your data locally before uploading it to the cloud.
+
+With this, you can create vaults locally and sync them to the cloud storage services you use.
+
+It’s very easy to use and you don’t need to have any specific technical knowledge to encrypt your data – that’s what Cryptomator is tailored for.
+
+### Features of Cryptomator
+
+Cryptomator is a simple encryption tool with the essential features. Here’s what it offers:
+
+ * [AES][7] and 256-bit Encryption for files.
+ * Ability to create a vault and sync it with the cloud storage service
+ * Optional recovery key for your master password of the vault
+ * Cross-platform support (Linux, Windows, macOS, Android, and iOS)
+ * Supports the dark theme for a one-time license fee.
+ * Supports [WebDAV][8], [FUSE][9], and [Dokany][10] for easy integration with your operating system.
+
+
+
+Do note that the [Android][11] and [iOS][12] apps are paid apps that you have to purchase separately while the desktop program is completely free to use. Also, you need to purchase a one-time license to unlock the dark mode. Don’t blame them please. They need to make some money in order to develop this open source software.
+
+### Installing Cryptomator on Linux
+
+Cryptomater provides an AppImage file that you can download to get started on any Linux distribution.
+
+You can get it from its [official download page][13]. In case you don’t know, please read [how to use an AppImage file][14] to get started.
+
+[Download Cryptomator][5]
+
+### How To Use Cryptomator?
+
+Attention!
+
+Encryption is a double-edged sword. It can protect you and it can hurt you as well.
+If you are encrypting your data and you forgot your encryption key, you’ll lose access to that data forever.
+Cryptomator provides a recovery key option so please be careful with both password and the recovery key. Don’t forget it or lose the recovery key.
+
+Once you have installed Cryptomator, it’s really easy to use it following the user interface or the [official documentation][15].
+
+But, to save you some time, I’ll highlight a few important things that you should know:
+
+#### Setup Your Vault
+
+![][16]
+
+After launching Cryptomator, you need to create the vault where you want to have your encrypted data.
+
+This can be an existing location or a new custom directory as per your requirements.
+
+Now that you proceed creating a new vault, you will also observe that you can open an existing vault as well (if you had one already). So, always have a backup of your vault, just in case.
+
+![][17]
+
+Here, I am assuming that you are a new user. So, obviously, proceed to create a new vault and give it a name:
+
+![][18]
+
+Next, you need to specify a storage location. If you already use OneDrive, Dropbox, Google Drive, or something similar, it might detect it automatically.
+
+![][19]
+
+However, if it doesn’t, like in my case (I use [pCloud][20]), you can select the cloud-synced directory or any other custom location manually.
+
+Once you select the location, you just need to create a password for it. It’s best to create a strong password that you can remember.
+
+![][21]
+
+Also, I’d suggest you to opt for the recovery key and store it in a separate USB drive or just print it on a paper.
+
+![][22]
+
+And, that’s it. You’re done creating your secure vault that you can sync with the cloud.
+
+![][23]
+
+Now, how do you add files to it? Let’s take a look:
+
+#### Adding Files To A Vault
+
+_**Note:** You can’t just go into the folder that you created from the file manager and files there. Follow the steps below to add files properly in your encrypted vault._
+
+Once you’ve created your vault, you just need to unlock it by typing the password as shown in the image below. If you’re on your personal computer, you can choose to save the password without needing to enter it every time you access the vault. However, I advise not to do that. Manually entering the password help in remembering it.
+
+![][24]
+
+Next, after unlocking the vault, you just need to click on “**Reveal Vault**” or reveal drive to open it using **File Manager** where you can access/modify or add files to it.
+
+#### Backup / Recover Your Vault
+
+You should simply copy-paste the folder you create to another USB drive or somewhere else other than your cloud storage folder to ensure that you have a backup of your vault.
+
+![][25]
+
+It’s important to have the **masterkey.cryptomator** file of the vault in order to open it.
+
+#### Upgrades, Preferences & Settings
+
+Note
+
+You should enable the auto-updates feature to ensure that you will have the most stable and error-free version automatically.
+
+Apart from the most important functions of the Cryptomator app, you will get a couple of other features to tweak, such as:
+
+ * Change the type of your virtual drive
+ * Tweak the vault to read-only mode
+
+
+
+You can explore the **Vault options** and the settings on Cryptomator to know about what else you can do.
+
+**Wrapping Up**
+
+Now that you know about Cryptomator, you can easily encrypt your important data locally before uploading them to the cloud.
+
+What do you think about Cryptomator? Let us know your thoughts in the comments down below!
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/cryptomator/
+
+作者:[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/cloud-services-linux/
+[2]: https://en.wikipedia.org/wiki/End-to-end_encryption
+[3]: https://www.theverge.com/2017/11/2/16600732/donald-trump-twitter-account-gone-realdonaldtrump
+[4]: https://partner.pcloud.com/r/22317
+[5]: https://cryptomator.org/
+[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-ft.jpg?ssl=1
+[7]: https://en.wikipedia.org/wiki/Advanced_Encryption_Standard
+[8]: https://en.wikipedia.org/wiki/WebDAV
+[9]: https://en.wikipedia.org/wiki/Filesystem_in_Userspace
+[10]: https://en.wikipedia.org/wiki/Dokan_Library
+[11]: https://play.google.com/store/apps/details?id=org.cryptomator&hl=en_US
+[12]: https://apps.apple.com/us/app/cryptomator/id953086535
+[13]: https://cryptomator.org/downloads/
+[14]: https://itsfoss.com/use-appimage-linux/
+[15]: https://docs.cryptomator.org
+[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-add-vault.jpg?ssl=1
+[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-create-open-vault.jpg?ssl=1
+[18]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-add-vault-name.jpg?ssl=1
+[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-vault-location.jpg?ssl=1
+[20]: https://itsfoss.com/recommends/pcloud/
+[21]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-pass.jpg?ssl=1
+[22]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-recovery.jpg?ssl=1
+[23]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-vault-success.jpg?ssl=1
+[24]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-unlock.jpg?ssl=1
+[25]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/cryptomator-master.jpg?ssl=1
diff --git a/sources/tech/20200525 How to Assign Static IP Address on Ubuntu Linux.md b/sources/tech/20200525 How to Assign Static IP Address on Ubuntu Linux.md
new file mode 100644
index 0000000000..87ddb6b839
--- /dev/null
+++ b/sources/tech/20200525 How to Assign Static IP Address on Ubuntu Linux.md
@@ -0,0 +1,179 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to Assign Static IP Address on Ubuntu Linux)
+[#]: via: (https://itsfoss.com/static-ip-ubuntu/)
+[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/)
+
+How to Assign Static IP Address on Ubuntu Linux
+======
+
+_**Brief: In this tutorial, you’ll learn how to assign static IP address on Ubuntu and other Linux distributions. Both command line and GUI methods have been discussed.**_
+
+IP addresses on Linux Systems in most cases are assigned by [Dynamic Host Configuration Protocol][1] (DHCP) servers. IP addresses assigned this way are dynamic which means that the IP address might change when you [restart your Ubuntu system][2]. It’s not necessary but it may happen.
+
+_**Dynamic IP is not an issue for normal desktop Linux users in most cases**_. It could become an issue if you have employed some special kind of networking between your computers.
+
+For example, you can [share your keyboard and mouse between Ubuntu and Raspberry Pi][3]. The configuration uses IP addresses of both system. If the IP address changes dynamically, then your setup won’t work.
+
+Another use case is with servers or remotely administered desktops. It is easier to set static addresses on those systems for connection stability and consistency between the users and applications.
+
+In this tutorial, I’ll show you how to set up static IP address on Ubuntu based Linux distributions. Let me show you the command line way first and then I’ll show the graphical way of doing it on desktop.
+
+### Method 1: Assign static IP in Ubuntu using command line
+
+![][4]
+
+**Note for desktop users**: Use static IP only when you need it. Automatic IP saves you a lot of headache in handling network configuration.
+
+#### Step 1: Get the name of network interface and the default gateway
+
+The first thing you need to know is the name of the network interface for which you have to set up the static IP.
+
+You can either use ip command or the network manager CLI like this:
+
+```
+nmcli d
+```
+
+In my case, it shows my Ethernet (wired) network is called enp0s25:
+
+```
+Ubuntu> nmcli d
+DEVICE TYPE STATE CONNECTION
+enp0s25 ethernet unmanaged --
+lo loopback unmanaged --
+```
+
+Next, you should note the [default gateway IP using the Linux command][5] **ip route**:
+
+```
+ip route
+default via 192.168.31.1 dev enp0s25 proto dhcp metric 600
+169.254.0.0/16 dev enp0s25 scope link metric 1000
+192.168.31.0/24 dev enp0s25 proto kernel scope link src 192.168.31.36 metric 600
+```
+
+As you can guess, the default gateway is 192.168.31.1 for me.
+
+#### Step 2: Locate Netplan configuration
+
+Ubuntu 18.04 LTS and later versions use [Netplan][6] for managing the network configuration. Netplan configuration are driven by .yaml files located in **/etc/netplan** directory.
+
+By default, you should see a .yaml file named something like 01-network-manager-all.yaml, 50-cloud-init.yaml, 01-netcfg.yaml.
+
+Whatever maybe the name, its content should look like this:
+
+```
+# Let NetworkManager manage all devices on this system
+network:
+ version: 2
+ renderer: NetworkManager
+```
+
+You need to edit this file for using static IP.
+
+#### Step 3: Edit Netplan configuration for assigning static IP
+
+_**Just for the sake of it, make a backup of your yaml file.**_
+
+Please make sure to use the correct yaml file name in the commands from here onward.
+
+Use nano editor with sudo to open the yaml file like this:
+
+```
+sudo nano /etc/netplan/01-netcfg.yaml
+```
+
+Please note that _**yaml files use spaces for indentation**_. If you use tab or incorrect indention, your changes won’t be saved.
+
+You should edit the file and make it look like this by providing the actual details of your IP address, gateway, interface name etc.
+
+```
+network:
+ version: 2
+ renderer: networkd
+ ethernets:
+ enp0s25:
+ dhcp4: no
+ addresses:
+ - 192.168.31.16/24
+ gateway4: 192.168.31.1
+ nameservers:
+ addresses: [8.8.8.8, 1.1.1.1]
+```
+
+In the above file, I have set the static IP to 192.168.31.16.
+
+Save the file and apply the changes with this command:
+
+```
+sudo netplan apply
+```
+
+You can verify it by [displaying your ip address in the terminal][7] with ‘ip a’ command.
+
+Revert the changes and go back to dynamic IP
+
+If you don’t want to use the static IP address anymore, you can revert easily.
+
+If you have backed up the original yaml file, you can delete the new one and use the backup one.
+
+Otherwise, you can change the yaml file again and make it look like this:
+
+```
+network:
+ version: 2
+ renderer: networkd
+ ethernets:
+ enp0s25:
+ dhcp4: yes
+```
+
+### Method 2: Switch to static IP address in Ubuntu graphically
+
+If you are on desktop, using the graphical method is easier and faster.
+
+Go to the settings and look for network settings. Click the gear symbol adjacent to your network connection.
+
+![][8]
+
+Next, you should go to the IPv4 tab. Under the IPv4 Method section, click on Manual.
+
+In the Addresses section, enter the IP static IP address you want, netmask is usually 24 and you already know your gateway IP with the ip route command.
+
+You may also change the DNS server if you want. You can keep Routes section to Automatic.
+
+![][9]
+
+Once everything is done, click on Apply button. See, how easy it is to set a static IP address graphically.
+
+If you haven’t read my previous article on [how to change MAC Address][10], you may want to read in conjunction with this one.
+
+More networking related articles will be rolling out, let me know your thoughts at the comments below and stay connected to our social media.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/static-ip-ubuntu/
+
+作者:[Dimitrios Savvopoulos][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/dimitrios/
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol
+[2]: https://itsfoss.com/schedule-shutdown-ubuntu/
+[3]: https://itsfoss.com/keyboard-mouse-sharing-between-computers/
+[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/static-ip-ubuntu.jpg?ssl=1
+[5]: https://linuxhandbook.com/find-gateway-linux/
+[6]: https://netplan.io/
+[7]: https://itsfoss.com/check-ip-address-ubuntu/
+[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/assign-static-ip-1.jpg?ssl=1
+[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/assign-static-ip-2.jpg?ssl=1
+[10]: https://itsfoss.com/change-mac-address-linux/
diff --git a/sources/tech/20200525 How to Compress PDF in Linux -GUI - Terminal.md b/sources/tech/20200525 How to Compress PDF in Linux -GUI - Terminal.md
new file mode 100644
index 0000000000..eba596bcb9
--- /dev/null
+++ b/sources/tech/20200525 How to Compress PDF in Linux -GUI - Terminal.md
@@ -0,0 +1,99 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to Compress PDF in Linux [GUI & Terminal])
+[#]: via: (https://itsfoss.com/compress-pdf-linux/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+How to Compress PDF in Linux [GUI & Terminal]
+======
+
+_**Brief: Learn how to reduce the size of a PDF file in Linux. Both command line and GUI methods have been discussed.**_
+
+I was filling some application form and it asked to upload the necessary documents in PDF format. Not a big issue. I gathered all the [scanned images and combined them in one PDF using gscan2pdf tool][1].
+
+The problem came when I tried to upload this PDF file. The upload failed because it exceeded the maximum file size limit. This only meant that I needed to somehow reduce the size of the PDF file.
+
+Now, you may use an online PDF compressing website but I don’t trust them. A file with important documents uploading to an unknown server is not a good idea. You could never be sure that they don’t keep a copy your uploaded PDF document.
+
+This is the reason why I prefer compressing PDF files on my system rather than uploading it to some random server.
+
+In this quick tutorial, I’ll show you how to reduce the size of PDF files in Linux. I’ll show both command line and GUI methods.
+
+### Method 1: Reduce PDF file size in Linux command line
+
+![][2]
+
+You can use [Ghostscript][3] command line tool for compressing a PDF file. Most Linux distributions include the open source version of Ghostscript already. However, you can still try to install it just to make sure.
+
+On Debian/Ubuntu based distributions, use the following command to install Ghostscript:
+
+```
+sudo apt install ghostscript
+```
+
+Now that you have made sure that Ghostscript is installed, you can use the following command to reduce the size of your PDF file:
+
+```
+gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/prepress -dNOPAUSE -dQUIET -dBATCH -sOutputFile=compressed_PDF_file.pdf input_PDF_file.pdf
+```
+
+In the above command, you should add the correct path of the input and out PDF file.
+
+The command looks scary and confusing. I advise copying and pasting most of it. What you need to know is the dPDFSETTINGS parameter. This is what determines the compression level and thus the quality of your compressed PDF file.
+
+dPDFSETTINGS | Description
+---|---
+/prepress (default) | Higher quality output (300 dpi) but bigger size
+/ebook | Medium quality output (150 dpi) with moderate output file size
+/screen | Lower quality output (72 dpi) but smallest possible output file size
+
+Do keep in mind that some PDF files may not be compressed a lot or at all. Applying compression on some PDF files may even produce a file bigger than the original. There is not much you can do in such cases.
+
+### Method 2: Compress PDF files in Linux using GUI tool
+
+I understand that not everyone is comfortable with command line tool. The [PDF editors in Linux][4] doesn’t help much with compression. This is why we at It’s FOSS worked on creating a GUI version of the Ghostscript command that you saw above.
+
+[Panos][5] from It’s FOSS team [worked on creating a Python-Qt based GUI wrapper for the Ghostscript][6]. The tool gives you a simple UI where you can select your input file, select a compression level and click on the compress button to compress the PDF file.
+
+![][7]
+
+The compressed PDF file is saved in the same folder as the original PDF file. Your original PDF file remains untouched. The compressed file is renamed by appending -compressed to the original file name.
+
+If you are not satisfied with the compression, you can choose another compression level and compress the file again.
+
+You may find the source code of the PDF Compressor on our GitHub repository. To let you easily use the tool, we have packaged it in AppImage format. Please [refer to this guide to know how to use AppImage][8].
+
+[Download PDF Compressor (AppImage)][9]
+
+Please keep in mind that the tool is in early stages of developments. You may experience some issues. If you do, please let us know in the comments or even better, [file a bug here][10].
+
+We’ll try to add more packages (Snap, Deb, PPAs etc) in the future releases. If you have experience with the development and packaging, please feel free to give us a hand.
+
+Would you like It’s FOSS team to work on creating more such small desktop tools in future? Your feedback and suggestions are welcome.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/compress-pdf-linux/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/convert-multiple-images-pdf-ubuntu-1304/
+[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/compress-pdf-linux.jpg?ssl=1
+[3]: https://www.ghostscript.com/
+[4]: https://itsfoss.com/pdf-editors-linux/
+[5]: https://github.com/libreazer
+[6]: https://github.com/itsfoss/compress-pdf
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/compress-PDF.jpg?fit=800%2C448&ssl=1
+[8]: https://itsfoss.com/use-appimage-linux/
+[9]: https://github.com/itsfoss/compress-pdf/releases/download/0.1/compress-pdf-v0.1-x86_64.AppImage
+[10]: https://github.com/itsfoss/compress-pdf/issues
diff --git a/sources/tech/20200525 How to Install Linux Mint in VirtualBox -Screenshot Tutorial.md b/sources/tech/20200525 How to Install Linux Mint in VirtualBox -Screenshot Tutorial.md
new file mode 100644
index 0000000000..1fc324e817
--- /dev/null
+++ b/sources/tech/20200525 How to Install Linux Mint in VirtualBox -Screenshot Tutorial.md
@@ -0,0 +1,194 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to Install Linux Mint in VirtualBox [Screenshot Tutorial])
+[#]: via: (https://itsfoss.com/install-linux-mint-in-virtualbox/)
+[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/)
+
+How to Install Linux Mint in VirtualBox [Screenshot Tutorial]
+======
+
+_**Brief: One of safest and easiest ways to try Linux Mint is inside a virtual machine. Your real system doesn’t change at all. Learn how to install Linux Mint in VirtualBox in this tutorial.**_
+
+[Linux Mint][1] is considered one of the [best distributions for new Linux users][2]. Its flagship Cinnamon DE is one of the most popular desktop environment giving your system a look and feel of classic Window-styled desktop.
+
+If you want to try Linux Mint and see if it fits your need, you could try installing it in a virtual machine. This way, you run Linux Mint inside your current system without changing your system’s partition or boot order. One of the safest way out there as you get to run Linux like a regular desktop application inside your current operating system.
+
+![][3]
+
+Oracle’s open source virtualization tool [VirtualBox][4] is available for free on all major desktop operating systems i.e. Windows, Linux and macOS.
+
+In this beginner’s tutorial, I’ll show you the steps for installing Linux Mint in VirtualBox. I am including the screenshots for each step so that you can easily follow the tutorial.
+
+### Installing Linux Mint in VirtualBox
+
+You can follow the steps on any operating system be it Windows, Linux or macOS. You just need to install VirtualBox on your operating system and rest of the steps remain the same.
+
+**Step 1:** [Download VirtualBox from its website][4] and install it by double-clicking on the downloaded file.
+
+![][5]
+
+Next, install the latest version of Linux Mint’s ISO file from its website.
+
+[Download Linux Mint ISO][6]
+
+**Step 2:** Once your virtual Box is up & running we are ready to get started. Click the New button, click Next on the virtual machine wizard.
+
+![Create a new Virtual Machine][7]
+
+Initially you need to specify the following:
+
+ * Name: Any preferred name for your VM like Linux Mint
+ * Type: Linux
+ * Version: Ubuntu (64 bit) as Linux Mint is an Ubuntu-based distribution
+
+
+
+Before configuring any hardware resource value, please make sure that are aware of the [system requirements][8].
+
+2 GB RAM would be okay but won’t give you a good experience. 3 GB is a comfortable amount if your system has 8 GB of RAM. I choose to set my Virtual Machine to 4096 MB (4 GB) because my system has plenty of RAM.
+
+RAM consumption
+
+One of the common confusion is regarding the RAM consumption. Let’s say your Windows system has 8 GB of RAM and you assign 3 GB of RAM to Linux Mint in VirtualBox.
+
+If you are running Linux Mint inside VirtualBox, your real system (called host system) will have 5 GB of RAM available for consumption.
+
+If you are not running Linux Mint inside VirtualBox, at that moment, the entire 8 GB will be available to the host system.
+
+**Step 3:** Next, choose a Virtual Hard disk now option and click create.
+
+Choose the virtual storage allocation method (Recommended Dynamically allocated). Set your storage location for virtual hard disk by browsing drive and then specify the size of virtual hard disk (it could be anything from 12-20 GB).
+
+![Dynamic allocation can save you space if you don’t need the maximum allowance][9]
+
+**Step (4 (optional advanced settings):** Once Virtual machine has been created, click on the settings button in menu:
+
+![][10]
+
+Now, go to the Display section. Specify the Video memory (128 MB) and check “Enable 3D Acceleration”.
+
+![Don’t forget to enable the 3D Acceleration][11]
+
+Then click on System Tab → Processor and choose how many threads would you like to allocate.
+
+My system is a 4 core/4 thread system and I choose to assign half of the CPU capability i.e. 2 threads.
+
+![Select CPU cores as per the distribution requirements][12]
+
+Once you have configured everything click ok.
+
+**Step 5:** In the System settings, go to Storage (from the left sidebar). Click on the [Optical Drive] Empty as shown in the image below.
+
+You’ll be asked to browse to the Linux Mint ISO file you had downloaded earlier.
+
+![][13]
+
+Once you select your ISO, click on the start button and that’s it! Now the ISO will start running as if you are booting from a live USB.
+
+Next, you need to press enter whilst your option is start Linux Mint as per the picture below.
+
+![][14]
+
+**Step 6:** Let’s start the installation procedure.
+
+Choose the language you want for your Linux Mint virtual machine.
+
+![Choose your native language][15]
+
+I’m based in the UK, so I have a UK keyboard layout. You can choose the one you want.
+
+![Choose your keyboard layout according to your hardware configuration][16]
+
+You may check the box to download and install any third-party software during the installation.
+
+![You may install media codecs while installing Linux Mint][17]
+
+You can proceed to erase the disk and install Linux Mint.
+
+Erase disk? Really?
+
+This step may seem scary because you may think that it will harm your real system.
+
+Let me assure you that it won’t do any damage to your actual disk. Remember you created 10-20 GB of virtual disk in step 3? Now you are inside that disk.
+
+When it asks for erasing the disk, it is erasing the virtual disk created for it. It doesn’t impact your real system disk and its data.
+
+![It is safe to erase your disk only at a Virtual Machine level][18]
+
+Next, select your time zone and click continue. You may [change time zone in Linux][19] later as well.
+
+![][20]
+
+You will be prompted to create your user account, your host name (computer’s name) and to choose a password. Once done, click continue to finalize the installation.
+
+![][21]
+
+Please wait a few minutes for the process to complete.
+
+![Wait a few minutes for the process to finish][22]
+
+The installation has now finished. Click on “Restart now”.
+
+![Well done! You have successfully installed Linux Mint][23]
+
+When you reach this step, Linux Mint will be installed and ready to use!
+
+![][24]
+
+You don’t have an installation medium so just power off the virtual machine.
+
+![][25]
+
+Now to use your virtual machine, click on the start button.
+
+![][26]
+
+You can explore a fully functional system, and at this time if you shut down Linux Mint like it was physically installed, it will automatically power off the virtual machine.
+
+![][27]
+
+Enjoy Linux Mint in VirtualBox. I hope you were able to install Linux Mint in VirtualBox. If you face any issues, please let me know in the comment section. I’ll try to help you out.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/install-linux-mint-in-virtualbox/
+
+作者:[Dimitrios Savvopoulos][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/dimitrios/
+[b]: https://github.com/lujun9972
+[1]: https://www.linuxmint.com/
+[2]: https://itsfoss.com/best-linux-beginners/
+[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/install-linux-mint-in-virtualbox.png?ssl=1
+[4]: https://www.virtualbox.org/
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/download-virtulabox.jpg?ssl=1
+[6]: https://www.linuxmint.com/download.php
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/1.-Create-new.jpg?ssl=1
+[8]: https://blog.linuxmint.com/?p=3832
+[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/2.-Create-virtual-hard-disk.jpg?resize=800%2C472&ssl=1
+[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/3.-settings.jpg?resize=800%2C470&ssl=1
+[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/4.-display.jpg?resize=800%2C472&ssl=1
+[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/5.-cpu.jpg?resize=800%2C468&ssl=1
+[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/6.-choose-iso.jpg?resize=800%2C472&ssl=1
+[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/7.-boot.jpg?resize=800%2C459&ssl=1
+[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/8.-choose-language.png?resize=800%2C679&ssl=1
+[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/9.-English-UK.png?resize=800%2C679&ssl=1
+[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/10.-install-third-party-software.png?resize=800%2C679&ssl=1
+[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/11.-installation-type.png?resize=800%2C679&ssl=1
+[19]: https://itsfoss.com/change-timezone-ubuntu/
+[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/12.-timezone.png?resize=800%2C679&ssl=1
+[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/13.-user-account.png?resize=800%2C679&ssl=1
+[22]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/14.-installation-screen.png?resize=800%2C679&ssl=1
+[23]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/15.-installation-finish.png?resize=800%2C679&ssl=1
+[24]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/16.-remove-the-media.png?resize=800%2C679&ssl=1
+[25]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/17.-power-off.png?resize=800%2C678&ssl=1
+[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/18.-init-the-fresh-installed-mint.png?resize=800%2C476&ssl=1
+[27]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/19.-Linux-mint-19.3-final.png?resize=800%2C469&ssl=1
diff --git a/sources/tech/20200525 LanguageTool Review- Free and Open Source Grammar Checker.md b/sources/tech/20200525 LanguageTool Review- Free and Open Source Grammar Checker.md
new file mode 100644
index 0000000000..afd1a08e49
--- /dev/null
+++ b/sources/tech/20200525 LanguageTool Review- Free and Open Source Grammar Checker.md
@@ -0,0 +1,155 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (LanguageTool Review: Free and Open Source Grammar Checker)
+[#]: via: (https://itsfoss.com/languagetool-review/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+LanguageTool Review: Free and Open Source Grammar Checker
+======
+
+This week’s open source software highlight is [LanguageTool][1]. It is a proofreading software that checks the grammar, style and spelling in more than 20 languages.
+
+I have been using it for past several days and I feel confident enough to review it and share my experience with it. I have used the popular proofreading tool [Grammarly][2] in the past and I’ll make some comparison between these two tools.
+
+### LanguageTool: Open source proofreading software
+
+![][3]
+
+[LanguageTool][1] grammar checker is available in [multiple formats][4]:
+
+ * You can copy-paste your text on its website.
+ * You can install browser extension that will check for errors as you type anything, anywhere in the web browser.
+ * You can install a Java-based desktop application for offline usage.
+ * You can install add-on for LibreOffice and MS Office.
+ * Add-ons are also [available for a number of other software][5] like Sublime Text, Thunderbird, Vim, Visual Studio Code etc.
+ * [Android app][6] is also available.
+ * API is also available if you want to use LanguageTool in your software or service. API offering comes under premium services.
+
+
+
+You can find source code of LanguageTool and its related assets on [their GitHub repository][7].
+
+[LanguageTool also has a premium version][8] that you can purchase. The premium version offers additional error checks.
+
+I am using LanguageTool premium version as a browser extension. Almost all the writing I do is online and thus the browser extension is perfect for me.
+
+The most convenient way to try LanguageTool is by using its browser extension. Install the browser add-on and next time you type anything in the browser, LanguageTool will start checking your text for grammatical and spelling errors. It will also check for styling errors.
+
+### Experience with LanguageTool: How good is it?
+
+LanguageTool leaves a good first impression. It starts checking for errors as you start typing.
+
+Different types of errors have different color codes. Spelling mistakes are highlighted in red color, grammatical mistakes are in yellow colors and styling errors have a blueish shade.
+
+Clicking on the error suggestion replaces your text with the suggested one. You may also ignore the suggestion. You’ll also see number of issues identified by LanguageTool in the current text check.
+
+![Spelling mistake identified by LanguageTool][9]
+
+#### Personal dictionary
+
+You can also create your personal directory and add words in it. This is helpful because no proofreading tool can give a green light to technical terms like systemd, iptables and brand names like [WireGuard][10]. To avoid these words labeled as spelling mistakes, add them to your personal dictionary.
+
+You may edit your personal dictionary from your LanguageTool account.
+
+![LanguageTool Personal Dictionary][11]
+
+#### Details on the error suggestion
+
+If it finds grammatical errors, it also gives a quick explanation of the error. You can get more details by clicking the tool tip which takes you to a reputable external source.
+
+![You can get additional details on the errors][12]
+
+#### Synonym suggestion (in beta)
+
+If you double-click on a word, it will also suggest synonyms.
+
+![][13]
+
+#### Are there any privacy issues?
+
+If you use the online services of LanguageTool, your text is sent to their servers over an **encrypted** connection. All their servers are hosted at Hetzner Online GmbH in Germany.
+
+LanguageTool states that it doesn’t store any text that you check using its services. You can read their privacy policy [here][14].
+
+The free to use languagetool.org website shows ads (there are no third-party ads in the browser add-on). To test their claim of “sending text over an encrypted server”, I typed sample text containing words like vacuum cleaner, laptop etc.
+
+Thankfully, the displayed ad on their website was nothing related to the text I typed. I haven’t noticed any vacuum cleaner ads on the websites I visit or on Facebook. That’s a good thing.
+
+#### It doesn’t work flawlessly all the time
+
+No software is perfect and LanguageTool is not an exception. While it is helpful in finding obvious spelling and grammatical mistakes, it struggles in some simple scenario.
+
+For example, if a sentence contains several blank spaces together, LanguageTool failed to find an issue with that.
+
+![Too many whitespaces and yet it went undetected][15]
+
+This is weird because if I look at their ‘error rules’, I can see a [whitespace repetition rule][16]. I think this rule is applicable only for the Java-based LanguageTool apps, not the browser add-on I am using.
+
+I also found some other cases where LanguageTool should have identified errors but it didn’t. For example, it didn’t alert for the missing ‘to’ in the text below:
+
+![LanguageTool fails to find the missing “to”][17]
+
+When I checked it against the [Grammarly free version][2], it was able to point it out.
+
+![Grammarly was quick to identify it][18]
+
+I also found an infinite loop of suggestion. It first suggests using syntaxes as plural of syntax.
+
+![Suggestion for using ‘syntaxes’][19]
+
+And then it doesn’t accept ‘syntaxes’ as a valid word.
+
+![And then it doesn’t accept ‘syntaxes’][20]
+
+I have seen such “infinite error loop” with Grammarly as well in the past, so I won’t be too hard on LanguageTool for such issues.
+
+### Conclusion
+
+Despite some hiccups, I am satisfied with LanguageTool proofreading tool. Both free and premium version are good enough for finding obvious spelling mistakes and grammatical errors.
+
+The premium version offers over 2500 additional error checks and it costs around $15-$70 per year depending on your geographical region. This is a lot cheaper than [Grammarly][2] which costs $140 per year.
+
+I opted for the premium version because it will help this open-source project. Premium users also get email support.
+
+You are not forced to go premium, of course. You can use the free version and if you have some questions or need support, there is a [community forum][21] that you can join for free.
+
+LanguageTool can certainly be considered one of the [essential open-source tools for writers][22]. I am going to continue using LanguageTool. If you find grammatical or spelling mistakes in It’s FOSS articles in the future, blame LanguageTool, not me. Just kidding :)
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/languagetool-review/
+
+作者:[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://languagetool.org/
+[2]: https://itsfoss.com/recommends/grammarly/
+[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool.png?fit=800%2C593&ssl=1
+[4]: https://languagetool.org/compare
+[5]: http://wiki.languagetool.org/software-that-supports-languagetool-as-a-plug-in-or-add-on
+[6]: https://play.google.com/store/apps/details?id=org.softcatala.corrector
+[7]: https://github.com/languagetool-org/
+[8]: https://languagetoolplus.com/
+[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/langaugetool-error-detection.png?ssl=1
+[10]: https://itsfoss.com/wireguard/
+[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-personal-dictionary.png?ssl=1
+[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-error-explanation.png?ssl=1
+[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-synonym-suggestion.png?ssl=1
+[14]: https://languagetoolplus.com/legal/privacy
+[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-whitespaces.png?ssl=1
+[16]: https://community.languagetool.org/rule/show/WHITESPACE_RULE?lang=en
+[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-suggestion-3.jpg?fit=800%2C219&ssl=1
+[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-suggestion-grammarly.jpg?fit=800%2C272&ssl=1
+[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-suggestion.png?ssl=1
+[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/languagetool-suggestion-1.png?ssl=1
+[21]: https://forum.languagetool.org/
+[22]: https://itsfoss.com/open-source-tools-writers/
diff --git a/sources/tech/20200525 Using ‘apt search- and ‘apt show- Commands to Search and Find Details of Packages in Ubuntu.md b/sources/tech/20200525 Using ‘apt search- and ‘apt show- Commands to Search and Find Details of Packages in Ubuntu.md
new file mode 100644
index 0000000000..d1d80bcb5d
--- /dev/null
+++ b/sources/tech/20200525 Using ‘apt search- and ‘apt show- Commands to Search and Find Details of Packages in Ubuntu.md
@@ -0,0 +1,172 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Using ‘apt search’ and ‘apt show’ Commands to Search and Find Details of Packages in Ubuntu)
+[#]: via: (https://itsfoss.com/apt-search-command/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+Using ‘apt search’ and ‘apt show’ Commands to Search and Find Details of Packages in Ubuntu
+======
+
+_**This is a detailed beginners guide to apt search command. Using apt search and apt show commands, you can get details of the available versions, dependencies, repositories and other important information about packages in Ubuntu.**_
+
+Have you ever wondered if a certain package is available to install via [apt package manager][1]?
+
+Have you wondered if the package offered by [Ubuntu repositories][2] are the latest one or not?
+
+The apt package manager in [Ubuntu][3] and many other distribution provides two handy [apt command options][4] for this purpose.
+
+The apt search command looks for the provided string in the name and description of the packages.
+
+```
+apt search package_name
+```
+
+The apt show command provides detailed information on a package:
+
+```
+apt show package_name
+```
+
+The commands don’t require you to [be root in Ubuntu][5]. Here’s an example of these commands:
+
+![][6]
+
+### Why would you want to use apt search or apt show command?
+
+Let’s say you want to [install Gambas programming language in Ubuntu][7]. You are happy with your knowledge of the apt command so you decided to use the command line for installing application.
+
+You open a terminal and use the apt command to install gambas but it results in [unable to locate package error][8].
+
+```
+sudo apt install gambas
+Reading package lists... Done
+Building dependency tree
+Reading state information... Done
+E: Unable to locate package gambas
+```
+
+Why did Ubuntu not find the gambas package? Because there is no such package called gambas. Instead, it is available as gambas3. This is a situation where you could take the advantage of the apt search command.
+
+Let’s move to apt show command. This command provides detailed information about a package, its repository, dependencies and a lot more.
+
+Knowing what version of a package is available from the official repository could help you in deciding whether you should install it from some other sources.
+
+Quick recall
+
+The apt package manager works on a local database/cache of available packages from various repositories. This database contains the information about the available package version, dependencies etc. It doesn’t contain the entire package itself. The packages are downloaded from the remote repositories.
+
+When you run the sudo apt update command, this cache is created/updated in the /var/lib/apt/lists/ directory. The apt search and apt show commands utilize this cache.
+
+The term package is used for an application, program, software.
+
+### Search for available packages using apt search command
+
+![][9]
+
+Let me continue the gambas example. Say, you search for
+
+```
+apt search gambas
+```
+
+It will give you a huge list of packages that have “gambas” in its name or description. This output list is in alphabetical order.
+
+Now, you’ll of course have to make some intelligent prediction about the package you want. In this example, the first result says “Complete visual development environment for Gambas”. This gives you a good hint that this is the main package you are looking for.
+
+![][10]
+
+Why so many packages associated with gambas? Because a number of these gambas packages are probably dependencies that will installed automatically if you install the gambas3 package. If you use the _‘apt show gambas3_‘ command, it will show all the dependencies that will be installed with gambas3 package.
+
+Some of these listed packages could be libraries that a developer may need in some special cases while developing her/his software.
+
+#### Use apt search for package name only
+
+By default, apt search command looks for the searched term in both the name of the package and its description.
+
+You may narrow down the search by instructing the apt command to search for package names only.
+
+```
+apt search --names-only search_term
+```
+
+If you are following this as a tutorial, give it a try. Check the output with search term ‘transitional’ with and without –names-only option and you’ll see how the output changes.
+
+```
+apt search transitional
+apt search --names-only transitional
+```
+
+**Bonus Tip**: You can use ‘apt list –installed’ command to [look for installed packages in Ubuntu][11].
+
+### Get detailed information on a package using apt show command
+
+The output of the apt search commands a brief introduction of the packages. If you want more details, use the apt show command.
+
+```
+apt show exact_package_name
+```
+
+The apt show command works on the exact package name and it gives you a lot more information on the package. You get:
+
+ * Version information
+ * Repository information
+ * Origin and maintainer of the package information
+ * Where to file a bug
+ * Download and installation size
+ * Dependencies
+ * Detailed description of the package
+ * And a lot more
+
+
+
+Here’s an example:
+
+![][12]
+
+You need to give the exact package name otherwise the apt show won’t work. The good thing is that tab completion works apt show command.
+
+As you can see in the previous image, you have plenty of information that you may found helpful.
+
+The apt show command also works on installed packages. In that case, you can see which source the package was installed from. Was it a PPA or some third-party repository or universe or the main repository itself?
+
+Personally, I use apt show a lot. This helps me know if the package version provided by Ubuntu is the latest or not. Pretty handy tool!
+
+### Conclusion
+
+If you read my detailed [guide on the difference between apt and apt-get commands][13], you would know that this ‘apt search’ command works similar to ‘apt-cache search’. There is no such command as “apt-get search”.
+
+The purpose of creating apt command is to give you one tool with only enough option to manage the packages in your Debian/Ubuntu system. The apt-get, apt-cache and other apt tools still exist, and they can be used in scripting for more complex scenarios.
+
+I hope you found this introduction to **apt search** and **apt show** commands useful. I welcome your questions and suggestions on this topic.
+
+If you liked it, please share it on various Linux forums and communities you frequent. That helps us a lot. Thank you.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/apt-search-command/
+
+作者:[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://wiki.debian.org/Apt
+[2]: https://itsfoss.com/ubuntu-repositories/
+[3]: https://ubuntu.com/
+[4]: https://itsfoss.com/apt-command-guide/
+[5]: https://itsfoss.com/root-user-ubuntu/
+[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/apt-search-apt-show-example-800x493.png?resize=800%2C493&ssl=1
+[7]: https://itsfoss.com/install-gambas-ubuntu/
+[8]: https://itsfoss.com/unable-to-locate-package-error-ubuntu/
+[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/apt-search-command.png?ssl=1
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/apt-search-command-example.png?fit=800%2C297&ssl=1
+[11]: https://itsfoss.com/list-installed-packages-ubuntu/
+[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/apt-show-command-example-800x474.png?resize=800%2C474&ssl=1
+[13]: https://itsfoss.com/apt-vs-apt-get-difference/
diff --git a/sources/tech/20200525 What to do When You See -Repository does not have a release file- Error in Ubuntu.md b/sources/tech/20200525 What to do When You See -Repository does not have a release file- Error in Ubuntu.md
new file mode 100644
index 0000000000..6cfd9f34de
--- /dev/null
+++ b/sources/tech/20200525 What to do When You See -Repository does not have a release file- Error in Ubuntu.md
@@ -0,0 +1,115 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (What to do When You See “Repository does not have a release file” Error in Ubuntu)
+[#]: via: (https://itsfoss.com/repository-does-not-have-release-file-error-ubuntu/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+What to do When You See “Repository does not have a release file” Error in Ubuntu
+======
+
+One of the [several ways of installing software in Ubuntu][1] is by using PPA or adding third-party repositories. A few magical lines give you easy access to a software or its newer version that is not available by default in [Ubuntu][2].
+
+All thing looks well and good until you get habitual of adding additional third-party repositories and one day, you see an error like this while [updating Ubuntu][3]:
+
+**E: The repository ‘ focal Release’ does not have a Release file.
+N: Updating from such a repository can’t be done securely, and is therefore disabled by default.
+N: See apt-secure(8) manpage for repository creation and user configuration details.**
+
+In this tutorial for Ubuntu beginners, I’ll explain what does this error mean, why do you see it and what can you do to handle this error?
+
+### Understanding “Repository does not have a release file” error
+
+![][4]
+
+Let’s go step by step here. The error message is:
+
+**E: The repository ‘ focal release’ does not have a release file**
+
+The important part of this error message is “focal release”.
+
+You probably already know that [each Ubuntu release has a codename][5]. For Ubuntu 20.04, the codename is Focal Fossa. The “focal” in the error message indicates Focal Fossa which is Ubuntu 20.04.
+
+The error is basically telling you that though you have added a third-party repository to your system’s sources list, this new repository is not available for your current Ubuntu version.
+
+_**Why so? Because probably you are using a new version of Ubuntu and the developer has not made the software available for this new version.**_
+
+At this point, I highly recommend reading my detailed guides on [PPA][6] and [Ubuntu repositories][7]. These two articles will give you a better, in-depth knowledge of the topic. Trust me, you won’t be disappointed.
+
+### How to know if the PPA/third party is available for your Ubuntu version [Optional]
+
+First you should [check your Ubuntu version and its codename][8] using ‘lsb_release -a’ command:
+
+```
+[email protected]:~$ lsb_release -a
+No LSB modules are available.
+Distributor ID: Ubuntu
+Description: Ubuntu 20.04 LTS
+Release: 20.04
+Codename: focal
+```
+
+As you can see, the codename it shows is focal. Now the next thing you can do is to go to the website of the software in question.
+
+This could be the tricky part but you can figure it out with some patience and effort.
+
+In the example here, the error complained about ****. It is a PPA repository and you may easily find its webpage. How, you may ask.
+
+Use Google or a [Google alternative search engine][9] like Duck Duck Go and search for “ppa numix”. This should give you the first result from [launchpad.net][10] which is the website used for hosting PPA related code.
+
+On the webpage of the PPA, you can go to the “Overview of published packages” and filter it by the codename of your Ubuntu version:
+
+![][11]
+
+For non-PPA third-party repository, you’ll have to check of the official website of the software and see if the repository is available for your Ubuntu version or not.
+
+### What to do if the repository is not available for your Ubuntu version
+
+In case when the repository in question is not available for your Ubuntu version, here’s what you can do:
+
+ * Delete the troublesome repository from your list of repository so that you don’t see the error every time you run the update.
+ * Get the software from another source (if it is possible).
+
+
+
+To delete the troublesome repository, start Software & Updates tool:
+
+![][12]
+
+Go to the Other Software tab and look for the repository in question. Highlight it and then click on Remove button to delete it from your system.
+
+![Remove Ppa][13]
+
+This will [delete the PPA][14] or the repository in question.
+
+Next step is to get the software from some other source and that’s totally subjective. In some cases, you can still download the DEB file from the PPA website and use the software (I have explained the steps in the [PPA guide][6]). Alternatively, you can check the project’s website if there is a Snap/Flatpak or Python version of the software available.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/repository-does-not-have-release-file-error-ubuntu/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/install-remove-software-manjaro/
+[2]: https://ubuntu.com/
+[3]: https://itsfoss.com/update-ubuntu/
+[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/Repository-does-not-have-a-release-file.png?ssl=1
+[5]: https://itsfoss.com/linux-code-names/
+[6]: https://itsfoss.com/ppa-guide/
+[7]: https://itsfoss.com/ubuntu-repositories/
+[8]: https://itsfoss.com/how-to-know-ubuntu-unity-version/
+[9]: https://itsfoss.com/privacy-search-engines/
+[10]: https://launchpad.net/
+[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/check-repo-version.png?ssl=1
+[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/software-updates-settings-ubuntu-20-04.jpg?ssl=1
+[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/remove-ppa.jpg?ssl=1
+[14]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/
diff --git a/sources/tech/20200526 Create interactive content in WordPress with the H5P plugin.md b/sources/tech/20200526 Create interactive content in WordPress with the H5P plugin.md
new file mode 100644
index 0000000000..871439e73a
--- /dev/null
+++ b/sources/tech/20200526 Create interactive content in WordPress with the H5P plugin.md
@@ -0,0 +1,130 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Create interactive content in WordPress with the H5P plugin)
+[#]: via: (https://opensource.com/article/20/5/h5p-wordpress)
+[#]: author: (Don Watkins https://opensource.com/users/don-watkins)
+
+Create interactive content in WordPress with the H5P plugin
+======
+Turn your WordPress site into an interactive learning management system
+with this open source plugin.
+![Family learning and reading together at night in a room][1]
+
+WordPress is best known as a website content management system, but it also a great [learning management system][2] (LMS) for delivering online courses. If that is what you are looking for out of WordPress, then [H5P][3] should be the top plugin on your list.
+
+H5P is a way to create and share interactive HTML5 content, including presentations, games, quizzes, forms, and more, in a browser. You can download a wide variety of content types from H5P's [Examples and Downloads][4] page, or you can create unique content to embed in your WordPress site.
+
+H5P provides plugins and integrations for WordPress, Moodle, Drupal, Canvas, Brightspace, Blackboard, and more. In this article, I will show how to use H5P in WordPress to create a reading comprehension quiz for students.
+
+### Install the H5P plugin
+
+The first step is to install the plugin. Log into your WordPress admin panel, go to **Plugins**, select **Add New**, and search for **H5P** in the Plugins field. When you find it, select **Install Now**.
+
+![Adding the H5P plugin][5]
+
+(Don Watkins, [CC BY-SA 4.0][6])
+
+H5P should now appear in the list of installed plugins. Be sure to **Activate** the plugin by going to the H5P menu at the bottom of your WordPress admin panel and clicking the button. You will see the following display—be sure to consent so you can connect to the H5P Hub.
+
+![H5P consent option][7]
+
+(Don Watkins, [CC BY-SA 4.0][6])
+
+Now you can begin adding H5P content to your WordPress installation.
+
+### Create a quiz
+
+One of my favorite poems is Robert Frost's "The Road Not Taken." Suppose you are teaching a class that is studying this poem, and one of your objectives is for your students to remember the poem's author. First, create a new WordPress post on your site that contains the poem's text and its author.
+
+![Creating a WordPress post][8]
+
+(Don Watkins, [CC BY-SA 4.0][6])
+
+Now you want to test your students' comprehension with an HTML5 interactive content embedded below the poem.
+
+In the WordPress admin panel, look near the bottom for the **H5P Content** menu and select it. In the menu that appears, click **Add New**.
+
+![H5P Content menu][9]
+
+(Don Watkins, [CC BY-SA 4.0][6])
+
+You will see an array of content options that are available. Since you want to create a multiple-choice quiz, look for the **Multiple Choice** option and click **Get** to its right.
+
+![H5P content types][10]
+
+(Don Watkins, [CC BY-SA 4.0][6])
+
+A form will open for you to start creating the quiz. Fill in the required fields (marked with a red asterisk)—give your quiz a title (e.g., "Road Not Taken Quiz"), enter a question (e.g., "Who wrote, 'The Road Not Taken'?") and correct and incorrect answers, and select the correct answer in the dialog box. When you finish creating the quiz, save the content.
+
+![H5P quiz][11]
+
+(Don Watkins, [CC BY-SA 4.0][6])
+
+### Embed the quiz in a post
+
+Now you're ready to insert the quiz exactly where you want it to appear in your post. Open the post where you want to put the quiz (e.g., "The Road Not Taken" post) in your WordPress editor, and you should see an **Add H5P** button near the top of the interface. Place your cursor wherever you want the quiz to appear in the post, and click **Add H5P**. Your H5P content will appear in a dialog box like this:
+
+![H5P list of interactive content][12]
+
+(Don Watkins, [CC BY-SA 4.0][6])
+
+Select the content you want, and H5P will insert an embed code (e.g., `[h5p id="1"]`) in the post, like this:
+
+![H5P embed code in a post][13]
+
+(Don Watkins, [CC BY-SA 4.0][6])
+
+Save your post, then open it in your browser. The quiz is exactly where you wanted it to appear in the post:
+
+![H5P quiz shown in the post][14]
+
+(Don Watkins, [CC BY-SA 4.0][6])
+
+When a student answers this question correctly, they get pleasant visual feedback:
+
+![Correct answer selection][15]
+
+(Don Watkins, [CC BY-SA 4.0][6])
+
+### The possibilities are endless
+
+H5P offers a wide range of options to add interactivity to WordPress posts. In this example, you could have created a more complex set of multiple-choice questions. H5P also has lots of other content types, including interactive video, arithmetic quizzes, an audio recorder, image hotspots, fill-in-the-blank quizzes, and [many more][4].
+
+H5P also provides [excellent documentation][16] and [great tutorials][17] to help anyone who wants to use the plugin on their WordPress site. H5P software is open source under the [MIT License][18] with the code available on [GitHub][19]. H5P also welcomes contributions to the community; check out the [developer guide][20] for more information.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/5/h5p-wordpress
+
+作者:[Don Watkins][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/don-watkins
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/family_learning_kids_night_reading.png?itok=6K7sJVb1 (Family learning and reading together at night in a room)
+[2]: https://en.wikipedia.org/wiki/Learning_management_system
+[3]: https://h5p.org/
+[4]: https://h5p.org/content-types-and-applications
+[5]: https://opensource.com/sites/default/files/uploads/addplugins-h5p.png (Adding the H5P plugin)
+[6]: https://creativecommons.org/licenses/by-sa/4.0/
+[7]: https://opensource.com/sites/default/files/uploads/h5p-consent.png (H5P consent option)
+[8]: https://opensource.com/sites/default/files/uploads/wordpress-post.png (WordPress post)
+[9]: https://opensource.com/sites/default/files/uploads/h5p-content-menu.png (H5P Content menu)
+[10]: https://opensource.com/sites/default/files/uploads/h5p-content-types.png (H5P content types)
+[11]: https://opensource.com/sites/default/files/uploads/h5p-multiple-choice-quiz.png (H5P quiz)
+[12]: https://opensource.com/sites/default/files/uploads/h5p-insert-interactive-content.png (H5P list of interactive content)
+[13]: https://opensource.com/sites/default/files/uploads/h5p-embedded-content.png (H5P embed code in a post)
+[14]: https://opensource.com/sites/default/files/uploads/h5p-quiz.png (H5P quiz shown in the post)
+[15]: https://opensource.com/sites/default/files/uploads/h5p-correct-answer.png (Correct answer selection)
+[16]: https://h5p.org/documentation/setup/wordpress
+[17]: https://h5p.org/documentation/for-authors/tutorials
+[18]: https://h5p.org/MIT-licensed
+[19]: https://github.com/h5p
+[20]: https://h5p.org/developers
diff --git a/sources/tech/20200526 FreeFileSync- Open Source File Synchronization Tool.md b/sources/tech/20200526 FreeFileSync- Open Source File Synchronization Tool.md
new file mode 100644
index 0000000000..549751e002
--- /dev/null
+++ b/sources/tech/20200526 FreeFileSync- Open Source File Synchronization Tool.md
@@ -0,0 +1,140 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (FreeFileSync: Open Source File Synchronization Tool)
+[#]: via: (https://itsfoss.com/freefilesync/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+FreeFileSync: Open Source File Synchronization Tool
+======
+
+_**Brief: FreeFileSync is an open-source folder comparison and sync tool with which you can back up your data to an external disk, a cloud service like Google Drive or any other storage path.**_
+
+### FreeFileSync: A Free & Open-Source Tool To Sync Files
+
+![][1]
+
+[FreeFileSync][2] is an impressive open-source tool that can help you back up your data to a different location.
+
+This different location can be an external USB disk, Google Drive or to any of your cloud storage locations using **SFTP or FTP** connections.
+
+You might have read our tutorial on [how to use Google Drive on Linux][3] before. Unfortunately, there’s no proper FOSS solution to use Google Drive natively on Linux. There is [Insync][4] but it is a premium, non open source software.
+
+FreeFileSync can be used to sync files with your Google Drive account. In fact, I’m using it to sync my files to Google Drive and to a separate hard drive.
+
+### Features of FreeFileSync
+
+![][5]
+
+Even though the UI of FreeFileSync might look old school — it offers a ton of useful features for average users and advanced users as well.
+
+I’ll highlight all the features I can here:
+
+ * Cross-platform support (Windows, macOS & Linux)
+ * Compare folders before synchronizing
+ * Supports Google Drive, [SFTP][6], and FTP connections
+ * Offers the ability to sync your files on a different storage path (or an external storage device)
+ * Multiple synchronization options available (Update files to the target from source or Mirror the files between target and source)
+ * Two-way synchronization supported (changes will be synced if there’s any modification on the target folder or the source folder)
+ * Version control available for advanced users
+ * Real-Time Sync option available
+ * Ability to schedule batch jobs
+ * Get notified via email when sync completes (paid)
+ * Portable edition (paid)
+ * Parallel file copy (paid)
+
+
+
+So, if you take a look at the features it offers, it’s not just any ordinary sync tool but offers so much more for free.
+
+Also, to give you an idea, you can also tweak how to compare the files before syncing them. For instance, you can compare the file content / file time or simply compare the file size of both source and target folder.
+
+![][7]
+
+You also get numerous synchronization options to mirror or update your data. Here’s how it looks like:
+
+![][8]
+
+However, it does give you the option to opt for a donation key which unlocks some special features like the ability to notify you via email when the sync completes and so on.
+
+Here’s what different between the free and paid version:
+
+![][9]
+
+So, most of the essential features is available for free. The premium features are mostly for advanced users and of course, if you want to support them (please do if you find it useful).
+
+Also, do note that the donation edition can be used by a single user on up to 3 devices. So, that is definitely not bad!
+
+### Installing FreeFileSync on Linux
+
+You can simply head on to its [official download page][10] and grab the **tar.gz** file for Linux. If you like you can download the source as well.
+
+![][11]
+
+Next, you just need to extract the archive and run the executable file to get started (as shown in the image above)
+
+[Download FreeFileSync][2]
+
+### How To Get Started With FreeFileSync?
+
+While I haven’t tried successfully creating an automatic sync job, it is pretty easy to use.
+
+The [official documentation][12] should be more than enough to get what you want using the software.
+
+But, just to give you a head start, here are a few things that you should keep in mind.
+
+![][13]
+
+As you can see in the screenshot above, you just have to select a source folder and the target folder to sync. You can choose a local folder or a cloud storage location.
+
+Once you do that, you need to tweak the type of folder comparison you want to do (usually the file time & size) for the synchronization process and on the right-side, you get to tweak the type of sync that you want to perform.
+
+#### Types of synchronization in FreeFileSync
+
+When you select **“Update” method for sync**, it simply copies your new data from the source folder to the target folder. So, even if you delete something from your source folder, it won’t get deleted on your target folder.
+
+In case you want the target folder to have the same file copies of your same folder, you can choose the **“Mirror”** **synchronization method**. So, here, if you delete something from your source, it gets deleted from your target folder as well.
+
+There’s also a **“Two-way” sync method** which detects changes on both source and target folder (instead of monitoring just the source folder). So, if you make any changes on the source/target folder, the modification will be synchronized.
+
+For more advanced usage, I suggest you to refer the [documentation][12] available.
+
+### Wrapping Up
+
+Another [open source file synchronization tool is Syncthing][14] that you might want to look at.
+
+FreeFileSync is a pretty underrated folder comparison and sync tool available for Linux users who utilize Google Drive, SFTP, or FTP connections along with separate storage locations for backup.
+
+And, all of that — with cross-platform support for Windows, macOS, and Linux available for free.
+
+Isn’t that exciting? Let me know your thoughts on FreeFileSync in the comments down below.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/freefilesync/
+
+作者:[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://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/free-file-sync.jpg?ssl=1
+[2]: https://freefilesync.org/
+[3]: https://itsfoss.com/use-google-drive-linux/
+[4]: https://itsfoss.com/recommends/insync/
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/FreeFileSync.jpg?ssl=1
+[6]: https://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol
+[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/freefilesync-comparison.png?ssl=1
+[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/freefilesync-synchronization.png?ssl=1
+[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/free-file-sync-donation-edition.jpg?ssl=1
+[10]: https://freefilesync.org/download.php
+[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/freefilesync-run.jpg?ssl=1
+[12]: https://freefilesync.org/manual.php
+[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/freefilesync-tips.jpg?ssl=1
+[14]: https://itsfoss.com/syncthing/
diff --git a/sources/tech/20200527 Manage startup using systemd.md b/sources/tech/20200527 Manage startup using systemd.md
new file mode 100644
index 0000000000..c0ff18a13d
--- /dev/null
+++ b/sources/tech/20200527 Manage startup using systemd.md
@@ -0,0 +1,567 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Manage startup using systemd)
+[#]: via: (https://opensource.com/article/20/5/manage-startup-systemd)
+[#]: author: (David Both https://opensource.com/users/dboth)
+
+Manage startup using systemd
+======
+Learn how systemd determines the order services start, even though it is
+essentially a parallel system.
+![Penguin with green background][1]
+
+While setting up a Linux system recently, I wanted to know how to ensure that dependencies for services and other units were up and running before those dependent services and units start. Specifically, I needed more knowledge of how systemd manages the startup sequence, especially in determining the order services are started in what is essentially a parallel system.
+
+You may know that SystemV (systemd's predecessor, as I explained in the [first article][2] in this series) orders the startup sequence by naming the startup scripts with an SXX prefix, where XX is a number from 00 to 99. SystemV then uses the sort order by name and runs each start script in sequence for the desired runlevel.
+
+But systemd uses unit files, which can be created or modified by a sysadmin, to define subroutines for not only initialization but also for regular operation. In the [third article][3] in this series, I explained how to create a mount unit file. In this fifth article, I demonstrate how to create a different type of unit file—a service unit file that runs a program at startup. You can also change certain configuration settings in the unit file and use the systemd journal to view the location of your changes in the startup sequence.
+
+### Preparation
+
+Make sure you have removed `rhgb` and `quiet` from the `GRUB_CMDLINE_LINUX=` line in the `/etc/default/grub` file, as I showed in the [second article][4] in this series. This enables you to observe the Linux startup message stream, which you'll need for some of the experiments in this article.
+
+### The program
+
+In this tutorial, you will create a simple program that enables you to observe a message during startup on the console and later in the systemd journal.
+
+Create the shell program `/usr/local/bin/hello.sh` and add the following content. You want to ensure that the result is visible during startup and that you can easily find it when looking through the systemd journal. You will use a version of the "Hello world" program with some bars around it, so it stands out. Make sure the file is executable and has user and group ownership by root with [700 permissions][5] for security:
+
+
+```
+#!/usr/bin/bash
+# Simple program to use for testing startup configurations
+# with systemd.
+# By David Both
+# Licensed under GPL V2
+#
+echo "###############################"
+echo "######### Hello World! ########"
+echo "###############################"
+```
+
+Run this program from the command line to verify that it works correctly:
+
+
+```
+[root@testvm1 ~]# hello.sh
+###############################
+######### Hello World! ########
+###############################
+[root@testvm1 ~]#
+```
+
+This program could be created in any scripting or compiled language. The `hello.sh` program could also be located in other places based on the [Linux filesystem hierarchical structure][6] (FHS). I place it in the `/usr/local/bin` directory so that it can be easily run from the command line without having to prepend a path when I type the command. I find that many of the shell programs I create need to be run from the command line and by other tools such as systemd.
+
+### The service unit file
+
+Create the service unit file `/etc/systemd/system/hello.service` with the following content. This file does not need to be executable, but for security, it does need user and group ownership by root and [644][7] or [640][8] permissions:
+
+
+```
+# Simple service unit file to use for testing
+# startup configurations with systemd.
+# By David Both
+# Licensed under GPL V2
+#
+
+[Unit]
+Description=My hello shell script
+
+[Service]
+Type=oneshot
+ExecStart=/usr/local/bin/hello.sh
+
+[Install]
+WantedBy=multi-user.target
+```
+
+Verify that the service unit file performs as expected by viewing the service status. Any syntactical errors will show up here:
+
+
+```
+[root@testvm1 ~]# systemctl status hello.service
+● hello.service - My hello shell script
+ Loaded: loaded (/etc/systemd/system/hello.service; disabled; vendor preset: disabled)
+ Active: inactive (dead)
+[root@testvm1 ~]#
+```
+
+You can run this "oneshot" service type multiple times without problems. The oneshot type is intended for services where the program launched by the service unit file is the main process and must complete before systemd starts any dependent process.
+
+There are seven service types, and you can find an explanation of each (along with the other parts of a service unit file) in the [systemd.service(5)][9] man page. (You can also find more information in the [resources][10] at the end of this article.)
+
+As curious as I am, I wanted to see what an error might look like. So, I deleted the "o" from the `Type=oneshot` line, so it looked like `Type=neshot`, and ran the command again:
+
+
+```
+[root@testvm1 ~]# systemctl status hello.service
+● hello.service - My hello shell script
+ Loaded: loaded (/etc/systemd/system/hello.service; disabled; vendor preset: disabled)
+ Active: inactive (dead)
+
+May 06 08:50:09 testvm1.both.org systemd[1]: /etc/systemd/system/hello.service:12: Failed to parse service type, ignoring: neshot
+[root@testvm1 ~]#
+```
+
+These results told me precisely where the error was and made it very easy to resolve the problem.
+
+Just be aware that even after you restore the `hello.service` file to its original form, the error will persist. Although a reboot will clear the error, you should not have to do that, so I went looking for a method to clear out persistent errors like this. I have encountered service errors that require the command `systemctl daemon-reload` to reset an error condition, but that did not work in this case. The error messages that can be fixed with this command always seem to have a statement to that effect, so you know to run it.
+
+It is, however, recommended that you run `systemctl daemon-reload` after changing a unit file or creating a new one. This notifies systemd that the changes have been made, and it can prevent certain types of issues with managing altered services or units. Go ahead and run this command.
+
+After correcting the misspelling in the service unit file, a simple `systemctl restart hello.service` cleared the error. Experiment a bit by introducing some other errors into the `hello.service` file to see what kinds of results you get.
+
+### Start the service
+
+Now you are ready to start the new service and check the status to see the result. Although you probably did a restart in the previous section, you can start or restart a oneshot service as many times as you want since it runs once and then exits.
+
+Go ahead and start the service (as shown below), and then check the status. Depending upon how much you experimented with errors, your results may differ from mine:
+
+
+```
+[root@testvm1 ~]# systemctl start hello.service
+[root@testvm1 ~]# systemctl status hello.service
+● hello.service - My hello shell script
+ Loaded: loaded (/etc/systemd/system/hello.service; disabled; vendor preset: disabled)
+ Active: inactive (dead)
+
+May 10 10:37:49 testvm1.both.org hello.sh[842]: ######### Hello World! ########
+May 10 10:37:49 testvm1.both.org hello.sh[842]: ###############################
+May 10 10:37:49 testvm1.both.org systemd[1]: hello.service: Succeeded.
+May 10 10:37:49 testvm1.both.org systemd[1]: Finished My hello shell script.
+May 10 10:54:45 testvm1.both.org systemd[1]: Starting My hello shell script...
+May 10 10:54:45 testvm1.both.org hello.sh[1380]: ###############################
+May 10 10:54:45 testvm1.both.org hello.sh[1380]: ######### Hello World! ########
+May 10 10:54:45 testvm1.both.org hello.sh[1380]: ###############################
+May 10 10:54:45 testvm1.both.org systemd[1]: hello.service: Succeeded.
+May 10 10:54:45 testvm1.both.org systemd[1]: Finished My hello shell script.
+[root@testvm1 ~]#
+```
+
+Notice in the status command's output that the systemd messages indicate that the `hello.sh` script started and the service completed. You can also see the output from the script. This display is generated from the journal entries of the most recent invocations of the service. Try starting the service several times, and then run the status command again to see what I mean.
+
+You should also look at the journal contents directly; there are multiple ways to do this. One way is to specify the record type identifier, in this case, the name of the shell script. This shows the journal entries for previous reboots as well as the current session. As you can see, I have been researching and testing for this article for some time now:
+
+
+```
+[root@testvm1 ~]# journalctl -t hello.sh
+<snip>
+\-- Reboot --
+May 08 15:55:47 testvm1.both.org hello.sh[840]: ###############################
+May 08 15:55:47 testvm1.both.org hello.sh[840]: ######### Hello World! ########
+May 08 15:55:47 testvm1.both.org hello.sh[840]: ###############################
+\-- Reboot --
+May 08 16:01:51 testvm1.both.org hello.sh[840]: ###############################
+May 08 16:01:51 testvm1.both.org hello.sh[840]: ######### Hello World! ########
+May 08 16:01:51 testvm1.both.org hello.sh[840]: ###############################
+\-- Reboot --
+May 10 10:37:49 testvm1.both.org hello.sh[842]: ###############################
+May 10 10:37:49 testvm1.both.org hello.sh[842]: ######### Hello World! ########
+May 10 10:37:49 testvm1.both.org hello.sh[842]: ###############################
+May 10 10:54:45 testvm1.both.org hello.sh[1380]: ###############################
+May 10 10:54:45 testvm1.both.org hello.sh[1380]: ######### Hello World! ########
+May 10 10:54:45 testvm1.both.org hello.sh[1380]: ###############################
+[root@testvm1 ~]#
+```
+
+To locate the systemd records for the `hello.service` unit, you can search on systemd. You can use **G+Enter** to page to the end of the journal entries and then scroll back to locate the ones you are interested in. Use the `-b` option to show only the entries for the most recent startup:
+
+
+```
+[root@testvm1 ~]# journalctl -b -t systemd
+<snip>
+May 10 10:37:49 testvm1.both.org systemd[1]: Starting SYSV: Late init script for live image....
+May 10 10:37:49 testvm1.both.org systemd[1]: Started SYSV: Late init script for live image..
+May 10 10:37:49 testvm1.both.org systemd[1]: hello.service: Succeeded.
+May 10 10:37:49 testvm1.both.org systemd[1]: Finished My hello shell script.
+May 10 10:37:50 testvm1.both.org systemd[1]: Starting D-Bus System Message Bus...
+May 10 10:37:50 testvm1.both.org systemd[1]: Started D-Bus System Message Bus.
+```
+
+I copied a few other journal entries to give you an idea of what you might find. This command spews all of the journal lines pertaining to systemd—109,183 lines when I wrote this. That is a lot of data to sort through. You can use the pager's search facility, which is usually `less`, or you can use the built-in `grep` feature. The `-g` (or `--grep=`) option uses Perl-compatible regular expressions:
+
+
+```
+[root@testvm1 ~]# journalctl -b -t systemd -g "hello"
+[root@testvm1 ~]# journalctl -b -t systemd -g "hello"
+\-- Logs begin at Tue 2020-05-05 18:11:49 EDT, end at Sun 2020-05-10 11:01:01 EDT. --
+May 10 10:37:49 testvm1.both.org systemd[1]: Starting My hello shell script...
+May 10 10:37:49 testvm1.both.org systemd[1]: hello.service: Succeeded.
+May 10 10:37:49 testvm1.both.org systemd[1]: Finished My hello shell script.
+May 10 10:54:45 testvm1.both.org systemd[1]: Starting My hello shell script...
+May 10 10:54:45 testvm1.both.org systemd[1]: hello.service: Succeeded.
+May 10 10:54:45 testvm1.both.org systemd[1]: Finished My hello shell script.
+[root@testvm1 ~]#
+```
+
+You could use the standard GNU `grep` command, but that would not show the log metadata in the first line.
+
+If you do not want to see just the journal entries pertaining to your `hello` service, you can narrow things down a bit by specifying a time range. For example, I will start with the beginning time of `10:54:00` on my test VM, which was the start of the minute the entries above are from. ****Note that the `--since=` option must be enclosed in quotes and that this option can also be expressed as `-S "