Shared posts

14 Jun 01:06

Why I don't like SemVer anymore

by Brett Cannon

Back in 2017 I wrote a blog post on how I manage version numbers. In that post I mentioned how I tried to follow semantic versioning. Over the subsequent 3 years I have come to the conclusion I actually don't like SemVer for my projects. It turns out I am not the only person to hold this opinion; Donald, Hynek and Bernat seem to agree with the general sentiment.

"But why don't you like it?"

Here's a thought experiment: you need to add a new warning to your Python package that tries to follow SemVer. Would that single change cause you to increase the major, minor, or micro version number? You might think a micro number bump since it isn't a new feature or breaking anything. You might think it's a minor version bump because it isn't exactly a bugfix. And you might think it's a major version bump because if you ran your Python code with -W error you suddenly introduced a new exception which could break people's code. I did a poll on Twitter and there was no consensus as to what the right answer was.

To me that speaks volumes to why SemVer does not inherently work: someone's bugfix may be someone else's breaking change. Because in Python we can't statically define what an API change is there will always be a disagreement between you and your dependencies as to what a "feature" or "bugfix" truly is.

Exceptions are especially a tricky case. They don't outwardly change an API, but they certainly can break code if a user was being careful about what exceptions they were catching (this is why Java makes exceptions part of the declared API). And this isn't a hypothetical issue, either: Python's CI broke once because a project we relied on introduced a new warning in a bugfix release and we run most code with -X dev or -W error to make sure we don't ship stale warnings out with Python itself. Since we pinned to minor/feature version only, CI pulled the latest bugfix, and 💥, CI suddenly started failing for everyone.

And even if you were very diligent/broad with your interpretation to avoid accidentally breaking people with a bugfix release, bugs can still happen in a bugfix release. Just today a popular project accidentally did a micro release with a bug in it that broke a bunch of people. It obviously wasn't intentional, but it does happen which means SemVer can't protect you from having to test your code to see if a micro version is compatible with your code.

This also applies to avoiding major version changes. There's no guarantee that a major version will actually break you, it just might break you. But as I just mentioned, micro releases can do that, too. So then why do we try to contort ourselves into fitting into SemVer and trying to rely on it when defining our acceptable dependency versions when the numbers don't really have a consistent meaning between projects, making the concept somewhat of a moot point?

Hopefully you're running CI to catch bugs in your project. But one kind of bug is not specifying your dependencies as you need to in order to keep your code from breaking and helping to smooth out this potential disagreement between you and your dependencies as to what a "bugfix" is. Now it may be frustrating when your CI turns red due to an external project (and this is why running your test suite on a cron job is a good thing; FYI GitHub Actions supports cron jobs), but you still have to check your dependencies don't break you if you don't pin to exact versions of your dependencies (which you should be doing for app; libraries/packages have to do as wide a range as possible, basically setting a floor and skipping known buggy, intermediate versions).

Version numbers are your branching strategy as a sequence of numbers

I had a bit of an epiphany while thinking on this topic: version numbers are just a mapping of a sequence of digits to our branching strategy in source control. For instance, if you are doing SemVer then your X.Y.Z version maps a branch to X.Y branch where you're doing your current feature work, an X.Y.Z+1 branch for any bugfixes, and potentially an X+1.0.0 branch where you doing some crazy new stuff. So you got your next branch, main branch, and bugfix branch. And all three of those branches are alive and receiving updates.

And for projects that have those 3 kinds of branches going, the concept of SemVer makes much more sense. But how many projects are doing that? You have to be a pretty substantial project typically to have the throughput to justify that much project overhead. And you still have the disagreement of what a "bugfix" is.

I suspect there are a lot more projects that have a single bugfix branch and a main branch which has all feature work, whether it be massively backwards-incompatible or not. In that case why carry around two version numbers? This is how you end up with ZeroVer where you major number stays 0 forever. But if you're doing that why not just drop a digit and have your version be X.Y? PEP 440 supports it, and it would more truthfully represent your branching strategy appropriately in your version number. And I bet if you did this most people would recognize what the version represents due to the lack of the third digit.

And what about projects that only have a main branch? At that point you really just have a X version number that is monotonically increasing. Once again PEP 440 supports it, so why not! It still communicates your branch strategy of there being only a single branch at any one time. Now I know this is a bit too unconventional for some people, and so this is when people reach for CalVer and set have a YYYY.X version numbering scheme. And if you are  taking an approach like pip where you make one major release a year, that makes sense! I just personally don't know if I would want to shoehorn in CalVer if I didn't stick to such an annual release cadence. I have heard some people say they still like CalVer to know how long it has been since there has been a release, but if stuff is working does that really matter?

And just as a reminder in case you're looking at all of this and thinking it's a bit too much if you needed to do a release to fix a simple spelling mistake, PEP 440 has the concept of post releases for that exact situation.

Summary

  • SemVer isn't as straightforward as it sounds; we don't all agree on what a major, minor, or micro change really is
  • Your version number represents your branching strategy, so you choose a versioning scheme that's appropriate your branching and release strategy
  • Rely on CI, potentially on a cron job, to detect when a project breaks for you instead of leaving it up to the project to try and make that call based on their interpretation of SemVer; will inevitably disagree
  • Remember to pin your dependencies in your apps if you really don't want to have to worry about a dependency breaking you unexpectedly
  • Libraries/packages should be setting a floor, and if necessary excluding known buggy versions, but otherwise don't cap the maximum version as you can't predict future compatibility

This doesn't necessarily apply to other ecosystems

All of  this advice coming from me does not necessarily apply to all other packaging ecosystems. Python's flat dependency management has its pros and cons, hence why some other ecosystems do things differently. For instance, with npm installing transient dependencies independently for your direct dependencies it makes SemVer potentially more useful, but you still have a potential disagreement between you and your dependency, so pinning is still better (and thus why npm has package-lock.json).

Some other ecosystems can also statically enforce SemVer in a more structured way. For instance, Elm's compiler can statically tell when no API changed and whether an API was added or not. That allows them to compute how to bump a version number compared to the previous version. In that instance you're just checking if a bugfix broke you rather than whether an API change will cause you issue.

14 Jun 01:06

SCP Foundation

Fiction » Hey, did you know that for the past couple of years I've been writing fiction for the SCP Foundation wiki? Here's my author page. Updates 2020-06-13 The epilogue of Five Five Five Five Five is Champions Of Nothing. The end! Thanks for reading! 2020-06-06 The final full-length chapter of Five Five Five Five Five is Tombstone. This does not fully conclude the story. There will be an epilogue in the next week or so. 2020-02-29 Five Five Five Five Five continues in Blood/Brain. 2019-12-11 Five Five Five Five Five continues in Wild Light. 2019-08-27 Five Five Five Five Five continues in Unthreaded. 2019-06-11 Five Five Five Five Five continues in Ará Orún. 2019-05-05 Since a few bits of fan art turned up, I've gone into more detail about what I think Marion Wheeler looks like. (Also Adam Wheeler.) 2019-04-11 I'm not totally sure how to go about cross-linking my SCP Foundation wiki contributions here on my own site, but the latest...
14 Jun 01:06

Twitter Favorites: [anotherglassbox] Q was where would TO's autonomous zone be. Wychwood Park is one of the weirdest little pockets in the city and it i… https://t.co/Af04S3yqwd

Dan Seljak-Byrne 🤖🚋 @anotherglassbox
Q was where would TO's autonomous zone be. Wychwood Park is one of the weirdest little pockets in the city and it i… twitter.com/i/web/status/1…
14 Jun 01:06

Twitter Favorites: [anotherglassbox] it's wild place: "But nothing compares to the mysterious rash of tire slashings that culminated in the 2008 suicide… https://t.co/o2DvKYmizF

Dan Seljak-Byrne 🤖🚋 @anotherglassbox
it's wild place: "But nothing compares to the mysterious rash of tire slashings that culminated in the 2008 suicide… twitter.com/i/web/status/1…
13 Jun 04:00

Twitter Favorites: [dylan_reid] There's a pretty easy solution to renaming Peter Street (named after the odious Peter Russell). Half of it is alrea… https://t.co/BNhdaeLyJ0

Dylan Reid @dylan_reid
There's a pretty easy solution to renaming Peter Street (named after the odious Peter Russell). Half of it is alrea… twitter.com/i/web/status/1…
13 Jun 04:00

Twitter Favorites: [fakehistoryhunt] Real history; Viking Age Excavation Could Rewrite the Story of Iceland’s Settlement https://t.co/GLEQciYWGK

Fake History Hunter @fakehistoryhunt
Real history; Viking Age Excavation Could Rewrite the Story of Iceland’s Settlement icelandreview.com/culture/viking…
13 Jun 04:00

The Libertarian History of Science Fiction

by Jordan Alexander Hill
mkalus shared this story from Quillette.

When mainstream authors like Eric Flint complain that the science fiction establishment, and its gatekeeper the Hugo Awards, has “drift[ed] away from the opinions and tastes of… mass audience[s],” prioritizing progressive messaging over plot development, the response from the Left is uniform: Science fiction is by its very nature progressive. It’s baked into the cake, they say. This is a superficially plausible claim. With its focus on the future, its embrace of the unfamiliar and other-worldly, and its openness to alternative ways of living, it is hard to see how the genre could be anything but progressive. In fact, studies indicate that interest in SF books and movies is strongly correlated with a Big Five personality trait called openness to experience, which psychologists say is highly predictive of liberal values.

But openness to experience also correlates with libertarianism and libertarian themes and ideas have exercised far greater influence than progressivism over SF since the genre’s inception. From conservatarian voices like Robert Heinlein, Larry Niven, Vernor Vinge, Poul Anderson, and F. Paul Wilson to those of a more flexible classical liberal bent like Ray Bradbury, David Brin, Charles Stross, Ken McLeod, and Terry Pratchett, libertarian-leaning authors have had an outsized, lasting influence on the field. So much so that The Encyclopedia of Science Fiction has deemed “Libertarian SF” its own stand alone “branch,” admitting that “many of libertarianism’s most influential texts have been by SF writers.”

So, is the connection between SF and the liberty movement necessary or contingent? While most science fiction novels are not libertarian, “[a]ll the best known libertarian novels,” says Jeff Riggenbach, “are science fiction novels,” from Ayn Rand’s Atlas Shrugged to Neal Stephenson’s Cryptonomicon. Even among conservatives, Stephenson himself writes, it is the “ostracized libertarian wing,” the wing “still able to hold up one end of a Socratic dialogue,” that has “disproportionately high representation among fans of speculative fiction.” Libertarians even have their own SF literature awards. Each year, the Prometheus and Prometheus Hall of Fame awards are given out by the Libertarian Futurist Society, a tradition dating back to the late 1970s. Instead of a trophy, winners are given a one-ounce gold coin “representing free trade and free minds.”

There’s also a prominent publishing house, Baen Books, that prioritizes liberty-themed SF literature. Though its authors and editors are ideologically diverse, ranging, says author Larry Correia, “from libertarian to communist,” Baen nevertheless represents an impressive cohort of staunch liberty defenders, among them Correia himself, Sarah Hoyt, and Michael Z. Williamson. Although Baen has attempted to distance itself from political affiliation, the company frequently publishes liberty-themed tracts and anthologies, including the recent Taxpayers’ Tea Party: A Manual For Reclaiming Our Country, by Sharon Cooper and Chuck Asay.

Science fiction’s libertarian roots

Although some critics trace SF’s roots all the way back to Homer’s Odyssey, Plato’s Republic, or, as Nabokov once argued, Shakespeare’s The Tempest, most scholars agree that the genre as we know it began with the publication of Mary Shelley’s Frankenstein, which many libertarians understand to be a cautionary tale about what happens when power-seeking men, under the guise of progress, devise a promethean monster (the State) that takes on an uncontrollable life of its own. Whether Shelley—whose parents were the libertarian feminist Mary Wollstonecraft and the “father of modern anarchism” William Godwin—intended this reading or not is unknown. Nevertheless, Mikayla Novak argues that the story remains a libertarian favorite for “the ways in which Mary Shelley grapples with matters of individuality, free will, and moral choices, and the place of individuals situated within broader civil society.”

Still, it is difficult to have science fiction in the modern sense until you have science in the modern sense. While the works of Shelley, Jules Verne, and H.G. Wells were successful examples of proto-SF, it was the rise of the pulps in the 1930s that finally made it possible to make a living writing consistently in the genre. Magazine SF, with its swoopy chrome ships and bubble-suited space men, grew initially out of publications like Amazing Stories, founded by Hugo Gernsback (of the eponymous Hugo Awards) in 1926. But it wasn’t until 1938, when John W. Campbell took editorial control over Astounding magazine, that the field began to properly develop its libertarian strain, a consequence of what SF historians call the “Campbellian Revolution.” Today, Campbell is still considered “the most powerful editor in the history of SF,” says Professor Michael Drout of Wheaton College. With a strident editorial hand, he ushered in the “Golden Age” of SF and shaped the work of greats like Isaac Asimov, Arthur C. Clarke, and Lester del Rey, among many others.

John W. Campbell (1910–71)

Campbell’s ideas sometimes veered into Nietzschean superman territory and he was often taken in by pseudo-scientific humbug like extrasensory perception and telepathy (a weakness exacerbated by his friendship with L. Ron Hubbard). But he was, all things considered, a cheerleader for freedom and the American way. With Campbell at the helm, a new ethos came to define the industry—a “tradition,” writes Eric S. Raymond, “of ornery and insistent individualism, veneration of the competent man, an instinctive distrust of coercive social engineering, and a rock-ribbed empiricism that valued knowing how things work.” In short, the new hard-SF emphasized a spirit of self-reliance and libertarian preparedness that saw heroic individuals, rather than government, as the key to solving humanity’s future problems.

The attitude of rugged American individualism that defined the pulps grew, in part, out of a sense of loss. By the 1930s, the last frontiers of Earth had been explored or mapped, creating a yearning for new vistas. As history closed off the real frontiers, SF created new ones. The spirit of the pulps can also be seen as a reaction against the rising tide of collectivism. Communism and fascism were sweeping through Europe and FDR’s New Deal policies were increasing the size and scope of government at home. An “intellectual elite in a far-distant capitol,” as Reagan would later put it, was promising to cure the ails of Americans and plan their lives for them.

It made sense, then, that many of the period’s big names were problem-solvers with backgrounds in science or engineering, including Campbell, who held a bachelor’s in physics from Duke, along with his protégé Robert A. Heinlein, an aeronautical engineer who would become one of the genre’s greatest talents.

Heinlein and the competent man

I have learned this about engineers. When something must be done,
engineers can find a way… turn your engineers loose.
Robert A. Heinlein, The Moon is a Harsh Mistress

Campbell’s preference for realistic, logically rigorous storytelling allowed him to “turn his engineer loose.” Under Campbell’s editorship, Heinlein and other writers introduced the reading public to a new type of protagonist, “the competent man”—a rugged, technically skilled, polymathic figure who was just as comfortable fixing his spaceship as he was defending himself with a ray-gun. In a postwar age of atomic uncertainty and space exploration, jack-of-all-trades survivalists made for excellent heroes. In his novel Time Enough for Love, Heinlein describes “the competent man” as follows:

A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyse a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects.

Robert A. Heinlein (1907–88)

The culture that Campbell and other Golden Age authors created was one of techno-optimism and a confidence that reason and human ingenuity would save the day. One of “science fiction’s central assumptions,” writes Alec Nevala-Lee in Astounding, was “that the skills that it developed in its writers and readers would prepare them for an unknown future.” SF’s faith that rational individuals can solve their own problems and plan their own lives, its belief that science and innovation can liberate humanity from the slings and arrows of an unnecessary status quo—these are qualities that set the genre at odds with both progressive and conservative ideologies. They are also the qualities that have enthralled many libertarian fans.

Thanks to writers like Heinlein, SF has produced its share of converts, too. According to Jeff Riggenbach, in a survey conducted by the Society for Individual Liberty in the 1970s, “one libertarian activist in six had been led to libertarianism by reading the novels and short stories of Robert A. Heinlein.” Dave Nolan, a founder of the Libertarian Party, was one such activist. Nolan was so influenced by Heinlein, says Brian Doherty in Radicals for Capitalism, that he wore a “Heinlein for President” button during the 1960 campaign.

Although he began his career as a utopian socialist working for Upton Sinclair’s 1934 gubernatorial campaign, Heinlein underwent a political transformation and became known for the rest of his career as a libertarian “guru” of sorts. Scott Timberg at the LA Times describes him as a “nudist with a military-hardware fetish” who “dominated the pulps… and became the first science fictionist to land on the New York Times bestseller list.” A four-time Hugo Award winner, Heinlein is credited with helping to elevate SF from its ray-blaster and tentacled space-monster phase to a more serious, respectable prominence, penning such classics as Stranger in a Strange Land and, Milton Friedman’s favorite, The Moon is a Harsh Mistress, a book that reads like an anarcho-capitalist blueprint for revolutionary uprising. Friedman even named his 1975 public policy book after the novel’s slogan TANSTAAFL (“There Ain’t No Such Thing As A Free Lunch”).

There have been attempts to downplay Heinlein’s commitment to liberty and to label him a fascist, a spurious mischaracterization of his worldview that arose after the publication of his 1959 novel, Starship Troopers, a story set in a quasi-fascistic society. But Heinlein loathed authoritarianism and resented such accusations. “[T]o call Heinlein a fascist,” argues Adam Roberts in The History of Science Fiction, “quite misrepresents his particular brand of ideological reaction. Whilst always a patriotic American, Heinlein was ideologically invested neither in racial nor geographical ideals… his books preach a libertarian gospel.” Heinlein said as much in a letter describing his outlook, writing, “As for libertarian, I’ve been one all my life, a radical one. You might use the term ‘philosophical anarchist’ or ‘autarchist’ about me, but ‘libertarian’ is easier to define and fits well enough.”

The New Wave

By the 1960s, a group of brash young writers emerged, loosely associated with Michael Moorecock’s magazine New Worlds. This group included J.G. Ballard, Samuel Delany, Brian Aldiss, and Joanna Russ, and they began to “call foul on the old guard of science fiction.” Armed with an avant-garde sensibility, the radical New Wave, inspired by the Frankfurt School and critical theory, challenged the dogmas of the Golden Age and changed the face of SF forever. At least, that’s the story critical histories of the genre now tell.

But this is a crude revisionist narrative, born of the impulse to neatly periodize literary history. The truth is less schismatic. In retrospect, says critic Damien Broderick, it is more accurate to describe the intellectual fecundity of the New Wave (a moniker borrowed from French cinema) as “a reaction against genre exhaustion.” More than anything, the movement can be seen as a bid on the part of talents like Ursula Le Guin and Thomas M. Disch to bring a much-needed thoughtfulness and literary credibility to the field. There was also an attempt to turn the genre inward, to explore “inner space”—consciousness, psychological states, and perception—rather than “outer space.”

While some New Wave writers were political leftists who wished to dismantle the genre’s Campbellian trappings, for the most part, SF’s “School of Resentment,” to use the Bloomian pejorative, was a sequestered, insular phenomenon. Instead, the proliferation of fresh voices and renewed focus on stylistic experimentation worked to lift all boats. Like Dadaism and Surrealism, the New Wave had more to do with liberation from bourgeois artistic constraints than any political agenda. The New Wave, says Adam Roberts, “called for a more passionate, subtle, ironic, and original form of SF,” but the result was that it wound up “bring[ing] together the literary sensibilities associated with High Modernism and the energies of popular pulp SF.”

The upshot was a new type of SF, entertaining and rigorous but at the same time thoughtful and stylistically sophisticated. It was the progeny of this union—in works like Stanisław Lem’s Solaris (1961), Heinlein’s Stranger in a Strange Land (1961), Frank Herbert’s Dune (1965), Philip K. Dick’s Ubik (1969), Poul Anderson’s Tau Zero (1970), and Le Guin’s The Dispossessed (1974)—that would define SF of the 1960s and ’70s and go on to become enduring classics.

The heady, rebellious atmosphere of this period produced some of the best libertarian SF ever written: In Vonnegut’s “Harrison Bergeron” (1961), one man fights back against a dystopian regime that enforces rigid equality of outcome through “handicaps” that stifle excellence. In Eric Frank Russell’s The Great Explosion (1962), militarists from Earth visit an isolated colony and meet a peaceful libertarian society whose people call themselves “Gands” (after Gandhi). In Poul Anderson’s No Truce with Kings (1963), aliens come to a post-apocalyptic Earth to “help” the backwards natives resolve their feuds, but the mission goes awry.

In Heinlein’s The Moon is a Harsh Mistress (1966), a lunar colony rebels against Earth’s oppressive control in a struggle for independence mirroring the American Revolution. In Jack Vance’s Emphyrio (1969), the people of Halma, inspired by a legendary hero, lead a revolt against the planet’s overlords who have outlawed free trade. In Ira Levin’s This Perfect Day (1970), every aspect of life is planned by a world government run by a central computer called “Uni”—that is, until a group rises up. In Shea and Wilson’s The Illuminatus! Trilogy (1975), readers meet libertarian characters as they are drawn into a surreal, hallucinatory web of conspiracy theories related to the global Illuminati and its control of world governments. Other favorites from the era include Niven and Pournelle’s Lucifer’s Hammer (1977) and F. Paul Wilson’s Wheels Within Wheels (1978).

Golden age redux

By the early 1980s, writers like Kingsley Amis were declaring the New Wave “officially over” and celebrating a Golden Age revival. It is more accurate to say, though, as Adam Roberts does, that “the Golden Age never went away.” Campbellian-era writers like Heinlein, Clarke, and Asimov—“the big three,” as they became known—captured numerous Hugo and Nebula awards throughout the 1960s and ’70s, and their works flew off bookstore shelves well into the 1980s and ’90s. Alongside these pulp-era pros, a generation of worthy inheritors was assuming the mantle. It was this new talent, together with the success of the Star Wars franchise, that would create a new thirst for hard-SF adventure stories and a boom in commercial SF publishing.

But the Campbellian renaissance was different this time around. A more overt, principled libertarian strain was emerging in prolific writers like Vernor Vinge, Larry Niven, Gregory Benford (longtime contributing editor for Reason magazine), Victor Milán, F. Paul Wilson, and L. Neil Smith. The works of Ayn Rand, which frequently drifted into the realm of SF and inspired a “wave toward deregulation” in the 1980s, had never been more popular. The Libertarian Party had grown rapidly since its founding in 1971 and had achieved ballot access in all 50 states by 1980. The economists Friedrich Hayek and Milton Friedman had recently won Nobel prizes. The liberty movement was thriving.

That the SF of this period often advanced a conservative view of liberty had to do with the political zeitgeist of the time, the ascendancy of Ronald Reagan’s Big Defense, Limited Government ethos in the US and Margaret Thatcher’s free market conservatism in the UK. It was, however, Reagan’s reputation as a Cold Warrior and his enthusiasm for the Strategic Defense Initiative (“Star Wars,” as critics mockingly called it) that captured the imaginations of right-leaning libertarian authors. The idea behind SDI, to install a network of orbiting battle-stations that could serve as a nuclear deterrent and shoot down intercontinental ballistic missiles (ICBMs) using lasers, was like something out of a space opera novel.

“[A] huge fan of The Day the Earth Stood Still and its anti-nuclear war rhetoric,” writes Kevin Bankston, Reagan “grew up devouring fantastic sci-fi tales like Edgar Rice Burroughs’s John Carter of Mars stories.” It was not surprising, then, that Reagan’s Citizen Advisory Council on National Space Policy was made up of some of the greatest SF talent of the 20th century. In addition to astronauts, scientists, engineers, and Reagan’s adviser Lt. General Daniel O. Graham, the council included authors Larry Niven, Jerry Pournelle, Jim Baen (of Baen Books), Robert Heinlein, and Poul Anderson. According to Pournelle, Reagan’s 1983 speech announcing SDI to the public was based on the technical plans, arguments, and phrases the council had drawn up for the president.

Citizen’s Advisory Council on National Space Policy members Jerry Pournelle (left) and Larry Niven.

The free-market energy of the 1980s and collapse of the Soviet Union in the ’90s reinstated a shared consensus regarding the value of freedom and limited government. Yet it would be a mistake to see libertarian SF as an intellectual monoculture. Then and now, the sub-genre has been a spectrum. “At one extreme,” writes Eric S. Raymond, you have fiction such as “that of L. Neil Smith,” which reads like “radical libertarian propaganda. At the other extreme,” you have “what could fairly be described as conservative/militarist power fantasies… in the writing of Jerry Pournelle and David Drake.” The finest work, like that of Heinlein, tends to fall somewhere in the wide, heterodox middle.

The necessary connection

It is 2020, and though socialism is again in vogue—44 percent of millennials say they would prefer to live in a socialist country—libertarian SF is showing no signs of waning. The connection between SF and liberty is not simply an accidental byproduct of the colorful history of SF publishing, but a necessary one tied to certain fundamentals of the genre. The soil of speculative fiction, in other words, has the right nutrients for the flourishing of libertarian values. But what are they? Unlike most ideologies that advocate forms of protectionism and luddite restrictionism, the libertarian outlook values choice, freedom, and market solutions. Libertarians, writes Ilya Somin for the Prometheus Newsletter, “are more likely to welcome such technological advances as genetic engineering, cloning, and nuclear power… the genre as a whole also tends towards technological optimism.”

Another element, certainly, is a general openness to radical new ideas and an instinctive rejection of stale convention and custom. This trait unites libertarians and progressives against Burkean conservatives. Openness to novelty and diversity enables SF writers to speculate (hence the name “speculative fiction”) and go where other writers, bound by earthly limitations, cannot. SF, writes Pittsburgh University professor Elisa Beshero-Bondar, “is the genre that considers what strange new beings we might become, what mechanical forms we might invent for our bodies, what networks and systems might nourish or tap our life energies, and what machine shells might contain our souls.”

At the same time, SF stands firm against the collectivist notions of both progressives and “common good” conservatives. “The individual is foolish,” wrote Edmund Burke, “but the species is wise.” In SF, the inverse is true. The species or collective is often coercive, irrational, and destructive. In The Moon Is a Harsh Mistress, Heinlein offers us a warning about left and right collectivism delivered by the character of Professor de la Paz, a “rational anarchist” who urges: “Distrust the obvious, suspect the traditional, for in the past mankind has not done well when saddling itself with governments… do not let the past be a straitjacket!”

Perhaps this is why so much of SF expresses itself as dystopian fiction, a genre which, by its very nature, cannot but take on a libertarian flavor. Totalitarianism, war, and wide-scale oppression is almost always carried out by state force. Liberation, accordingly, must come in the form of negative rights—that is, “freedom from”—and voluntarism: “[I]n writing your constitution,” Professor de la Paz instructs, “let me invite attention to the wonderful virtues of the negative! Accentuate the negative! Let your document be studded with things the government is forever forbidden to do.”

There are some exceptions. In cyberpunk novels, like Stephenson’s Snow Crash or M.T. Anderson’s Feed, dystopian misery is often a result of corporate control or not enough government. But even these works make libertarian arguments. In the case of Snow Crash, the minimal state fails to carry out its only moral duty from a Lockean perspective—to protect citizens’ natural rights. In Feed, corporations run every aspect of life, thanks to cronyism, corruption, and regulatory capture, all libertarian bugaboos.

Which brings us to a final reason that libertarian authors choose to express their ideas through a science fictional lens. While dystopias satirize and allegorize the flawed political systems and social practices that govern the world we know, SF is more often about exploring new worlds and systems. Contrary to “traditional literary fiction, which is mostly set in the present-day world or in the historical past,” writes Somin, “science fiction… makes it easier for authors to explore ideologies [like libertarianism] that differ radically from those dominant in the real world”—ideologies that, unlike socialism, have truly never been tried.

 

Jordan Alexander Hill lives in Massachusetts where he works as a high school English and philosophy teacher. He is the host of the Western Canon Podcast and has written about campus politics for Heterodox Academy and Minding the Campus. You can follow him on Twitter @WesternCanonPod.

The post The Libertarian History of Science Fiction appeared first on Quillette.

13 Jun 03:56

The Mockup

by Richard Millington

A simple rule; make your mockups of the community really good.

If you’re trying to get support from your boss, colleagues, or people you want to participate in the community, putting together a shoddy wireframe and adding the disclaimer ‘this is just a mockup, the real thing will be a lot better!’ isn’t going to cut it.

The mockup is the only thing that people can see.

They can’t visualise what lies beyond that.

If it looks bad, they will only see it as bad.

This means you either need to hire a designer, head on over to 99 designs and get some help, or invest the time to learn a tool like Figma.

Whether you’re trying to get support, help people to understand what the community is, or simply solicit feedback – begin with something that looks good. Trust me.

13 Jun 03:56

Brexit Britain risks heading to international pariahdom

by Chris Grey
The irritation in Michel Barnier’s press statement at the end of last week’s negotiations was palpable. “Things cannot go on like this”, he despairingly warned, and his particular concern was the UK “backtracking on the Political Declaration”. It was a strong indication that any remaining trust in the negotiations has all but disappeared, and that hasn’t just happened in the last few weeks. Rather, it has been in the making for years.

If not earlier, it perhaps began when the Brexiters, including Boris Johnson, denied the legitimacy of any financial settlement – something I will come back to. It became entrenched when David Davis and Theresa May immediately disowned the backstop they had agreed to end of the phase 1 of the Article 50 negotiations in December 2017. Many other examples could be given.

Distrust is now endemic

Under Johnson’s premiership that lack of trust has become endemic. That’s partly because EU leaders recall the long years of lies he told whilst a Telegraph columnist, and have disdain for his role in the Referendum. It’s not difficult to imagine that he is one of those whom Donald Tusk was referring to as warranting a “special place in hell” for having advocated Brexit with no plan. But it is more because of the way in which, since coming to power, Johnson has seemed to resile from what he agreed, especially as regards Northern Ireland.

In a post last month, following the Frost letter, I lamented that the bitter truth is that the UK can no longer be trusted. Yet the Brexit ‘patriots’ feel no shame and, worse, no realism. Their response to Barnier’s press statement was to crow that he was ‘rattled’ by Britain’s ‘tough stance’ – yet apparently not so cowed as to stop him being ‘rude’ and ‘insulting’! The more ‘cerebral’ and, indeed, the official response was to point out, echoing Davis’ comments about the phase 1 agreement, that the Political Declaration (PD) is not legally binding.

The Political Declaration isn’t irrelevant

That is perfectly true, but it is a very long and dangerous jump from that to treating it as totally irrelevant. It was signed by Boris Johnson as a commitment of ‘good faith’ to the agreed framework for the future. As Simon Usherwood, Professor of Politics at Surrey University, points out reneging on it has damaging reputational consequences. It’s not just dishonest but, perhaps worse, naïve, for Johnson to treat as if it were one of his throwaway newspaper columns. You simply can’t conduct international relations that way and expect it just to be laughed off, or forgiven and forgotten, by other countries.

It’s clearly the case that, as a framework, it does not address the detailed provisions of the future agreement. Equally clearly, within negotiation there will legitimately be ‘maximalist’ and ‘minimalist’ interpretations of how to operationalize the framework. But that is not at all the same as simply treating it as totally irrelevant (as, indeed, Brexiters used to realise).

For example, on one of the key areas of contention referred to by Barnier, Level Playing Field (LPF) provisions, paragraph 77 of the PD is very explicit about how economic interdependence and geographical proximity mean there must be robust commitments on state aid, competition law and so on. So, yes, there is legitimate negotiation space around what ‘robust’ means in practical terms, but it is simply dishonest for Brexiters, including Johnson, to pretend that these issues have been newly introduced by the EU (£)*. If Johnson objected, the time to do so was before signing the document off.

Ominous signs

But more ominous than the ongoing disavowal of the PD was a report in the Brexiters’ house journal, The Express, that the government regards the Withdrawal Agreement (WA) as having “unfair defects” that must be remedied. That marks a significant escalation because it is not based on any claim that it is legally non-binding: there is no dispute that the WA was signed as a legally binding international treaty. Reneging on it would go beyond reputational damage.

The justification for this stance is telling. On the one hand, the report refers to an unnamed ‘government source’ (does that mean Dominic Cummings?) as linking the ‘defects’ to what was agreed by Theresa May and Olly Robbins, and the constraints of the May parliament. This reflects something which has been swirling around Brexiter circles for months now – a sense that, despite Johnson signing it, it was in some way not legitimate because of those antecedents including what they regard as a ‘remainer’ parliament. It is dangerous nonsense for whilst, as they are wont to say, no parliament can bind its successor, that does not mean that international treaties negotiated during one parliament become irrelevant afterwards. International relations would scarcely be possible if that were so. And, in any case, it’s an absurdity as Johnson didn’t sign the WA and PD until January 2020 - after the election. He owns them.

This relates to the other aspect of the supposed justification for re-opening the WA, namely that the government did not have time to deal with all the “defects” of May’s deal, just to replace the Northern Ireland backstop. But not only is the government now resiling from the frontstop that replaced it, it was the government that insisted – against much warning – that the whole thing had to be rushed through with scarcely any scrutiny to meet the deadline of 31 January. Moreover, we now know – courtesy of Steve Baker – that the ERG hardliners were persuaded by Dominic Cummings to support the WA, without needing to read it, on the basis that Michael Gove said it could be changed later.

As with Brexit in general, the easiest way to understand the outrageousness of this is to think about it the other way round, and imagine how the UK, and Brexiters especially, would react if the EU said that with Juncker, Tusk et al now gone, the EU no longer felt bound by the WA and PD. Or if the states and MEPs who had voted to ratify the WA now said that they had done so without bothering to read it as they had been told it could all be re-written afterwards. The shrieks of anger would be deafening, and the opprobrium heaped on the EU vitriolic.

The deal formerly known as ‘oven-ready’

Of course it’s not just the trust of the EU which is being betrayed by this deepening farrago of lies. It’s also the British electorate. For don’t forget that this near-discarded PD and this ‘defective’ WA used to go under a very different name: together, they were the “oven-ready deal” that Johnson promised would “get Brexit done” during the 2019 General Election campaign. This was “the great new deal”, not in any way to be confused with May’s despised efforts. In vain did I and countless others warn that it would just be the beginning of a new process of negotiation. Still, at least it might have been assumed that those negotiations would go forward on the basis of the WA and PD, not backwards to try to re-write them.

Such an assumption was always going to be naïve, though. And this goes to the heart of why the EU is right to distrust Johnson. Again and again as Prime Minister (never mind about beforehand) he has shown not just dishonesty but a palpable scorn for law and the normal political process. The doyen of law and policy commentators, David Allen Green, who invariably uses words with great precision, last year wrote of Johnson “going rogue” (£) over the question of whether he would obey the law requiring him to seek an extension to the Article 50 period. It was, Green said, “unprecedented” for a Prime Minister even to be contemplating not doing so. This was also in the context of the illegal prorogation of parliament and these and other examples provide ample evidence of the subfusc authoritarianism that Johnson’s jokey persona increasingly fails to cloak. No doubt it is echoed, amplified, and incited by Cummings’ infamous contempt for ‘playing by the rules’.

This makes Johnson a difficult character for the EU to deal with, but that character is only one manifestation of the problem. As noted above, the UK government’s behaviour since Brexit has been repeatedly untrustworthy, even under the leadership of May, whose character was very different. The underlying issue is neither of them, but the now near comprehensive ‘ERG-ification’ of the Tory Party and, hence, government. Perhaps because the old familiar trappings of the political spectacle persist, it’s easy to miss how hollowed-out Britain’s political institutions have become during these Brexit years.

Government by cult

Indeed, the EU’s bewilderment – like that of many commentators including, at times, myself – stems from a failure to appreciate quite how far and deep that process has gone. The ERG is rather like the Terminator which “can’t be bargained with, it can’t be reasoned with, it doesn’t feel pity or remorse or fear and it absolutely will not stop ever …”. So the hope that, at some point, rationality will assert itself – for example over the damage of no deal or extending the transition period – keeps being dashed. Similarly, the idea that some ‘compromise’ from the EU would unlock things, even if such compromise was possible, is flawed. Really, one could imagine that if the EU conceded on every single UK demand the Brexit Ultras would still denounce it as insultingly inadequate.

We’ve arrived here step by step because every demand made by the Ultras has been conceded – the Referendum, then the row about the question to be asked, then the franchise. And each demand met has led to a still harder one, from ‘we just want to be like Norway’ right up to the point that we are just about at which is that any deal and any form of relationship with the EU is intolerable. That’s totally unrealistic, of course, since the EU will still be there (although the hardcore of the Ultras always believes it will collapse) but realism isn’t part of the story here. Indeed, realistically, it’s far more likely that Brexit will lead to the break up of the United Kingdom.

That an entire government should be in hock to an effectively nihilistic cult is partly to do with the internal history of the modern Conservative Party, the ruthlessness of the ERG, and their parliamentary numbers which are enough to pose a threat even when the government has a large majority. But it requires that those who are far from membership of the cult – and, still, there are plenty of Tory MPs in that category – for one reason or another go along with it. At the present moment, that means buying into the narrative that all that is happening is a tough negotiating stance which will yield an eleventh hour ‘blink’ from the EU and, for this reason, no transition extension should be sought.

Beyond that, it requires a much larger number of people within the electorate to accept the situation – either being themselves cultists, or buying in to the strategy as described or, and here the numbers are probably very large, thinking that it is all a lot of noise and that in the end ‘they’ (whoever that might be) will ‘sort things out’. There is much danger in that. It rests upon the complacent assumption that ‘things are bound to go on much as always’. Yet few realise the complex web of systems and regulations that create what they take for granted, and they may very well not forgive the ‘disruptors’ for ripping those systems up.

The idea floating around that any damage from there being no trade deal will be ascribed to the wider coronavirus crisis is unlikely to be correct when specific consequences – food shortages being the most obvious, but Bloomberg have compiled an extensive and alarming list – kick in overnight, making causation very obvious. If anything, coming on top of all the pain of coronavirus, public tolerance is likely to be less forthcoming, and much of the disruption will occur even with a trade deal.

So far, with the exception of the immediate sharp fall in sterling after the Referendum, Brexiters have been able to provide alibis for the damaging effects of Brexit (what one might call the ‘diesel decoy’). I’m not sure that will be so as people begin to experience what Tom Hayes calls ‘the Brexit of small things’, the things that affect their daily lives. On the other hand, that currency collapse of 2016, which would in any other context have led to a political crisis, was almost shrugged off - so who knows?

The road to pariahdom

But even if the government ride out the domestic economic and political consequences of no deal, the damage to Britain’s international reputation will be substantial. That will matter in relation to the EU and also in relation to other countries, who will see Britain as untrustworthy and irrational but also as desperate to do trade deals on any terms it is given.

For example, it’s already the case that Japan regards Brexit as a betrayal of the trust upon which basis its companies invested so heavily in the UK, and already the case that it is set to make tough demands in trade talks, which have just begun. Their outcome, says Michito Tsuruoka of Keio University writing in the Japan Times, is crucially bound up with the progress and outcome of the UK-EU talks. Indeed, he says, “no country wants to conclude a definitive trade deal with the UK without knowing the final shape of the EU-UK partnership”.

More generally, writing about the ‘original’ no deal scenario, Dr Nicholas Westcott of SOAS argued starkly that it would be “a heavy international defeat for Britain … we would have proven unable to negotiate – with our nearest friends – a deal that protected our economic interests. And the world will see this. They – the US, China, India, Russia, the Gulf States, African and Latin American countries, Spain, Mauritius, Argentina - all will say to themselves that Britain is now weak, it needs our support, and we can ask for whatever we want”. In short, no deal with the EU has a much wider import: it, or any other outcome of the negotiations, will directly impact upon the UK’s global standing and upon global relationships as well as those with our nearest neighbours.

And the thing about no deal is that that won’t be an end to the matter. That’s not simply because – as Tom Hayes, again, points out and as I did , in a different way, last week – all the unresolved issues will still be in need of resolution. It’s also because of the implications of the analysis of the ERG, above. For if it is correct that whatever they get they always want more, then what ‘more’ would they ask for having achieved the no trade deal scenario that many of them advocate?

The answer to that is already clear, even before it has happened, in what is already being said about the defects in the WA. That claim will intensify, because the Ultras have never accepted the idea of a financial settlement being made in the absence of a trade deal, and have always argued that any such settlement should be contingent upon a trade deal. Indeed Johnson, during his leadership campaign, threatened just that, whether in order to pander them or from conviction hardly matters.

So if there is no trade deal come next January they will unquestionably try to force the government to break the WA by reneging on the financial settlement and, very likely, as the signs are already there, the Northern Ireland Protocol, with all that will mean for relations with both Ireland and the US, though probably not, I think and hope, the Citizens’ Rights agreement. We will then be well beyond the current damage to trust and reputation, and headed down the road to pariahdom. We’re not quite on that road yet, but we’ve had glimpses recently of the signposts to it and if, as seems increasingly likely, there is no deal it’s the one the Ultras will be urging us down.

If so, it’s worth recalling that they haven’t, so far, failed to get their own way.



*Actually, on social media at least, it is more common to see Brexiters claim that the EU has reneged not so much on the PD but on the Barnier staircase. On this account, that staircase promised a Canada deal, denoted by the Canadian flag. However, apart from the ludicrousness of regarding a signed agreement as non-binding but a PowerPoint slide as a promise, and as a promise of a deal on the same terms as Canada (when more stringent LPF conditions had been set in more formal documents), it is a misreading of that slide. What actually appears are the Canadian and South Korean flags – an indication of the general category of such a deal (FTA) and also of the fact that within that category there are different variants: not all FTAs are the same.

13 Jun 03:56

Jabra Evolve2 85 :: First sighting

by Volker Weber

EaSyhHEWAAA8wB2.jpg

Frank already has what I have been waiting for since late April, the Jabra Evolve2 85 noise cancelling headset with foldout microphone boom. Sweet. And ex-pen-sive.

13 Jun 03:56

From the other side of the bridge

There’s a story about William Gibson’s jacket. In his book Pattern Recognition he confabulates a jacket for the protagonist, Cayce, in a colourway that never existed.

The manufacturer, getting requests from fans for this fictional jacket, approaches Gibson, and together they create the jacket for real. Gibson himself has a custom version. Here’s his telling from 2005:

I received a very puzzled letter from the folks at Buzz Rickson’s, who had been getting requests for black MA-1’s. Once I had explained what was happening, they amazed and delighted me by asking my permission to make a repro of *Cayce’s* jacket, to market as their Pattern Recognition model. Yes indeed, I said, and while you’re at it, cut me one with an extra four inches in the back, please. Which they did, and it’s over the back of a chair nearby as I write this. I love this jacket. It reminds me of the title of a Surrealist sculpture, “An Object From The Other Side Of The Bridge”. It’s real, but it emerged from a work of fiction.

– William Gibson, blog post, December 2005

So I’d forgotten this story. Then read it again this week in Pfeil Magazine 12 which I received as part of my Stack magazines subscription (I’ve signed up to get a different magazine each month, their choice).

That piece in the magazine (for completeness here’s a pic) also used that phrase an object from the other side of the bridge

and

it totally

ate my brain.


What I hadn’t realised, before looking up Gibson’s telling of the story, is that the phrase is taken from the name of a sculpture. Which I would now like to see.

Here’s the sculpture: De l’autre côté du pont, “From the Other Side of the Bridge,” Yves Tanguy, 1936.


Now, I’ve written before about fiction and inner and outer realities but this feels… different, somehow? More ouroboros. More like magick: speaking as a way of forming the universe.

A crossing between the fictional realm and our world! I mean, an invention in fiction is also an invention in our world, of course.

But there’s something special, here, about the way the object can only be reached via first constructing the ENTIRE FICTIVE UNIVERSE, thus writing it into being, and that process has to be conducted from our side of course; like projecting a hologram from a laser-engraved lens, but once inscribed you can step into the hologram and – grab it.

Like searching for a particular item in a dream, and waking with it in your hands.

Both the molecular structure of benzene and the molecular structure of DNA were brought back from dreams.

13 Jun 03:53

TransLink: The Light of Progress in Dark Times

by Gordon Price

One of the so-sad consequences of the pandemic is the loss of momentum immediately experienced by TransLink.  And not just with the reverse of the quite stunning increase in passengers. (Said CEO Kevin Desmand in September of 2019: ““If this trend continues … then over the four-year period from 2016 to 2019, we would have seen a 20% growth in overall ridership. It is pretty astonishing.”)

By March, an 80 percent drop.

But it’s not just in ridership where the momentum has been lost.  TransLink was in the process of delivering on its 10-year Plan, with significant increases in rolling stock, frequency, new routes and upgrades in its facilities. (Like this PT report on Joyce-Collingwood Station.)  Much is still going ahead, like the rolling out of the Rapidbus routes. But, on the North Shore, the R2 line literally started just as we all went into lock-down.  I took it shortly after it started – one of only two passengers for a good part of the trip (right).

Progress continues.  And one of the places where changes will be the most welcome is one of the most dismal transit exchanges in the system.  Dark, dank and polluted from diesel, it sits under the ICBC headquarters adjacent to Seabus at Lonsdale Quay.  Convenient but unpleasant.

Well, that’s changing – as these pictures from CNV Councillor Tony Valente reveal:

 

As Daily Scot would point out – a lot of grey.  But alleviated by LED lighting overhead:

Tony tells us that there’s more to come.  All it will need is a lot more passengers.

 

 

 

 

 

13 Jun 03:53

“Tell me forty-two thousand people haven’t watc...

by Ton Zijlstra

“Tell me forty-two thousand people haven’t watched this shit!” “Yep.” Veneza goes back to the search results and points out other horrifically large numbers. “That was one of their higher-count vids, but still. And, like, there’s a whole industry of dudes like this. The more inflammatory they are, the more people watch them, and the more money they make.” “White dude whining as a growth industry,”

White dude whining as a growth industry,

(from The City We Became, by N.K. Jemisin)

13 Jun 03:52

Wil Shipley on the State of the App Store

Wil Shipley on the App Store:

We have all been asking for years now for these changes. I've filled out three or four of these surveys before. I know Phil specifically says he doesn't want to hear about upgrade pricing anymore, but Phil also is working for the world's richest company, which sells hardware and gives software away.

I also recently filled out this survey and I wish I had been as thoughtful in my responses as Wil is in his. It probably won't surprise you to know that I agree with everything he mentions.

13 Jun 03:52

This Week in Glean: Project FOG Update, end of H12020

by chuttenc

(“This Week in Glean” is a series of blog posts that the Glean Team at Mozilla is using to try to communicate better about our work. They could be release notes, documentation, hopes, dreams, or whatever: so long as it is inspired by Glean. You can find an index of all TWiG posts online.)

It’s been a while since last I wrote on Project FOG, so I figure I should update all of you on the progress we’ve made.

A reminder: Project FOG (Firefox on Glean) is the year-long effort to bring the Glean SDK to Firefox. This means answering such varied questions as “Where are the docs going to live?” (here) “How do we update the SDK when we need to?” (this way) “How are tests gonna work?” (with difficulty) and so forth. In a project this long you can expect updates from time-to-time. So where are we?

First, we’ve added the Glean SDK to Firefox Desktop and include it in Firefox Nightly. This is only a partial integration, though, so the only builtin ping it sends is the “deletion-request” ping when the user opts out of data collection in the Preferences. We don’t actually collect any data, so the ping doesn’t do anything, but we’re sending it and soon we’ll have a test ensuring that we keep sending it. So that’s nice.

Second, we’ve written a lot of Design Proposals. The Glean Team and all the other teams our work impacts are widely distributed across a non-trivial fragment of the globe. To work together and not step on each others’ toes we have a culture of putting most things larger than a bugfix into Proposal Documents which we then pass around asynchronously for ideation, feedback, review, and signoff. For something the size and scope of adding a data collection library to Firefox Desktop, we’ve needed more than one. These design proposals are Google Docs for now, but will evolve to in-tree documentation (like this) as the proposals become code. This way the docs live with the code and hopefully remain up-to-date for our users (product developers, data engineers, data scientists, and other data consumers), and are made open to anyone in the community who’s interested in learning how it all works.

Third, we have a Glean SDK Rust API! Sorta. To limit scope creep we haven’t added the Rust API to mozilla/glean and are testing its suitability in FOG itself. This allows us to move a little faster by mixing our IPC implementation directly into the API, at the expense of needing to extract the common foundation later. But when we do extract it, it will be fully-formed and ready for consumers since it’ll already have been serving the demanding needs of FOG.

Fourth, we have tests. This was a bit of a struggle as the build order of Firefox means that any Rust code we write that touches Firefox internals can’t be tested in Rust tests (they must be tested by higher-level integration tests instead). By damming off the Firefox-adjacent pieces of the code we’ve been able to write and run Rust tests of the metrics API after all. Our code coverage is still a little low, but it’s better than it was.

Fifth, we are using Firefox’s own network stack to send pings. In a stroke of good fortune the application-services team (responsible for fan-favourite Firefox features “Sync”, “Send Tab”, and “Firefox Accounts”) was bringing a straightforward Rust networking API called Viaduct to Firefox Desktop almost exactly when we found ourselves in need of one. Plugging into Viaduct was a breeze, and now our “deletion-request” pings can correctly work their way through all the various proxies and protocols to get to Mozilla’s servers.

Sixth, we have firm designs on how to implement both the C++ and JS APIs in Firefox. They won’t be fully-fledged language bindings the way that Kotlin, Python, and Swift are (( they’ll be built atop the Rust language binding so they’re really more like shims )), but they need to have every metric type and every metric instance that a full language binding would have, so it’s no small amount of work.

But where does that leave our data consumers? For now, sadly, there’s little to report on both the input and output sides: We have no way for product engineers to collect data in Firefox Desktop (and no pings to send the data on), and we have no support in the pipeline for receiving data, not that we have any to analyse. These will be coming soon, and when they do we’ll start cautiously reaching out to potential first customers to see whether their needs can be satisfied by the pieces we’ve built so far.

And after that? Well, we need to do some validation work to ensure we’re doing things properly. We need to implement the designs we proposed. We need to establish how tasks accomplished in Telemetry can now be accomplished in the Glean SDK. We need to start building and shipping FOG and the Glean SDK beyond Nightly to Beta and Release. We need to implement the builtin Glean SDK pings. We need to document the designs so others can understand them, best practices so our users can follow them, APIs so engineers can use them, test guarantees so QA can validate them, and grand processes for migration from Telemetry to Glean so that organizations can start roadmapping their conversions.

In short: plenty has been done, and there’s still plenty to do. 

I guess we’d better be about it, then.

:chutten

13 Jun 03:51

Internet Archive closes the National Emergency Library

Geoffrey Rockwell, Theoreti.ca, Jun 12, 2020
Icon

I didn't think the Internet Archive would prevail in the lawsuit against its National Emergency Library (NEL) even though the NEL was designed to replace the services of regular libraries forced to close by the pandemic. And it hasn't. As this article notes, however, the idea of Controlled Digital Lending (CDL) itself is under attack; this is the practice of purchasing a book, digitizing it, and then lending access to that digitized copy on a controlled basis (so the idea is you're not lending out access to more copies than you own).

Web: [Direct Link] [This Post]
13 Jun 03:36

A global outlook to the interruption of education due to COVID-19 pandemic: Navigating in a time of uncertainty and crisis

Aras Bozkurt, et.al., Asian Journal of Distance Education, Jun 12, 2020
Icon

Educators and researchers will very likely be citing this paper in the years to come. Written as it was in the midst of a global response to a pandemic, this substantial paper (127 page PDF) examines how education systems around the world responded to the need for social distancing, remote teaching, and online resources. Although the authors appear to have no particular agenda in mind, which I appreciate, "this study points out how social injustice, inequity and the digital divide have been exacerbated during the pandemic and need unique and targeted measures if they are to be addressed." The first 8 pages, in particular, are worth reading as a summation of the issues of our times.

Web: [Direct Link] [This Post]
13 Jun 03:35

Freedom Mobile offering Apple Watch Series 5 with three months free service

by Dean Daley
Apple Watch Series 5

Freedom Mobile is now selling Apple Watch Series 5 with three months of free data service.

The Apple Watch must be activated on the same account as your other Freedom Mobile device, which means you need to have a smartphone plan with the carrier.

Once a subscriber activates the Apple Watch data service, the plan will then cost $10/month per activated Apple Watch line. Following that, there’s a corresponding discount of $10 for the next three months that will appear on your bills.

  • Available at Freedom Mobile is the Gold Aluminum 40mm Pink Sport Band for $699
  • Space Grey Aluminum 40mm with Black Sport Band for $699
  • Space Grey Aluminum 44mm with Black Sport Band for $739
  • Silver Aluminum 44mm with White Sport Band for $739

Check out the sale here

Source: Freedom Mobile

The post Freedom Mobile offering Apple Watch Series 5 with three months free service appeared first on MobileSyrup.

13 Jun 03:35

CCPA opt out, nerd edition

While we figure out how to make general-purpose CCPA opt-outs practical (feel free to set up a time on Calendly if you want to talk with me about Authorized Agent projects), here's a quick summary of my current CCPA opt-out tools. This is a prototype only, but does work.

  1. Mutt with GNU Privacy Guard (I put this first so people with a normal mail client setup can stop reading. You're welcome.)

  2. A Keybase account. Yes, we don't know what will happen to this service in the long run, but this is a prototype so whatevs.

  3. My ccpa shell script.

  4. An opt-out letter.

What the script does is generate a GPG-signed opt-out request that I can edit and send in Mutt, and the letter contains a link to the Keybase profile. Remember that the CCPA regulations Section 999.315(h) if you're following along at home. say,

"A request to opt-out need not be a verifiable consumer request. If a business, however, has a good-faith, reasonable, and documented belief that a request to opt-out is fraudulent, the business may deny the request. The business shall inform the requestor that it will not comply with the request and shall provide an explanation why it believes the request is fraudulent."

They're not allowed to deny the first one, opt-out, unless they come up with a good reason. Their choice is to do the opt-out or to take on a writing assignment for me for no money. And if they really want to pick the latter, and write an explanation of their "good-faith, reasonable, and documented belief" that this opt-out is fraudulent, they have to learn GPG and Keybase, and no growth-hacking marketer is going to spend time doing that.

This script works so far. They just do the opt-out. Sometimes they'll even treat the opt-out alone as either a Request to Know and/or a Request to Delete, because seriously, time is limited and once you have decided to just give the privacy nerd what they want, you might as well get all that nerd stuff out of the way at once.

Next steps? Make it work for more people, opting out of more companies. Right now this is just a simple version of the items needed for a "real" opt-out.

  • credibly claim that I am the person identified by data points that can be found in a marketing database (email, phone, IDFA/AdID, postal address...)

  • credibly claim that I am in a jurisdiction where I have a privacy right

  • assert that the sender of this letter has the right to act on a privacy request for me (in this case because it's me)

To be practical at scale, all of these need good UX, working, scalable implementation, and an effective legal payload. Some opt-outs will be on-demand, one company at a time, and others will be larger, in cases where you want to opt out of every company engaging in a specific practice and have your authorized agent do it.

But for now, for someone with my mail setup, doing CCPA is pretty convenient.

More, including template suppport: CCPA for nerds, part 2

Bonus links

Preliminary results are in! CCPA testers provide important insights into the landmark privacy law

Bombora Sues ZoomInfo For Allegedly Gaining An Unfair Advantage By Breaching CCPA

Maine Was Sued for Trying to Modernize Privacy Laws

Ad Buyers Should Rethink Facebook Spending, Says Media Watchdog

13 Jun 01:23

New Book on Machine Learning

by matloff

I’m nearing completion of writing my new book, The Art of Machine Learning: Algorithms+Data+R, to be published by the whimsically named No Starch Press. I’m making a rough, partial draft available, and welcome corrections, suggestions and comments.

I’ve been considering doing such a project for some time, intending to write a book that would on the one hand serve as “machine learning for the masses” while ardently avoiding being of a “cookbook” nature. In other words, the book has two goals:

  • The math content is kept to a minimum. Readers need only be able to understand scatter plots and the like, and know the concept of the slope of a line. (For readers who wish to delve into the math, a Math Companion document will be available.)
  • There is strong emphasis on building a solid intuitive understanding of the methods, empowering the reader to conduct effective, penetrating ML analysis.

As I write in the preface (“To the Reader”),

“Those dazzling ML successes you’ve heard about come only after careful, lengthy tuning and thought on the analyst’s part, requiring real insight. This book aims to develop that insight.”

The language of instruction is R, using standard CRAN packages. But as I also write,

“…this is a book on ML, not a book on using R in ML. True, R plays a major supporting role and we use prominent R packages for ML throughout the book, with code on almost every page. But in order to be able to use ML well, the reader should focus on the structure and interpretation of the ML models themselves; R is just a tool toward that end.”

So, take a look, and let me know what you think!

13 Jun 01:21

RT @screenise: RIP Denise Cronenberg, one of the all-time great costume designers. pic.twitter.com/MddeSsriII

by screenise
mkalus shared this story from moodvintage on Twitter.

RIP Denise Cronenberg, one of the all-time great costume designers. pic.twitter.com/MddeSsriII






Retweeted by moodvintage on Friday, June 12th, 2020 2:21am


379 likes, 66 retweets
13 Jun 01:21

Bad news for the British Museum. They'll be sending almost everything in it back to where it came from. Unless, of course, he doesn't mean a word of this & is just hoping that more violence will distract us from all the blood on his hands. twitter.com/BorisJohnson/s…

by mrjamesob
mkalus shared this story from mrjamesob on Twitter.

Bad news for the British Museum. They'll be sending almost everything in it back to where it came from. Unless, of course, he doesn't mean a word of this & is just hoping that more violence will distract us from all the blood on his hands. twitter.com/BorisJohnson/s…

They had different perspectives, different understandings of right and wrong. But those statues teach us about our past, with all its faults. To tear them down would be to lie about our history, and impoverish the education of generations to come. 4/8




12174 likes, 1677 retweets



1106 likes, 274 retweets
13 Jun 01:20

Saturday Morning Breakfast Cereal - Cure

by tech@thehiveworks.com
mkalus shared this story from Saturday Morning Breakfast Cereal.



Click here to go see the bonus panel!

Hovertext:
I should probably switch from newspapers to websites, but dammit it just isn't as good.


Today's News:


13 Jun 01:19

NICHTLUSTIG-Cartoon: LADEN

by Joscha Sauer
mkalus shared this story from joscha.com RSS Feed.

Kennst du schon den NICHTLUSTIG-Cartoon 'LADEN' von Joscha Sauer?

Hier geht's zum Bonuspanel!

12 Jun 05:31

10 Megabyte Hard Disk System: $3,695. From BYTE, January 1981 pic.twitter.com/MFKjcf5Pjs

by moodvintage
mkalus shared this story from moodvintage on Twitter.

10 Megabyte Hard Disk System: $3,695. From BYTE, January 1981 pic.twitter.com/MFKjcf5Pjs





266 likes, 81 retweets
12 Jun 05:31

Persistence Wins, Even For Someone Like You

by Eugene Wallingford

There's value to going into a field that you find difficult to grasp, as long as you're willing to be persistent. Even better, others can benefit from your persistence, too.

In an old essay, James Propp notes that working in a field where you lack intuition can "impart a useful freedom from prejudice". Even better...

... there's value in going into a field that you find difficult to grasp, as long as you're willing to be really persistent, because if you find a different way to think about things, something that works even for someone like you, chances are that other people will find it useful too.

This reminded me of a passage in Bob Nystroms's post about his new book, Crafting Interpreters. Nystrom took a long time to finish the book in large part because he wanted the interpreter at the end of each chapter to compile and run, while at the same time growing into the interpreter discussed in the next chapter. But that wasn't the only reason:

I made this problem harder for myself because of the meta-goal I had. One reason I didn't get into languages until later in my career was because I was intimidated by the reputation compilers have as being only for hardcore computer science wizard types. I'm a college dropout, so I felt I wasn't smart enough, or at least wasn't educated enough to hack it. Eventually I discovered that those barriers existed only in my mind and that anyone can learn this.

Some students avoid my compilers course because they assume it must be difficult, or because friends said they found it difficult. Even though they are CS majors, they think of themselves as average programmers, not "hardcore computer science wizard types". But regardless of the caliber of the student at the time they start the course, the best predictor of success in writing a working compiler is persistence. The students who plug away, working regularly throughout the two-week stages and across the entire project, are usually the ones who finish successfully.

One of my great pleasures as a prof is seeing the pride in the faces of students who demo a working compiler at the end of the semester, especially in the faces of the students who began the course concerned that they couldn't hack it.

As Propp points out in his essay, this sort of persistence can pay off for others, too. When you have to work hard to grasp an idea or to make something, you sometimes find a different way to think about things, and this can help others who are struggling. One of my jobs as a teacher is to help students understand new ideas and use new techniques. That job is usually made easier when I've had to work persistently to understand the idea myself, or to find a better way to help the students who teach me the ways in which they struggle.

In Nystrom's case, his hard work to master a field he didn't grasp immediately pays of for his readers. I've been following the growth of Crafting Interpreters over time, reading chapters in depth whenever I was able. Those chapters were uniformly easy to read, easy to follow, and entertaining. They have me thinking about ways to teach my own course differently, which is probably the highest praise I can give as a teacher. Now I need to go back and read the entire book and learn some more.

Teaching well enough that students grasp what they thought was not graspable and do what they thought was not doable is a constant goal, rarely achieved. It's always a work in progress. I have to keep plugging away.

12 Jun 05:30

Chenchénstway

by Chris Corrigan

It’s my birthday on Saturday. Join me in donating to:

On Saturday it is my 52nd birthday. It seems to be a feature of getting older that birthdays and other gift-giving holidays become less about the stuff and more about the relationships.

For this birthday, I’d like to invite any of my readers, friends, and colleagues to join me in donating funds to two local indigenous women who are doing powerful work for others. We can gift to them and through them to support a better world. For my birthday this year, I’m donating $200 to each of their initiatives and I invite you to join me and give what you can. In these times, and perhaps always, the work of indigenous women is critical to support.

One of the gifts I receive all the time is the gift of living in Squamish territory on a little island called Nexwlélexwem (Bowen Island) in the Squamish language. I am grateful to live here and grateful to have so many friends and colleagues from the Squamish Nation who have schooled me on the cultural landscape that surrounds me.

The word “Chenchénstway” is a Squamish word meaning “to lift each other up” and it’s a key value in Squamish life. It is one of the values that permeate the landscape where I live and it’s the core of the work of one of my friends, Ta7talíya (Michelle Nahanee), who has assembled a powerful collection of teaching and practices in the service of decolonization. Her work is opening eyes and building capacity and she holds it with the energy of a matriarch. Donating to Michelle’s work helps her to develop new resources and grow the impact of her work. You can learn more about her work and offer a donation at the Decolonizing Practices website. You can also sign up for a 4-week online program there, so consider that too.

The other woman I’m donating to this year is Teara Fraser. Teara is a pilot and an entrepreneur who is single-mindedly focused on indigenous women’s leadership development, including her own. She created the first indigenous-women owned airline, Iskwew Air, which flies out of Vancouver. During the pandemic, along with the Indigenous LIFT Collective, she has been raising funds to fly essential goods and services to remote indigenous communities along our coast.

I’ll be donating to that initiative this year too and hope you will join me in supporting this work.

I’m grateful to be living and working on Squamish land, and deeply grateful for the work these two women do in the world.

12 Jun 05:30

Recommended on Medium: Black Lives Matter.

Change starts with conversation, and the Black Lives Matter movement is driving some of the most important conversations of our time. As a place that fosters connection and conversation, OkCupid is committed to supporting the movement and helping our users connect over their shared support as well. There is more work to be done, but here’s what we’re doing today:

  1. We’re donating $1 million in advertising space on OkCupid to Black civil rights organizations. These amazing non-profits deserve a space to be heard, and if we can help in even a small way, we’re honored to do that.
  2. For our users, we’re rolling out a #BlackLivesMatter profile badge in over a dozen countries. OkCupid users can get the badge on their profile by answering “yes” to the question “Do you want to support the #BlackLivesMatter movement by adding a badge to your profile?”
  3. We’ve made a donation to the NAACP, the ACLU, Black Girls CODE, and Fair Fight Action.
The #BlackLivesMatter profile badge is available to OkCupid users in over a dozen countries.

Some of you have also noticed that we’ve also added a new series of matching questions related to racial equality and justice to encourage conversations between people. In just the past week, we’ve had over 100,000 answers to questions such as:

  • Do you protest to fight inequality?
  • How will you address racial inequality?
  • Is it important that your date fights for racial justice?

And we were encouraged by the responses. The vast majority of OkCupid respondents said it is not acceptable to silently support racial equality. In the United States, 70% of OkCupid respondents are protesting to fight racial inequality. And when asked how people are addressing racial equality:

  • 62% are donating their time or money, educating themselves or others, and protesting
  • 23% are educating themselves or teaching others
  • 9% are donating their money or time
  • 6% are protesting

We know there is a lot more work to be done. We won’t stop here and we are committed to being part of the change.

Additional details about how nonprofit organizations can apply for free ad space will be available in the coming weeks.


Black Lives Matter. was originally published in The OkCupid Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.

12 Jun 05:29

He’s disabled replies so here’s a quote-retweet. You know what’s racist? Assuming all EU citizens are the same race. You’re a racist Kawczynski, a racist playing the race card to justify your xenophobic anti-European bigotry. twitter.com/dkshrewsbury/s…

by ottocrat
mkalus shared this story from ottocrat on Twitter.

He’s disabled replies so here’s a quote-retweet. You know what’s racist? Assuming all EU citizens are the same race. You’re a racist Kawczynski, a racist playing the race card to justify your xenophobic anti-European bigotry. twitter.com/dkshrewsbury/s…

Forgive me but EU immigration policy is racist as it gives automatic entry to fellow Europeans at expense of Commonwealth and other non EU citizens. Am delighted that post Brexit we will assess who you are & what you can bring to our country rather than where you are from.




296 likes, 102 retweets



219 likes, 52 retweets
12 Jun 05:28

Datasette 0.44: The annotated release notes

I just released Datasette 0.44 to PyPI. With 128 commits since 0.43 this is the biggest release in a long time - and likely the last major release of new features before Datasette 1.0.

You can read the full release notes here, but I've decided to try something a little different for this release and write up some annotations here on my blog.

Writable canned queries

Datasette's Canned queries feature lets you define SQL queries in metadata.json which can then be executed by users visiting a specific URL. https://latest.datasette.io/fixtures/neighborhood_search for example.

Canned queries were previously restricted to SELECT, but Datasette 0.44 introduces the ability for canned queries to execute INSERT or UPDATE queries as well, using the new "write": true property (#800)

I originally intended this to be the main feature in the release.

Datastte 0.37 added the ability for plugins to write to the database. This marked a pretty huge philosophical shift for Datasette: from a read-only publishing system to a framework for building interactive SQL-driven applications. But you needed a plugin, such as my datasette-upload-csvs.

I realized back in March that canned queries could provide a simple, sensible way to start adding write functionality to Datasette core. A query could be configured like this:

{
  "databases": {
    "my-database": {
      "queries": {
        "add_twitter_handle": {
          "sql": "insert into twitter_handles (username) values (:username)",
          "write": true
        }
      }
    }
  }
}

And Datasette could then provide a form interface at /my-database/add_twitter_handle for executing that query. How hard could that be to implement?

The problem with "simple" features like this is that they open up a cascade of other features.

If you're going to have write queries, you probably need to restrict who can execute them - which means authentication and permissions. If forms are performing POSTs you need CSRF protection. If users are changing state you need a way to show them messages telling them what happened.

So let's talk about authentication and permissions.

Authentication

Prior to this release the Datasette ecosystem has treated authentication as exclusively the realm of plugins, most notably through datasette-auth-github.

0.44 introduces Authentication and permissions as core Datasette concepts (#699). This makes it easier for different plugins can share responsibility for authenticating requests - you might have one plugin that handles user accounts and another one that allows automated access via API keys, for example.

I demonstrated with datasette-auth-github and datasette-auth-existing-cookies that authentication could exist as completely separate layer from Datasette call (thanks to the magic of ASGI middleware). But I'd started to run into limitations of this approach.

Crucially, I wanted to be able to support more than one kind of authentication. Users might get authenticated with cookies (via a SSO mechanism such as GitHub's) but API clients need API keys. Now the different authentication plugins need to make sure they don't accidentally intefere with each other's logic.

Authentication in web applications always comes down to the same thing: inspecting aspects of the incoming HTTP request (headers, cookies, querystring variables etc) and deciding if they prove that the request is coming from a specific user or API integration.

I decided to use the word "actor" for this, since "user or API integration" is a bit of a mess. This means that authentication can work entirely via a new plugin hook, actorfromrequest.

Here's a really simple implementation of that hook, copied directly from the documentation:

from datasette import hookimpl
import secrets

SECRET_KEY = "this-is-a-secret"

@hookimpl
def actor_from_request(datasette, request):
    authorization = request.headers.get("authorization") or ""
    expected = "Bearer {}".format(SECRET_KEY)

    if secrets.compare_digest(authorization, expected):
        return {"id": "bot"}

It returns an "actor dictionary" describing the authenticated actor. Datasette currently has no opinion at all on what shape this dictionary should take, though I expect conventions to emerge over time.

I have a new policy of never releasing a new plugin hook without also building a real-world plugin with it. For actor_from_request I've released datasette-auth-tokens, which lets you create secret API tokens in a configuration file and specify which actions they are allowed to perfom.

Permissions

Datasette also now has a built-in concept of Permissions. The permissions system answers the following question:

Is this actor allowed to perform this action, optionally against this particular resource?

You can use the new "allow" block syntax in metadata.json (or metadata.yaml) to set required permissions at the instance, database, table or canned query level. For example, to restrict access to the fixtures.db database to the "root" user:

{
    "databases": {
        "fixtures": {
            "allow": {
                "id" "root"
            }
        }
    }
}

See Defining permissions with "allow" blocks for more details.

Plugins can implement their own custom permission checks using the new permission_allowed(datasette, actor, action, resource) hook.

Authentication on its own isn't enough: you also need a way of deciding if an authenticated actor has permission to perform a specific action.

I was dreading adding permissions to Datasette. I have a long-running feud with Amazon IAM and the Google Cloud equivalent: I've been using AWS for over a decade and I still get completely lost any time I try to figure out the minimum set of permissions for something.

But... I want Datasette permissions to be flexible. My dream for Datasette is to nurture a growing ecosystem of plugins that can solve data collaboration and analysis problems way beyond what I've imagined myself.

Thanks to Datasette's plugin hooks, I think I've found a way to provide powerful plugins with minimum additional footprint to Datasette itself.

The key is the new permission_allowed() hook, which lets plugins receive an actor, action and optional resource and allows them to reply with "allow", "deny" or "I don't know, ask someone else".

Its partner is the datasette.permission_allowed(actor, action, resource) method, which plugins (and Datasette core) can call to check if the current actor is allowed to perform an action against a given resource (a specific database, table or canned query).

I invented a JSON/YAML based syntax for defining simple permission rules. If you want to provide access to a table to a specific user you can do so like this:

{
    "allow": {
        "id": "simonw"
    }
}

Or you can grant access to any actor with a role of "staff" like so:

{
    "allow": {
        "role": "staff"
    }
}

What are roles here? They're nothing at all to Datasette itself. Datasette authentication plugins can create actors of any shape, so if your plugin decides that "role" is a useful concept it can just bake it into the Datasette.

You can read more about how these "allow" blocks work in the documentation.

/-/permissions debug tool

Given my ongoing battle with opaque permission systems, I'm determined to try and make Datasette's take on permissions as transparent as possible. The new /-/permissions page - visible only to authenticated users with the debug-permissions permission - shows a rolling log of the last 200 permission checks carried out by that instance. My hope is that instance administrators and plugin authors can use this to figure out exactly what is going on.

/-/permissions screenshot

datasette-permissions-sql

datasette-permissions-sql is my new proof-of-concept plugin that puts the permission hook to use.

It exercises a Datasette pattern I find really interesting: using SQL queries to configure custom behaviour. I first started eploring this in datasette-atom and datasette-ics.

This is best illustrated by an example metadata.yaml file. I prefer YAML over JSON for anything that includes a SQL query because YAML has support for multi-line strings:

databases:
  mydatabase:
    queries:
      promote_to_staff:
        sql: |-
          UPDATE users
          SET is is_staff=1
          WHERE id=:id
        write: true
plugins:
  datasette-permissions-sql:
  - action: view-query
    resource:
    - mydatabase
    - promote_to_staff
    sql: |-
      SELECT * FROM users
      WHERE is_staff = 1
      AND id = :actor_id

This block does two things. It configures a writable canned query called promote_to_staff. It then uses datasette-permissions-sql to define a permission rule that says that only authenticated actors who's id appears in the users table with is_staff=1 are allewod to execute that canned query

This is the beginnings of a full user management system in just a few lines of configuration. I'm really excited about exploring this concept further.

register_routes() plugin hooks

Plugins can now register new views and routes via the register_routes() plugin hook (#819). View functions can be defined that accept any of the current datasette object, the current request, or the ASGI scope, send and receive objects.

I thought the asgi_wrapper() hook might be enough to allow plugins to add their own custom routes and views, but the more I worked with it the more I wanted something a bit more high level.

Inspired by pytest, the view functions you can define using register_routes() benefit from a simple form of dependency injection. Any of the following counts as a valid view function - it will be called with the arguments it requests:

async def hello(request):
    return Response.html("Hello {}".format(
        html.escape(request.args.get("name"))
    ))

async def page(request, datasette):
    page = await datasette.get_databse().execute(
        "select body from pages where id = :id", {
            "id: request.url_vars["page_id"]
        }
    ).first()
    return Response.html(body)

async def asgi_hello_world(scope, receive, send):
    assert scope["type"] == "http"
    await send(
        {
            "type": "http.response.start",
            "status": 200,
            "headers": [
                [b"content-type", b"application/json"]
            ],
        }
    )
    await send({
        "type": "http.response.body",
        "body": b'{"hello": "world"}'
    })

Here's the code that makes this work - utility functions that pass in just the arguments that match a function's signature.

Tucked away at the end of the 0.44 release notes is this:

The road to Datasette 1.0

I've assembled a milestone for Datasette 1.0. The focus of the 1.0 release will be the following:

  • Signify confidence in the quality/stability of Datasette
  • Give plugin authors confidence that their plugins will work for the whole 1.x release cycle
  • Provide the same confidence to developers building against Datasette JSON APIs

If you have thoughts about what you would like to see for Datasette 1.0 you can join the conversation on issue #519.

It's time to start working towards the big 1.0!