Evening Edition

036e9794-8717-4bdd-b3b5-c2f259162e29

Brands, fans and influencers: why social media for small business is about more than sales

Words: Mark Smith - The Guardian - 15:58 12-06-2020

Most businesses these days will have some form of social media presence, but many may not be making the most of the opportunities it provides. Not only does it open up a huge potential customer base – half the world’s population is now on social media – it also gives companies the perfect opportunity to build and retain loyalty among existing customers.

Like all aspects of technology, social media is constantly evolving. So while a small business may have set up a Facebook or a Twitter account a few years back and thought that was a case of “job done”, new social media platforms such as TiKTok have been developed since then, while Instagram and YouTube have become vital parts of a holistic social media ecosystem.

Beyond the platforms themselves, trends have also changed in terms of what users want, how they interact with brands and what’s important to them. Customers have now become fans, emotional ties to brands are a thing and thought-leadership can make you an influencer. Content is still king, and shareability is vital.

But as well as all this modern stuff – the basics are still important too.

“On the high street you wouldn’t have a shopfront with a broken window, peeling paint, rubbish everywhere and goods randomly thrown on displays, and expect to thrive,” says PR and social media expert Mike Crutchley.

As someone who helps businesses improve and overhaul their social media strategies, he says first impressions count.

“Social media channels must be up to date with everything from posts to contact details and opening hours,” he says. “High-quality images and videos, as well as good grammar and spelling are as vital as creating engaging posts.”

The tools that allow businesses to make this happen have never been more accessible, and there is now an opportunity to try some of them out free of charge. Customers of the website builder GoDaddy are currently receiving a complimentary 90-day premium subscription to the mobile app Over, which gives them access to simple templates for creating sleek and effective social media content.

Sometimes the things that work best on social media are the simplest. You can have all the metrics and dashboards in the world, but if people don’t engage and share your original posts then you’re missing a huge potential source of customers.

When Dutch-born Londoner Annemarie Plas saw people in countries throughout Europe clapping for their healthcare workers she was inspired to help set up something similar in her adopted home, and so created clapforourcarers.co.uk with GoDaddy.

Scaling up quickly could well have proved a challenge, but with the astute use of social media things have gone from strength to strength.

“I just put together a small image and posted it on my socials such as Instagram, LinkedIn, Facebook and Twitter, and sent it to all my UK friends by WhatsApp, I also made a small website and an Insta page,” says Plas.

Her efforts to spread the word were given a huge boost when her campaign was picked up by influencers such as the Beckhams and the Duke and Duchess of Sussex, who shared it to their followers.

The first clap happened on Thursday 26 March at 8pm and became a weekly event, being covered by the national media and circulated widely on social media too, right up to the final clap on 28 May.

Although Plas has a background working for media agencies, she had neither the time nor staff support that other organisations might be able to draw upon. So she decided to keep things simple and made shareability a big part of her strategy.

“I understood the importance of having simple and engaging messaging. I used a hashtag and made the image easy to share on any social channels.”

Her simple and consistent messaging has resulted in the #clapforourcarers hashtag being shared more than 139,000 times on Instagram alone.

“Some influencers get a bad reputation,” says Masha Zvereva, founder of Coding Blonde. She set up her blog back in 2015, when she was trying to learn some coding skills to make her more employable. She originally registered it with GoDaddy, which she then also used as a hosting provider.

Through that blog, as well as Instagram and YouTube, Zvereva has amassed a loyal following and is now regarded as an influencer in the field of women in tech, entrepreneurship and personal growth.

“Influencers can be perceived as fake, superficial, salesy etc, but what people don’t see is the hard work that goes behind being able to make a living off of this business model and growing your business,” she says.

Quality content is paramount according to Zvereva. Whether you’re filming a video for YouTube or writing a thought leadership piece, it has to add value beyond simply advertising your skills to the wider world.

“Anyone can become an influencer if they want to, but I’d recommend approaching it from the standpoint of adding value to an audience,” she says.

“What’s the purpose behind your blog? How will you be impacting people’s lives and who is your target audience? And finally, why should it be you?”

Many people might still associate social media in a business context purely with selling, but its importance when it comes to building a brand can’t be overstated.

This is something Zaffrin and Brian O’Sullivan, co-founders of the vegan skincare company Five Dot Botanics set out to do well before their company launched.

Establishing it on Instagram even before they had products to sell, they were able to develop a loyal audience.

“Social media has allowed small brands like mine to build a brand. Historically it would not have been possible to launch a beauty brand without millions of pounds to acquire customers through marketing,” says Zaffrin.

Before setting up those social channels though, their first move was to register a domain name and get a URL through GoDaddy. Then it was time to get the ball rolling with social media.

The stories the O’Sullivans shared weren’t all about success, but about the challenges they were facing. This honesty helped create a situation where people were rooting for them. The couple were also able to get 600 people signed up to their newsletter email list so there was already an eager customer base waiting for when the products were ready.

Once the social channels were up and running, the O’Sullivans set up an internet landing page using GoDaddy’s services – and they were in business.

Social continues to be at the heart of their marketing. As well as using Instagram for brand-building, Zaffrin posts to Pinterest and Facebook, although she says the latter works best for business if you’re willing to put money behind it – paying for targeted ads, for example. Otherwise the other platforms can be effective without budget, simply by skilful use. Zaffrin uses LinkedIn to raise her business profile and publish articles, and is curious about TikTok, saying it is “one to watch”.

“Our audience are our fans,” she says. “They root for our success, and our customers on social tell us every day what they think and what they want. We are constantly listening to them, whether they’re letting us know how they are using our products or coming up with ideas for new ones.”

GoDaddy launched the #OpenWeStand initiative offering a number of free tools, widgets, resources and blogposts at OpenWeStand.org to help small businesses keep their digital doors open while their physical doors are closed. Over 50 companies have joined the cause, including Slack, Salesforce, PayPal, and more

(read more)

Updating the Language of SPI Pin Labels to Remove Casual References to Slavery

Words: Mike Szczys - Hackaday - 14:45 29-06-2020

This morning the Open Source Hardware Association (OSHWA) announced a resolution for changing the way SPI (Serial Peripheral Interface) pins are labelled on hardware and in datasheets. The protocol originally included MOSI/MISO references that stand for “Master Out, Slave In” and “Master In, Slave Out”. Some companies and individuals have stopped using these terms over the years, but an effort is being taken up to affect widespread change, lead by Nathan Seidle of Sparkfun.

The new language for SPI pin labeling recommends the use of SDO/SDI (Serial Data Out/In) for single-role hardware, and COPI/CIPO for “Controller Out, Peripheral In” and “Controller In, Peripheral Out” for devices that can be either the controller or the peripheral. The change also updates the “SS” (Slave Select) pin to use “CS” (Chip Select).

SPI is widely used in embedded system design and appears in a huge range of devices, with the pin labels published numerous times in everything from datasheets and application notes to written and video tutorials posted online. Changing the labels removes unnecessary references to slavery without affecting the technology itself. This move makes embedded engineering more inclusive, an ideal that’s easy to get behind.

Even though the terminology needs an update, the approach to how SPI data lines are designated is one of the best of all protocols because the *O*I/*I*O format stays the same even when the device changes. This is easiest to understand when thinking about a microcontroller that can act as either the “Controller” or “Peripheral”. A controller will always send out its data on the COPI line (controller out) and receive data back on the CIPO (controller in). Now, the same device acting in the peripheral role retains the exact same pin labels. It just begins listening on the COPI line (peripheral in) and sending on the CIPO line (peripheral out). Under this naming scheme, the controller is always the device that controls the clock.

The SDI/SDO labels have most commonly appeared on devices that lack the ability to serve as an SPI controller (think sensors or LCD screens). But here’s the problem, when you have three or more chips in a design, which SDI lines get connected to SDO lines? Even with two chips, if one port is called SDI and the other is called SDO, what name do you assign to the wire? It’s the UART RX/TX problem all over again.

Retaining the COPI/CIPO paradigm, the problem is answered without any knowledge at all of function: all COPI lines should be connected to one another, as should all CIPO lines. Brilliant.

SPI is a de facto standard which Motorola published starting back in the 1980s. It’s simple and it works well, becoming one of the two most widely used chip to chip communication protocols along with I2C. But it’s not governed by a ruling body. That means, to change the pin names, all it takes is for people to decide we should change them. That’s what’s happening here.

With hardware manufacturers like Sparkfun and Adafruit, and the Open Source Hardware Association adopting the SDO/SDI and COPI/CIPO labels, the effort gets a jump start. I encourage you to make the changes in your own schematics, software, and documentation.

The hardware world isn’t the only place removing references to slavery from design specs. The OpenZFS project changed references to “slave” in the code base to “dependent” which was also abbreviated as “dep” for variable names. An article in Ars Technica published on the OpenZFS change also references a paper published by the Internet Engineering Task Force (IETF) standards organization recommending a shift away from oppressive language being included in defined standards.

The history of slavery is a dark and disturbing one, and its casual inclusion in engineering can be hurtful. In this time of introspection sparked by massive protests over racial inequality, systemic racism, and violence within law enforcement, this is one small but meaningful change the hardware world should choose to adopt. And one that I wish had been adopted long ago.

(read more)

Joker steals all of Batman’s money, Bruce Wayne now a penniless orphan

Words: Susana Polo - Polygon - 17:01 29-06-2020

It’s only been a few weeks since we found out that the Joker’s ultimate plan to do away with Batman forever is to steal all of his money, and the Clown Prince of Crime has already done the deed. By the end of week’s Batman #93, with some help from his new Number Two, Punchline, the Joker is the world’s newest billionaire.

How does the Joker even know that Batman has money? Well, aside from the obvious, this summer’s Joker War crossover rests on the idea that the Joker knows that Batman is secretly the billionaire Bruce Wayne, that Nightwing is former circus acrobat Dick Grayson, that Batgirl is really Commissioner Gordon’s daughter, etc. etc. It’s already a tough time for the Bat-Family, and now the Joker has all the resources and technology of Wayne Enterprises at his fingertips.

What else is happening in the pages of our favorite comics? We’ll tell you. Welcome to Polygon’s weekly list of the books that our comics editor enjoyed this past week. It’s part society pages of superhero lives, part reading recommendations, part “look at this cool art.” There may be some spoilers. There may not be enough context. If you missed the last one, read this.

The tag here, “Joker’s Billions” is a reference to The Joker’s Millions , a silver age comic story so good they made an entire episode of Batman the Animated Series about it. I don’t have anything to add, I just appreciate a good comics history pun.

Marvel’s delayed summer event is finally making its way to stands, with Avengers: Empyre #0. Al Ewing condenses a lot of weird Marvel lore in this one and Pepe Larraz makes it all look gorgeous, but the upshot is: The Kree and the Skrulls are teaming up, something weird is happening in the Blue Area of the moon, and Iron Man is feeling weirdly protective about all of it. Perhaps ... unnaturally so.

Speaking of comics back from the virus hiatus, Die is back, and everyone’s emotional state is just getting worse. So we’re right on track for a Kieron Gillen comic, really.

There were a lot of nice stories in the Green Lantern 80th Anniversary special, including the late Denny O’Neil’s final story for DC, but I think my favorite was Mariko Tamaki and Mirka Andolfo’s piece on Jessica Cruz. Cruz is among the newer Green Lanterns of Earth, and the whole hook of her character is how she can still be a Green Lantern — beings renowned for their iron wills and lack of fear — when she struggles with severe anxiety.

I struggled to pick one part of this week’s Suicide Squad to feature. The part where they adopt a puppy? The part where Deadshot halts a Batman punch by putting the puppy in front of his face? The part where Deadshot quits the squad? I settled for this one, even though right after this Batman retorts “You want me to call you an ambulance?”

Simon Spurrier and Aaron Campbell tell a grisly little horror story in the first part of this story, but it was the promise of revenge at the end that kept me on the hook, pun very much intended.

Vox Media has affiliate partnerships. These do not influence editorial content, though Vox Media may earn commissions for products purchased via affiliate links. For more information, see our ethics policy .

(read more)

Nacelle raises $4.8M for its headless e-commerce platform

Words: Lucas Matney - TechCrunch - 19:09 29-06-2020

As e-commerce companies aim to capitalize on the online spending boom connected to shelter-in-place and keep the party going as physical retailers open back up, more are turning their attention to how they can juice the functionality of their online storefronts and improve experiences for shoppers. Enter Nacelle, an LA-based startup in the burgeoning “headless” e-commerce space.

The startup bills itself as a JAMstack for e-commerce, offering a developer platform that delivers greater performance and scalability to online storefronts. Nacelle has raised about $4.8 million to date in fundings led by Index Ventures and Accomplice. Some of the company’s other angel investors include Shopify’s Jamie Sutton, Klaviyo CEO Andrew Bialecki and Attentive CEO Brian Long.

Nacelle builds an easier path for e-commerce brands to embrace a headless structure. Headless web apps essentially mean a site’s front end is decoupled from the backend infrastructure, so it’s leaning fully on dedicated frameworks for each to deliver content to users. There are some notable benefits for sites going headless, including greater performance, better scalability, fewer hosting costs and a more streamlined developer experience. For e-commerce sites, there are also some notable complexities due to how storefronts operate and how headless CMSs need to accommodate dynamic inventories and user shopping carts.

“We asked how do you pair a very dynamic requirement with the generally static system that JAMstack offers, and that’s where Nacelle comes in,” CEO Brian Anderson tells TechCrunch.

Anderson previously operated a technical agency for Shopify Plus customers building custom storefronts, a venture that has led to much of the company’s early customers. Nacelle also recently hired Kelsey Burnes as the startup’s first VP of marketing; she joins from e-commerce plug-in platform Nosto.

Though Anderson described a flurry of benefits regarding Nacelle’s platform, many are the result of reduced latency that he says converts more users and pushes them to spend more. The startup has a particular focus on mobile storefronts, with Anderson noting that most desktop storefronts dramatically outperform mobile counterparts and that the speedier load times Nacelle enables on mobile can do a lot to overcome this.

As more brands embrace headless structures, Nacelle is aiming to manage the experience. Nacelle is optimized for Shopify users to get up and running the most quickly. Users can also easily integrate the system with popular CMSs like Contentful and Sanity. All in all, Nacelle sports integrations for more than 30 services, including payments platforms, SMS marketing platforms, analytics platforms and more. The goal is to minimize the need for users to migrate data or learn new workflows.

The company is unsurprisingly going after direct-to-consumer brands pretty heavily. Some of Nacelle’s early customers include D2C bedding startup Boll & Branch, cozy things marketplace Barefoot Dreams and fashion brand Something Navy. Most of Nacelle’s rollouts launch later this summer. Last month, Nacelle went live with men’s toiletries startup Ballsy and says that the storefront has already seen conversions increase 28%.

Nacelle is far from the only young entrant in this space. Just last month, Commerce Layer announced that it had raised $6 million in funding from Benchmark.

Italy’s Commerce Layer raises $6M led by Benchmark for its headless e-commerce platform

(read more)

Coronavirus stimulus money will be wasted on fossil fuels

Words: David Roberts - Vox - 19:29 29-06-2020

Update, June 29: Chesapeake Energy Corp., a massive US oil and gas company that led the fracking boom, has filed for Chapter 11 protection in a bankruptcy court in Texas following the collapse of energy demand in the Covid-19 crisis. The following post, first published April 20, explains why companies like it faced challenges predating the pandemic. (It’s not clear whether Chesapeake received stimulus funds before filing for bankruptcy.)

As countries across the world have gone into lockdown in response to Covid-19, economies are in free fall. Almost every sector is taking a hit, hemorrhaging jobs and value. And almost every sector will be shaped, for years to come, by the speed, amount, and nature of public assistance it receives. There is a finite amount of time, resources, and political will available to get economies going again; not every sector will get what it wants or needs.

In short, the decisions legislators make in response to the coronavirus crisis will have an enormous influence on what kind of economies emerge on the other side.

In March, I wrote about what an ideal recovery and stimulus package would look like. Then I wrote about how shortsighted it is for Republicans (enabled by learned Democratic passivity) to reject aid for the struggling clean energy industry.

BREAKING: WTI crude oil futures trade at negative price for first time https://t.co/pOSyH6AVtP pic.twitter.com/XsoH1jG8WH

— Bloomberg (@business) April 20, 2020

In this post, I take a look at why it is equally shortsighted for President Trump and congressional Republicans to remain so devoted to the fossil fuel industry.

The dominant narrative is still that fossil fuels are a pillar of the US economy, with giant companies like Exxon Mobil producing revenue and jobs that the US can’t afford to do without. Even among those eager to address climate change by moving past fossil fuels to clean energy — a class that includes a majority of Americans — there is a lingering mythology that US fossil fuels are, to use the familiar phrase, too big to fail.

But the position of fossil fuels in the US economy is less secure than it might appear. In fact, the fossil fuel industry is facing substantial structural challenges that will be exacerbated by, but will not end with, the Covid-19 crisis. For years, the industry has been shedding value, taking on debt, losing favor among financial institutions and investors, and turning more and more to lobbying governments to survive.

It is, in short, a turkey. CNBC financial analyst Jim Cramer put it best, back in late January, before Covid-19 had even become a crisis in the US: “I’m done with fossil fuels. They’re done. They’re just done.”

“We’re in the death knell phase,” he said. “The world has turned on [fossil fuels].”

Cramer’s take is not yet conventional wisdom, but he’s right. Evidence in support appears in an April report from the Center for International Environmental Law (CIEL) called “Pandemic Crisis, Systemic Decline.” Let’s walk through it.

The UK-based think tank InfluenceMap recently did an analysis that tracks corporate lobbying in the face of the Covid-19 crisis. It found that, across the globe, the oil and gas sector has been the most active in lobbying for interventions, seeking, as CIEL summarizes, “direct and indirect support, including bailouts, buyouts, regulatory rollbacks, exemption from measures designed to protect the health of workers and the public, non-enforcement of environmental laws, and criminalization of protest, among others.” In Canada, Australia, and the UK, the industry is arguing that it must be subsidized and deregulated in order to survive.

In the US alone, the industry is seeking access to a range of stimulus funds, relief from a variety of pollution regulations, and use of the strategic petroleum reserve to bolster prices. Journalist Amy Westervelt is tracking at least a dozen other lobbying efforts. Recently the Federal Reserve changed its rules to allow bigger businesses access to “Main Street loans” (widely seen as a sop to oil and gas companies) and, as Emily Holden reports for the Guardian, records show that fossil fuel companies have already gotten $50 million in loans meant for small businesses.

The petrochemical and plastics industry, which is in large part an extension of the oil and gas industry, is exploiting the crisis as well. It has lobbied the federal government to declare an official preference for single-use plastic bags and suggested that more fresh produce should be wrapped in plastic.

The virus has not slowed down the Trump administration’s attempts to assist the industry. It is gutting fuel economy standards, which, by its own estimation, will increase pollution and eliminate 13,500 jobs a year. The EPA has dramatically eased the enforcement of pollution regulations and moved forward with its “secret science” rule, which will make it more difficult to understand and address the health impacts of air pollution — and more difficult to study the coronavirus.

During a supply glut driven by historically low prices, the Interior Department is rushing to lease federal land for oil and gas development, despite an anemic response, rock-bottom prices, and calls from conservative and taxpayer groups to suspend leasing in the face of the coronavirus.

The administration seems determined to bail out struggling shale gas companies, despite that overleveraged, debt-ridden sector being long overdue for a shakeout. (For more on that, check out Amy Westervelt’s reporting at Drilled.)

Trump is negotiating with Saudi Arabia and Russia on oil supply cuts, and has the Department of Energy buying up millions of barrels of oil for the strategic petroleum reserve, all to try to boost the price of oil to help struggling oil majors. A group of GOP senators is lobbying for fossil fuel companies, including coal companies, to be eligible for the small business recovery fund.

In April, EPA Administrator Andrew Wheeler announced that the administration, in defiance of an enormous body of evidence and recommendations from EPA scientists and staff, will not tighten restrictions on soot pollution. And on Friday, Wheeler announced that the EPA will weaken standards on mercury and other toxic metals from fossil-fueled power plants, again in opposition to the scientific consensus, based on rigged cost-benefit analysis that deliberately excluded most benefits.

Across the board, the administration is doing everything it can to help fossil fuels. But it’s a mug’s game. The industry is faltering for reasons that well predate Covid-19.

US coal is in terminal decline, for reasons I’ve written about many times before. No amount of stimulus money or weaker pollution regulations can save it.

But on the surface, things look different for oil and gas. Thanks to fracking, production has been booming for the past decade, vaulting the US ahead of Saudi Arabia and Russia to become the the world’s leading oil and gas producer.

And the same goes for petrochemicals and especially plastics, which have been forecast to be the main drivers of rising petroleum demand in coming years. The industry has issued rosy projections of plastics’ growth and invested $200 billion in new petrochemical and plastics infrastructure.

But dig below the surface and things don’t look so good.

First, fracking was a financial wreck long before Covid-19 hit. US fracking operations have been losing money for a decade, to the tune of around $280 billion. Overproduction has produced a supply glut, low prices, and an accumulating surplus in storage.

Since 2015, over 200 drillers have gone bankrupt, with 32 declaring bankruptcy in 2019. At the beginning of 2020, the industry continued to struggle as natural gas prices remained low due to sluggish demand growth. By the end of the first quarter, another seven drillers had declared bankruptcy, six additional drillers had their credit outlook downgraded, and several major banks had written down the expected value of many drillers’ reserves. A recent analysis from Rystad Energy indicated that, at prevailing oil and gas prices, almost all new fracking wells drilled would lose money.

Even as its prospects grow dimmer, the enormous debt the industry has taken on over the years is coming back to bite it. Some $40 billion will come due this year alone, and around $200 billion in the next four years.

Second, both oil and gas prices were persistently low leading into 2019. Due to oversupply and mild winters in the US and Europe, there is a glut of both natural gas and oil, such that the entire world’s spare oil storage is in danger of being filled. Many big oil deals in “frontier countries” with as-yet-unexploited reserves, like Guyana, Argentina, and Mozambique, are falling through as low prices drag on.

Third, renewable energy and electric vehicles are threatening oil and gas’s dominance in both transportation, which represents 70 percent of global demand, and electricity. Natural gas’s status as a “bridge fuel” in the power sector is in increasing doubt; since 2014, orders for new gas turbines (to generate power) have fallen by half. As for transportation, a recent report from the international banking group BNP Paribas concluded that “the economics of oil for gasoline and diesel vehicles versus wind- and solar-powered EVs are now in relentless and irreversible decline.”

Fourth, oil and gas majors are revealing their own weakness by writing down assets — effectively conceding that certain reserves cannot be profitably exploited. In 2019, Chevron wrote down $11 billion worth; Spanish oil company Repsol recently wrote down $5 billion worth. Exxon Mobil, after adding Canadian tar sands assets to its books in 2017, reversed course and wrote down 3.2 billion barrels last year.

Fifth, financial institutions — “institutional and retail investors, banks, insurers, and credit rating agencies” — are catching wind of fossil fuels’ weakness and beginning to back away. Many, like Wells Fargo, BlackRock, the European Investment Bank, and the World Bank Group, are restricting investments in carbon-intensive projects. As of March 2020, asset investors worth $12 trillion had declared that they would divest from fossil fuels.

As financial institutions divest, the ones still invested in carbon-intensive projects face increasing vulnerability to lawsuits charging them with ignoring material risks. “As the risks of investing in the oil and gas sector become ever more apparent,” CIEL writes, “more and more investors subject to fiduciary duties will likely choose to steer clear of these companies.”

Like these other dismal trends, the financial turn from fossil fuels was underway well before Covid-19. Over the past decade, companies in the sector have spent more on stock buybacks and dividends than they have brought in through revenue, leading to a greater and greater debt burden. Declining confidence in the sector has made it the worst-performing sector on the S&P Index.

Finally, plastics, the great hope of the oil and gas sector, do not appear to be growing fast enough to justify the industry’s optimistic projections. Much of the US plastics industry is geared for export, but countries across the world (127 and counting) are adopting restrictions on single-use plastics. The most recent such restrictions were adopted by China, the world’s largest plastic producer and consumer. Plastics, like oil and gas, are suffering from the dual malady of overexpansion and underconsumption.

As an example that encompasses all these structural problems, CIEL cites Exxon Mobil. The company’s plan for growth involves growth in its petrochemical operations, which is now in doubt; fracking in the Permian Basin, which is now in doubt; and expanding oil production in Guyana, which is now (owing to political instability) in doubt.

All these doubts are converging as Moody’s recently revised the company’s outlook to negative. It fell out of the S&P’s top 10 for the first time, its stock hit its lowest price in a decade, the rapid rise of renewables and electric vehicles rendered billions (and perhaps soon trillions) of dollars of its assets worthless, and it is keeping shareholders happy with debt-financed dividends. The Institute for Energy Economics and Financial Analysis found that over the past decade, Exxon Mobil has spent $64.5 billion more on payouts to stockholders than it earned in free cash flow. That can’t go on much longer.

Again: All of these structural trends predate Covid-19. But the global lockdown in response to the virus has accelerated all of them.

Into this already dismal situation for fossil fuels came the virus and the subsequent lockdown. The vertiginous plunge in consumer demand has hit every sector of the economy, but oil and gas, already facing oversupply and persistent low prices, were particularly vulnerable.

“Oil, gas, and petrochemical stocks have been affected more rapidly and much more deeply than almost any other sector,” CIEL writes. “The oil and gas sector lost more than 45% of its total value from the beginning of January to early April 2020.”

The already declining stocks of Exxon Mobil, Royal Dutch Shell, and Occidental Petroleum were sent tumbling even faster. In July 2014, Exxon stock hit a high of $107; as of early April 2020, it was at $42, its lowest level in decades. (On June 29, it was at $44.)

Transportation represents 70 percent of petroleum consumption, but no one is moving. Rystad Energy estimates that as of March 2020, global traffic is down 40 percent. As lockdowns remain, that number will likely drop further.

Air travel has been the fastest-growing source of demand for transport fuels, but no one is flying. “In the final week of March 2020,” CIEL writes, “commercial air traffic was almost 63% lower than in 2019.”

Public health officials warn that there could be periodic outbreaks for months or even years. Meanwhile, there are rapid advances being made everywhere in the infrastructure, technology, and practices of working remotely from home. It’s entirely possible that auto and air travel won’t reach their pre-virus levels in the US for years, if ever.

Travel by ship is also taking a hit. Cruise ships, beset by a series of viral horror stories, have suspended operations and many analysts doubt they will ever fully recover.

Meanwhile, oversupply, exacerbated by the drop in demand, is taxing the nation’s storage capacity — the International Energy Agency says global capacity is about 85 percent full. “Nearly all observers have concluded that at projected levels of demand destruction,” CIEL writes, “the total global capacity for storing unneeded oil and gas will soon be exceeded.” At that point, many producers will be forced to simply shut down operations and write-downs will accelerate.

On top of all this has come a price war between Saudi Arabia and Russia, competing for the shrinking supply left over by the US supply glut. Global oil prices were at $69 per barrel in January 2020. The price of a barrel of Canadian tar sands oil appears headed into negative prices, as are Texas oil and natural gas in some parts of the US, for May futures (June prices are higher). The so-called OPEC+ group of oil-producing nations (OPEC + Russia) recently agreed to a 10 million barrel a day cut in production, but analysts agree that it is unlikely to be sufficient to stabilize prices.

(In the hours after this article was first published on April 20, oil futures for May fell to negative prices. Mind-boggling.)

When storage capacity runs out, producers are forced to pay people to take oil off their hands. (Raise your hand if you had “negative oil prices” on your 21st-century bingo card.) Even if storage doesn’t completely run out, it will be close to full, serving to suppress prices, for years. Petrochemicals and plastics don’t have it much better, with major investors delaying or dropping out of projects left and right.

“In the medium term,” CIEL writes, “the prospect of a full recovery for many of these revenue streams is, at best, uncertain, and, in many cases, unlikely.” Fossil fuels and petrochemicals could struggle for years.

And even if they eventually manage to achieve something like their pre-virus trajectory, that trajectory was sloping downward. As CIEL summarizes: “the pandemic exposes and exacerbates fundamental weaknesses throughout the sector that both predate the current crisis and will outlast it.”

Slowly but surely, the world is beginning to take global warming seriously, shifting attention and investment to materials and sources of energy that do not produce greenhouse gas emissions. As more and more jurisdictions, institutions, and investors turn away from fossil fuels, explicitly citing climate change, those left holding carbon-intensive assets will become targets of increasingly intense legal and civic activism holding them responsible for the damages.

CIEL concludes with recommendations to investors, frontier countries, and local communities: Take heed of fossil fuels’ long-term weakness when making decisions about the future. CIEL also argues that public officials “should not waste limited response and recovery resources on bailouts, debt relief, or similar supports for oil, gas, and petrochemical companies.”

Given the well-established inclinations of Trump and congressional Republicans, that recommendation is likely to fall on deaf ears, at least in the US. If Democrats do not muster the courage to stop them — and it does not seem they will — the GOP is likely to continue showering the fossil fuel industry with favors while dismissing aid to the clean energy industry as frivolous.

At best, they can slow down the transition to clean energy a bit. They cannot stop it. Adding stimulus money to fossil fuels’ already subsidy-rich diet will allow a little more pollution and a little more damage to public health for a little longer, but it’s only a delay. Meanwhile, other countries will be establishing a commanding position in some of the biggest growth industries of the 21st century.

It would be a shame to emerge from this crisis still clinging to the past rather than facing, and preparing for, the future.

Editor’s note, May 1: This piece has been updated to note new Federal Reserve rules to allow bigger businesses access to “Main Street loans.”

Support Vox’s explanatory journalism

Every day at Vox, we aim to answer your most important questions and provide you, and our audience around the world, with information that has the power to save lives. Our mission has never been more vital than it is in this moment: to empower you through understanding. Vox’s work is reaching more people than ever, but our distinctive brand of explanatory journalism takes resources — particularly during a pandemic and an economic downturn. Your financial contribution will not constitute a donation, but it will enable our staff to continue to offer free articles, videos, and podcasts at the quality and volume that this moment requires. Please consider making a contribution to Vox today.

(read more)

The real cost of Amazon

Words: Jason Del Rey - Vox - 12:00 29-06-2020

At 5:30 every morning, Rosie, an Amazon worker at a fulfillment center in Staten Island, New York, checks her text messages to see if she’s received more bad news: yet another colleague infected with Covid-19, on top of the at least 50 people at her facility who she says have already gotten sick.

As an older employee, Rosie is at higher risk of developing serious complications from the disease than many of her younger coworkers. Her two children beg her to quit.

“It’s frightening, but you have to put on a smile and you go to work because you need the income,” Rosie, who is being identified by a pseudonym because she fears losing her job for speaking to the press, told Recode in late May.

While she’s grateful for the safety precautions Amazon has introduced at its fulfillment centers in the past two months, like providing masks and hand sanitizer stations, she’s alarmed by what she says she saw and heard around her: dirty air filters that aren’t replaced, a visibly ill colleague who vomited in the bathroom — even after passing the mandatory temperature checks the company instituted in early April — and workers standing close together in the morning when they’re waiting to get shift assignments, even though the rules specify workers must always stay 6 feet apart.

On a follow-up call in late June, Rosie said that since management canceled morning meetings, there is no longer crowding before shifts, and conditions have improved, but not entirely.

“It affects your nerves, your mental state, your way of thinking — because you have to be cautious in everything you do now,” Rosie said. “It’s like I’m risking my life for a dollar. It’s twisted.”

Last month, Rosie was shocked to hear that a colleague who she heard was in his 20s — practically “a kid,” she said — had died of Covid-19. Management never informed Rosie, and she suspects many others didn’t know either. Instead, she said, she learned the news from a coworker’s Facebook post.

Management’s attitude toward the death was “hush-hush, underneath the rug — along with how many people have the disease,” Rosie told Recode. “This is how this company runs this organization.”

An Amazon spokesperson disputed Rosie’s account, saying the company communicated the news about the colleague’s death in person to everyone working at the warehouse. The spokesperson also said Amazon has made it clear that all employees who feel ill must stay home and that they have several paid and unpaid leave options.

But Rosie’s story is just one of several similar accounts thatstronghave emerged from workers inside Amazon fulfillment centers since the pandemic started in March, prompting an unprecedented series of internal scandals, employee protests, and public petitions that have united some of Amazon’s corporate and warehouse employees against their employer for the first time. In turn, this unrest has attracted scrutiny from top politicians over the company’s labor practices, and threatens to harm Amazon’s reputation in the eyes of the hundreds of millions of people who shop on the platform every year. It also reveals inequalities in the economy that Amazon has flourished in, an economy that the e-commerce giant is also shaping as its size and influence expand.

Amazon, the second-largest private US employer after Walmart, pays its fulfillment center workers a $15 minimum hourly wage and offers superior benefits when compared to some major competitors. But many of the company’s workers still say they are struggling to stay afloat, and they have such limited work options that they keep showing up to sort, pack, and deliver shipments for Amazon even as they fear the company isn’t doing enough to keep them safe during a global health crisis.

In interviews with Recode, dozens of current and former Amazon employees, from the warehouse level to senior corporate managers, shared previously unreported details about the inner workings of the company, inconsistent enforcement of health and safety protocols, and the tactics they say the company has employed to tamp down tensions rising among its workforce.

Amazon seems to be well aware that its treatment of workers during the pandemic matters. Externally, the company has launched a public relations campaign that includes TV commercials and a documentary TV series to drive home a message to customers that keeping the “retail heroes” in its warehouses safe is its top priority.

But internally, employees told Recode that Amazon has responded to workers’ complaints by cracking down on dissenters. The company has fired at least six employees who were involved in recent worker protests or who spoke out about working conditions at Amazon, including several who were visible leaders within the company on worker issues. Sources told Recode the company has also reprimanded at least six other employees during the same period who were involved in recent protests.

Amazon has said that it terminated the employees in question for repeatedly violating internal policies on social distancing, internal communications, and conduct with colleagues. It denied retaliating against employees for their criticism of the company.

Top Amazon executive Dave Clark, who oversees Amazon’s global warehouse network, told Recode in May, “I’ve been here 21 years, and I have never seen anybody punished or terminated or anything for speaking out or having a contrary opinion or debating something. And that continues to be the case.”

Courtney Bowden, a former Amazon warehouse worker in Pennsylvania who was fired in March shortly after organizing her colleagues to demand paid time off for part-time employees, disagrees. Bowden says Amazon’s stated reason for firing her was for getting into a dispute with a coworker. “Amazon thinks that they can control all these workers speaking out by firing them,” Bowden told Recode in mid-March. “What they don’t understand is that the amount of people doing this is just going to grow, grow, grow.”

Clark also told Recode that the company led many of its competitors in rolling out Covid-19 safety measures such as mandatory masks, temperature checks, and enforced social distancing in warehouses. In interviews with Recode, even warehouse employees who were critical about Amazon’s Covid-19 safety practices said they have seen some signs of improvement since mid-March.

But workers told Recode that other, deeper issues that existed before the pandemic have only gotten worse — namely, that how Amazon responded to workers’ pandemic complaints exemplifies how workers have limited power or voice in how their employer treats them.

The internal conflicts at Amazon, coupled with growing outside scrutiny, have put the company — and its customers — in a fraught position.

The e-commerce giant with a $1 trillion valuation has become a symbol of the longstanding economic and racial inequalities in the US that the pandemic has exaggerated. The virus disproportionately kills more Black Americans than other ethnic groups; 80 percent of Amazon’s US warehouses are located in zip codes that have a higher percentage of Black, Latinx, and Indigenous people than the regional average, according to a recent analysis by the employee activist group AECJ.

Like many other white-collar tech workers in the US, most of Amazon’s corporate employees have been able to work from home. Meanwhile, Amazon’s warehouse employees, who have historically been more racially diverse than its corporate employees, have to show up in person. And as millions of other Americans have lost their jobs and are struggling to afford necessities, Amazon and companies like it are reaping record sales and hiring hundreds of thousands workers to staff their facilities, deliver products, and risk exposure to a virus that’s already killed more than 125,000 people in the US as of late June.

Before the pandemic, millions of Americans already relied on Amazon for the convenience of its one- or two-day shipping. Covid-19 shelter-in-place orders and the temporary shuttering of many physical retailers only increased dependence on the company: Amazon sales and Prime membership subscriptions shot up from January to March.

But reports of the company’s labor issues have raised uncomfortable questions. Is it possible for Amazon to maintain what its CEO Jeff Bezos calls its “obsessive-compulsive focus on the customer” while also protecting its employees? Would customers pay more and accept slower delivery times if it meant Amazon would support and pay its workers more? Do we want to live, work, and shop in an economy where more and more businesses are emulating Amazon’s business model, and where more people depend on fast-paced warehouse and delivery work to make their livelihoods? Or will politicians, Amazon’s own employees, and, most importantly, consumers demand changes from the company — and the economy in which it thrives?

These questions aren’t entirely new. Well before the pandemic, Amazon was seemingly unstoppable despite reports of grueling and sometimes dangerous conditions at its warehouses. In the past 25 years, the company has grown from a scrappy online bookstore to one of the world’s most valuable companies, with its reach extending beyond e-commerce to streaming television, brick-and-mortar grocery, and cloud computing.

“When we talk about Amazon, we’re really talking about the future of work,” Stuart Appelbaum, president of the Retail, Wholesale, and Department Store Union (RWDSU), which represents workers at major retailers such as Macy’s, Bloomingdale’s, and H&M, told Recode. “Other employers feel that if they want to survive, they have to find a way to change their working conditions to replicate Amazon. And that’s exactly what we don’t want — we don’t want Amazon to be the model for what working is going to be like, of what the future of work is going to look like.”

In light of the pandemic’s life-or-death consequences, assessing the future of work and Amazon’s role in it is more urgent than ever.

The company does not publicly share the total number of its workers infected with Covid-19, although it has directly messaged warehouse workers individually when there is a person with a new case at their facility. Former Indiana warehouse employee Jana Jumpp started a project to crowdsource these messages from workers. She says she’s confirmed nearly 1,600 cases of Amazon warehouse employees with Covid-19 since March, and at least nine workers who have died of the disease. That case total would represent well less than 1 percent of Amazon’s US warehouse workforce, but without Amazon’s confirmation, it’s still unclear how widely the virus has spread among its employee base.

Amazon declined to comment on Jumpp’s reporting to Recode, but Amazon spokesperson Kelly Cheeseman told Recode the company uses “a variety of data to closely monitor the safety of our buildings and there is strong evidence that our employees are not proliferating the virus at work.”

Jumpp says she’s getting a steady stream of reports of at least 10 to 20 new cases a day from Amazon workers across the US, which she compiles in a spreadsheet.

“If the public really knew what was going in the facilities, they might think twice about shopping on Amazon,” Jumpp told Recode.

That’s because what happens inside Amazon’s warehouses doesn’t just affect its employees. It will impact the rest of us, too.

And the company’s customers will impact its practices.

External surveys show that Amazon’s customer reputation began slipping during the pandemic, though the causes of this shift are not yet clear. The share of people who said they have a positive impression of Amazon dropped from 74 percent in January before the pandemic hit the US to 58 percent in May in two similar, separate polls of more than 1,000 people conducted by Survey Monkey with Fortune and Recode, respectively.

Another recent poll by RBC Capital Markets showed a similar trend: Amazon customers are reporting record-low levels of customer satisfaction, despite making more frequent purchases.

For now, it’s hard to say if we’re seeing more negative customer feedback about Amazon because people encountered inventory shortages and delivery delays due to the coronavirus, or because they’re troubled by criticisms of Amazon’s labor practices, or some other reason. If it’s merely shopping inconveniences prompting the shift in customer perception, the company may be motivated to push its employees harder, and return to pre-Covid-19 levels of worker productivity as quickly as possible. But if the shift relates to Amazon’s ethics as an employer, the company has a deeper issue to solve for, and what it does next is likely to have significant implications for the rest of the US economy.

“If the public starts supporting the protests, if the customers start boycotting Amazon, then customers form a significant form of power,” Thomas Anton Kochan, a professor of industrial relations at MIT, told Recode. “The ultimate arbiters of this debate will be the public, not Amazon and not the workers themselves.”

If it’s still uncertain how customers will ultimately respond to Amazon and how it handled the pandemic, what has become clear is that the past three months have shaken up Amazon’s internal culture, which one employee described as an “artificial internal class system” that has until now separated corporate employees from fulfillment center workers.

As reports emerged of the company firing and cracking down on workers agitating for better conditions at fulfillment centers, a growing number of the company’s engineers, product managers, and designers have become embarrassed, worried, and angry. For the first time, they’re joining forces with their colleagues at the warehouse level to publicly criticize their employer, and some say they lost their jobs because of it. Meanwhile, prominent politicians like Sens. Cory Booker and Elizabeth Warren are pressing the company on its firings of workers across corporate offices and the warehouse floor alike.

“People want to be proud of the company, but they are feeling quite ashamed and deciding whether they can change [it] from within or need to leave,” one longtime corporate Amazon employee told Recode in late April.

“At the end of the day, I want to know what kind of company does Amazon want to be: a company that allows discourse and dialogue between employees, or a company that suppresses dissent?” another Amazon employee told Recode in late April.

Since March, workers have issued two petitions with more than 6,000 combined employee signatures demanding better pay and benefits, and they’ve held at least eight protests at over a dozen fulfillment centers, sortation centers, and delivery stations.

Amazon’s response to its warehouse and corporate employees’ concerns seems to have only agitated employees more. In public statements and internal meetings, the company seems to be treating the scrutiny of warehouse conditions like a PR problem rather than an opportunity to find and fix potential operational flaws.

“We have our critics, both here in the United States and around the world, who — some are completely inconvincible,” top Amazon spokesperson Jay Carney said during an internal video Q&A with corporate employees in early May, of which Recode obtained an audio recording.

“Look, you have situations where we have a protest at a fulfillment center and we have more organizers than actual Amazon employees out on the street.” Carney went on, “I think the total number of protesters in the city and states has been less than a fraction of a half of a fraction of a percent of our employee base, but some of the media coverage suggests that that’s not the case.”

Cheeseman reiterated what the company previously said in a statement in regard to worker protests: that the “overwhelming majority” of Amazon employees have not participated and that the walkouts had “no measurable impact on operations.”

“We encourage anyone interested in the facts to compare our overall pay and benefits, as well as our speed in managing this crisis, to other retailers and major employers across the country,” Cheeseman told Recode.

Amazon offers full-time warehouse employees the same health care insurance and 401(k) options as corporate employees. At the start of the pandemic, it also led other companies by being one of the first to grant workers a $2-per-hour wage hike, and it doubled overtime pay and provided unlimited unpaid time off. (All of these pandemic-related policies ended on June 1, prompting loud pushback from some employees.) In late June, the company announced it will pay a one-time bonus for the month of June to front-line employees and some contractors, amounting to around $500 per full-time Amazon employee and $250 for part-timers.

“Our focus remains on protecting associates in our operations network,” Cheeseman said.

Amazon has nearly 600,000 full-time and part-time employees in the US, the vast majority of whom work in its warehouse network, so the hundreds of workers protesting are indeed only a tiny percentage of its workforce. But one corporate employee who doesn’t consider himself an activist and hasn’t been involved in any recent protests told Recode, “Many workers do not feel comfortable walking off a job for a protest, especially in this climate. So the voice of organizers should be heard as representative of the workers they’re organizing for.”

Of course, Amazon’s many employees have a range of perspectives on how their employer treats them in general and how it’s handled their safety during the pandemic. Some value how Amazon pays all employees a $15-per-hour minimum wage, as well as how it offers health care and dental insurance, and highly subsidized tuition or vocational training to further employees’ careers.

“Amazon is a good job in many ways: great benefits, it pays good, there are opportunities for overtime, to go to school,” said Jumpp.

Others empathize with the company and the extraordinary challenges Covid-19 has created for it.

But a significant number of Amazon’s employees, in warehouses and in its headquarters, feel it has let them down, and that’s fueling their criticism of the company.

The growing dissent among Amazon’s corporate workforce followed a few key moves Amazon made in the early days of the pandemic: First, the company fired Christian Smalls, a warehouse worker in Staten Island, New York, who led an early protest against the company in March.

Then company executives, led by top lawyer David Zapolsky, strategized in an executive meeting attended by Bezos about how to downplay Smalls’s complaints by characterizing him as “not smart or articulate.” Then, when Zapolsky’s notes from this meeting leaked to the press and corporate employees began to protest and question Amazon’s actions on internal company listservs, the company fired three key corporate activists in mid-April and began restricting employees’ ability to communicate on large listservs. It paused enforcing these restrictions after Recode reported on them.

Amazon workers told Recode in April they were particularly concerned by what they saw as racist overtones in the notes from the executive meeting focused on Smalls, who is Black. Amazon told Recode in April that Zapolsky was unaware of Smalls’s race when he made the comments.

Since then, workers’ unease has grown because four of the six workers Amazon has fired since March are people of color.

Cheeseman, the Amazon spokesperson, told Recode that the company “works hard to foster a culture where inclusion is the norm for each and every one” of its employees.

“We do not tolerate any kind of discrimination in our workplace,” said Cheeseman.

John Hopkins is another worker who says Amazon targeted him in May for his activism at work. The company lifted his suspension in June after an internal health and safety investigation; since then, he has continued to be vocal about what he sees as retaliation and racial injustice at Amazon.

Hopkins told Recode it didn’t matter that Zapolsky said he wasn’t aware of Smalls’s race when he said Smalls wasn’t articulate.

“Ultimately, he [Zapolsky] didn’t have to be aware of his [Smalls’s] race — he should have been aware of the chances,” Hopkins told Recode. “Regardless of whether he knew specifically, he has to know the number of African American workers in warehouses is far larger than in AWS [Amazon Web Services]. The chances he was going to say that about a Black worker are higher.”

“Race permeates everything. These aren’t disconnected issues; what’s at the heart of them all is implicit bias,” Hopkins added.

Amazon said it fired Smalls because he violated social distancing policies while he was on paid quarantine leave, and that it terminated the corporate employees after they violated company policies around internal communications. “There are also plenty of [employees] who are regularly talking to reporters and publishing different things that, you know, I disagree entirely with,” Clark, the Amazon executive, told Recode. “But they come back to work every day, are paid well, and nothing negative happens to them.”

The six recently fired employees have all disputed Amazon’s explanations for their terminations.

“It’s not okay that Amazon did that and fired that employee [Smalls]; those things aren’t normal,” one former Amazon engineer who recently left the company told Recode in late April, speaking on condition of anonymity out of fear of retaliation. “I’m not okay with going to work every day and continuing my day job while things are happening in the background. I need to show support for other people in the company.”

Smalls’s case also caught the attention of politicians like New York City Mayor Bill de Blasio and New York Attorney General Letitia James, who have launched investigations into the incident, as well as Sen. Booker, who has sent several letters pressing Bezos on the matter.

“What’s disturbing to me is that you have people who are, frankly, just speaking toward the crisis, and they’re seeing retaliation that is unacceptable,” Booker told Recode in early May. Since Booker wrote the letter about Smalls, the company has fired several more warehouse workers involved in activism. “These firings further marginalize employees who already feel really pressured.”

While Amazon’s termination of visible activist leaders both within company headquarters and at its fulfillment centers has scared some employees, they haven’t stopped organizing. The firings further angered and encouraged critical employees to move discussions off corporate platforms so they can discuss their ethical qualms about their employer more discreetly — and freely.

“I think temporarily people will be discouraged from speaking, but it’s not going to silence their inner concerns,” one employee told Recode in late April.

“People before were saying, ‘Oh, maybe Amazon’s not so bad,’ but when they see the silencing, and the censorship, and the firings, and the not listening — that is the last straw for a lot of people,” former longtime Amazon corporate employee Maren Costa told Recode. Costa and her colleague Emily Cunningham were fired on April 10, shortly after they both shared a petition started by Amazon warehouse workers about the risks warehouse workers face during the pandemic. Amazon told Recode that the pair were terminated for violating Amazon’s internal policies, including one that bars employees from using company resources to solicit their coworkers for signatures.

Both Costa and Cunningham were active leaders of an internal employee group that pushes the company to become more environmentally friendly, called Amazon Employees for Climate Justice (AECJ). After they were fired, Costa and Cunningham helped host two virtual panel discussions between warehouse workers and corporate employees about safety standards at warehouses, environmental policies, and unionization. Around 400 employees attended each event, according to the organizers.

“We are definitely on the right side of history,” Cunningham told Recode in late April. “Even those of us that have more privilege doesn’t mean we’re immune to the real harm that is already coming our way. … There’s only so much insulation unless you’re an extremely rich billionaire.”

Dozens of warehouse workers Recode spoke with emphasized the importance of corporate employees like Cunningham and Costa speaking out on their behalf.

“While warehouse and tech workers are treated differently in many ways by Amazon, recent events have clearly shown how we’re still in the same struggle, like against retaliation from Amazon for exercising free speech,” Ted Miin, a warehouse worker at the DCH1 facility in Chicago and member of the worker group DCH1 Amazonians United, told Recode in early May.

This newfound unity between front-line and office workers reflects a growing gulf between the company and segments of its workforce, who say the company’s leaders — both in its headquarters and those managing its warehouses — are disconnected from the challenges workers lower in the company face.

When you consider the scale of Amazon’s vast network of warehouses — which includes 110 fulfillment centers in the US and hundreds of smaller sorting and delivery facilities — as well as the machine-like efficiency required to keep this operation running, that’s not surprising. The pandemic has just raised the stakes.

“Amazon treats the humans in the warehouses as fungible units of pick-and-pack potential,” Tim Bray, a former VP-level engineer at the company, wrote in a now-viral public blog post he published in late April after quitting in protest of Amazon’s firings of Costa, Cunningham, Smalls, Bowden, and other whistleblowers. Bray called management’s decisions “chicken shit” and accused the company of fostering a “climate of fear” among its workers. (Bray later deleted the “chicken shit” language after he said people he respected told him it was “mean-spirited.”)

The day after Bray posted his note, Brad Porter, the company’s vice president of robotics, defended Amazon’s measures to protect its workers in a LinkedIn post. In it, he cited technological solutions his teams have been rolling out: using AI to make sure workers are social distancing, installing thermal cameras to check workers’ temperatures, and developing mobile ultraviolet sanitation to kill Covid-19 in warehouses.

But, as several employees wrote in internal emails that Recode obtained and in public comments on LinkedIn, Porter sidestepped one of the main focuses of Bray’s critique: that the company is allegedly retaliating against workers who question the company’s treatment of fulfillment center workers.

“This Linkedin post has honestly left me a little sick for several reasons, because it just shows how keenly and brazenly VPs do not get it,” wrote one Amazon employee in a May 6 post on an internal corporate listserv that Recode obtained. “The fact that Brad Porter does not once mention the fired employees — something Tim Bray clearly and plainly states to be the reason for his resignation — in his exculpatory post makes things very clear: they don’t see this as an issue.”

Others pointed out that Porter’s solutions were largely technical fixes to a very human problem.

“Even if we eventually have all the technology in place for a COVIDfree workplace, if people don’t feel safe to speak, that’s not a safe space,” wrote another employee on the same listserv.

How Amazon is handling workers’ dissent is just one part of the problem, workers say. The scale and pace of its operations have always had downsides, but now the pressure of a pandemic is making them more visible.

Amazon has long been known for hiring bright, data-focused managers in its warehouse network to help increase efficiency while keeping costs down. The result has been a world-class logistics operation that offers affordable next-day delivery to millions of Americans. But there are drawbacks to that data-obsessed approach, too: quotas and metrics that don’t account for an employee having a bad day — or not feeling well — and some managers who are more comfortable evaluating numbers than human emotions.

“Algorithms can be very, very dangerous … and that’s where Amazon is right now,” a former senior HR manager at Amazon told Recode. “There is no other company on the planet that is more efficient. But the downside is … you take people who don’t have life experiences, or just don’t have empathy, and it becomes very easy to look at data as the end-all, be-all, as opposed to as a guide.”

Cheeseman refuted that characterization and referenced two emails that Clark sent to warehouse managers during the pandemic, which expressed the importance of keeping employees healthy and safe.

“To be abundantly clear, your most important job right now has nothing to do with a metric,” Clark wrote to managers in a March 14 email that Amazon showed Recode. “It’s walking your floors, talking to your teams, supporting them if they need help or have [any] questions, and ensuring all the safety measures we have rolled out are implemented and followed.”

Amazon seems aware that some of its warehouse managers focus too narrowly on meeting fulfillment goals, even if it won’t talk about it publicly. The company previously developed a computer system, Recode has learned, that periodically prompts some warehouse supervisors to get out from behind their computer and go interact with their front-line staff. Similar to how employees criticized Porter’s response to Bray’s resignation note, it’s an Amazonian solution to a very human problem.

“We do have mechanisms to remind our teams what’s important to us, and that does include recognizing and connecting with associates,” Cheeseman said.

Amazon wasn’t always so intensely focused on performance metrics. A longtime former corporate employee, who was an HR manager focused on warehouses, told Recode they saw a major shift in that direction at Amazon around 2010.

“When I joined, it was very apparent to me that the leaders in the facility really cared about the people,” the former HR manager said. “The Amazon that I left in fulfillment was … not that way.”

Part of the change this former manager saw can be attributed to an increased reliance on performance data, as well as the implementation of so-called standard operating procedures. “We almost overindexed on processes,” said the former HR manager, while also acknowledging the business upsides to adding more structure to warehouse work.

But the other factor in the shift was the type of warehouse leaders the company recruited as Amazon expanded to meet exploding customer demand. “It was all about just drive, drive, drive, and there were not a lot of very kind leaders,” according to the former manager.

A former Amazon data science engineer focused on warehouse metrics told Recode, “I knew that every single time we developed a tool, we are just adding pressure.

“The pressure to be consistent and perform every single second there is tremendous,” the engineer added. “Not everyone is the same.”

Despite the note Clark sent warehouse managers in mid-March urging them to prioritize safety measures above delivery metrics, several employees told Recode as recently as late April that some of the company’s rigid middle managers in fulfillment centers were slow to empathize with the unique setbacks of working during a pandemic and were enforcing strict work quotas.

An Amazon worker at a fulfillment center in New Jersey, who spoke to Recode on the condition of anonymity for fear of losing her job, said in late April that the pace demanded in her warehouse made it, in her view, impossible to properly social distance: “When you’re picking an order, the bins and pallets … they’re all close together, and they’re used by multiple people at one time. And if you’re not picking up certain items within a certain time frame, you’re penalized.” The same worker told Recode that by early May, management at her site had improved on safety issues at the warehouse — making bin aisles one-way for foot traffic, and easing up enforcement of worker productivity rates.

Miin, the worker in Chicago, told Recode in early April that the company was inconsistently enforcing social distancing requirements in the fulfillment center where he worked. In a follow-up interview in late June, Miin said he thought the warehouse was still facing the same issues.

“When we’re protesting conditions, they bring up the 6-feet rule. But, of course, they don’t bring that up when people are trying to work hard and fast inside the warehouse — those rules are ignored,” Miin said.

Cheeseman said the company denies these accusations. “That’s not true,” she wrote to Recode. “We have a policy related to social distancing and we are enforcing it across all sites.” Cheeseman said the company has implemented several ways to monitor social distancing, including spending $85 million to move existing employees into new “social distancing ambassadors” roles.

Interviews with employees at other Amazon warehouses from late March through June indicate that at some facilities, management meticulously and successfully enforced social distancing. But according to Recode’s interviews with more than 30 employees across the company’s entire network, not every warehouse was operating at the same level.

At many Amazon warehouses, social distancing is rigidly upheld: “At my building, the safety committee is always on top of everybody about being safe and wearing your mask,” one Amazon associate at the ACY5 fulfillment center in Swedesboro, New Jersey, told Recode in late May, speaking on the condition of anonymity for fear of losing her job for speaking to the press. “Even if you’re 5 feet apart, they’re always yelling at you to be 6 feet apart.”

The associate said she has ample access to masks, wipes, and hand sanitizer, and that overall she feels safe at work. But she said that circumstances seem to vary from warehouse to warehouse. She said her facility had only had one confirmed employee case of Covid-19 so far in May, whereas she heard another site nearby in West Deptford, New Jersey, has dozens of cases. (Jumpp’s report shows over 20 recorded cases at the West Deptford site as of late June.)

“It’s like a chain restaurant, like a Chili’s or something — each franchise may be run differently,” the Amazon associate said.

In an interview with Recode in mid-May, Clark, the Amazon senior vice president, said he doesn’t agree that there were significant inconsistencies in the company’s response to the pandemic. “I’d love to say that we were perfect. But I don’t think anybody had a playbook for this thing,” Clark said. “We’ve learned as we’ve gone, and I think we’ve executed incredibly well.”

Patrick Penfield, a professor of supply chain management at Syracuse University, told Recode he thinks Amazon is working hard to protect its workers from the coronavirus.

“The problem is this coronavirus is something we’ve never ever encountered before — this is the dilemma,” Penfield said.

Clark told Recode the company faced challenges in parts of March “where in every part of the supply chain — even the medical community — getting enough sanitizer and some of those things were very challenging.

“But for weeks we’ve been in a place where we’ve procured enough supplies where at every piece of the operation, we now have overages to support what teams need,” he said in the second week of May.

Amazon has not been alone in struggling with the challenge of keeping the coronavirus out of its facilities.

Walmart was forced to temporarily close a Pennsylvania warehouse in early April after a rapid rise in Covid-19 cases over a short period. Amazon’s biggest retail rival also faced Covid-19 outbreaks in several of its supercenter stores, including a Massachusetts location that was temporarily shuttered after 23 employees there tested positive. The activist group United for Respect says that at least 22 Walmart associates have died of Covid-19. And a dozen US state attorneys general wrote to Walmart in early June with demands over what they say has been a subpar coronavirus response when it comes to the health and safety of Walmart employees and customers.

Costco, too, has come under fire from some of its employees for not standardizing health and safety protocols early enough in the US despite having stores in Asia, where the virus appears to have first spread.

Indeed, government lockdown measures in the US began on a city-by-city basis, creating confusion for companies with a presence in hundreds of municipalities across the country. Even so, Amazon says it began reworking its US warehouses ahead of national guidance from the Centers for Disease Control and Prevention to allow for social distancing based on World Health Organization guidelines it was already following in its European facilities.

In Clark’s interview with Recode and in Amazon statements to other media outlets, the company has argued that it took protective measures earlier than many of its peers, and, though it would not specify which ones, it seemed to allude to Walmart. Amazon began issuing masks to US warehouse employees on April 2; while Walmart did so around the same time, the brick-and-mortar giant did not make them mandatory until April 17.

On April 30, Amazon vowed to spend $4 billion over three months to invest its profits on things like mass Covid-19 testing and expanding paid sick leave for its employees. As of May 13, Amazon announced that it had supplied 93 million sanitizing sprays and wipes, more than 100 million masks, and more than 2,000 new hand-washing stations across its fulfillment center network.

And though Amazon ended its pandemic pay increases and unlimited time off in June, Clark told Recode that employees still have several other leave options, including ones that apply to parents with school-age children or employees with preexisting conditions. As of mid-May, Clark said more than 10,000 employees have used those other time off options, though Bloomberg reported in June that some warehouse employees are having trouble accessing these options because of a highly automated, and overwhelmed, human resources operation.

But even with all the precautions that Amazon has implemented since mid-March, the coronavirus continues to spread in the US, and it’s still infecting Amazon’s workers. Workers told Recode that Amazon’s refusal to disclose exactly how many people are infected at each site makes showing up for work more stressful than it needs to be.

When there are confirmed Covid-19 cases in its facilities, Amazon said that it reviews video footage to identify every person an infected worker has been in close contact with and then notifies those individuals so they can go on paid leave. “We alert every person at the site anytime there is a confirmed diagnosis,” Amazon has said in a statement. “This alert includes when the person with the confirmed diagnosis was last in the building.”

Clark told Recode that he believes a better metric for determining whether Amazon warehouses are safe is the number of employees it quarantines after they come into close contact with a coworker who later tested positive. Internal data shows that as of the first week in May, Amazon has only needed to quarantine one additional employee for every four confirmed cases, Clark said.

“It means that the infections that we see … usually come from spread within a community, not inside the building.”

The company said it also interviews those who test positive to see whether they have had close contact with coworkers outside of work, too. But several employees told Recode they worked closely with someone they know was later confirmed to have Covid-19, and had not heard anything from the company, even several days after potential exposure.

Amazon’s Cheeseman said the company uses CDC guidance for what constitutes exposure — standing within 6 feet for more than 15 minutes — or local health guidance if it’s stricter. She added that employees have several ways to escalate concerns if they think they were exposed.

When Recode asked dozens of warehouse workers if they thought Amazon was any better or worse than competitors like Walmart in how they treat workers, many said that those companies could be just as bad. But they said they expected more from Amazon and its leadership because of the company’s success.

“What really makes me mad is that Jeff Bezos is one of the richest men on the planet,” said Billie Jo Ramey, a worker at the DTW1 fulfillment center in Romulus, Michigan, on a call with reporters in April. “He can afford to keep us safe.”

More than three months after the pandemic transformed Amazon from being a convenient service to an essential one providing supplies to millions of homebound Americans, the company has found itself in a delicate situation. Amazon itself calls its workers “heroes.” But many of these warehouse heroes — and their corporate colleagues — are angry with their employer in ways they’ve never been before.

“It’s a new moment when hundreds of workers are taking action and when tens of thousands more are signing our petitions and expressing their solidarity online,” Dania Rajendra, director of Athena, a coalition of nonprofits and organizations scrutinizing Amazon’s business practices, told Recode. “People who are not the executives of extremely wealthy corporations are realizing they’re in this together.”

While unions have succeeded in organizing some of Amazon’s European workforce, no US facility has been unionized. The last attempt, in 2014, ended with a small group of Amazon technicians at a Delaware facility voting against unionization. In the past, Amazon has staved off attempts at warehouse organizing by monitoring and discouraging any preliminary signs of worker solidarity talk on the shop floor and by conceding on some of workers’ demands before they escalate further.

This time, quelling organizers’ efforts won’t be so easy — but Amazon has long been preparing for the potential of unionization, which a former Amazon executive told Recode in April “is likely the single biggest threat to [Amazon’s] business model.”

As early as the 2000s, Amazon began tracking the potential for unionization at each of its warehouses, building a heat map in Excel to identify “hot spots” in its fulfillment network, a former senior leader in Amazon’s human resources department told Recode. This calculation was based on at least dozens of metrics, including employee survey data, timing of the last pay raise, the safety record of the facility, and even the financial strength of local unions, the former HR manager said.

According to this employee, who spoke on the condition of anonymity, Amazon tracked these details to determine “where do we swoop in to figure out if there’s a problem with leadership or maybe there’s one particularly toxic employee who is really causing chaos.” Whole Foods, which Amazon acquired in 2017, now employs a similar union tracking system, Business Insider reported in April.

Cheeseman said she couldn’t confirm or deny the existence of the Excel-based unionizing-tracking tool because employees who would have overseen it no longer work for Amazon. But she acknowledged that Amazon does “monitor closely sites where employees have issues and concerns to make sure we’re solving them.”

Several current and former Amazon warehouse employees told Recode there have been more recent talks of unionization among rank-and-file employees, but also widespread fear that doing so could cost workers their jobs or other repercussions.

“When I worked there, I joked that if I even said the word ‘union,’ I’d be kicked out. We called it [unions] the ‘u-word,’” Jumpp said. “There’s a lot of talk about unions, but I don’t know if they’ll work or not.”

While established unions like United Food & Commercial Workers International Union (UFCW) and RWDSU have been informally helping Amazon warehouse workers in pushing for better conditions, the first real step toward unionization — actively announcing a bargaining unit and calling for a vote — hasn’t happened yet.

Even if Amazon workers are still a long way from officially unionizing, their organizing and the public attention it’s drawn provide an opening to politicians ready to seize an opportunity to rein in the unparalleled power the company has consolidated in the past decade.

On May 12, a group of 13 US state attorneys general pressed the company for data on Covid-linked worker infections.strongNew York City’s Commission on Human Rights and the New York state attorney general are investigating Christian Smalls’s firing. Some Republican lawmakers, like Sen. Josh Hawley, meanwhile, have used the pandemic as a time to push the company on antitrust issues, arguing that their business practices are destroying mom-and-pop businesses.

The House Judiciary Committee, which is investigating Amazon and the three other Big Tech giants (Facebook, Google, and Apple), recently asked Jeff Bezos to testify on issues including how Amazon competes with its own marketplace merchants. Bezos said he would show up, under certain conditions. And the Federal Trade Commission has been conducting an informal probe of Amazon since last year. These investigations, if they result in regulation or new antitrust laws, could present an existential threat to Amazon’s grip on the online retail market.

And Democrats like Sen. Booker are using Amazon as an opportunity to mount a full-throated defense of stronger labor rights in the US more broadly, drawing on the larger economic anxieties Americans face during the recession.

“I strongly believe that we must make sure that labor has a voice, has the right to organize, and has the power to bargain and strike,” Booker told Recode. “If not, we are going to see the country continue in this dull and perverse direction. ... It really is a worrisome trend that you’re seeing in this country where people who are working hard every day are finding themselves economically compromised, economically fragile.”

Booker and the other politicians who scrutinize Amazon do so because they know the company affects far more people than the hundreds of thousands it directly employs. Amazon delivered nearly 3.5 billion packages globally last year — and that figure doesn’t even count Amazon orders delivered by partners like UPS or USPS. This has helped make Bezos the richest man in the world; meanwhile, most Americans haven’t received a meaningful raise in decades.

Until significant political action or regulation on Amazon comes — if it ever does — labor organizers are trying to shame the company into action, like when Sen. Bernie Sanders helped pressure Amazon to raise its minimum wage to $15 an hour back in 2018, or how in 2019, local activists, labor groups, and politicians in New York City pushed Amazon to withdraw its plans to build a new headquarters in Long Island City.

“It’s very difficult to see this [employee activism] movement dying out when to a certain degree it’s successful,” said an Amazon corporate employee who is active on worker organizing around climate change and warehouse worker rights.

And then there’s the impact of all this on Amazon’s loyal and ever-growing base of customers. If they start to perceive Amazon as a company that, on the whole, is weakening rather than strengthening the working class, will their allegiance to two-day shipping and Prime subscriptions change? If customers demand changes from Amazon, could it raise the bar for labor not just at Amazon but at other retailers that imitate the company’s business practices in order to compete with it?

Amazon is “a technological leader, the first place where most Americans turn to shop online, and a hugely influential political power,” former US Secretary of Labor Robert Reich told Recode. “So its employee practices are watched and likely to be emulated by every other big American company. When it treats its workers badly, those tawdry practices reverberate across the country.”

Some workers are skeptical that customers will care, no matter what happens in Amazon’s warehouses.

“The American psyche is so selfish that it doesn’t matter what goes on in there,” said one longtime Amazon warehouse worker in Lexington, Kentucky, who’s been internally vocal about what he feels is a lack of sanitation at his facility. “It’s, ‘Just get my package to me. Just get my package to me.’ The company is feeding off of that because on the walls and inside the facility it specifically states, ‘We are customer-obsessed.’”

For now, customers are by no means rushing to cancel their Prime subscriptions, even if polls indicate that their overall perception of the company is declining. But worker unrest presents a long-term reputational problem for Amazon. Major tech companies like Facebook, Uber, and Google have all made missteps in recent years, from failing to protect user data to allegedly covering up sexual harassment issues, that have stained their reputations and sometimes cost them revenue.

Worker unrest at Amazon has higher stakes, though: It has ramifications for the rest of the economy. Amazon has been ascending to dominance for years, and the pandemic has sped it up. What do its employees, who are a key part of this success, deserve? And what power should they have in shaping the direction of the company?

“I think the state of affairs in our economy is that people are used to it being broken and not working for them,” said AFL-CIO Secretary-Treasurer Liz Shuler. “That’s the way the economy has been for some time, and not just due to Covid. But workers should be able to have higher expectations, to have power and strength as working people. To go to the table [with management] and say, ‘We should be in this together.’”

Even after all their agitations for change during the pandemic, Amazon workers are still fighting to be heard.

During his interview with Recode in May, Amazon’s Clark twice brought up Smalls, the warehouse worker whose firing sparked other employees’ anger toward the company. Despite the internal and external criticism Amazon faced over how its top lawyer called Smalls “not smart or articulate” in a leaked memo, Clark used Smalls in the interview as an example of what dissenting workers have done wrong.

In a recent interview with Recode, Smalls reflected on the significance of the memo that propelled him into the media spotlight.

“When the leaked memo came out, it exposed who Jeff Bezos is as a person, who’s around him, who’s giving him counsel — the types of conversations that they have about their employees, and their focus on smearing me. That tells you right there they don’t care about us,” said Smalls. “It’s never going to be Amazon v. Chris Smalls. It’s Amazon v. the people.”

Support Vox’s explanatory journalism

Every day at Vox, we aim to answer your most important questions and provide you, and our audience around the world, with information that has the power to save lives. Our mission has never been more vital than it is in this moment: to empower you through understanding. Vox’s work is reaching more people than ever, but our distinctive brand of explanatory journalism takes resources — particularly during a pandemic and an economic downturn. Your financial contribution will not constitute a donation, but it will enable our staff to continue to offer free articles, videos, and podcasts at the quality and volume that this moment requires. Please consider making a contribution to Vox today.

(read more)

Google adds local COVID-19 news coverage to its Google News app in pilot test

Words: Sarah Perez - TechCrunch - 18:00 29-06-2020

Google is piloting a new way to bring local news about the COVID-19 pandemic to its Google News application. In partnership with regional news publications in select cities across the U.S., the Google News app will now offer a dedicated section in select markets detailing critical information like community reopening timelines, business updates, school openings, as well as information on the local healthcare infrastructure, public transportation, events and ways to help families in need.

At launch, the new feature is available for readers in Raleigh, Baton Rouge, New Orleans, Lafayette, Columbus, Portland, Cleveland, Myrtle Beach, Albany, Sarasota, Cap Girardeau, Richmond, Memphis, Cincinnati, Boston, New York, Baltimore, Chicago, Detroit, Los Angeles and Minneapolis.

To access the newly added local information, app users will click on the COVID-19 banner, which directs them to the existing section focused on coverage of the coronavirus outbreak. They will then scroll down to find the new “Local news” section directly underneath the “Top news” section.

This new section won’t be shown if the user’s city or town isn’t yet covered. However, you can force the section to display by selecting one of the supported cities and making that your city in the Google News app.

To deliver this local information, Google is working in partnership with 21 news organizations for the supported markets, including Raleigh’s The News & Observer, NOLA.com, CBS Chicago, Oregon Live and Gothamist, among others. The news organizations must already provide this COVID-19 information in the form of short-form content. For example, this page from The News & Observer offers a brief list of updates as bullet points that Google can easily republish to the Local news section of the Google News app.

The app will still allow users to click through to the local publication to read more.

Google tells us that all publishers will have to offer news a similar format to be included for the time being. In other words, Google isn’t automatically creating short-form summaries from news articles to fill this section.

The local COVID-19 news feature is currently in pilot testing, but Google plans to expand coverage across the U.S. and Canada in the future. It also plans to offer the feature outside of the Google News mobile app itself.

To some extent, the addition is a way for Google to offer its own version of Facebook’s “Community Help” feature, which the social network expanded in March due to the COVID-19 crisis. Facebook’s hub today offers a way for users to get information about how the coronavirus outbreak is impacting their own local region and what they can do to help. Google’s feature also arrives at a time when Flipboard has splashed back onto the scene with its new focus on local coverage, including coronavirus updates.

And of course there’s Google News app’s direct rival, the Apple News app. Apple News has also added its own take on local coverage with a “City Guides” section in its own COVID-19 special coverage area. These city guides focus on providing essential knowledge about testing, resources, jobs and more for larger U.S. metros.

In addition to the update to the Google News app, Google says it’s recently expanded access to local news on Search and Google Assistant, as well.

Now when people search for coronavirus information on Google Search, they’ll see both a top stories carousel as well as a new dedicated local news carousel. Google also expanded its new carousel highlighting top tweets from local and health authorities in more than 30 countries.

Meanwhile, users can ask Google Assistant for local coronavirus news by saying something like “Hey Google, play news about coronavirus in Boston,” in select markets.

Google has also financially contributed to local news organizations itself in the wake of the COVID-19 crisis, having recently provided emerging funding for over 5,300 local news organizations around the world, ranging from $5,000-$30,000. The company said it expects to spend “tens of millions” through this Journalism Emergency Relief Fund. Plus, Google recently launched a Support Local News campaign to encourage people and businesses to subscribe, donate and advertise across local news outlets in the U.S. and Canada.

(read more)

Trump suspended from Twitch, as Reddit bans the ‘The_Donald’ and additional subreddits

Words: Brian Heater - TechCrunch - 17:56 29-06-2020

Two big new pieces of news today from the ongoing battle between social media and politics. Both Twitch and Reddit have made moves against political content, citing violations of terms of service.

Twitch confirmed today that it has temporarily suspended the president’s account. “Hateful conduct is not allowed on Twitch,” a spokesperson for the streaming giant told TechCrunch. “In line with our policies, President Trump’s channel has been issued a temporary suspension from Twitch for comments made on stream, and the offending content has been removed.”

Twitch specifically cites two incidents from campaign rallies, uttered by Trump at rallies four years apart. The first comes from his campaign kickoff, including the now infamous words:

When Mexico sends its people, they’re not sending their best. They’re not sending you. They’re not sending you. They’re sending people that have lots of problems, and they’re bringing those problems with us. They’re bringing drugs. They’re bringing crime. They’re rapists. And some, I assume, are good people. But I speak to border guards and they tell us what we’re getting. And it only makes common sense. It only makes common sense. They’re sending us not the right people.

The second is from the recent rally in Tulsa, Oklahoma, his first since COVID-19-related shutdowns ground much of presidential campaigning to a halt. Here’s the pertinent bit from that:

Hey, it’s 1:00 o’clock in the morning and a very tough, I’ve used the word on occasion, hombre, a very tough hombre is breaking into the window of a young woman whose husband is away as a traveling salesman or whatever he may do. And you call 911 and they say, “I’m sorry, this number’s no longer working.” By the way, you have many cases like that, many, many, many. Whether it’s a young woman, an old woman, a young man or an old man and you’re sleeping.

Twitch tells TechCrunch that it offered the following guidance to Trump’s team when the channel was launched, “Like anyone else, politicians on Twitch must adhere to our Terms of Service and Community Guidelines. We do not make exceptions for political or newsworthy content, and will take action on content reported to us that violates our rules.”

Going to war with Twitter, Trump threatens critical social media legal protections

That news follows the recent ban of the massive The_Donald subreddit, which sported more than 790,000 users, largely devoted to sharing content about Trump. Reddit confirmed the update to its policy that resulted in the ban, along with 2,000 other subreddits, including one devoted to the hugely popular leftist comedy podcast, Chapo Trap House.

The company cites the following new rules:

explicitly states that communities and users that promote hate based on identity or vulnerability will be banned. Rule 1

There is an expanded definition of what constitutes a violation of this rule, along with specific examples, in our  .

ties together our previous rules on prohibited behavior with an ask to abide by community rules and post with authentic, personal interest. Rule 2

Debate and creativity are welcome, but spam and malicious attempts to interfere with other communities are not.

The other rules are the same in spirit but have been rewritten for clarity and inclusiveness.

It adds:

All communities on Reddit must abide by our content policy in good faith. We banned r/The_Donald because it has not done so, despite every opportunity. The community has consistently hosted and upvoted more rule-breaking content than average (Rule 1), antagonized us and other communities (Rules 2 and 8), and its mods have refused to meet our most basic expectations. Until now, we’ve worked in good faith to help them preserve the community as a space for its users—through warnings, mod changes, quarantining, and more.

Reddit adds that it banned the smaller Chapo board for “consistently host[ing] rule-breaking content and their mods have demonstrated no intention of reining in their community.”

Trump in particular has found himself waging war on social media sites. After Twitter played whack-a-mole with problematic tweets around mail-in voting and other issues, he signed an executive order taking aim at Section 230 of the Communications Decency Act, which protects sites from being sued for content posted by users.

(read more)

Blackbaud’s cloud for ‘social good’ serves customers that work against human rights

Words: Devin Coldewey - TechCrunch - 17:35 29-06-2020

Blackbaud offers enterprise tools ostensibly in a campaign to support social good, but the company also provides services to far-right organizations the Heritage Foundation and the Center for Security Policy, TechCrunch has discovered.

Blackbaud describes itself as “the world’s leading cloud software company powering social good,” and collects revenues in the hundreds of millions of dollars from that business. Nothing about that mission is partisan, and good can of course be accomplished by groups all across the current American political spectrum.

But while conservative causes are by no means excluded from the category, the far-right stances of Heritage and especially those of CSP are difficult to square with even the broadest interpretation of social good.

The decades-old Heritage Foundation has been behind lobbying efforts against climate change action, equal rights for LGBTQ Americans and immigration modernization efforts. It has worked on behalf of the oil and tobacco industries, opposed health care reform and recommended the likes of Betsy DeVos and Scott Pruitt to the administration.

Google recently scuttled an advisory committee on AI that included Heritage’s president after overwhelming criticism that they had essentially endorsed the think tank’s policies.

Google’s anti-trans controversy is the latest case of big tech overcorrecting to the right

According to GLAAD, Heritage “has made it a focused mission to stop all laws protecting on the basis of sexual orientation and gender identity.” This alone makes it a poor match for a company that just weeks ago said in celebration of Pride that “we want to underscore that LGBTQ+ rights are human rights.”

Yet according to documents reviewed by TechCrunch, Blackbaud collects about $180,000 in annual revenue from the Heritage Foundation and has worked with them for about 15 years.

The Center for Security Policy is a more extreme case. Designated as a hate group by the Southern Poverty Law Center, CSP has pursued a hardline anti-Muslim stance for years. It publishes reports saying jihadists are infiltrating the U.S. government and was commissioned to perform polling to show support for Trump’s Muslim travel ban. A CSP executive was hired by John Bolton to serve in the administration and later left to rejoin the anti-Muslim organization as its head.

One recent study warns of a Muslim plot “even more sinister” than the widespread sexual abuse revealed in the #MeToo era: “Sharia-supremacists are insinuating themselves into script-writing, Hollywood ‘consulting,’ film production, and even financial scholarships designed to facilitate young Muslims’ penetration of the entertainment industry.”

The documents show a smaller contract with CSP, amounting to about $11,000 in annual revenue.

Blackbaud records show interactions with both companies within the last month or so; these are current contracts. Neither Heritage nor CSP responded to requests for comment, and Blackbaud would not confirm they are customers as a matter of policy.

“Blackbaud provides cloud software, services, data intelligence and expertise to a wide spectrum of registered 501c3 organizations and companies that are lawfully conducting business. Those organizations are diverse in their missions and belief systems, but we remain committed to building the best software to support all who are truly doing good in achieving their missions,” the company said in a statement. It then referred me to a recent blog post entitled “EQUALITY.”

While doing business with a couple of bad actors doesn’t negate Blackbaud’s work with other organizations actually working for the social good, the discrepancy bears highlighting given the company’s virtue-first brand. If the concept of social good they are working with is mutable enough that it includes hate groups, other organizations might think twice about trusting that message.

At times like the present, companies are being called on to not just say they are dedicated to things like human rights, anti-racism and other causes, but to demonstrate it and respond to criticism. According to Blackbaud:

“Racism and acts of hate strip people of basic human rights and defy the very principles of what ‘good’ stands for. We condemn racism and discrimination and seek solutions to end the suffering in our communities and world.

Equality must be more than a motto. It must be a promise to each other and the world.”

By espousing equality on one hand and making millions from those who oppose it on the other, it may be fairly questioned whether that promise is being kept.

(read more)

The iRig Pro Duo I/O makes managing advanced audio workflows simple anywhere

Words: Darrell Etherington - TechCrunch - 16:58 29-06-2020

Connecting audio interfaces to the various mobile and computing devices we use these days can be a confusing headache. The iRig Pro Duo I/O ($199.99 USD), which IK Multimedia announced this year at CES and recently released, is a great way to simplify those connections while giving you all the flexibility you need to record high-quality audio anywhere, with any device.

The iRig Pro Duo is a new addition to IK’s lineup based on the original iRig Pro, which adds a second XLR input, as the name implies. It’s still quite small and portable, fitting roughly in your hand, with built-in power optionally supplied via two AA batteries, while you can also power it via USB connection, or with an optional dedicated plug-in power adapter accessory.

Compared to desktop devices like the Scarlett Focusrite 2i2 USB audio interface that’s a popular standard among home audio enthusiasts, the iRig Pro Duo is downright tiny. It’s still beefier than the iRig Pro, of course, but it’s a perfect addition to a mobile podcaster’s kit for ultimate portability while also maintaining all the features and capabilities you need.

The iRig Pro Duo also includes balanced L/R 1/4″ output, built-in 48v phantom power for passive Macs, a 3.5 mm stereo jack for direct monitoring, 2x MIDI inputs and dedicated gain control with simple LED indicators for 48V power status and to indicate audio input peaking.

Beveled edges and a slightly rounded rectangular box design might not win the iRig Pro Duo any accolades from the haute design community, but it’s a very practical form factor for this type of device. Inputs go in one side, and output comes out the other. IK Multimedia employs a unique connector for its output cables, but provides every one you could need in the box for connecting to Mac, iOS, Windows and Android devices.

The whole thing is wrapped in a matte, slightly rubberized outside surface that feels grippy and durable, while also looking good in an understated way that suits its purpose as a facilitation device. The knobs are large and easy to turn with fine-grained control, and there are pads on the underside of the Duo to help it stick a bit better to a surface like a table or countertop.

The lighting system is pretty effective when it comes to a shorthand for what’s on and working with your system, but this is one area where it might be nice to have a more comprehensive on-device audio levels display, for instance. Still, it does the job, and since you’ll likely be working with some kind of digital audio workflow software whenever you’re using it that will have a much more detailed visualizer, it’s not really that much of an issue.

As mentioned, iRig Pro Duo works with virtually all platforms out of the box, and has physical connector cables to ensure it can connect to just about every one as well. IK Multimedia also supplies free DAW software and effects, for all platforms — though you do have to make a choice about which one you’re most interested in since it’s limited to one piece of software per customer.

If you’re looking for a simple, painless and versatile way to either set up a way to lay down some music, or to record a solo or interview podcast, this is an option that ticks essentially all the boxes you could come up with.

(read more)

Linus Torvalds on the future of Linux kernel developers and development

Words: asteroid - lobste.rs - 19:37 29-06-2020

Linus Torvalds has no problem with Microsoft

Watch Now

Once more, at The Linux Foundation's virtual Open Source Summit,  VMware's Chief Open Source Officer, Dirk Hohndel, and Linux's creator, Linus Torvalds had a wide-ranging conversation about Linux development.

The illustrious pair started with Hohndel asking about the large size of the recent Linux kernel 5.8 initial release. Hohndel wondered if it might have been so big because developers were staying home thanks to the coronavirus. Torvalds, who always worked at home, said, "I suspect 5.8 might be [so large]  because of people staying inside but it might also be, it's just happened that several different groups ended up coming at roughly the same time, with new features in 5.8."

While COVID-19 COVID-19 has slowed down many technologies, while speeding up other tech developments, it hasn't affected Linux development much at all. "None of my co-developers have been hugely impacted either. I was worried for a while because one of our developers was offline for a month or two. … [But,] it  turned out that it was just RSI [repetitive strain injury], and RSI is kind of an occupational hazard to deal with." He added. "One of the things that is so interesting about the Linux community is how much it has always been email-based and remote, how rarely we get together in person."

In any case, Torvalds trusts this new build. Indeed, he ran his end of the videoconference from his new developer machine running the first release candidate of 5.8.

Thinking of his new AMD Threadripper 3970x-based processor-powered developer desktop, Torvalds later added that, although he had been concerned about its fan noise it actually works well for him. Torvalds moved to this new homebrew computer because he needed the speed. "My 'allmodconfig' test builds are now three times faster than they used to be." That's important because Torvalds "strives to do about 20 to 30 [pull requests] a day, which is above my limit, … [but] in order to do that, [he needs] a lot of computing power.

Hohndel then turned the conversation to diversity in the Linux kernel developer community. Hohndel said:

One of the things that I found striking when I look at our community and the CNCF [Cloud Native Computing Foundation], I see a significantly larger share of Black contributors and leaders, Kelsey Hightower and Bryan Liles. And I don't think I'm seeing that in Linux. Is it just me not seeing the right people, or are we, less racially diverse than some younger foundation simply as a function of the time when we all started almost 30 years ago?

Torvalds replied, "Honestly, I don't know. I mean, I don't know on two different levels. One is I suspect that a lot of the people who are in low technology are the kind of people who started several decades ago. And that's how they got into the whole low level hardware interfaces and getting into operating systems. But the other reason I don't know is that I literally don't know."

Having been to many Linux Plumber summits, I can say the majority of Linux kernel developers are white, with a large number of Indian and Chinese developers. There are only a handful of Black kernel programmers. These annual get-togethers tend to host a few hundred of the most senior Linux developers.

Torvalds added, the kernel developer crew is a "very homogeneous crowd. But I don't even know about all the new developers, we have every single release. We have over 1,000 new developers. And I do not know what the people are or if they are even people. There could be pull requests being sent by artificial intelligences."

He also speculated that one reason why the CNCF and other newer projects may have a more heterogeneous developer community is that, frankly, the cloud-related programs are more interesting. "I've told people if they're looking for a new exciting project that kernels are not the future. The basics of a modern operating system were set in the 60s."

Torvalds continued, a lot of kernel work is "literally very fundamental stuff, we're cleaning up, and fixing problems." In some ways, kernels are boring and should be taken for granted. As Hondhel reminded Torvalds, Torvalds has said "Linux is boring and that's how it should be."

But, if you're really interested in the low-level interaction between the hardware and the operating system, Torvalds said, "there is a lot of interesting technical work being done right now."

This led to another natural question, which has come before: Is Linux's leadership graying out?  Hohndel said, "Many of us have a five at the beginning of our ages, while a couple are approaching their 60s. So at some point, we as a community need to start thinking about generational change."

Torvalds agreed. "For us, there is nothing more interesting than interacting at a low level with the hardware and really controlling everything that's going on. So don't get me wrong, kernels are not boring but it's definitely true that the core people have been around for decades. Yes, we are getting grey."

He continued, many of the oldest developers "have moved into maintenance and management. I don't like the word management, because I don't think of myself as a manager, but realistically that's what I do." Indeed, Torvalds thinks of himself these days as a code manager and maintainer, not a developer.

The new people are the ones who are often doing the [programming] work. We have managers and retainers who are old and starting to gray, that's, I think, a completely different issue. But we do we have a generation of people in their 30s who are moving up through the ranks of maintainers so that we have that next wave of people to take over eventually, I mean, look, we've been doing this for almost 30 years so we need to start thinking, the next 20 to 30 years. And so we need to have that next generation.

The problem is, Torvalds continued, "We don't have enough maintainers. It turns out it's really hard to find people who are maintainers. It's interesting and it's challenging, but one of the downsides of being a kernel maintainer is you have to be there all the time. Maybe it's not 24 hours a day, but every day you react to email, you have to be there."

Moreover, "it's not a very easy niche, to get into. And we do not have enough maintainers. We do have a lot of people who write code. We have hundreds of people who are beginners, and that's usually more than most projects have. But at the same time, the one gating issue we often have is it's our need for maintainers to look at other people's code and help."

Another problem with finding maintainers is that:

It takes time, it takes experience. You have to have done this for a while, as a low-level maintainer to slowly move up and then gain the trust of enough people including your trust. And I think the keyword is trust. No, it's not just trust from other maintainers, it's also trust from all the people writing the code. And, that just, it takes time.

Still, there are maintainers moving up in the kernel developer system. Hohndel wondered if another generational problem for Linux developers is finding people who are experienced C programmers. He worried, "Is there a risk that we are becoming the COBOL programmers of the 2030s?"

Torvalds doesn't think so. "I think C is still one of the top 10 languages." That said, Torvalds continued, "people are actively looking at doing drivers and things that are not very central to the kernel, for example, in Rust. People have been looking at that for years now. I'm convinced it's going to happen one day."

The pair also talked about how Torvalds only tests builds on the x86 architecture. But Hohndel wonders, now that Apple is switching its Macs to ARM, if this " will change the landscape of the hierarchy of CPUs but in a few years." Torvalds thinks it might. "For ten years or so I'd be complaining about the fact that it's really, really hard to find ARM hardware that is usable for development. They exist, but they have certainly not been real competition for x86 so far."

Now, though with Apple moving Macs to ARM, this will help. Sure, on the cloud with AWS and its Graviton processors you have the needed power. But Torvalds thinks for "kernel developers, you want to have a machine in front of you, you want to feel like eating your own dog food. I refuse to basically develop for anything that I can't use as my desktop portal."

Hohndel replied, "Apple if you're listening, get Linus an early ARM laptop."

OK, Apple, the ball's in your court now.

(read more)

Improving HTTP with structured header fields

Words: calvin - lobste.rs - 14:12 29-06-2020

The HTTP community has been busy modernising the web’s protocol over the last decade, with multiple revisions of the core specification , a number of extensions , HTTP/2, and now HTTP/3. Unfortunately, the way we define and use HTTP header fields hasn’t changed much since the beginning, with underspecified headers (and lots of different ways to handle them) causing interoperability issues, developer pain, and even security problems. But help is coming.

Most web developers are familiar with HTTP headers like Content-Length, Cache-Control, and Cookie; they carry metadata for requests and responses. Typically, it will be information the sender can’t put into the message body for some reason, or information they want recipients to be able to access without having to search through the body.

Because headers need to be handled by lots of different clients and servers, proxies and CDNs — often more than once in the lifetime of a message — you’d expect them to be easy to handle, efficient to parse, and to have well-defined syntax.

Unfortunately, these things are rarely true. HTTP defines header values (more properly, field values since they can also occur in trailer fields, after the body) as a “sequence of octets” (i.e., bytes) with few constraints, although it recommends they be ASCII bytes. It also suggests headers be defined in ABNF , and that multiple fields with the same name can be combined on the same line if you separate their values with commas.

As a result, every header field has its own, unique definition that you need to know to parse its value. Some field authors use ABNF to do this; others use examples. Some just make you guess based upon the values you’ve seen before.

For example, consider the Age header. It’s part of the core HTTP specifications, so it should be well-defined, and it’s just a simple integer.

It is specified by this ABNF:

That seems straightforward at first — one to many instances of the digits between 0 and 9. Consider, though, what an implementation should do if it encounters any of these Age headers:

It’s not so simple, as tests against real caches that need to use Age show.

So, while examples or ABNF might be a sufficient definition when the same person is writing the code that generates and consumes the header and there’s no one else, it’s horrible for interoperability if there are multiple implementations generating and parsing the value.

Each header author has to remember to address a laundry list of questions about how to handle things like duplicate values, case normalisation, whether it’s a single item or a list, and so on. Often, they don’t address these things, which means implementers choose for themselves — often in different ways.

Insufficiently specified headers are also a source of security issues; if implementations parse headers differently, they can be tricked into behaving differently, leading to attacks like Response Splitting .

Browser vendors have become concerned enough about these issues to start defining headers like CSP algorithmically. That is, they painstakingly define parsing and serialisation algorithms and then create test cases. This approach has less ambiguity about the field’s syntax and fewer differences between implementations. However, it’s still a one-off; it only helps clarify the algorithms for that specific header. It’s also exhausting for the author of the specification to go to the effort and to make sure it’s correct — so most header authors don’t bother. It also creates a lot of busy work for implementers, since they’ll need to implement each new header’s parser separately.

These problems have been pretty clear to the HTTP Working Group for a while, and a few years ago we started to try to define something better that people can use for new fields. After a few attempts, we settled on an approach originally called Structured Headers, but we now (more properly) call it Structured Fields .

Structured Fields is a library of well-defined data types that are potentially useful in HTTP headers and trailers, including Strings, Tokens, Booleans, Integers, Decimals, and Byte Sequences as atomic “Item” types, and Lists and Dictionaries of those Items. Importantly, it defines exacting parsing and serialisation algorithms for each type, along with error handling and a detailed test suite — all to help assure interoperability.

That allows the author of a new header field to define it in terms of those types. For example, they can say “it’s a List of Strings”, and people will know how to parse and generate the header unambiguously using an off-the shelf library, rather than writing header-specific code.

Each Item can also have Parameters, or key/value pairs of extra information. Parameters are an important extensibility mechanism that allow headers to evolve over time.

There’s also a limited form of recursion; lists and dictionary values can contain lists too, like:

Each of the items in the inner lists can be parameterised, as can the inner lists themselves.

You might notice that these headers look a lot like many existing HTTP fields. That’s by design; not only is it comfortable for developers, it allows many existing fields to be generated by a Structured Fields implementation, and often they can be parsed by them too. For example, many Cache-Control headers are valid Structured Fields, even though it’s not defined as one:

Unfortunately, you can’t use Structured Fields for existing headers yet, and you can’t tell if a given field is a Structured Field or not just by looking at it; you have to know its definition, because Structured Fields is just for new fields, at least for now.

Making it easier to specify new fields plus making them safer and more interoperable to handle is a significant improvement to HTTP. What if Structured Fields could help HTTP performance as well? There are two ways they might be able to help. To be clear, these are speculative benefits, but they are nonetheless interesting to talk about.

The first is parsing efficiency. Because traditional HTTP headers are textual, a parser has to touch each byte in the string, sometimes multiple times, and sometimes copying and re-copying it into different parts of memory. This is an inherently inefficient process and one of the reasons HTTP/2 and HTTP/3 are binary rather than textual protocols.

Before Structured Fields, there wasn’t much we could do about that, because HTTP headers are defined so loosely. The well-defined data types in Structured Fields changes that. Now, we can define a new, binary serialisation of any headers that use them.

Binary Structured Fields is a straw-man proposal to define such a serialisation. It uses the HTTP/2 (and /3) SETTINGS mechanism to negotiate support for the alternative serialisation, and exploits Structured Fields’ similarity to many existing header fields’ syntax to backport it onto a set of already widely used header fields, falling back to opaque text if they fail to parse.

How much will binary serialisation help performance? It should reduce latency of request handling and improve scalability, thanks to an anticipated reduction in CPU load. We don’t have real-world numbers yet, but if you consider the path many headers take — from JavaScript to the browser, and then onto a CDN, through multiple CDN nodes to the origin server, then to the application code itself. The potential of cumulative savings are attractive.

The second way Structured Fields might help performance is through b. HTTP/2 introduced HPACK compression for header and trailer fields. While its predecessor, SPDY, used GZIP, it was found to be insecure because of the CRIME attack . So, HPACK (and its successor, QPACK) compress fields by referencing the entire field value; if any one part of it changes, it can’t use a previous reference (with sometimes surprising impact on compression efficiency ).

That whole-value granularity was chosen because there was no way for a generic parser to understand the structure of a field value; to be secure, we had to be certain an attacker couldn’t probe a secret by guessing parts of it.

With Structured Fields, there’s now potentially a way for the compression algorithm to operate on the individual data types in a field, rather than the entire value.

For example, consider the following Cache-Control field:

With HPACK and QPACK, the entire field value is stored in the dynamic table, and it can only be referenced by a future message with exactly the same value. If we were to parse it as a Structured Field and store the individual data types, we could store:

Each of these could then be referenced separately when they occur in a future header, making the compression algorithm more granular and possibly more efficient.

Early prototyping suggests the efficiency gains using this technique are pretty small for web browser connections because their headers tend to be highly repetitive, and replacing what was a 1-byte reference in HPACK with multiple bytes (one for each type in the field value) can actually hurt.

However, for connections that carry traffic from multiple clients — such as traffic seen by reverse proxies and CDNs upstream to the origin server — the benefits may be more apparent; more experimentation is needed.

If the backporting technique described above catches on, a future version of HTTP (or extensions to HTTP/2 and HTTP/3) could reduce the number of unstructured headers in use dramatically.

The Binary Structured Fields draft describes two ways to do this. If the field’s syntax is compatible with Structured Fields — at least most of the time — it can be sent as one, falling back to a plain-text header when that fails.

Headers that don’t have compatible syntax need another approach. For example Date, Last-Modified, Expires and similar headers can never be valid Structured Fields. However, it is possible to represent a date as an integer, and Structured Fields can convey an integer.

So, a header like this:

Might be represented as this on a hop that knows about the appropriate translations:

That gives us a way to eventually send all common headers and trailers as Structured Fields, letting HTTP’s message metadata catch up with the modernised transport of HTTP/2 and HTTP/3.

The Structured Fields specification is in the very last stages of standardization, which means it should become an RFC soon. We already have multiple implementations , including in Chrome, since many of their newer security headers (for example, Fetch Metadata ) are Structured. There’s also an extensive test suite that’s used by many of the implementations to assure they’re correct.

In the meantime, you can play with many of the implementations to get a sense of how they work. For example, the Python library http_sfv allows you to parse them from the command line.

If you define new headers — whether they’re for the web overall or just your HTTP API — you can start using Structured Fields once the RFC is published.

(read more)

Daily Crunch: Facebook faces an advertiser revolt

Words: Anthony Ha - TechCrunch - 16:15 29-06-2020

Facebook takes (small) steps to improve its content policies as advertisers join a broad boycott, founder Alexis Ohanian is leaving Initialized Capital and Waze gets a new look.

Here’s your Daily Crunch for June 29, 2020.

1. As advertisers revolt, Facebook commits to flagging ‘newsworthy’ political speech that violates policy

In a live-streamed segment of the company’s weekly all-hands meeting, CEO Mark Zuckerberg announced new measures to fight voter suppression and misinformation. At the heart of the policy changes is an admission that the company will continue to allow politicians and public figures to disseminate hate speech that does, in fact, violate Facebook’s own guidelines — but it will add a label to denote they’re remaining on the platform because of their “newsworthy” nature.

This announcement comes as advertiser momentum against the social network’s content and monetization policies continues to grow, with Unilever and Verizon (which owns TechCrunch) both committing to pull advertising from Facebook.

2. Alexis Ohanian is leaving Initialized Capital

Ohanian is leaving Initialized Capital to work on “a new project that will support a generation of founders in tech and beyond,” the firm said in a statement to TechCrunch. According to Axios, Ohanian is leaving Initialized to work more closely on pre-seed efforts.

3. Waze gets a big visual update with a focus on driver emotions

The new look is much more colorful, and also foregrounds the ability for individual drivers to share their current emotions with Moods, a set of user-selectable icons (with an initial group of 30) that can reflect how you’re feeling as you’re driving.

4. Amazon warehouse workers strike in Germany over COVID-19 conditions

Amazon warehouse workers in Germany are striking for 48 hours this week, to protest conditions that have led to COVID-19 infections among fellow employees. Strikes began today at six warehouses and are set to continue through the end of day Tuesday.

5. Four views: How will the work visa ban affect tech and which changes will last?

Normally, the government would process tens of thousands of visa applications and renewals in October at the start of its fiscal year, but President Trump’s executive order all but guarantees new visas won’t be granted until 2021. Four TechCrunch staffers analyzed the president’s move in an attempt to see what it portends for the tech industry, the U.S. economy and our national image. (Extra Crunch membership required.)

6. Apple began work on the Watch’s handwashing feature years before COVID-19

Unlike other rush initiatives undertaken by the company once the virus hit, however, the forthcoming Apple Watch handwashing app wasn’t built overnight. The feature was the result of “years of work,” VP of Technology Kevin Lynch told TechCrunch.

7. This week’s TechCrunch podcasts

The latest full-length Equity episode discusses new funding rounds for Away and Sonder, while the Monday news roundup has the latest on the Rothenberg VC Scandal. And Original Content has a review of the second season of “The Politician” on Netflix.

The Daily Crunch is TechCrunch’s roundup of our biggest and most important stories. If you’d like to get this delivered to your inbox every day at around 9am Pacific, you can subscribe here.

(read more)

Ways to explain code when told it doesn't make sense

Words: rusrushal13 - lobste.rs - 13:20 29-06-2020

24

9

As a programmer I have found my code frequently elicits the reaction "I don't understand". Whenever I get this response I try my best to explain my code patiently, and not make anyone feel afraid to ask questions.

I am pretty sure I've got the second part right, people are certainly not afraid to ask questions about my code!

However I have good reason to believe my explanations are not effective. I routinely have hour long discussions trying to explain my code, and on many occasions the conversations have ended with my coworker saying they still don't understand, but they have somewhere else to be (lunch, or home, or a meeting, etc).

I believe this is a problem with my code, as I cannot recall the last time some else's code has taken an hour of explanation to understand. As well, I rarely see my coworkers spending anywhere near as much time explaining their code to each other.

Specifically, when posed with the question "I don't understand your code", what are some strategies I can use to explain my code?

I have previously employed the following follow up questions, and I am looking for better, or at least more, follow questions:

What part specifically seems to be confusing?

Sometimes this works, but often the answer is "the whole thing". I have been in meetings with 5 other programmers, where all of the programmers agreed they didn't understand my code, but none of them could give any specifics parts which were confusing.

Are you familiar with pattern "X"?

I have tried to learn the names of the coding patterns I tend to use. I will bring up these names, such as "the visitor pattern", and ask them if they are familiar with this pattern. If they are familiar with it I try to show them how my code is an implementation of that pattern. This seems to stop them from immediately asking more questions, but invariably we seem to come back to the same code, and so I am afraid while they fully understand the pattern, the connection between the pattern and my code is not obvious.

What are some solutions to problem "X"?

Sometimes I try to get them to actively engage with solving the general problem, hoping that if they explain how they would solve it, I can show them the parallels between their solution and mine. This works, however often times the problem is a bit too complicated to just solve in your head, and so they can't quickly describe how they would solve it.

ADDITIONAL INFORMATION:

The code I work on most frequently is framework/architectural code, often legacy code which no one presently with the company is familiar with. My team is very busy, and while they are patient, they honestly don't have the time to help me work through legacy code. As a result my approach as been to fully understand it myself, and then try to explain it to my team during team meetings.

They will be interfacing with it though, and they interface with the existing code on a daily basis.

An example of this type of code would be our log pipeline, which takes browser errors, server errors, service errors, http logs, javascript logs, web logs and correctly joins time with session information, going through a few steps before the data eventually ends up in splunk. It isn't exactly complicated, but it also isn't exactly trivial, as the servers needed to handle tens of millions of logs per day, without any significant impact on server performance (our servers are already more expensive than my yearly salary).

CODE SAMPLES

(Please excuse the text dump. I tried to keep it short, but code samples seem like the best way to demonstrate my problem).

I put together a code sample of one piece of code that seemed to confuse my teammates the most. I no longer work at the company, so it isn't the exact code, and the exact code was scrapped anyway (it confused everyone, so we all agreed no one should use it).

A bit of background, our company was beginning a major rewrite, converting from a legacy framework to React/Typescript/Redux. There were regretting using Redux, but due to our browser support restrictions we were unable to use Mobx. As a result we were using Redux poorly, trying to make it work like Mobx, or KnockoutJS. The majority of our reducers simple set state, with the caller knowing exactly what they wanted to set (not how Redux action/reducers should work). However due to time constraints, we simply could not switch frameworks, and had to make Redux work. That was at least 3-4 years ago, and I would be surprised if the team was still using Redux now.

(I've linked to the Typescript playground for my code, as it is a bit long for a question)

An example of existing code can be found here: original code

I am opposed to this style, as although it is clear, it requires changing 4 pieces of code (spread across 3 different files) to add a variable. The steps to adding a new variables are: update the state definition, add a new action, add to the actions union, and add a reducer handler.

I made a builder class (a term I may not be using correctly, basically it is like yargs, https://www.npmjs.com/package/yargs, where you make a series of chained function calls to create a more complex object) that makes it possible to only add properties to one place, while preserving the types of everything.

(This was before Typescript mapped types, which provides alternatives to the builder approach).

A recreation of my proposed code can be found: changed code

code-reviews reactjs typescript

10

Siloed

Framework and Infrastructure code is tricky. It is the dark and messy parts of the code base that hit actual walls, and the worst part is that often the solutions are counter-intuitive, as they have to work around the user (aka. programmer), language decisions, and platform idiosyncrasies.

What has happened is that you've become an expert, and become effectively siloed.

The worst part is this kind of code does not have an effective boundary between your code and the users code.

There are a few ways to deal with this situation.

Share the Pain

Nothing breeds knowledge quite like having to shovel the S#*T yourself.

Not everyone on the team will have the head for infrastructure/framework work, but there will be a few. The best way to start distributing knowledge is to start getting these developers to work on small areas of the infrastructure/framework.

Of course maintain oversight (it is critical after all), but you need to start getting the other developers thinking across the silo border.

Enforce the Border

If for one reason or another tearing down the silo cannot be done. The other strategy is to enforce better boundaries between your code and their code.

This can be done in a number of ways.

Push code into libraries, and while you do it stabilise and document the interface.

Institute Idioms. Idioms are easily remembered and can vastly simplify a complex implementation to a simple story from the users perspective.

Documentation. If your going to explain it more than once, best to capture it for future reference. Better yet if you can multimedia it with a recording of your voice/presenting it/graphs/pictures, or can link it to the source itself somehow.

Push back on explaining. Its not your job to describe the systems nuances to everyone who asks. If it were, you would be a technical writer not a software developer. Knowledge that was not hard won, does not stay learned. Don't waste your efforts.

Push implementation out of the framework up into user space. If they are seeking you out a lot to understand it, they are trying to alter it, ergo it is in flux and at the wrong shearing layer in the tech stack. Provide a plugin interface for it (such as a strategy pattern) and a default if others need it in the framework.

49

Personally, I have encountered multiple variants of code-that-is-hard-to-understand, and each needs a different way to cope with:

Simply messy. Formatting is off, variable names are not clear, convoluted control structures, methods with multiple responsibilities. => Learn cleanliness, use a formatter.

Patternitis: applying patterns for each and every aspect of the code. Instead of a simple "if" apply a subclass strategy with two visitors derived from an abstract visitor, which is created by two factories which are derived from an abstract factory, which is selected via a strategy... (search for "FizzBuzz enterprise edition" on the net) => Understand the basis of patterns. A pattern is not a standard way of solving things, it is a name that you tack on a solution that you found. You don't go from a problem to "which pattern might I apply here", you go from a problem to a solution, and then say "oh look, my solution follows the form of a visitor pattern, it has a name!"

Abstraction mess: instead of having a simple class that does a thing, have two to five abstract base classes, which results in a control structure, where a simple function call goes through abstract and overriden methods in subclasses all over the place. => YAGNI. Embrace this piece of extreme programming. There is no "I might need this in the future, so I split it off now".

Misunderstood clean code: "good code needs no comments", and then writing code, that is not self-explanatory, but without any comments b/c "it's good". => These are the hardest to crack. If anyone knows a solution, I'd love to hear suggestions myself.

Mathematicians code: looks like a proof on a whiteboard. No variable name longer than a single character, no comments, no explanation. => Teach the mathematician the values of software development, and hand them a copy of "clean code".

What many junior programmers don't understand at first is, that the greatest value in software is SIMPLICITY. Don't try to be clever, don't try to optimize runtime (at least, not until you actually find a concrete problem), don't add an extra abstraction because you might need it in the future.

Always do the simplest thing that solves the problem at hand. No more. No less.

Seemingly, the part about the "misunderstood clean code" needs some clarification. I never meant to tell anyone personally that good code needs no comments.

The remark comes from the following situation, which I often encountered with some ex-colleagues:

Programmer A: I have written cool code, I understand it. As I have read the book "clean code", I know that comments are not necessary for self-explanatory code, therefore I do not comment.

Programmer B: I don't understand a single line of what you have written.

Programmer A: Then you are not smart enough to understand good code.

The problem here is, that Programmer A does not see his own mistake, but loads it off to lack of understanding on B's side. As this is his understanding, he'll probably never change his ways, and continue to write mumble-jumble which only he understands, and refuse to comment it, as he sees it as plainly self-explanatory. (Unfortunately, nobody else shares that view.)

Regarding your code samples: I am not really proficient in TypeScript, so frankly, I don't exactly understand the finer points of what you have done there. (Which probably already points to the first problem.)

What I can see from the first glance and a few line counts:

You have replaces 40 lines of perfectly readable code (heck, even I can understand that) with roughly 60 lines of hard-to-understand code.

The resulting change in usage is probably something along the lines of:

// old

let v = userReducer(x, y);

// new

let v = new ReducerFactory().addStringProp("x").addStringProp("y").createReducer();

So, the question is "why?".

Let us assume that you have taken half a workday to do the concept, the implementation, and the testing. Let us further assume,

that one developer day costs $1000.

It is quite well known that code that must be maintained has a much higher cost of ownership than the price of initial development. From

experience, a good guess is times ten for simple code, and times twenty for complicated code (which I apply here.)

Therefore, you have taken $500 * 20 = $10000 of company money to create which business value? That the creation of a given object is somewhat

"more elegant" in your personal view?

Sorry, as I see it, you do not need arguments to explain what you have done. You need education and experience in software architecture, where you learn

to put value on the right things in business.

16

The original code is extremely obvious, that is a very good thing. It is boring in the best way, there are no suprises there and you can very quickly see what it is doing.

Your code is very abstract and hides what is actually happening in your reducers. If I were entirely new and had to understand the codebase, it would be much harder in your example. And even if you understand it in general, for me it is much harder to reason about this because it is so abstract. There is of course a place for this kind of abstraction, they're not inherently bad (I think Redux Toolkit has some similar things, but I haven't used Redux in a long time). But you have to think hard about whether the abstractions are worth the cost.

My experience with similar abstractions is that you very quickly run into cases that differ just slightly from the common case. You can then either make your abstraction more powerful and complex, or fall back to plain, boring code. In those cases I did mostly regret my previous choices.

I can understand the original code in seconds, I think a bit of repetition is a low price to pay for that. You should take it seriously when people tell you they don't understand your code, and it's not just a single person. Either your code is actually overly complex and abstract, or your team is simply not comfortable with certain programming styles. In both cases you need to write simpler code to work efficiently in a team.

12

Get people to look at your code sooner.

Every code base I've ever touched conveys a mindset. A way of looking at things. A big part of my job is molding my brain into something that can work with this existing mindset. This can be jarring if the mindset clashes with my personal style. I try to put more effort into being effective with the existing mindset than into imposing my personal style.

Ask yourself: how well do you understand your coworkers code? Even if you aren't working in it if you don't understand it you don't understand your coworkers. You don't understand the mindset.

If you're working alone on something that doesn't connect much to the existing code it's easy to let your personal style take over. Doing this feels comfortable as you write code but will bite you when others, who are steeped in the mind set, look at your code.

I'm not saying you're forever a slave to the existing mindset. But anytime you step away from it check with your team and see if you aren't making things too weird for them. Because when you go too far what you're doing is imposing a new mindset. It doesn't matter if yours is better. It matters how many mindsets you're making people deal with. One at a time please.

Judging from your experiences you need to get people looking at your code sooner. All of your energy seems to be aimed at convincing them that they should understand your code as is. The problem is they shouldn't need an explanation.

If you let too much time go by changing your code becomes expensive. If this issue had come up sooner you'd have been more likely to change your code in reaction. It seems now you're too far gone and are simply trying to convince people to like it as is. The problem with that is this code will still be here long after you're no longer around to explain it.

This might seem a little soul crushing, but in my experience my wild new ideas catch on much more effectively if they aren't only my ideas.

9

With out wishing to be rude, if you find that other experienced engineers are regularly struggling to understand your code, then your actual problem is how to make the code simpler, not how to explain the complexity.

If you are working as part of a team your first priority is to make your code as readable as possible. Sooner or later somebody is going to have to maintain that code - either to fix a bug or add a new feature. If they struggle to understand what's going on you will have a buggy updated system and an unhappy engineer. That engineer might be somebody who is not currently in your team and you didn't have the luxury to explain the code to. Worse, it might be YOU in 6 months time when you've forgotten all the little tricks you employed.

8

For what its worth, I also find your changed code quite confusing compared to the original code.

The original code is beautifully simple. Apart from the interface declaration it is basically a three-way switch. Your code is a lot more complex including a factory, a builder pattern and something called a randomIdentifier (WTF?). Complexity leads to bugs and code that is hard to change, so it is the enemy of maintenance. If I had to review this code as pull request, my first question is what real-world problem the old code has which justifies this manifold increase in complexity?

The problem is not that I don't understand the patterns in use. The problem is I don't understand why you need all these patterns. To put it another way, it is not that any particular part of the code is especially confusing, it is more that I don't understand why you think you need all this complexity in the first place.

So I think you should focus more on explaining why you write the code you do, rather than how the code works. Show some concrete problem with the existing code which everybody will agree is a problem. For example that you use a lot of time adding new properties or that you often have bugs where actions are added incorrectly. Then explain why your code makes these problems go away.

5

I believe this is a problem with my code, as I cannot recall the last time some else's code has taken an hour of explanation to understand.

I'm happy to see this conclusion. Most commonly, people blame others for not understanding. It shows you can see things from other people's perspective, which is going to help you solve this issue.

Specifically, when posed with the question "I don't understand your code", what are some strategies I can use to explain my code?

Clean coding means writing readable code, preferably code that is readable enough that it requires no documentation. Your explanation, even if not written down, counts as "documentation".

Rather than trying to explain your code, rewrite your code to explain itself. The better response here isn't to tell your coworker what the code does (I'll humorously refer to that as "devsplaining"), but instead ask your coworker what is unclear about it. Take that feedback and revisit your code to see if you can rewrite it so that the unclear parts become clear.

I can't tell you that all code ever written should be crystal clear without any documentation or comments - that's overreaching. But crystal clear code is the goal, even if you never perfectly attain it.

Sometimes this works, but often the answer is "the whole thing". I have been in meetings with 5 other programmers, where all of the programmers agreed they didn't understand my code, but none of them could give any specifics parts which were confusing.

Assuming these developers are all of equal or greater skill to you, and they have the expected contextual knowledge of the application, this signals to me that you need to rework your code from the ground up.

"Are you familiar with concept X?"

I can't make any final conclusions here, but I do want to point two things out:

Watch out with your tone when you ask if someone is familiar with something. It can come across as passive aggressive or suggesting that the other person lacks the required skill to understand your code. Even if that is objectively correct (e.g. a junior dev), it's still not the best way to express yourself.

If you are genuinely dealing with developers who don't know a design pattern you've used, that seems to suggest that maybe your coworkers are lower skilled than you. However, even if you used a design pattern correctly, it's still possible (and I would guess likely, based on some indirect inferences from your question) that your low code readability is obfuscating an otherwise correct implementation of a design pattern.

Sometimes I try to get them to actively engage with solving the general problem, hoping that if they explain how they would solve it, I can show them the parallels between their solution and mine. This works, however often times the problem is a bit too complicated to just solve in your head

If that is the case, then the code you wrote has not been reasonably abstracted. Using clean coding and good practice, your code should already be subdivided into easily digestible chunks of logic, and you should be able to discuss one of these chunks by themselves. If you can't to that with your code, then your code is not separating its responsibilities correctly.

You haven't really shown concrete examples so I cannot judge your code. By extension, I cannot conclude whether you're making things too difficult or your coworker's skill it too low. However, based on what I read in your question, my educated guess is that your code works but is unreadable, and you're currently not in an environment where clean coding is actively enforced, so you're only relying on wondering if the code works or not, not whether it passes the smell test.

You said your colleagues communicate among themselves without much confusion, so what I would do is inspect their code. Do you understand their code better than they understand yours? How is their code different?

Secondly, putting your code itself aside for a minute, you also seem to struggle with explaining your intentions to others. That's also a problem. Me and my coworkers are generally able to explain design decisions to each other without even looking at the code itself. We of course don't delve into specifics, but explaining the general design (i.e. "mental diagram") is not something you need to see concrete code for. For reasonably experienced developers, they can fill in the blanks on the concrete implementations of the design for as much as they need to in that conversation.

I think both your code quality issues and problems with explaining your design stem from the same problem. I'm paraphrasing here, but there's a well known quote that strikes at the heart of this:

Software development is breaking a problem down into a series of smaller and smaller problems until each individual problem is trivial to solve.

My personal addition to that adage is that programming (as opposed to development) is implementing those individually trivial problems.

If your code and explanation are too convoluted, then you haven't broken the problem down enough for things to become trivial.

Never forget that any solution to a problem, no matter how difficult that problem is, is really just a sequence of steps, each of which is trivially simple by itself.

3

Two suggestions come to my mind:

Use models/diagrams to represent the different aspects of your solution/implementation. You can use a paper or a dashboard just to simply draw the ideas/concepts and the relations between them. That could help to represent your code in a simpler and more understandable way, and would allow you to explain it better.

The idea is to just put drawing into your ideas, as the phrase “A picture is worth a thousand words”. Simplified UML-like diagrams can be used or whatever that fits into the subject so it can help to simplify the understanding.

Show your code running. It could be as simple as giving play in debugging mode on your development environment with a few breakpoints in the key places. Maybe this couldn't be possible in all scenarios, but if it is possible it could be useful.

Then, having into account that all software processes are about [input]=>{process}=>[output], you can choose some relevant inputs for your code with its corresponding expected outputs, and guide your coworkers through the transformation process that your code is performing (using the help of the created models and the debugger -if available-).

I agree with the other answers and comments that point to the issue that the code should be understandable to allow maintenance, etc, but as I understand your question was not about the code itself, but about how to best explain it to your colleagues.

2

I ask: What part specifically seems to be confusing? Sometimes this

works, but often the answer is "the whole thing".

What this tells me is that they do not know where to start. To understand anything, you need some anchors and a clear entry point. You need to see the coarse logic first and then work from there to the nitty gritty. I suggest to focus on that coarse logic, make it as visible as you possibly can and hide from view what is not essential to the big picture.

I will bring up these names, such as "the visitor pattern"

Hmja... I once had to work with that. And I can totally relate to your co-workers. I looked it up and got to understand what it was but then still did not see a good reason to apply it, to solve the problem at hand. So I am thinking you may be using the wrong patterns to solve problems. That can be most confusing.

The visitor pattern is hard because it lacks a clear hierarchy. You cannot find your way by simply zooming in from coarse to detailed as I suggested. Most programmers are stack oriented. Take away that backbone and they are lost.

So, is that fancy pattern really appropriate or is it just something you got used to applying?

It would be worth passing you code to someone who is not in a hurry, to have him look at it seriously. Now you can only guess what is wrong.

1

Common names, terms and language

Others have talked about code-style, but I think you might be struggling to explain things because you're naming standard things in an unexpected way, either in the code or in your verbal explanation. If you use the same terminology as your co-workers then you can save a lot of time on the explanation as you can skip over the bits of standard implementation. Some of these common terms are quite natural (file, , some of it is built into programming languages (class, pointer etc.), but some has to be learned (abstract patterns, language/domain specific words), that can be achieved by reading books/articles or just listening to your co-workers and using (where appropriate) the same terms that they do to describe code objects.

Taking a slightly facetious example, imagine someone explaining that a tool "enables RAM to disk bit flushing when the floppy-icon command instance is activated", that might require some detailed explanation as to what's going on, but "click the save button" probably won't. As a bonus, if your naming things the same way, chances are your code will be more standard and your style will be more consistent.

This is something I struggled with in my early days as a developer, but reading and listening helped me understand more terms and communicate better. It's also something that you can take with you throughout your career to different languages, employers, and even different countries.

1

I don't know the language used in the examples, but I understand the existing code. I could easily modify it or fix bugs. However I don't understand the proposed code. This in itself isn't a problem, since I don't know the language. But it makes me think the code is harder to understand than it should be.

In your code I'm seeing 2 patterns I've seen before:

The code is very complex. The result is that no one except you understands it without a lot of work. Which takes time and energy for something that should be relatively simple. I've had a colleague that coded like this. His code was great, and performed well. But it was impossible for anyone else to understand what was happening, we had to refuse touching the code. What I learned from that was that it's more important to make code that's easy to understand than to make it perform, or even to follow rules and patterns.

The code is completely refactored, instead of just fixing what needed to be fixed. I had another colleague that refactored code he didn't know in order to understand it better. The problem with this approach is that most people in the team knew the code, and could do changes pretty easy. That is until he had refactored the code, after which we didn't know the code any more and needed to relearn it. My lesson from that is that small changes should be as small as possible, refactoring should only be done when it's really needed. The cost of the refactoring is to high otherwise.

Now let's try to answer your question. You ask:

Specifically, when posed with the question "I don't understand your code", what are some strategies I can use to explain my code?

If it's multiple persons that don't understand your code it's likely a problem with the code you write, and not with the other developers. Instead of trying to explain your code, try to get information from them about what they don't understand. And change the architecture and code to make sure it's easier to understand. Do this early and often, from the planning and architecture until the code is finished.

1

If this happens to you repeatedly, then there are two possibilities: Either your colleagues are pranking you, or you are writing code that isn’t understandable.

I suspect that you are writing code that is just too complicated for its own good. And frankly, I wouldn’t discuss your code with you for four hours in a code review. If I don’t understand it, then I can’t maintain it, so it cannot pass the code review.

Maybe the next time you discuss how to approach a problem with someone before you start writing the first line of code, and you will see a much simpler solution. And maybe specifically before you try to apply the visitor pattern you think twice or three times whether it actually gains you anything.

PS. I saw your code example. I wouldn't ask you to explain it, I would ask you to throw it away. If I found it in an existing code base, it would have to be refactored to the original code. Your coworkers are very, very patient.

PPS. You managed to take some very, very simple code that I can read line by line and understand everything immediately, into a convoluted mess that doesn't make any sense except after a thorough analysis. So what are you going to do if you have code to handle something that is in itself difficult? When you have a difficult problem?

0

I guess there are two possibilities:

Your code IS a bit overly complex

Your code isn't too complex but your team-mates are struggling to understand it for some reason

Either way, you're right to be concerned as they will likely be the ones maintaining it so it's important to bring them along with you.

With respect to 1, it's hard to tell without code samples but do YOU think it's too complex?

More objectively, how well does the code adhere to SOLID principles? How well is the code commented? Are the classes/methods/functions self-documenting?

How easy is the code to unit test? If unit tests are hard to write, it's often a sign that the code is overly complex.

Also static code analysis could provide an objective measure of complexity and might indicate where you could refactor.

But assuming it's NOT too complex, I would go for early and frequent peer review as you write the code. That way you can bring the other developers along with you as the implementation develops rather than present the finished article which seems to be causing confusion.

If they are struggling with some of the concepts you are introducing (design patterns etc.) then maybe some brown-bag sessions on those topics where you have space to discuss and learn outside of the code you are writing.

0

Idiomatic code and uniform style

Many things can be written in many different ways that work equally well, however, for anyone maintaining and reading the code it's much better if they are written in the "expected" default style, using common patterns and avoiding deviation from the standard way without a good reason.

This essentially comes to code standards - some languages (e.g. Python) have universally accepted standards of how code is supposed to look like and what is 'idiomatic code'; in other cases there are company-specific guidelines (e.g. Google C++ style guid https://google.github.io/styleguide/cppguide.html)

All these cases restrict the writer of the code in order to ensure that the result is more uniform, with the benefit of increased readability (as all code uses the same, familiar patterns) and easier maintenance by others, as it's easier from them to understand the code if it's written in the same style as they write their code; and it's harder to understand code (needing more explanations) if each developer codes in a different style.

(read more)

Google brings free product listings to its main Google Search results

Words: Sarah Perez - TechCrunch - 14:58 29-06-2020

Earlier this year, Google made a significant change to its Shopping search tab in the U.S. to allow the service to primarily feature free product listings selected by Google’s algorithms, instead of paid ads. Building on that change, Google is today introducing a shift to free product listings in the main Google Search results page in the U.S. Before, it would only showcase sponsored links in its “product knowledge panel.”

This panel appears when a Google user searches for a product that has matching listings on e-commerce websites. But until now, those links were paid ads. Google says, starting this summer, these panels will instead feature free listings.

This change will roll out first in the U.S. on mobile, followed later by the desktop.

Shopping ads aren’t going away, however. These ads will appear separately at the top of the page, where they’re marked like Google’s other ad units.

Since its shift to free listings in April of this year, Google says it has seen an average 70% increase in clicks and 130% increase in impressions across both the free listings and ads on the Shopping tab in the U.S. These metrics were based on an experiment looking at the clicks and impressions after the free listings were introduced, compared with a control group. The control group was a certain percentage of Google traffic that had not been moved to the new, free experience.

Google has positioned its shift to free listings as a way to aid businesses struggling to connect with shoppers due to the impact of the coronavirus pandemic. But the reality is that this change would have had to arrive at some point — pandemic or not — because of Amazon’s threat to Google’s business.

Amazon over the years has been steadily eating away at Google’s key business: search ad revenue. In a report published last fall, before the pandemic hit, analyst firm eMarketer said Google’s share of search ad market revenue would slip from 73% in 2019 to 71% by 2021, as more internet users started their searches for products directly on Amazon.

Now the coronavirus is pushing more consumers to shop online in even greater numbers, much to Amazon’s advantage. The online retailer reported the pandemic helped drive a 26% increase in its first-quarter 2020 revenue, for example. Meanwhile, a new eMarketer forecast estimates that Google ad revenues will drop for the first time this year, falling 5.3% to $39.58 billion due to pandemic impacts on ad spend — particularly the pullback in travel advertiser spending.

Google needed to change its Search service to return more than just paid listings to better compete. Paid listings alone wouldn’t always feature the best match for the user’s search query nor would they show as complete a selection — a problem Amazon’s vast online superstore doesn’t have. But Google’s shift to free listings also incentivizes advertisers to pay for increased visibility. Now, advertisers will need a way to stand out against a larger and more diverse selection of products.

“For many merchants, connecting with customers in a digital environment is still relatively new territory or a smaller part of their business,” notes Bill Ready, Google’s president of Commerce. “However, consumer preference for online shopping has increased dramatically, and it’s crucial that we help people find all the best options available and help merchants more easily connect with consumers online.”

(read more)

FreeBSD Binary Package Manager Cheatsheet

Words: vermaden - lobste.rs - 13:14 29-06-2020

pkg-update Notes: It’s used to refresh repositories.

To suppress output, use -q or --quiet flag.

Refresh the enabled repositories: root@freebsd:~ # pkg update It simply synchronizes the catalogues of the enabled repositories from their servers.

Force refreshing the enabled repositories: root@freebsd:~ # pkg update -f Or by using the full-form flag --force.

pkg-upgrade Notes: It’s used to install the newest versions available for one or more packages.

By default it stores the downloaded packages in /var/cache/pkg/.

It will automatically update/refresh the repository catalogues, unless the -U or --no-repo-update flag is used.

To assume yes as an answer to all confirmation questions in the upgrade process, use -y or --yes flag.

To suppress output, use -q or --quiet flag.

If -q and -n flags are used, a summary of the work list will be displayed.

Upgrade all installed packages: root@freebsd:~ # pkg upgrade It simply installs the newest available versions of the installed packages. Just fetch upgrades & detect possible conflicts: root@freebsd:~ # pkg upgrade -F Or by using the full-form flag --fetch-only. Simulate the upgrade process: root@freebsd:~ # pkg upgrade -n Or by using the full-form flag --dry-run.

Upgrade one or more packages. (e.g: vim): root@freebsd:~ # pkg upgrade vim It simply installs the newest available version of the vim. Force upgrade or re-installation of installed packages: root@freebsd:~ # pkg upgrade -f Or by using the full-form flag --force.

pkg-search Notes: It’s used to search for a package in the repositories catalogues.

It will automatically update/refresh the repository catalogues, unless the -U or --no-repo-update flag is used.

To produce less output, use -q or --quiet flag.

Search for a package. (e.g: vim): root@freebsd:~ # pkg search vim Search for packages start with vim-: root@freebsd:~ # pkg search '^vim-' Search for two packages. (e.g: neofetch and screenfetch): root@freebsd:~ # pkg search 'neofetch|screenfetch' Since both of those packages end with fetch, we can make it like:

root@freebsd:~ # pkg search '(neo|screen)fetch' Search for packages start with any alpha-character, and followed by top: root@freebsd:~ # pkg search '^[a-z]top' Display a package’s downloadable URL. (e.g: vim-8.2.0869): root@freebsd:~ # pkg search -Q url vim-8.2.0869 Or by using the full-form flag --query-modifier. Display a package’s size. (e.g: vim-8.2.0869): root@freebsd:~ # pkg search -Q pkg-size vim-8.2.0869 Display a package’s size after getting unpacked and installed. (e.g: vim-8.2.0869): root@freebsd:~ # pkg search -s vim-8.2.0869 Or by using the full-form flag Same as --size.

pkg search -Q size vim-8.2.0869. Display a package’s maintainer email. (e.g: vim-8.2.0869): root@freebsd:~ # pkg search -Q maintainer vim-8.2.0869 Display a package’s categories. (e.g: vim-8.2.0869): root@freebsd:~ # pkg search -Q categories vim-8.2.0869 Display a package’s options. (e.g: vim-8.2.0869): root@freebsd:~ # pkg search -Q options vim-8.2.0869 Display a package’s dependents. (e.g: vim-8.2.0869): root@freebsd:~ # pkg search -Q required-by vim-8.2.0869

Search for debian in packages comments: root@freebsd:~ # pkg search -c debian Or by using the full-form flag Same as --comment.

pkg search -S comment debian. Search for gnu.org in packages descriptions: root@freebsd:~ # pkg search -D 'gnu.org' Or by using the full-form flag Same as --description.

pkg search -S description 'gnu.org'. Search for a package’s dependencies. (e.g: vim-8.2.0869): root@freebsd:~ # pkg search -d vim-8.2.0869 Or by using the full-form flag Same as --depends-on.

pkg search -Q depends-on vim. Search for exact package. (e.g: vim-8.2.0869): root@freebsd:~ # pkg search -e vim-8.2.0869 Or by using the full-form flag --exact. Display a package’s information. (e.g: vim-8.2.0869): root@freebsd:~ # pkg search -f vim-8.2.0869 Or by using the full-form flag Same as --full.

pkg search -Q full vim-8.2.0869. Display a package’s origin. (e.g: vim-8.2.0869): root@freebsd:~ # pkg search -o vim-8.2.0869 Or by using the full-form flag Same as --origins.

pkg search -L origin vim-8.2.0869. Display where a package will be installed in. (e.g: vim-8.2.0869): root@freebsd:~ # pkg search -p vim-8.2.0869 Or by using the full-form flag Same as --prefix.

pkg search -Q prefix vim-8.2.0869. Display which repository provides a package. (e.g: vim-8.2.0869): root@freebsd:~ # pkg search -Q repository vim-8.2.0869 Display a package’s project URL. (e.g: vim-8.2.0869): root@freebsd:~ # pkg search -Q www vim-8.2.0869

pkg-install Notes: It’s used for installation of packages from package repositories or local archives.

By default it stores the downloaded packages in /var/cache/pkg/.

It will automatically update/refresh the repository catalogues, unless the -U or --no-repo-update flag is used.

To assume yes as an answer to all confirmation questions in the installation process, use -y or --yes flag.

To suppress output, use -q or --quiet flag.

If -q and -n flags are used, packages that are going to be installed, upgraded or deleted, will always be shown.

Install a package. (e.g: vim): root@freebsd:~ # pkg install vim Note that it’ll keep the downloaded package in . Even after the installation./var/cache/pkg/ Re-install an installed package. (e.g: vim): root@freebsd:~ # pkg install -f vim Or by using the full-form flag --force. Re-install an installed package and all its dependents. (e.g: vim): root@freebsd:~ # pkg install -Rf vim Or by using the full-form flag --recursive. Fetch a package and detect conflicts. (e.g: vim): root@freebsd:~ # pkg install -F vim Or by using the full-form flag --fetch-only.

Install a package and mark it as automatic. (e.g: vim): root@freebsd:~ # pkg install -A vim Or by using the full-form flag --automatic. Which means if there are no packages depend on vim and the command pkg autoremove is issued, then vim will be removed automatically.

Force installation of a package even with missing dependencies. (e.g: vim): root@freebsd:~ # pkg install -m vim Or by using the full-form flag --ignore-missing. Simulate the installation process. (e.g: vim): root@freebsd:~ # pkg install -n vim Or by using the full-form flag --dry-run. Which prints the list of changes to packages, without actually applying them.

pkg-fetch Notes: It is used for downloading binary packages without installing them automatically.

It’s useful for offline uses or to manually interact with package’s contents.

Downloaded packages can be installed by using pkg-add or pkg-install.

By default it stores the downloaded packages in /var/cache/pkg/.

It will automatically update/refresh the repository catalogues, unless the -U or --no-repo-update flag is used.

To assume yes as an answer to all confirmation questions in the fetching process, use -y or --yes flag.

To suppress output, use -q or --quiet flag.

Download all available updates: root@freebsd:~ # pkg fetch -u Or by using the full-form flag --available-updates. Download a package. (e.g: vim): root@freebsd:~ # pkg fetch vim It’ll be downloaded to /var/cache/pkg/. Download a package with all its dependencies. (e.g: vim): root@freebsd:~ # pkg fetch -d vim Or by using the full-form flag --dependencies.

Download all available packages: root@freebsd:~ # pkg fetch -a Or by using the full-form flag --all. Download a package to custom folder. (e.g: vim): root@freebsd:~ # mkdir /tmp/pkgsroot@freebsd:~ # pkg fetch -o /tmp/pkgs/ vim Or by using the full-form flag --output.

pkg-info Notes: It’s used to display some information about packages.

To suppress output and print only the requested information, use -q or --quiet flag.

Check whether or not a package is installed. (e.g: vim): root@freebsd:~ # pkg info -a | grep -i vim Or by using the full-form flag --all. If there is no output, it means is not installed, Otherwise it is.vim Another method to check the existence of a package. (e.g: vim): root@freebsd:~ # pkg info -e vim ; echo $? Or by using the full-form flag --exists. If is installed and registered in the database, it’ll return , Otherwise is returned.vim01 Alternative way to know if a package is installed. (e.g: vim): root@freebsd:~ # pkg info -x vim Or by using the full-form flag --regex. List installed packages (with dependencies): root@freebsd:~ # pkg info -a Or by using the full-form flag --all. List installed packages (without dependencies): root@freebsd:~ # pkg query -e '%a = 0' %n-%v Or by using the full-form flag --evaluate. %a Returns 1 if the matched package was automatically installed as a dependency of another package, 0 otherwise.

%n Name of the matched package.

%v Version of the matched package.

List installed packages as dependencies: root@freebsd:~ # pkg query -e '%a = 1' %n-%v Already explained above. Keep in mind, if a package is manually installed with the -A flag, it will be shown here too even it’s not a dependency.

Display where a package is installed. (e.g: vim): root@freebsd:~ # pkg info -p vim Or by using the full-form flag --prefix. Get information about an installed package. (e.g: vim): root@freebsd:~ # pkg info vim For full information, use -f or --full.

Get the total size of files installed by a package. (e.g: vim): root@freebsd:~ # pkg info -s vim Or by using the full-form flag --size. Display the installed package’s short description. (e.g: vim): root@freebsd:~ # pkg info -I vim Or by using the full-form flag --comment. List the dependencies of an installed package (e.g: vim): root@freebsd:~ # pkg info -d vim Or by using the full-form flag --dependencies. List an installed package’s dependents (e.g: vim) root@freebsd:~ # pkg info -r vim Or by using the full-form flag --required-by. List all files installed by a package (e.g: vim): root@freebsd:~ # pkg info -l vim Or by using the full-form flag --list-files. Display an installed package’s origin. (e.g: vim): root@freebsd:~ # pkg info -o vim Or by using the full-form flag --origin. Display an installed package’s message. (e.g: vim): root@freebsd:~ # pkg info -D vim Or by using the full-form flag --pkg-message. pkg-lock Notes: It’s used to lock or unlock installed packages.

Locking a package, means make that package immune against re-installation, upgrading, downgrading or deletion.

All locked package’s dependents and dependencies will have the same effect. It may even forbid the installation of some packages if they require different version of the locked package. So, use it carefully.

To assume yes as an answer to all confirmation questions in the lock or unlock process, use -y or --yes flag.

To suppress output except for the confirmatory questions, use -q or --quiet flag.

Lock a package. (e.g: vim): root@freebsd:~ # pkg lock vim Lock all installed packages: root@freebsd:~ # pkg lock -a Or by using the full-form flag --all. List the locked installed packages: root@freebsd:~ # pkg lock -l Or by using the full-form flag --show-locked. Unlock a package. (e.g: vim): root@freebsd:~ # pkg unlock vim Unlock all installed packages: root@freebsd:~ # pkg unlock -a Or by using the full-form flag --all. Check if there is any locked packages: root@freebsd:~ # pkg lock --has-locked-packages If there is at least one locked package, it’ll return , otherwise is returned.01 pkg-delete Notes: It’s used to delete the installed packages from the database and the system.

pkg remove is an alias to pkg delete, which means both of them do the same exact job.

To assume yes as an answer to all confirmation questions in the deletion process, use -y or --yes flag.

To suppress output, use -q or --quiet flag.

If -q and -n flags are both used, a list of packages to be deleted will be displayed.

Delete an installed package. (e.g: vim): root@freebsd:~ # pkg delete vim To delete more than one package at a time, separate the packages with space. e.g: pkg delete vim py37-ranger. Force the deletion of a package. (e.g: vim): root@freebsd:~ # pkg delete -f vim Or by using the full-form flag --force. If -f and -a flags are used together, it will cause pkg package to be deleted as well.

Delete all installed packages except pkg: root@freebsd:~ # pkg delete -a Or by using the full-form flag --all. Simulate the deletion process. (e.g: vim): root@freebsd:~ # pkg delete -n vim Or by using the full-form flag --dry-run.

pkg-autoremove Notes: It’s used to remove the orphan installed packages.

To assume yes as an answer to all confirmation questions in the auto-removal process, use -y or --yes flag.

To suppress most output, use -q or --quiet flag.

Remove all orphan installed packages: root@freebsd:~ # pkg autoremove It’ll simply remove all unneeded packages anymore, which were installed during dependency resolution.

Simulate the removal of orphan packages: root@freebsd:~ # pkg autoremove -n Or by using the full-form flag --dry-run.

pkg-clean Notes: It’s used to delete the previous downloaded packages.

By default the packages cache is stored in /var/cache/pkg/.

To assume yes as an answer to all confirmation questions in the installation process, use -y or --yes flag.

To suppress most output, use -q or --quiet flag.

If bothe -y and -q flags are used, all output will be suppressed.

Remove the old versions of packages cache: root@freebsd:~ # pkg clean It removes the old versions of packages, and the packages that are no longer provided. Simulate the removal of packages cache: root@freebsd:~ # pkg clean -n Or by using the full-form flag --dry-run.

Remove all packages cache: root@freebsd:~ # pkg clean -a Or by using the full-form flag --all.

pkg-stats Notes: It’s used to display package database statistics.

To suppress most output, use -q or --quiet flag.

To display disk space usage in bytes, use -b or --bytes flag.

Get general packages statistics: root@freebsd:~ # pkg stats Displays remote and local package databases stats. Get remote package database stats: root@freebsd:~ # pkg stats -r Or by using the full-form flag --remote. Count the installed packages as dependencies: root@freebsd:~ # pkg query -e '%a = 1' %n-%v | wc -l

Get local package database stats: root@freebsd:~ # pkg stats -l Or by using the full-form flag --local. Count the installed packages (with dependencies): root@freebsd:~ # pkg info -a | wc -l Count the installed packages (without dependencies): root@freebsd:~ # pkg query -e '%a = 0' %n-%v | wc -l

(read more)

Apple reveals its 2020 Apple Design Award winners

Words: Sarah Perez - TechCrunch - 14:01 29-06-2020

One thing missing from last week’s virtual version of Apple’s annual Worldwide Developers Conference was its ceremony announcing its latest selection of Apple Design Award winners. Today, Apple announced the 2020 award winners, highlighting those it said brought “distinctive new ideas to life” while demonstrating a mastery of Apple technology.

The Design Awards serve as a signal to the development community as a whole what sort of apps and games Apple wants to see. For example, last year, the company celebrated apps that showcased the use of Apple Pencil, CoreML, Metal 2 and other Apple technologies.

This year, Apple has again focused on several apps designed for iPad, particularly photo editors and other design tools that showcase the iPad as a tool for creatives. Meanwhile, a couple of the game winners were selected for their use of spatial audio, in addition to their use of other technologies and their design choices. Not coincidentally, Apple at WWDC20 said it was updating its AirPods Pro with support for spatial audio.

The photo and video editor Darkroom from Bergen Co., which was described as being easy enough for casual and pros to use, was among this year’s app winners. It also leveraged Apple technologies like photo and camera APIs, Home Screen quick actions, contextual menus and haptics.

Animation app Looom, developed by iorama.studio, won for its playful and creative interface, novel custom controls and support for Apple technologies like Apple Pencil and Dark Mode.

CAD editor Shapr3D, from Shapr3D Zartkoruen Mukodo Reszvenytarsasag, runs on iPad and works with Apple Pencil to allow technical designers to create 3D models. The app uses ARKit and drag and drop, and is soon adding support for the LiDAR Scanner for generating 2D floor plans from 3D photos.

StaffPad, from StaffPad Ltd., turns handwritten musical notations into digital sheet music using Apple Pencil, drag and drop and Core ML.

Sayonara Wild Hearts from developer Simogo and publisher Annapurna Interactive, had already been dubbed by Apple one of the best games of 2019. The game won a Design Award for its vibrant landscapes, visuals and motion, as well as its extensive use of Apple technologies, including Metal, Game Center, spatial audio and game controllers.

Sky: Children of the Light, from thatgamecompany, also made Apple’s “best of” list last year, and has returned to win the Design Award for multiplayer, social quest game featuring Apple technologies including a custom Metal engine, haptics, Game Center and spatial audio.

“Song of Bloom,” from indie developer Philipp Stollenmayer, is a nonlinear puzzler with stories told in rapidly changing art styles. Apple selected this title, which runs on iPad, for its handcrafted gameplay and design.

“Where Cards Fall,” from developer The Game Band and publisher Snowman, is an adventure game where players build houses of cards to bring memories to life. The game uses Metal, haptics, Game Center, iCloud and other technologies.

“Every year, app and game developers demonstrate exceptional craftsmanship and we’re honoring the best of the best,” said Ron Okamoto, Apple’s vice president of Worldwide Developer Relations, in an announcement. “Receiving an Apple Design Award is a special and laudable accomplishment. Past honorees have made some of the most noteworthy apps and games of all time. Through their vision, determination, and exacting standards, the winning developers inspire not only their peers in the Apple developer community, but all of us at Apple, too.”

(read more)

Write Once, Build Anywhere

Words: thangalin - lobste.rs - 04:51 29-06-2020

Cross-compiling self-contained Java desktop application launchers.

Java’s promise of write once, run anywhere still resonates with me, perhaps because I cut my teeth on JDK 1.0.2b. It was amazing to write cross-platform networking applications without concern for variations in POSIX implementations, or having to worry about nuances between C compilers, or even needing to grok htons. Someone else could wrestle with #ifdefs, shielding others by high-level, standard abstractions. Although Smalltalk had concocted platform-independence punch in 1983, it wasn’t until 1996 that Java’s virtual machine (VM) and subsequent OEM distributions made drinking the mantra of cross-platform development an easy reality.

Strategically—and selfishly—Microsoft smote that future with a sledgehammer: it moved to embrace and extend Java to achieve vendor lock-in, splintering the platform.

Developers can no longer rely on systems having a Java VM available. This implies that end-users must download (and install) two independent programs: a suitable VM and a Java archive. It also means that developers now have choices ahead of them that were once bygone worries. Choices that burden end-users and developers alike. Asking people to download a VM for their operating system and CPU architecture is a barrier to product adoption. What’s worse is that some VMs now support “full” Java while others don’t support JavaFX modules at all.

We’ll address that last point later.

In late 2019, Kevin Rushforth, of Oracle’s Java Team, presented a solution to the packaging problem: jpackage and jlink. During the presentation he listed some of the tooling’s shortcomings, which include:

Let’s not mince words: Java developers could once build applications on their preferred operating system and deploy anywhere; now, they must build installers for every individual platform they intend to target on those very systems.

Was that the punch-line to a two-decade lead up?

Requiring developers to have at least two commercial operating systems (Windows, MacOS X), even if emulated inside of a virtualized container—as opposed to using physical hardware—for a platform-independent programming language is an ironic barrier to entry. Especially for people bereft of bankroll.

Yes, those tools—alongside modules—help produce minimal executables. Who cares? What they don’t do is make it possible to create a set of native, standalone launcher binaries from a single build machine. Let’s fix that by pouring over the big splashes of how to cross-compile application launchers for Java on one build machine. We’ll use Linux because it’s free.

Install git and wget using the package manager for your Linux distro.

The installation instructions for Warp Packer are a bit buried. Install the software on a Linux system as follows (change the version number to suit):

If needed, include $HOME/bin in the PATH environment variable by adding the following line to $HOME/.bashrc:

Apply the new environment settings by opening a new terminal or source’ing the .bashrc file directly.

Copy, move, or download build-template into $HOME/bin.

The build template is installed.

Before we get into building a Java application, a little more history is warranted. Originally, the Abstract Window Toolkit (AWT) came bundled with Java, for the same reasons that having a bundled networking API was useful. The AWT lacked aesthetic, both in appearance and as a library. Swing, the AWT’s successor, made strides to address both, but fell short. JavaFX, which was also initially bundled with Java (versions 8 to 10), is a modern graphical user interface (GUI) library for developing desktop applications, as well as a superb replacement for Swing.

It has been argued that JavaFX should never have been bundled with Java. Nevertheless, the decision to un-bundle JavaFX from Java 11 onwards has led to Java projects that will be stuck with old Java versions for years to come—possibly leading to their abandonment—because it takes a lot of effort to migrate a build process to support these new, un-bundled Java Development Kits (JDKs).

Part of that effort entails re-bundling JavaFX. There are a few ways this can be accomplished:

It’s almost a Hobson’s choice because we have to create launcher binaries for each target platform anyway. Meaning bundling all of the target platform libraries into each native launcher is wasteful; however, bundling them in a single JAR file for those who have a Java VM installed already may be somewhat useful.

Java has introduced the concept of modules, looking to simplify the build process. Sometimes, though, modules cannot be included because of outdated dependencies. Problems can arise when running jlink against old dependencies. Compounding the issue is when the projects have been sundowned or have long release schedules. Nevertheless, for our purposes, we’ll want to download a version of OpenJDK that supports JavaFX.

With that background in mind, let’s go cross-compile some binaries.

We’ll create native application launchers for Scrivenvar, a JavaFX-based text editor that I’ve been developing.

Dive in by cloning the latest version as follows:

Let’s review the scripts that help build the application, which include:

Separating the installer script’s responsibilities from build.gradle is not necessary, technically. When running third-party executables (e.g., warp-packer), my first inclination is to use a shell script, rather than gradle’s exec.

The installer script invokes gradle when requested.

Open up build.gradle to review a few pertinent code blocks.

The first snippet determines what native JavaFX libraries (i.e., target platform code) to include within the JAR file:

Unless instructed otherwise, the build script will create a JAR file that includes JavaFX binaries for Windows, Linux, and MacOS embedded. We can target a specific platform by using the -P command line option when building, such as:

There’s a catch here in that win and windows are different names. The installer script needs to use windows because that’s part of the JDK file name being downloaded. Arguably, we could move that logic into the installer script, but the point is that the JDK filename and JavaFX refer to Windows using different terminology. The difference must be captured somwhere.

The second snippet tells the build system to include JavaFX for a given set of operating systems, as follows:

The application uses JavaFX controls, graphics, fxml, and notice that it also lists a JavaFX-Swing integration. Using .each is a tidy way of not having to maintain a list of JavaFX-specific imports for each operating system, should either or both need to change.

Of lesser importance are exclude groups:

Without excluding JavaFX from certain JavaFX-related dependencies, the build will fail. Unfortunately, the build fails in such a way that the developer must investigate what package caused the conflict. Ideally, the build failure would pinpoint any collisions for the developer.

The last point of note are the following lines:

These lines address permissions issues encountered when running the application using gradle, such as:

Now that we understand how this build script works, let’s move on to the installer shell script.

Looking at the big picture, the installer script performs the following steps to create a native launcher binary:

These high-level steps can be found in the execute() function.

Let’s take a closer look at how the script works.

The build-template script is described in depth in the first three parts of my Typesetting Markdown series. We reuse the script here because it simplifies writing user-friendly shell scripts.

Downloading and extracting a requisite JDK is pivotal. JDKs can be downloaded from a few places, but most of them have unworkable drawbacks. Here are my findings:

BellSoft, and the other OpenJDK suppliers, could be improved by offering zip archives for all platforms. We’ll see why in a moment.

The utile_extract_jre function generates a download URL for a particular target platform based on a number of parameters:

Had all the archives been offered in zip format, we wouldn’t need to capture this difference as ${ARCHIVE_EXT} anywhere. Computers abhor exceptions. The more general you can make systems, the less work it is to automate, and less arduous to maintain. There’s this prevalent assumption that Windows systems use zip files and Unix systems use tar.*z files. It’s strange because unzip has been available for Unix systems since 1989 (with updates into 2009). Yes, tar.*z files compress smaller. So what? The difference in size is negligible. Mini-rant over. Forest and trees, forest and trees.

The script downloads the JDK into /tmp with a simplified name based on the Java version, target platform, and architecture. On subsequent builds, if that archive exists, it is re-used rather than re-downloaded.

For the native binary bundle to work, it needs to know how to launch the application. Using Java, this often looks something like:

With a native wrapper, it’s conceptually no different, but in practice we need to take into consideration:

These differences are captured in the following functions:

The ARG_JRE_OS variable value, set in utile_configure_target(), determines what type of launch script is created.

After the JAR file, launch script (e.g., run.sh or run.bat), and platform-specific JDK version are created inside the distribution directory, we can compile a native wrapper.

Before doing so, another subtle difference must be captured. The Warp Packer uses x64 to indicate a 64-bit binary whereas the download filename uses amd64. Having resolved that last issue, the packer is called as follows:

You may wish to remove the > /dev/null if you want to see the error messages. For the adventurous, you could redirect to a log file and display its contents depending on the exit value returned from Warp Packer.

The ${APP_NAME} is derived from a Java property file so that the application name can be changed from a single point in the code base. Migrating the install script into the build.gradle script would simplify determining the application name.

All this machinery allows creation of platform-specific binaries quite simply:

Both invocations create standalone binary executables, with no installation required by application users: just download and run. The first generates an exe for Windows; the second a bin file for Linux platforms (only tested on one distro, buyer beware). MacOS remains an exercise for the reader.

The largest waves for building installation-free native binary application launchers for JavaFX have receded. To me, this approach keeps Java’s original tagline in mind, while eyeballing future continuous build processes with respect to desktop applications: write once, run anywhere (yes, or test everywhere).

In this post we covered:

Returning to the theme of history, the remainder of this post discusses how this blog post came into being.

I love writing. Having to remember character names, monikers, physical attributes, story locations, event timelines, day names from dates, and so on is a chore. Character sheets come in a variety of forms: spreadsheets, notebooks, web sites, or even software. I started making a spreadsheet for a hard sci-fi novel when it dawned on me that I’m a software developer; I decided to use a YAML document instead.

There didn’t seem to be a cross-platform application out there that allowed users to open a hierarchically structured data definition document alongside the text being authored. Moreover, once a hierarchy is in place, have the ability to interpolate those definitions before embedding into the document.

Given that Java is my first language (followed closely by English), led me to seek out a bare-bones Java-based Markdown editor that I could extend with a panel for editing definitions. That is, provide a way to edit and inject document variables easily. One editor stood out: Markdown Writer FX.

Turns out, many such text editors (of Markdown, AsciiDoc, etc.) rehash the same formula, depicted as the topmost box (labelled “Today”) in the following diagram:

A little more up-front effort, a more versatile editor is within reach: the red, bottommost box. In object-oriented terms, the bottom box represents the chain-of-responsibility design pattern. One processor receives a document, performs some transformation upon it, then passes the new version down the line until the final form is generated: an HTML document.

Markdown Writer FX has the following main components: RichTextFX, WebView, and Flowless. The Markdown editor is provided by RichTextFX, the HTML preview is rendered by WebView, and the scrollbars are provided by Flowless. Specifically, the VirtualizedScrollPane handles scrolling the WebView. There are a few drawbacks to this approach.

First, WebView is pretty much a complete web browser, adorned with CSS3 parsing and JavaScript execution. Markdown documents typically transform into rudimentary HTML documents that don’t need the full force of CSS3, nor any JavaScript.

Second, and rather brutal, the VirtualizedScrollPane doesn’t provide a simple API to get a handle to its scrollbars. This turned into a thorny problem when synchronizing the text editor and the preview panel scrollbars. Adding such a feature to that class may not be forthcoming because the maintainer has moved on.

Without a reference to VirtualizedScrollPane’s scrollbar, synchronizing the editor and preview panes seemed intractible. Without Flowless, the WebView component would no longer be usable. No great loss, though, because WebView is like drinking from an aquarium when sipping from a cup would do.

Replacing a web browser with an HTML viewer isn’t trivial. Ultimately, WebView was replaced with the following components:

The dependency on Apache Batik made the build process incompatible with jlink. Removing the dependency would mean that vector graphics no longer appear. Since the hard sci-fi novel uses vector graphics, I didn’t want to introduce an external step to first rasterize the images.

Besides jlink not being an option, I don’t have a Mac, don’t want one, and would rather not use MacOS X—much less purchase it. That goes double for AIX. Still, it would be nice to have the possibility of cross-compiling standalone binaries for MacOS X, AIX, and other platforms. Thanks to Warp Packer, this can be achieved.

A few early beta testers mentioned that adoption rates may be higher if there was a standalone binary that people could try. This blog post, having originated with my desire to use interpolated strings while writing, has culminated in the following application binaries:

Please add any issues you encounter to the issue tracker.

Email me your suggestions, corrections, or thoughts on this topic.

My career has spanned tele- and radio communications, enterprise-level e-commerce solutions, finance, transportation, modernization projects in both health and education, and much more.

Delighted to discuss opportunities to work with revolutionary companies combatting climate change.

(read more)
1
2
3
4
5