Java developers can now run Gradle builds with JDK 11. The latest milestone release of the popular open source build automation tool (Gradle 5.0) also comes with a production-ready Kotlin DSL, dependency version alignment, and task timeouts, among a long list enhancements and upgrades.
The true headline grabber in this release is the inclusion of Kotlin DSL 1.0. The Kotlin DSL (domain-specific language) provides an alternative syntax to the traditional Groovy DSL (originally introduced in the earliest versions of Gradle) through an "enhanced editing experience" in supported IDEs (according to the Gradle Kotlin DSL Primer). The Kotlin DSL is currently fully supported by two IDEs: IntelliJ IDEA and Android Studio, but other integrated development environments can import and work with Kotlin-DSL-based builds.
Authoring build logic using Kotlin provides "significant additional editing assistance in IDEs," the Gradle teams said in a blog post, "including: improved completion, error highlighting, and refactoring tools ... . "If you prefer the flexibility and dynamic features of Groovy, that's totally okay -- the Groovy DSL will not be deprecated," they added.
The introduction of dependency version alignment in Gradle 5.0 is also an attention getter in this announcement. This capability allows different modules belonging to the same logical "platform" or set of modules that "work together," either because they are published as a whole or because a test showed that they work together, as the Gradle Docs page explains it.
But Java jocks will be happy to learn about the JDK support in this release. The original Gradle plugin focused on Java, Groovy, and Scala, and it's still considered a leading build system for the JVM.
Gradle has always supported build automation across multiple languages and platforms, starting with Groovy, Java, and Scala, but now including Android and C/C++. The system is closely integrated with several development tools and continuous integration servers, including Eclipse, IntelliJ and Jenkins.
The Gradle team has published a detailed guide for developers who need to migrate older Gradle 4.x builds to Gradle 5.0. ("Keep in mind there are some breaking changes and considerations for any developer moving from 4.x up," they wrote.) There's also an installation guide available on GitHub for new developers who want to start using Gradle.
A one-hour, live webcast, "What's New in Gradle 5.0," featuring Gradle Developer Advocate Jenn Strater and Gradle Developer Experience Lead Eric Wendelin, is scheduled for Nov. 29. Register here.
Posted by John K. Waters on November 28, 20180 comments
The recent announcement that Amazon Web Services (AWS) will be providing Java developers with a no-cost, fully supported OpenJDK distribution came as welcome news in the face of Oracle's decision to end free long-term support for OpenJDK after January 2019. Dubbed Amazon Corretto, the new dev kit comes with long-term support that Amazon says will include performance enhancements and security fixes.
Arun Gupta, principal open source technologist at AWS, described Corretto in a blog post as a "multiplatform, production-ready distribution of OpenJDK," which Amazon has used internally on "thousands of production services." And he addressed the support issue directly.
"Many of our customers have become concerned that they would have to pay for a long-term supported version of Java to run their workloads," he wrote. He pointed to the AWS "re-affirmation" in October that the organization will continue to provide free long-term support for the OpenJDK 8 and OpenJDK 11 Java runtimes in Amazon Linux 2 "at least" through June 30, 2023. Amazon Corretto, he wrote, will receive no-cost, long-term support, with quarterly updates that include bug fixes and security patches. AWS runs the Technology Compatibility Kit (TCK) on each Corretto release to ensure compatibility with the Java SE platform, he said.
"We downstream fixes made in OpenJDK, add enhancements based on our own experience and needs, and then produce Corretto builds," Gupta said. "In case any upstreaming efforts for such patches is not successful, delayed, or not appropriate for OpenJDK project, we will provide them to our customers for as long as they add value. If an issue is solved a different way in OpenJDK, we will move to that solution as soon as it is safe to do so."
AWS will also provide "urgent fixes" to customers outside of the quarterly schedule, he said.
Gupta included a supporting quote from James Gosling in his post. Gosling, who created Java back in 1994, joined AWS earlier this year as a distinguished engineer. "Amazon has a long and deep history with Java," the quote reads. "I'm thrilled to see the work of our internal mission-critical Java team being made available to the rest of the world."
Gosling led the official unveiling of the preview release of Corretto (called Corretto 8 and corresponding with OpenJDK 8) at the Devoxx BE conference in Antwerp, Belgium. Not surprisingly, he has been promoting the news on Twitter, where he describes Corretto as "the externalization of the OpenJDK distribution that Amazon uses internally," adding: "If you're an Amazon customer, you're almost certainly using Corretto already."
The Corretto 8 preview is available now for Amazon Linux 2, Microsoft Windows, and macOS platforms and Docker image. The company is planning for a General Availability release in the first quarter of next year. That release will include support for Ubuntu and Red Hat Enterprise Linux platforms, Gupta said. Corretto 11 builds corresponding with Open JDK 11 on these platforms will follow "with ample time for testing" before April 2019, he said.
The source code for Corretto available on GitHub. Corretto 8 is available for download. Documentation can be downloaded here.
Posted by John K. Waters on November 26, 20180 comments
Information security provider Imperva has been in the headlines recently, thanks to news that tech investment firm Thoma Bravo LLC plans to acquire it. But the Redwood Shores, Calif.-based company caught my eye again last week when it announced that it has open sourced a new Java SDK designed to simplify interaction with Microsoft's Active Directory (AD) for small, medium and large development projects using LDAP.
The company created the SDK, which it christened Domain Directory Controller (DDC), as an internal library to help its devs with hassles associated with Microsoft's AD.
"[I]n order to communicate with an AD server," Gabi Beyo, principal engineer at Imperva, wrote in a blog post, "we'd have to handle a host of issues manually: connection retries, switching between primary and secondary servers, performing queries against multiple servers, paging results, and several other known-issues which might not be directly related to the task at hand. An additional pain in the neck was the LDAP protocol we'd have to learn and understand in order to perform our queries against the AD server."
The SDK the company developed to solve these problems comes with a "friendly" API designed to allow developers to quickly compose simple, or complex queries against AD's endpoints without any previous LDAP knowledge, Beyo explained. "The goal of this library is to enable easy interaction with any LDAP Directory Server by hiding all the related communication issues and internal bits-and-bytes," he wrote.
The SDK was an immediate hit with Imperva's developers, the company told me in an e-mail, and the decision was made to open source it. Internally, DDC makes use of apache-directory-ldap API and builds on it with a host of enhancements, which Beyo listed in his blog post:
- Assemble LDAP queries easily via an Object-Oriented syntax instead of concatenating and parsing strings
- Although DDC currently supports Microsoft Active Directory only, it was designed to be easily extended to fit any other LDAP implementation
- Easy Paging API
- Change Requests: Add, Remove, Replace AD's objects
- Secured connection
- Perform automatically connection retries in case of failure
- Automatically resolve host to IP
Support search in Multiple AD servers
- Support Primary & Secondary AD servers
Beyo provides some examples of how Imperva has used the SDK in his blog post, and it's well worth reading.
The source files, full documentation, and a starter kit project for Imperva DDC can be found on GitHub in Imperva's official Open Source repository.
Posted by John K. Waters on November 14, 20180 comments
The Java Community Process (JCP), the standards-development organization for Java technology, has posted the nominees for the 2018 Fall Executive Committee (EC) election. Eight seats are open for this election, including 8 Ratified, 3 Elected and 1 Associate.
The EC oversees the work of the Expert Groups that define Java specifications, essentially guiding the evolution of Java. The committee picks the JSRs that will be developed, approves draft specs and final specs, approves Technology Compatibility Kit (TCK) licenses, approves maintenance revisions and occasionally defers features to new JSRs, approves transfer of maintenance duties between members, and provides guidance to the Program Management Office (PMO).
The EC comprises 16 Ratified Seats, 6 Elected Seats, and 2 Associate Seats, all serving a two-year term, as well as a permanent seat held by Oracle America, the official steward of Java. The Ratified Seats are filled by Full Members nominated by the PMO; the Elected and Associate Seats are filled by members nominated by Full and Partner Members.
This will be the third EC election held under JCP 2.10 rules implemented in 2016. The JCP now offers three membership levels: the Associate level, for unaffiliated individuals; the Partner level, for Java User Groups and other non-profit organizations; and Full Membership, for "legal entities who wish to join Expert Groups, lead JSRs, and/or vote or serve on the Executive Committee."
The list of this election's candidates includes:
- Ratified Seats:
- Kingsum Chow, Chief Scientist at Alibaba
- Jackie Haynes, who works in the core engineering group at Godman Sachs
- Trisha Gee, a Java Champion and Java Developer Advocate at JetBrains
- Hendrik Hoefer, co-founder/technical director of MicroDoc ComputerSystems GmbH
- Volker Simonis, a long-time OpenJDK contributor who works on Java/JVM technologies at SAP
- Prasad Yendluri, Vice President Product Development at Software AG
- Donald Raab, Managing Director and Instructional Coach on the Shared Services Team at the Bank of New York Mellon
- Leonardo Lima is CTO at V2COM
- Elected Seats:
- Gil Tene is CTO and co-founder at Azul Systems
- Simon Ritter is Deputy CTO at Azul Systems
- Janine Patterson, President of the Chicago Java Users Group
- Mike Milinkovich, Executive Director of the Eclipse Foundation
- Martijn Verberg, co-leader of the London Java User Group
- Associate Seats:
- Joseph Aruja
- Marcus Biel
- Ivar Grimstad
- Ceyhun Erturk
The JCP hosted a "Meet the JCP EC Candidates" Birds of a Feather (BOF) session at the Oracle Code One conference in San Francisco last week. The JCP is also planning a meet-the-candidates conference call for this Thursday, Nov. 1, at 10 AM PDT. The candidates' statements are available on the JCP Web site.
Posted by John K. Waters on October 31, 20180 comments
What's in a name? Not much, apparently, as Oracle proved last week with its inaugural Code One event, which replaced the venerable JavaOne user conference, in name mostly. The event included a ton of Java content -- sessions, events, keynotes -- with some new tracks aimed at developers building databases-focused apps and MySQL developers. The program also includes sessions on such languages as Go, Rust, Python, JavaScript and R.
The conference included the all-important Java Technical Keynote on Monday evening, with presentations by Mark Reinhold, chief architect of the Java Platform Group, and Georges Saab, VP of Development, who talked about Java SE updates from the last 12 months, including Java 11, as well as future projects.
For his part of the keynote, Saab focused on the challenge of "preserving Java's virtues," by which he meant the free and open community in which Java has evolved. He also talked about Oracle's contributions to that community, including the open sourcing of such Java platform features as Application Class-Data Sharing, the Z Garbage Collector, Flight Recorder and Java Mission Control.
Matthew McCullough, VP of Field Services at GitHub, gave a presentation in which he talked about the importance of OpenJDK and discussed Project Skara, a prototype GitHub-based mirror of the official OpenJDK upstream Mercurial repositories.
But it was Reinhold's presentation that really brought the "JavaOne" to Code One. Everyone's favorite Java Uber Geek started with a discussion about the impact of the new rapid release cadence for Java SE and the JDK, through which Oracle is now "evolving the Java platform at a more rapid pace."
"We've broken a few things, and we will continue to do so," he said, "but in a careful measured way, in order to make Java a better fit for modern applications.'
Attendees got a real sense of the spirit of JavaOne as Reinhold dispelled five misconceptions about how Java is changing. His list included:
- Every feature release will be as disruptive as past releases: "No, that's not true. The rate of innovation hasn't changed. What's changed is the rate of innovation delivery."
- Non-LTS (long-term support) releases are just a fancy name for a beta: "No. The only difference with an LTS release is it has a longer support timeline. You can use a non-LTS release in production if you like, but know that you'll have to update it in six months, or find someone to support it, or perhaps support it yourself."
- To remove an old feature, it must be deprecated three years in advance: "False. To remove a deprecated feature requires a production-ready build that issues a suitable warning at either compile time or runtime -- because a working build, after all, is the ultimate release method."
- If you maintain an infrequently migrated system you can ignore the non-LTS releases: "That would be a bad plan ... If you test with each feature release, then you'll be ready to migrate to the next long-term support release."
- You can't get more than six months of support for any non-LTS release and never more than three years for any LTS release: "Not true. It all depends on what the non-Oracle members of the JDK community decide to do. They have a proven track record and are already discussing how best to support JDK 8 and JDK 11 for the long haul."
He also made his own strong case for Oracle's approach to open Java. "Oracle builds and OpenJDK builds are at this point functionally interchangeable," he added. "This means that you can switch from one to the other as you please. It also means that all of this code is available under the GPL for anyone to build, test, publish, update and support."
And he covered a number of OpenJDK projects Oracle is pursuing to enhance the language, including Project Valhalla (more efficient JVM memory usage), Project Panama (improving C APIs for interacting with the JVM), Project Amber (making Java more "terse" through the addition of features, such as switch expressions and raw string literals) and Project Loom (a lightweight alternative to threads called "fibers" designed to be more efficient for concurrent code).
All in all, a very Java conference, and with the language and platform evolving in so many directions, it's probably the best we can hope for.
Posted by John K. Waters on October 31, 20180 comments
If you had to rank the many changes the Java community has seen over the past few years, the rebranding of a developer conference probably wouldn't make the top 10. But Oracle's decision to expand the menu of languages, frameworks, tools and tech covered at what was the annual JavaOne event, now called Oracle Code One, which gets underway next week in San Francisco, ain't nothin'.
In fact, it could be considered a kind of manifestation of a Java landscape increasingly infiltrated by new languages and not-so-Java tools -- many of which are quickly becoming essential additions to the Java Jock's gym bag.
That's kinda the way Stephen Chin explained it to me last week. Chin is the director of the Developer Community Team at Oracle (and a former JavaOne Rock Star), and he's the current Conference Content Chair, a role he also played for past JavaOne conferences.
"This is a trend that has been going on for several years," he said of the non-Java content in this year's show. "Now we're changing the conference name to match what has become a very broad developer conference."
As I reported earlier, Oracle is billing the change as "an expansion of tracks to include more languages, technologies, and developer communities." This year's conference program includes three tracks dedicated to Java content exclusively: a Java core track, which comes straight from the Java technology team; a server-side Java track, which covers the backend server-side use cases for Java, "including both the things we do at Oracle and things from the broader Java community," Chin said; and a Java ecosystem track, which is chaired by, Jonathan Giles, who works for Microsoft.
But for the first time, the conference will include content aimed at two different developer communities: those building databases-focused apps and MySQL developers. The program also includes sessions on such languages as Go, Rust, Python, JavaScript, and R.
"We're not taking away any significant Java content from the show," Chin said. "We adding to it."
The big events are also on the schedule: In the very popular Java technical keynote on Monday, Mark Reinhold, Chief Architect of the Java Platform Group, and Georges Saab, VP of Development, are set to talk about Java SE updates from the last 12 months, including Java 11, as well as "future projects aimed at accelerating user productivity, such as Java in container environments and exploration of new code review options for the JDK."
The Duke's Choice Awards are still part of the conference, the winners of which will announced during the technical keynote. But there's a new prize on the program called the Groudbreakers Award. Where Duke's Choice is aimed at projects, Groundbreakers recognizes influential developers in the community, Chin explained. In fact, "Groundbreakers" is a new "developer engagement brand," Chis said, which is why all the demos will be happening in the Groundbreakers Hub, and Oracle is promoting a new class of expert, called Groundbreaker Ambassador.
The Code One conference has 500 speakers on the schedule, Chin said, including a surprise addition to the community keynote on Wednesday: the father of Java himself, James Gosling. Chin will be there, too, along with Heather VanCura, Director at Oracle and Chair of the Java Community Process.
This year's Fireside Chat brings together some other industry icons, including: Doug Cutting, co-creator of Hadoop; Neha Narkhede, co-founder and CTO of Apache Kafka; Charles Nutter, co-leader of JRuby, Graeme Rocher, creator of Grails and Micronaut; and Guido van Rossum; creator of Python.
The great news about the chat is, attendees will get a chance to ask these luminaries questions during an audience Q&A.
And then there's the Blockchain Beer demo. There are a half dozen cool demos planned for the event, but this is the one, not surprisingly, generating the buzz.
For this demo, Oracle instrumented the entire operation of a Bay Area brewer, Alpha Acid Brewing Company, with IoT sensors, and coordinated with its suppliers (GigaYeast in San Jose, Admiral Malting in Alameda, and a hops farm in Gilroy) to collect data into a distributed blockchain ledger. The result: a QR code on the labels that, when scanned, shows the full history of the beverage, from farm to bottle.
"One of the things I love about doing projects like this is they expose small businesses doing interesting things," Chin said. "GigaYeast, for example, is working with local universities on specific strains of yeast that generate flavors and essences that taste like hops, so you get a hoppier beer without adding more hops.
Oracle was written up in the San Francisco edition of Eater, on this project, which I'm sure is a media first for Oracle.
The first official Oracle Code One keynote is set for Tuesday. Matt Thompson, Oracle's VP of Developer Engagement and Evangelism will be presenting. He'll be joined by Amit Zavery, Executive, Vice President of Fusion Middleware and PaaS Development at Oracle, and Siddhartha Agarwal, Group Vice President of Product Management and Strategy for Oracle Cloud Platform. The keynote will "explore topics ranging from managed Kubernetes and serverless functions to blockchain and intelligent digital assistants powered by chatbot technology," the company said.
Lots of other stuff to see and do at this year's show, including the big CloudFest concert on Wednesday night. You won't even notice the rebranding.
Oracle CodeOne, which runs Oct. 22-25, will be held at Moscone West.
Posted by John K. Waters on October 16, 20180 comments
The Eclipse Foundation is joining forces with the Cloud Native Computing Foundation (CNCF) to form a new Eclipse working group focused on improving Kubernetes IoT and edge deployments, the two organizations recently announced. The Kubernetes IoT Edge Working Group will address "surging demand" for Kubernetes in IoT cloud and edge environments, they said.
The working group is also supported by several industry heavy hitters who are betting big on Kubernetes, including Red Hat, Bosch, Eurotech, InfluxData, Siemens, Vapor IO, and VMware.
But it's actually more accurate to say that the new working group is a collaboration among the 40-member Eclipse IoT Working Group and the Kubernetes community, explained the Eclipse Foundation's Executive Director, Mike Milinkovich.
"We saw that there were highly complementary technologies being worked on by our two groups," Milinkovich told me. "It just made sense to pull the members together, so they could collaborate on defining the terminology, identifying the gaps in deployment and management, put standard metrics in place, identify open source projects that could help, and just generally educate the market on common use cases and typical scenarios for IoT solutions."
The complexity of orchestrating IoT systems is a problem domain for which Kubernetes is a perfect fit, Milinkovich added.
"Companies with commercial interests in IoT are facing a common set of infrastructure challenges at the edge," said Dejan Bosanac, Red Hat engineer and lead of the new working group, in a statement. "IoT and edge applications have many distributed components that don't usually sit together within the same datacenter infrastructure. There are messaging challenges, security has to be re-invented for every application and service, and there are integration and data locality issues with sidecar services. These are issues that shouldn't have to be re-invented every time; they should be open source infrastructure with broad industry support."
Red Hat sees "broad potential" for Kubernetes sitting between gateways, edge nodes, and cloud platforms, said Bosanac. "Much like the LAMP stack was instrumental to the client-server era, this group is focused on accelerating a Kubernetes stack for running cloud infrastructure and distributed components at the IoT edge," he said.
To get everybody's favorite container orchestration platform IoT-and-edge-ready, the working group will focus first on evolving Kubernetes to support IoT workloads at the edge (a $2.1 trillion market by 2021, according to IDC), and defining key use cases and requirements, Milinkovich said. Several areas that need improvement have already been identified. If Kubernetes is going to work in Industrial IoT (IIoT) applications, for example, the ingress layer must scale to millions of connections. That same layer must provide first-class support for IIoT messaging protocols. And Kubernetes must support multi-tenancy for environments where devices and gateways are shared.
"As you're building out IoT use cases, and in particular Industrial IoT use cases, you pretty quickly get into extremely large-scale scenarios -- millions of devices, hundreds of thousands of IoT gateways, and the scale of the data is enormous," Milinkovich said. "Ultimately, you need to get that data into a cloud infrastructure, so it can be dealt with at cloud scale and connected to the business processes."
Milinkovich also wrote about the new working group in a blog post, which I recommend. Here's a quote from the blog:
"Enterprises are being catapulted into system resource engineering concepts that have been the bedrock of operations at web-scale leaders like Google and Netflix, and the open source stack underneath it all is evolving so fast it's hard to keep up. Kubernetes is attracting all sorts of exciting frameworks and services (see projects like Istio and Envoy), and no one could have anticipated it having this degree of momentum."
The CNCF, which is part of The Linux Foundation, hosts some of the key components of cloud native software stacks, including Kubernetes and the Prometheus systems and service monitoring system.
Posted by John K. Waters on September 26, 20180 comments
What the Eclipse Foundation is describing as a "surge" of interest in both enterprise Java (Jakarta EE) and the activities of the Eclipse IoT community led to a spike in new memberships last month. The standards organization behind 350 open source projects and home of the Eclipse IDE added 16 new member organizations in August to its roster of 275 members.
The list of new members includes Advantest Europe GmbH, Baloise Holding AG, Cirrus Link Solutions, Cloudbees, Codescoop Oy, Fujitsu, iJUG, Inductive Automation, Istanbul JUG, Karakun AG, Kynetics LLC, Liferay, Lightbend, London Java Community, Mettenmeier, Mindus, Mizuho International, Nanjing Glaway, Pacific Northwest National Laboratory, RTD Embedded Technologies, Toyota, Tuev Sued Auto Services, Useopen Middleware and V2Com.
The Foundation is focused on creating an environment for successful open source projects, and to promote the adoption of Eclipse technology in commercial and open source solutions.
"Throughout the 14-year history of the Eclipse Foundation, our focus has been on fostering successful open source projects using a member and community-driven process to enable commercial adoption," said Mike Milinkovich, the Foundation's Executive Director, in a statement. "This is one of the most exciting periods in the Foundation's history, particularly as the enterprise Java stack re-imagines itself for cloud-native use cases via Jakarta EE, and as commercial adoption of IoT continues to explode with Eclipse IoT projects at the center of this innovation."
According to Milinkovich, seven of the Foundation's new members said they joined specifically to contribute to the evolution of Jakarta EE, and several expressed interest in participating in the Eclipse IoT Working Group, an industry collaboration of companies that invest and promote an open source community for IoT. Eclipse IoT currently includes more than 40-member companies working on 35 open source projects for IoT devices, gateways, and cloud platforms.
Another draw: the Foundation's new open source governance model and a "cloud native Java" path forward for Jakarta EE, which the organization unveiled in April.
"Ultimately, what we are trying to do here is to take a technology that is approaching its 20th birthday and give it a whole new life," Milinkovich told ADTmag in an earlier interview. "I have to say, when I talk to people, whether it's in person or through the mailing list, there is still an enormous amount of energy and passion in the Java EE community. If we can tap into that and give developers the tools they need on this platform to be successful in this new cloud-native, microservices-centric kind of world, they're going to love what's coming out of the Jakarta EE projects. This is an opportunity for this community to get a whole second generation of technology and momentum, and that's really what we are working very, very hard toward."
Posted by John K. Waters on September 12, 20180 comments
And so, finally, after eight long years, can this really be the end of the seemingly immortal court battle between Oracle and Google over those 37 Java APIs? The answer is ... probably not.
This week a U.S. Federal Circuit Court of Appeals declined to re-hear the case (Oracle America v. Google LLC) in which it found Google to be in violation of Oracle's copyright of those infamous APIs in its Android OS by a panel, or en blanc. Google can still appeal the ruling to the Supreme Court, but that court refused to hear an earlier appeal.
If Google appeals again and the Supremes demure again, the next step is a jury hearing to determine damages. Why take another run at the big court? Oracle is claiming $8.8 billion in damages, which is a lot of money, even for Alphabet's search giant.
In March, the appeals court ruled that Google's use the Java APIs in its Android OS was not protected under the fair use provision of U.S. copyright law. The U.S. Court of Appeals for the Federal Circuit sent the case back to a judge in San Francisco for a trial to decide how much the search engine giant will have to pay.
Oracle originally sued Google in 2010. Google's argument that its use of the Java APIs was allowed under the "fair use" provisions of the federal copyright law, and therefore did not infringe on Oracle-owned copyrights failed to persuade the court. "There is nothing fair about taking a copyrighted work verbatim and using it for the same purpose and function as the original in a competing platform," a panel of three Federal Circuit judges wrote in their March opinion.
What the appeals court found initially was that the declaration code in Oracle's API packages, which Google copied verbatim, was copyrightable. Google developed the implementation code independently, so that wasn't at issue. The court found that the Oracle code had not been merged with the functions performed by the code; that combinations of short code phrases, such as those used in the APIs, can be copyrightable; and the fact that the code serves a function does not preclude its copyrightability if, as the court put it, "the author had multiple ways to express the underlying idea" at the time of creation of the code.
Given the stakes, I think we can expect one more round.
Posted by John K. Waters on August 29, 20180 comments