Shared posts

14 Sep 23:13

The Other Ninety Percent

We made several improvements to TidyBlocks this week, but not all of them are visible to users. The ones that are include: More of the interface has been translated. We now have a block for calculating running sums and averages. And there is another new block for shifting columns up and down so that users can...
31 Aug 03:13

airtable-export

airtable-export

I wrote a command-line utility for exporting data from Airtable and dumping it to disk as YAML, JSON or newline delimited JSON files. This means you can backup an Airtable database from a GitHub Action and get a commit history of changes made to your data.

29 Aug 20:23

We Contain Multitudes

by Dave Pollard

sun flashes, blinks, glimmers
through aspen leaves rustling in late summer breeze

sparrow watches me below watching her

all this complexity, undirected
stunning complicity of countless cells,
looking after each other,
creating more of their kind,
doing what they do
for no reason

no wonder we invented gods to try to explain it all

brain’s job was never to make sense of this,
it was just to convert signals to messages:
food afoot, or danger,
as it’s done for half a billion years

too smart now for its own good
it imagines its models to be real
and imagines, at the centre, a self, me

a delusion, but one
that harms only itself
a tragic misunderstanding, source of
endless unnecessary suffering
dis-ease of confusion and of fear

sparrow
(in no way separate from
rippling ocean currents of air)
flitters
among branches of the tree
(in no way separate from either
or from anything)

just (if you look closely, quietly)
a dance of atoms, molecules, cells, strands and fibres
vibrating in such a way
as to seem to take the shape of everything,
a play of light and shadow
with no rules
no roles, no settings, no limits
no beginning and no end

no now, or later
neither here, nor there

no solidity to it, to any of these things
appearing to be separate
when they are not —
least of all me
this ponderous, bedraggled self-invented mess
endlessly grasping at thoughts and feelings
presuming them to be mine,
my responsibility to corral and order,

a ghost sheepdog trying vainly
to herd an oblivious flock

the play whirls on, explodes, flutters,
whispers, chirps, thunders, morphs, quivers
outside of space and time, complete,

as I, somehow, insanely apart, look on,
desperate to make sense
of what makes no sense, and has no need to,

self-constrained by my own inventions,
finite, limited, quarantined,
self-immiserating, victim
not of my conditioning, but of its denial

sun fades, sky opens
a roar of rain, in sheets;
sparrow calls out: look!

but my eyes are closed,
I cannot see what she is pointing me to,
joyously, wings aflutter

I am too lost in the grief of knowing


photo is my own; title is from a poem by Walt Whitman

29 Aug 20:23

Google’s upcoming ‘Sabrina’ media streaming device listed on Canadian database

by Jonathan Lamont
Android TV streaming stick colours

Rumours have swirled about Google’s upcoming streaming media device with codename ‘Sabrina.’ However, it now appears Sabrina has passed through Canadian certification as the device turned up on the government’s Radio Equipment List (REL) database.

Two Google devices bearing model numbers ‘GZRNL’ and ‘G9N9N’ turned up in the REL database, which suggests we could see a launch sometime soon. Considering Google last launched a new streaming device alongside the Pixel 3 series a couple of years ago, I wouldn’t be surprised to see Sabrina launch alongside the upcoming Pixel 5 in the fall.

The REL database confirms that GZRNL is likely the Sabrina unit itself. The database labels it an ‘Interactive Media Streaming Device.’ G9N9N, on the other hand, is simply a ‘Wireless Device.’ It’s expected to be Sabrina’s included remote.

MySmartPrice also discovered a “dongle” with model number GPJ110 on an Indonesian telecom database. While it’s not immediately clear what this is, past rumours about a Google device with that model number indicate it’s an upcoming Chromecast, potentially a replacement to the Chromecast Ultra.

This isn’t the first time that Sabrina turned up in a government database. It recently appeared on an FCC database, which also labelled it an interactive media streaming device.

Based on past leaks, Sabrina will likely support up to 4K video, HDR10 and Dolby Vision, and feature an automatic low-latency mode, which will probably work with Google’s Stadia game streaming platform.

Due to the nature of the REL database, links redirect to the main search page.

Source: REL Via: MySmartPrice

The post Google’s upcoming ‘Sabrina’ media streaming device listed on Canadian database appeared first on MobileSyrup.

29 Aug 20:22

Changing desktop environment in Pop!_OS

by Doug Belshaw

I’ve used many different distributions of GNU/Linux over the last (gosh!) 23 years, from Red Hat Linux as a 16 year-old through Mandrake, Fedora, Ubuntu, elementaryOS, and now Pop!_OS.

No matter which distribution you use, there are an infinite number of ways to customise Linux. One of the easiest ways to do this is to change desktop environment. The gallery at the Wikipedia page on desktop environments shows the sheer diversity of approaches in offer.

Not only do desktop environments change the look and feel of operating systems, they also affect the amount of resources being used, and therefore how responsive your system feels in practice.

I like the default desktop environment in Pop!_OS but I’m always experimenting with my setup to improve it. So when I stumbled across this page on the System76 website (the people behind Pop!_OS) I decided to give other desktop environments a try.

It’s important to inform those who have never tried this that all that’s happening here is a change in the final layer between you and the operating system. As such, your files remain untouched, and all of your browser settings (for example) remain the same. In fact, you could change desktop environments every time you logged on, should you wish.

I tried KDE Plasma again and Cinnamon, the latter being the default desktop environment from Linux Mint. I followed the instructions from System76 and everything was very straightforward. Next time I logged in the options were there at the bottom-right.

I’m sticking with Cinnamon for now, as it feels snappy and is aesthetically pleasing. The great thing is that, should I change my mind, I can just switch to another one without having to reinstall the whole operating system!


This post is Day 39 of my #100DaysToOffload challenge. Want to get involved? Find out more at 100daystooffload.com

The post Changing desktop environment in Pop!_OS first appeared on Open Thinkering.

29 Aug 20:22

Suspected Accomplice in Berlin Tiergarten Murder Identified as FSB/Vympel Officer

by Bellingcat Investigation Team
mkalus shared this story from bellingcat.

  • Exactly one year ago this week, Zelimkhan Khangoshvili, a 40-year-old Georgian citizen and former Chechen rebel commander, was shot dead in Berlin’s Kleiner Tiergarten. The killer – traveling under the guise of a tourist and using a Russian passport in the name of Vadim Sokolov – was arrested by Berlin police following a tip-off from two teenagers who had seen him dispose of evidence into a river.
  • In a series of investigations, Bellingcat, together with Der Spiegel and The Insider, identified the assassin as Vadim Krasikov, a former Russian security officer previously linked to at least two contract murders in Russia.
  • Using telephone metadata, we established immediately prior to the trip to Berlin, Vadim Krasikov had interacted extensively with current and former FSB Spetsnaz officers, and had spent extended periods of time on an FSB training base outside Moscow. We also established that his most frequent contacts in the eve of the assassination had been with members of the Vympel Group of companies: a security services holding employing predominantly former Spetsnaz officers from the FSB’s elite Department “V”.
  • We subsequently disclosed that two weeks before the assassination, another person traveled by car from Russia to Poland – and possibly on to Germany on a fake passport issued on the same date, and having the same number range as that used by “Vadim Sokolov”. This second person – who is listed in German indictment documents as a person of interest and possibly an accomplice to the murder – traveled under the name “Roman Davydov”, having a birth date of 9 October 1981. Both “Davydov” and the suspected assassin had listed the same employer in their visa applications – the St. Petersburg company ZAO RUST.
  • While no person with these exact personal data exists in Russian national databases, we also discovered that a person with the same face and a different last name (“Roman Nikolaev”) and birth-date, traveled to Czechia in 2015. Using visa application documents and booking data, we linked “Roman Nikolaev” to six other fake identities who obtained visas to Czechia for the same period of time. We were able to link at least three of those people to at least one assassination of another Chechen former commander in Istanbul. At least one of these three co-travelers was linked to the Vympel group of companies.
  • Based on these findings, we hypothesized that the Vympel Group of companies – and an affiliated “Regional Association of Vympel Spetsnaz Veterans” – are used as a front organization for Russia’s security services in order to pursue a program of targeted assassinations of perceived Russian enemies abroad. While most of the known targets have been ethnic Chechens who had fought against Russia in the Chechen wars, at least one target was a Uzbeki cleric living in Turkey with no known association with the Chechen war.

We have now been able to positively identify the second person of interest in the Kleiner Tiergarten murder case previously known under the aliases “Roman Davydov” and “Roman Nikolaev”. This person is in fact Roman Yuryevich Demyanchenko, a former FSB officer and current Vympel Group operative.

This is a joint investigation with The Insider (Russia) and Der Spiegel (Germany).

Who is Roman Demyanchenko?

Facial comparison of “Roman Davydov”, based on a photograph from his visa application documents, and Roman Yuryevich Demyanchenko, a photograph from a personal identity document. The comparison was performed using Microsoft’s Azure Face Verification Tool.

Roman Demyanchenko — the true identity of “Roman Davydov” and “Roman Nikolaev” — was born in Moscow on 4 December 1980. While he has almost no online footprint, data breadcrumbs from previously leaked residential databases and phone listings lead to the conclusion that he was a decorated FSB officer who, until 2011, served in the FSB’s Department V (Vympel).

Moscow residential data show he was a pensioner as early as in 2011, at age 31, suggesting early retirement (Spetsnaz officers typically retire at age of 45.) This early retirement can possibly be explained with a service related trauma or wound. Such a hypothesis is indirectly corroborated by the fact that as of 2008, he has been listed in Moscow residential databases as a person entitled to state benefits – a status usually given to people who have received a state award.

A phone number which we identified as belonging to Roman Demyanchenko is listed in a phone number sharing app (which harvests data from its users’ phone contact books) that is popular in Russia, as “Roma FSB”. This means at least one person has saved Demyanchenko’s number in their telephone with “Roma FSB” in their contact book.

A leaked database of employment records reviewed by us shows that in 2019, Demyanchenko was employed by Vympel Sodeystvie (Vympel Cooperation), a Moscow-based company owned by Eduard Bendersky. Bendersky is the chairman of the Regional Association of former Vympel Spetsnaz officers, and is himself a former Lt. Colonel from the Vympel’s Spetsnaz training unit in Balashikha, just outside Moscow.

In our previous investigations, we disclosed that Eduard Bendersky personally communicated with Vadim Krasikov dozens of times in the weeks and days before his trip to Berlin. Vympel Sodeystvie is one of a cluster of companies bearing the Vympel name that all offer security-related services. All of these companies are registered in the name of Bendersky, and are located at the same address which was visited many times by the Berlin assassin, Vadim Krasikov. Former employees of the Vympel group of companies have described them as a commercial front for high-ranking FSB officials.

Demyanchenko’s declared monthly income for January 2019, based on leaked tax data for that month, was 480,000 rubles (EUR 5,500). It is not clear if this is a regular monthly salary or if it includes an accrued annual bonus. If it refers to a single month’s salary, it would be a very high pay-rate for Moscow standards and would suggest a high rank within the organization.

Metadata from phone records of Demyanchenko show that he frequently visits the headquarters of the Vympel group of companies and communicates with its management – including with its president Eduard Bendersky, as well as with active FSB officers. He also frequently communicates with a person who actively communicated with both the suspected assassin Vadim Krasikov and with his wife in the months after the assassination. This person is an FSB colonel and a Vympel Spetsnaz alumnus, named Evgeny E.

Trips to St. Petersburg

As reported previously, Roman “Davydov” traveled to the Schengen area two weeks before the Kleiner Tiergarten murder using a Slovak visa issued in the St. Petersburg consulate of Slovakia. Since our report on this visa issuance, Slovakia has expelled two Russian diplomats over Russia’s abuse of their visa system. Having determined his real identity, we were able to use a leaked travel database to look up his trip from Moscow to St. Petersburg at the time of obtaining the visa. Roman Demyanchenko traveled by train from Moscow to St. Petersburg on 23 July 2019, and had a return ticket for 26 July 2019. He did not use that return ticket and booked another return trip on 29 July. Based on the visa application documents which we have reviewed, Demyanchenko/”Davydov” applied for his visa on 29 July. This suggest he needed more time than planned to compile the necessary package of (inauthentic) documents, and stayed longer than planned in St. Petersburg. As his visa was issued on 31 July 2019, this means someone else picked up his passport and visa from the consulate.

Prior Trips and Prior Identities

Roman Demyanchenko has traveled under at least three different identities with three different names and birthdays; under all of these he used a government-issued, valid passport. As we have written before, this is not possible without the direct involvement of the Russian state.

Under his real identity, Demyanchenko has traveled only domestically and in former Soviet republics, such as Ukraine, Belarus, and Kazakhstan. Among his frequent destinations in the past five years were Crimea and Krasnodar. Krasnodar is near the base of the Wagner PMC, which, as reported earlier, is supervised by both GRU and FSB.

Under his latest identity – “Roman Davydov” – he took only one trip, from August 3 to August 7 2019, two weeks before the Berlin murder.

Demyanchenko’s travels under his third identity, Roman “Nikolaev”, born 22 December 1980, appear to have been most prolific. These trips also appear to be most sensitive and zealously guarded by the Russian state. Travel logs under this identity have been purged from Russian border crossing databases, as well as from a comprehensive FSB-maintained database tracking all Russian residents’ movements. Partial offline archives, which exist beyond the reach of Russian security services, show a trip to Czechia in 2015 (which was already reported by us), as well as trips to Latakia (Syria). The trips to Syria are likely linked to the presence of Russian Spetsnaz (including FSB Spetsnaz) and mercenary units there.

Potential Further Persons of Interest

During one trip to St. Petersburg in 2017, Demyanchenko traveled with three other men on same train booking. One of them – Andrey Sazontsev – was previously identified by us as a member of the “Magnificent Seven”: an FSB/Vympel team that made repeated trips overseas under fake identities covert operations, including at least two murders in Istanbul in 2015. The other two co-passengers are both employed by the Vympel group of companies, and are former FSB Spetsnaz officers. We are not disclosing their identities at this stage while investigating their possible link to the Berlin assassination or other prior covert operations.

One of Demyanchenko’s co-passengers – Andrey Sazontsev – is a former senior police officer working at Moscow’s police criminal search department. He traveled to Czechia in 2015 using a cover identity of “Andrey Mitrakov”. He was also in frequent telephone contact with the assassin Vadim Krasikov prior to his trip to Berlin, and called the assassin’s wife immediately after the murder. He also spoke with Demyanchenko repeatedly in the last few months, as shown in telephone records obtained by us. While his possible link to the Berlin murder is yet uncertain, it is clear from the pattern of communication that he was aware of the operation. Based on the identity change pattern used by Demyanchenko, it can be assumed that if he did indeed play an active role in the Berlin murder – and if he traveled to Germany as part of the kill team – he would likely have used a different cover identity than “Mitrakov”.

Left, Andrey Sazontsev, personal ID document. Right, “Andrey Mitrakov”, photo from 2015 visa application documents

Identification Method

The starting point for the identification of Demyanchenko was his alter ego “Roman Davydov”, born on 9 October 1981, who was originally discovered based on his use of a sequential passport number and identical employer, in the visa application, as those of the suspected assassin .

As always in our investigations, we initially attempted to identify the real person behind the “Davydov” persona using several open-source reverse-face-search tools offering look-ups of people on Russian social media sites based on a photograph. In this case, there was no match for the photograph used by “Davydov” in his visa application, indicating Demyanchenko does not have social media presence. We had to switch to a deductive method.

A basic rule of thumb in identifying Russian spies – both of GRU and FSB provenance – is that they tend to use the same first name and middle name or initial, and sometimes the same birth date, in both their real and fake identities. The latter however is more often true of GRU operatives than of FSB spies who tend to have better operational security and rarely use the exact same birth date. Even so, both sets of operatives typically use a cover identity with a birth year that is either the same or at most one year different than their real one.

Unusually, in this case we had discovered that the person behind “Roman Davydov” had also used a previous cover identity – that of “Roman Nikolaev”, born on 22 December 1980. As this identity had been used earlier – before Bellingcat’s and others’ disclosures of a number of Russian undercover operations, and the possible subsequent improvement of Russian OpSec routines – we assumed that the real identity would have more in common with the “Nikolaev” cover identity than with that of the later created “Davydov”.

Our starting hypothesis was that the real “Roman Davydov” would likely also have a first name “Roman”, and that his birth year would be 1980, or less likely 1981 or 1979. Based on traffic camera logs of the Infiniti car which “Davydov” had used before and after the August 2019 trip to the EU, we could establish also the likely general area of his residence in Moscow. While these characteristics gave us a possible profile, none of them was specific enough to filter the possible candidates to a manageable shortlist.

We initially attempted to identify “Davydov” via obtaining passenger records for the flights which Krasikov took to and from St. Petersburg in late July. We hypothesized that the two may have flown together from Moscow to St. Petersburg, given that “Davydov” had applied for a visa on 29 July 2019, and Krasikov had been in St. Petersburg at that time. However we did not find any co-passenger of Krasikov’s matching the above criteria.

Our next approach was to use as a starting point the telephone logs from Vadim Krasikov’s telephone number. We had obtained his main number’s metadata for the period from February to September 2019, which included periods both before and after the assassination in Berlin. We had discovered that he did not take his phone with him on his mission, but instead used a new, burner phone registered in his cover identity of “Vadim Sokolov”. His main phone, however, remained switched on and connected to the network even after he departed for Berlin. Cell tower connection data showed it stayed at his residence, which suggested that after his departure, calls to and from it were handled by his wife.

As part of our investigation into Krasikov’s circle of contacts, using open-source phone number reverse look-up tools (primarily the apps GetContact and NumBuster) we had identified all people with whom he interacted via regular GSM phone calls. There was no match for a person meeting the “Davydov” criteria, implying that they either did not communicate at all, or (more plausibly), did it via untraceable VoIP messengers such as WhatsApp, Signal or Telegram.

Therefore, we had to go one step further and look for a “Davydov” candidate among the larger universe of contacts of Krasikov’s own contacts. In order to limit the scope, we decided to focus only on those contacts of Krasikov who were most likely to have been involved in the planning of the assassination. We had discovered that only two of Krasikov’s contacts continued calling his phone after the murder – likely, communicating with his wife after the arrest, and giving her assistance and/or instructions. These two contacts were Col. Evgeny E., and Andrey Sazontsev.  By this stage we had discovered that Andrey Sazontsev had used a fake identity to travel with “Davydov” on a previous covert overseas operation in 2015, which implied Sazontsev would likely be in long-term contact with “Davydov”.

Based on this hypothesis, we obtained – from a source at a Russian mobile operator – Andrey Sazontsev’s phone records for the last three months.  Using reverse phone search tools, we identified his most frequent contacts, and encountered one person who matched the initial criteria: a Roman Yuryevich Demyanchenko, born on 4 December 1980.

To confirm our hypothesis that Demyanchenko is in fact “Davydov”, we then obtained from a source with access to offline copies of Russian passport data, a copy of Demyanchenko’s ID document, and indeed confirmed that his face closely resembled “Davydov”‘s. A face comparison using Microsoft Azure’s Face Verification tool resulted in a conclusive >0.9 match which positively validated our identification.

Relevance of Findings

These latest findings corroborate our previous conclusion that the assassination of Zelimkhan Khangoshvili in Berlin was organized by the Vympel group of companies (and the affiliated Regional Association of Former FSB Spetsnaz veterans), in coordination and at the instructions of the FSB. It is logical to conclude that the Vympel group of companies is a de facto arm of the FSB earmarked, at least partly, for deniable overseas assassinations or other unlawful interventions. The role of the Vympel group for such targeted assassinations is not dissimilar to the use of Wagner PMC for deniable military operations abroad. At the same time, FSB’s use of a proxy for overseas illegal operations is different than the modus operandi of the GRU who only use staff officers for clandestine operations abroad.

As stated in previous reports, our findings also point to a gaping security hole in the European visa issuance system permitting the award of visas to false identities with no credible documentary background, and with relatively easily identifiable doppelgangers working for Russian security services (or for their proxy organizations). Our findings show that the deficiency is systemic and is not restricted to one particular country’s consular service, as we have observed successful abuses of the visa issuance systems deployed against the UK, France, Italy, Slovakia, Czechia and Switzerland.  The abuse is made possible partly due to the continued acceptance of non-biometric passports for Russian travelers.

The case of Demyanchenko/”Nikolaev”/”Davydov” however indicates that a mandatory requirement for biometric passports may not be a sufficient measure to curtail the flow of covert illegal operatives infiltrating the European space under fake identities. Demyanchenko was apparently able to obtain (at least) two Schengen-space visas based on two different identities. In theory, this should not have been possible due to the mandatory collection of biometric data upon visa application, and its entry into a central EU maintained database called the Visa Information Service. A previously collected fingerprint under one identity should have alerted the visa issuance officer when the same fingerprints are used for a new visa application under a different identity.

In response to a question from Der Spiegel in this regard, the European Commission replied that:

“..the Visa Information System central system provides Member States with all necessary tools and that such type of fraudulent application should have been detected in the procedure. Further analysis would be needed to determine whether all relevant checks were conducted in line with the obligations stemming from the Visa Code and the Visa Information System Regulation.  Relevant Member States can check the logs of their national visa systems as well as their internal working procedures, to find out whether the decision resulted from a technical or human error (e.g. non-compliance with the procedures indicated in the respective regulations and handbooks)

….

As regards the quality of fingerprints, each Member State is expected to use tools that ensure compliance with the standards established for the Visa Information System central system, including the associated functionality offered by the central system (check fingerprint quality) to ensure that the enrolment of biometric data complies with the agreed specifications. In case of low quality fingerprints, the visa authority should retry their capture.”

 

The post Suspected Accomplice in Berlin Tiergarten Murder Identified as FSB/Vympel Officer appeared first on bellingcat.

29 Aug 20:20

Give the Kids a Break

by Dave Pollard

I wonder if there has ever been a generation that didn’t consider the generations that followed it to be spoiled, selfish and hopelessly foolish?

With cases of CoVid-19 surging in many areas that thought they’d escaped or moved past the worst of it, we’ve now got shaming of “young people” by older people across the political spectrum, for supposedly causing the surge by failing to socially distance and observe other norms.

It is not at all surprising to me that the average age of positive cases has plummeted, since:

  1. There is evidence that, while risk of hospitalization and death is up to two orders of magnitude higher for seniors than it is for those under 30, the likelihood of getting infected is just about the same for every age group. So now that testing is finally being done at a reasonable scale beyond those with serious symptoms, the average age of new infections will inevitably start to converge on the average age of the population as a whole. In fact, it should tend to skew a little below that level, since many of those in hospitals, seniors’ homes and care facilities are still essentially in various stages of lockdown and hence less likely to become infected.
  2. There have been some studies that suggest that among those of working age, more new infections are due to returning to CoVid-19-unsafe work environments than to parties and other social occasions. This virus spreads more the longer that people are in close proximity to each other indoors, and the average work day/week is a lot longer than the average social event.
  3. There is also a growing consensus that the actual infection fatality rate (IFR) — the percentage of all people infected (including asymptomatically) who die, may be only 60% as high as the current case fatality rate (CFR) which is converging on about 1.0%. If that’s the case, then nearly twice as many may have been infected as what the data had been suggesting — and record high confirmed case counts may not lead to record high hospitalization and death rates.

This is not to suggest there’s not cause for alarm — the daily positivity rate (positive tests as a percentage of all tests done) in some areas has jumped up again past the 5% threshold, notably in Spain and many parts of the US where the average is nearly 7% and in some regions it’s over 10%. By contrast, in Canada, Australia and most of Europe it ranges from less than 1%, to 3%. A high positivity rate suggests many new cases are not yet being detected, and hence cases are likely to rise in that area, and many more are likely infectious than official cases would suggest.

But there’s little indication that “young people” are taking the situation significantly less seriously than those of us in riskier age groups. The map at the top of this post shows who is and who is not regularly using masks (the rates for social distancing are comparable). What it suggests is that we don’t take precautions before/until we perceive our immediate risk to be high. The lax social distancing and mask use in Western Canada and in Australia is easy to understand when case, hospitalization and death rates there have been minimal and positivity rates are less than 1%.

I’m a resident of BC, and my observation is that mask use among all ages is still minimal, even indoors, except in establishments that mandate them (in which case, being Canadians, we mostly politely comply). Even now, with rates increasing, there are almost no places in BC where more than one person in a thousand (0.1%) of the community has tested positive, and overall only one tenth of that small number is still infectious (ie was infected in the last 14 days). Even if only a fifth of infections have been reported (which is likely the case in most areas) the risk is still tiny. But as quickly as reported cases rise, I am seeing mask use rise commensurately, voluntarily, and among all age groups.

And as much as I have been infuriated by the laxness of some adult community leaders (business leaders, police, and particularly parents, whose model young children are likely to follow) in social distancing and mask use, I think their complacency is understandable in light of what would seem to be a community-wide unspoken consensus as to their level of risk. And I think it is changing, and will change, as the level of reported cases and deaths rise.

There is also some evidence that many asymptomatic cases, and those who are infectious but wearing masks, spread a relatively small amount (called the “load”) of the virus. This would seem to be a significant reason why new cases and deaths in New York state are now at an astonishingly low level, despite the fact only an estimated 20-25% of its 20M citizens have been infected (only a tenth that number have a confirmed positive test), far below “herd immunity” level. Mask use there is about 60%, and social activity is still 30% below normal, which accounts for much of the improvement. It may just be that at that 60% threshold, many fewer infections are occurring with a high viral “load” transmitted, and hence hopefully new cases and positivity rates will fall and stay below the threshold below which test-and-trace programs can finally be effective.

Even more encouraging, a new research report suggests if your mask exposes you to only a small “load” of the virus from an infected person, you may not only be asymptomatic, you may acquire some immunity to the disease in the process. (Layperson’s explanation of this report here.)

It will be interesting to watch what happens in California, which, after a horrific month, despite mask and social distancing measures comparable to New York’s, has finally managed to ratchet its positivity rate down to 5.5% (below the US average) and its daily deaths per M people down below 3.0. The IHME is betting that won’t be enough to prevent another 30,000 deaths in California (versus almost none in New York) over the next three months. I guess we’ll see.

The chart above, published this week in the BMJ, is probably the best advice we could all take at this point. If you’re thinking of going to a high risk (red) activity, you would be wise to avoid it. If you’re planning a medium risk (yellow) activity, you would best consider taking some action (wear a mask, shorten your visit, and/or get it moved outdoors) to make it into a low-risk (green) activity. All other things being equal, social distancing will help but probably not as much as these other actions.

So, bottom line, I hope we’re willing to give the kids a break. In most places we haven’t been good, or early, models of what we are now wisely preaching. And I don’t think there’s any comparing the thoughtlessness of some “young people” during CoVid-19, to what we “old people” have done on a massive scale to wreak ecological havoc, accelerate climate collapse, rack up unrepayable levels of debt, and exhaust inexpensive non-renewable resources, without giving a tinker’s damn about the consequences to “young people”. People in glass houses and all that.


This is the 11th in a series of articles on CoVid-19. I am not a medical expert, but have worked with epidemiologists and have some expertise in research, data analysis and statistics. I am producing these articles in the belief that reasonably researched writing on this topic can’t help but be an improvement over the firehose of misinformation that represents far too much of what is being presented on this topic in social (and some other) media.

[Postscript for math & stats geeks: Just as I completed this post, IHME announced it’s recomputed its age-weighted IFR, used to calculate estimated actual historical infections, and hence to forecast, based on recent estimated-infections-to-reported-cases ratios, deaths going forward. The old rate was ~0.9%; the new age-weighted rate for the US is 0.66% (it differs for each jurisdiction based on median age). Estimated actual historical infection rates have been increased proportionally, though they remain far below herd immunity levels everywhere. What’s interesting is that they are still using reported deaths in these computations, despite the fact that excess death studies suggest actual CoVid-19 death rates in most developed nations are ~50% higher than reported rates. If you take the new IFR of 0.66% and multiply it by 1.5, guess what you get as an actual IFR? The same 1.0% that rates globally have seemingly been converging on for months. It’s just coincidence, and convenient, that reported deaths and estimated actual infections have both apparently been understated by a third. We just have to be sure that when we’re talking 0.66%, or 1%, we’re referring to the appropriate numerators and denominators. It is doubtful we’ll ever know precisely what the death total, or IFR, actually were — too many uncertainties. But it seems increasingly likely it’s in this range.]

29 Aug 20:20

Reminder: the Earth is still farting methane from exploding permafrost craters

by jwz
29 Aug 02:11

Twitter Favorites: [conspirator0] We downloaded tweets containing "That seals the deal. I am no longer a/an fan. I've been a fan since and a… https://t.co/s2BKszJSRy

Conspirador Norteño @conspirator0
We downloaded tweets containing "That seals the deal. I am no longer a/an <X> fan. I've been a fan since <Y> and a… twitter.com/i/web/status/1…
29 Aug 02:10

Twitter Favorites: [cdemwell] @sillygwailo Well, they WERE secret, way to go

Chris Demwell @cdemwell
@sillygwailo Well, they WERE secret, way to go
28 Aug 23:25

Ethereum is a Dark Forest. A horror story. | by Dan Robinson | Aug, 2020

mkalus shared this story .

If the attacker only tried executing the get transaction, it would revert without calling the set transaction. We were hoping that by the time the attacker had executed both the set and get transactions in sequence to spot the internal call to pool.burn and frontrun us, our transactions would already be included.

To our surprise, the get transaction would get rejected by Infura even when we manually overrode the gas estimator. After several failed attempts and resets, the time pressure got to us, and we got sloppy. We let the second transaction slip into a later block.

It was a fatal mistake.

Our get transaction did get included—but with a UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED error, meaning the liquidity was gone. It turned out that, in the seconds after our get transaction entered the mempool, someone had executed the call and swept the funds.

The monsters had devoured us.

Monsters are real

We knew intellectually that these generalized frontrunning bots existed. But until you’ve actually seen them in action, you’re likely to underestimate them.

We held out some hope that doing the rescue as an internal call via an authorized contract, passing a variable from storage as the to address, might protect us. It didn’t.

If you find yourself in a situation like this, we suggest you reach out to Scott Bigelow, a security researcher who has been studying this topic and has a prototype implementation for a better obfuscator.

Don’t get sloppy

Even under time pressure, we should have stuck to the plan. If we had spent more time on the scripts, tweaked the contracts (perhaps changing the Getter contract to do nothing instead of reverting if called before being activated), or even synced our own node to avoid using Infura, we probably would have been able to get the transactions into the same block.

Don’t rely on normal infrastructure

The weirder what you’re doing is, the harder it will be to jam it through existing infrastructure like Infura. In our case, we were trying to submit a transaction that looked like it would fail based on the current blockchain state, which Infura has reasonable protections against. Using our own node could have sidestepped this problem.

Better yet, if you happen to know a miner (we didn’t), you could have them include the transaction directly in a block, skipping the mempool—and the monsters—entirely.

The future is only going to get scarier

This was just one example of a frontrunning incident. Similar things happen countless times every day. Today, the frontrunners are just bots. Tomorrow, it will be miners.

Miners today leave money on the table by not acting on these opportunities. In the future, they will reorder and submit transactions in their mempools for their benefit. Even worse, they could reorg blocks mined by other miners, in an attempt to steal MEV which was not claimed by them, resulting in chain instability.

We think this future can be prevented. Optimism (another Paradigm portfolio company) has an ambitious vision of how MEV can be redirected for the benefit of the ecosystem, as part of its layer-2 scaling solution, optimistic rollup.

If you are thinking about MEV, or building something in this area, please reach out to us!

Thanks to Alberto Cuesta Cañada, Scott Bigelow, Phil Daian, Charlie Noyes, and Sam Sun for discussions that helped inform this post.

This post is for general information purposes only. It does not constitute investment advice or a recommendation or solicitation to buy or sell any investment and should not be used in the evaluation of the merits of making any investment decision. It should not be relied upon for accounting, legal or tax advice or investment recommendations. This post reflects the current opinions of the authors and is not made on behalf of Paradigm or its affiliates and does not necessarily reflect the opinions of Paradigm, its affiliates or individuals associated with Paradigm. The opinions reflected herein are subject to change without being updated.

28 Aug 23:25

The Dawn's Early Light

by peter@rukavina.net (Peter Rukavina)

The quality of the morning sun changed completely this morning as its position vs. Earth vs. 100 Prince Street saw sunlight streaming in the back windows in a most delightful way at breakfast time.

The sun streaming through the back window this morning at 100 Prince Street.

28 Aug 23:25

The sparkly results of the latest Macro Mondays group challenge

by Carol Benovic-Bradley

Last week, we shared the theme for Macro Monday’s latest group challenge –– glass. From this challenge, participants shared stunning explorations of crystal, jewels, and glass, using light, color, and different angles and edges to create captivating photographs.

GLASS
Glass
Glass
Diamonds are a girl's best friend. About truth and fallacy.
You are the sky. Everything else - it's just the weather. Pema Chodron

To explore a larger selection of photos that were submitted for this theme, visit this gallery.

MM_Glass_2020-08-24

The Macro Mondays group produces weekly macro photography challenges. The theme for this week is “Sound.” To participate, the group asks that you take “a photograph of something designed and built by humans for the specific purpose of making sound (buzzers, bells, instruments, sirens, whistles,…), recording/processing/preserving sound (microphones, mixing boards, records, cds, cassettes, …) or replaying sound (speakers, earphones, radios,…).” Read more details about the theme and the group’s rules and then add your relevant photo to the Macro Mondays group photo pool this Monday, August 31st.

28 Aug 20:29

3 advantages of consent-based decision making

by Doug Belshaw

Note: this builds on my earlier post about consent.

I’ve worked for a number of organisations over the years, in various different industries and sectors. Looking into an organisation as a consultant, though, is interesting because you begin to notice things that you’d perhaps miss if you’re trying to fit in and be there for the long-haul.

One of the things I notice is that there’s a direct correlation between how good an organisation is at making decisions, and how effective it is in achieving its goals. Organisations that have structures and processes for making good, timely decisions thrive. Others stutter and fail.

Many organisations default to hierarchical decision making: whoever is most senior in any given situation makes the final call. That can work, and it’s absolutely the quickest way of getting things done in an emergency. However, the downside is that it breeds resentment: do what you’re told or get out.

The opposite of the hierarchical approach is consensus-based decision making. This is usually seen as the ideal approach if your group has got time to mull things over and get everyone on board. It’s difficult to do well when you’ve got more than 10 people, though, and it’s easy for one or two people to derail the process.

In Sociocracy, groups (‘circles’) are encouraged to instead use consent as an approach to decision-making instead of the hierarchical or consensus-based approaches. In Many Voices, One Song, a book I’ve been reading recently, the authors explain why:

If we ask for unanimous decisions, we ask “do you agree?”, this question tends to focus people on their personal preferences. In consent, we ask “do you object?” and this question includes both the range of tolerance and the personal preference.

We don’t see consent as a watered-down version of consensus. In our experience, consent shifts the energy towards doing, instead of convincing others of our own viewpoint. To focus on the range of tolerance instead of personal preferences means to acknowledge that people’s experiences and perspectives are different and might remain different. With consent, we can still operate together, guided by a shared aim. (p.138)

Ted J. Rau & Jerry Koch-Gonzalez, Many Voices, One Song, p.138

The ‘range of tolerance’ is something which the authors explain as the difference between someone having a personal preference versus them objecting to something.

For example, let’s say there’s a vegetarian who doesn’t particularly like Brussels sprouts, so she never cooks them at home. However, she would eat them if served at a friend’s house for dinner. She has a personal preference rather than an objection.

Of course, business decisions tend to be bit more high-stakes than this, so let’s look at three advantages to consent-based decision making that the authors of Many Voices, One Song outline in their book:

1. Consent balances groups and individuals

With consent, individuals will not have as much power as they have in decisions requiring unanimity. On the other hand, with consent, a majority will not have power over a minority.

Ted J. Rau & Jerry Koch-Gonzalez, Many Voices, One Song, p.134

2. Consent allows for forward motion

It is easier to find common ground when working with the overlap of our ranges of tolerance. Once we have made a decision, we can carry out our plans and evaluate whether the changes bring improvement. Since we learn with every decision made (and we do not learn from decisions not made), every decision made gives us more options to learn and adapt to outside and inside changes. We use the slogan “good enough for now” to encourage groups to innovate and prototype quickly.

Ted J. Rau & Jerry Koch-Gonzalez, Many Voices, One Song, p.134

3. Consent is safe

Like a safety net, consent makes sure that no one can be ignored. If someone objects to a proposal, that person will be heard and the objection addressed. Thus, consent secures equivalence. The slogan here is “safe enough to try” which emphasizes that we only move when it seems safe – but then we don’t hold back.

Ted J. Rau & Jerry Koch-Gonzalez, Many Voices, One Song, p.135

I’m finding this approach increasingly valuable, and would encourage anyone interested in finding out more to come along to an introductory workshop run by Outlandish. They run them regularly, and beginners are very welcome!


This post is Day 38 of my #100DaysToOffload challenge. Want to get involved? Find out more at 100daystooffload.com

The post 3 advantages of consent-based decision making first appeared on Open Thinkering.

28 Aug 20:29

Asimov’s Foundation, and what’s unique about science fiction

Isaac Asimov’s Foundation books were the first real sci-fi I read, at about 9 or 10. Apple is releasing a TV adaptation in 2021 (here’s the teaser trailer) – and I can’t help but feel it misses the point, and what the magic of science fiction is.


You don’t need to have read Foundation to read this post, but let me give you the basics.

The premise of Foundation is that the Galactic Empire collapses. One guy, Hari Seldon, predicts the fall, and using his new science (psychohistory) is able to tell that a 10,000 year dark age will follow. Yet he can create a new future! He can shorten the dark age to only 1,000 years by establishing a new society on a new planet - the Foundation of the title - to guide the galaxy back to new heights. Using psychohistory, he shapes the destiny of the Foundation long after his own death, using recorded messages that appear at pivotal moments over hundreds of years.

Foundation, the story, begins in the middle.

Asimov’s first Foundation stories, written in the 1940s, were set 50 years after Hari Seldon’s death. The Galactic Empire had already fallen, the Foundation was already established – but not entirely aware of its destiny. We meet Seldon only as pre-recorded hologram messages. He uses fake-outs and the holding back of information in order to forge the Foundation into what it needs to become.

The story of Foundation is not the story of Hari Seldon. Fundamentally it’s about what happens next.

  • What are the consequences and limits of true prophecy? What if there was a guy who, long ago, said he could predict the future and his prophecies were true?
  • How does a society respond to Manifest Destiny? By taking it for granted, stirring envy in others, pushing back to find its own path… And how should an anointed, privileged child be nurtured towards self-reliance?

Look, nobody gets to say what science fiction is or isn’t, least of all me.

But, for me, what happens next is, in a nutshell, exactly what is special and unique about science fiction.

Sci-fi is a scientific investigation, and the lab bench is the book. It’s a thought experiment in narrative form.

That’s what you don’t get anywhere else. The author has a setting that goes to great lengths to be plausible: a world, a society, a group of people. Then the subject of the investigation: a dead guy who prophesied the present and the future, blessing the current society in ways beyond its knowing.

What happens next? Sci-fi uses the power and constraint of story to find its way through. And by doing that, discoveries are made.

Like any scientific endeavour it starts as a phenomenological exercise: what’s happening? How does this thing behave in various circumstances? Then beginning to probe: what are its limits? How do we break the premise? And finally consequences… what does it mean for this phenomenon to be wielded deliberately; what are the second order effects when others can see the effects …and so on. Dynamical systems are all the same; the reader can readily draw parallels and discover new truths.

And the new truths are about the present, of course.

Foundation can be drawn out into a study of everything from America and Manifest Destiny, to how to express individuality when growing up with wealth and privilege.

For me, spaceships, distance planets and so on – these aren’t intrinsic to science fiction. They’re lab equipment. They provide necessary narrative distance from the everyday such that the reader (and the author) is able to fully explore the premise. But you could do Foundation without spaceships, if you wanted.

They’re fun, of course.

But ultimately:

Spaceships and futuristic cities are just stage dressing.


After the first short stories and novellas, Asimov went in two directions.

  • Into the future: Subsequent stories cover the next 500 years of the Foundation’s future history.
  • Into the past: the short stories from the 40s were published as books, the Foundation Trilogy, in the early 1950s. The opening chapter, written in 1951, is a mini prequel in its own right and shows us Hari Seldon alive for the first time. It’s set pre-Fall, and we meet Seldon at the heart of Empire, at the height of its glory.

After the main run of Foundation novels, Asimov returned to Seldon, and devoted a couple of books to telling his story.

But Seldon’s life only works as a story if you already know the unbelievable truth, that his prophecies were correct (which is why Foundation should be read in publication order, not chronological). Otherwise he could be just another conspiracy nut.


So, looking at the Apple TV trailer of Foundation, it appears that the show is about Hari Seldon, and it’s set during the impending fall of the Galactic Empire.

What show runner wouldn’t want to put that glamour and rotten decadence on screen? I get it!

BUT.

The science fictional magic of the original stories is that we see the aftermath - good and bad - of Seldon’s truth.

We get to see the maturing of the Foundation under the distance guidance of his dead hand, one that everyone can see is always right – but that is none-the-less stifling for its presence. And perhaps, eventually, might be wrong?

Glamour is shown without ever putting it on-screen (or rather, on the page). We see old Empire only from a great distance, from the dusty frontier planet of Terminus, the home of the Foundation at the edge of the galaxy. And we can imagine its splendour!

The galaxy is more sprawling, Empire is grander, and Seldon more omniscient for never seeing them.

So I’m excited to see Foundation on TV.

But from the trailer it looks like it’s leaning in hard on the far-future fantastical setting – great, but for me that misses what makes sci-fi sci-fi. It’ll be fun to see essentially the Fall of Rome with spaceships and a massive CGI budget…

…but it looks like we’re not going to get to explore the what-ifs that made me fall in love with Foundation to begin with

  • What If Prophecy, but Really,
  • and How to Live with Destiny.

And in the era of algorithms that decide our fate, and ethno-nationalists who say that national past gives us rights over the future, I can’t think of topics that need greater examination today.


My view on sci-fi (which is not universal, of course) is why I have such a strong connection with design as a method for innovation: both put new objects in familiar settings, crank the handle, and trust that the process will lead to new ideas.

Science fiction is how we do design’s thinking through making when the only way to make is to put on a fictionsuit.


A coda

Isaac Asimov was horrible to women. I’ve noticed the lack of women in Foundation for as long as I can remember. What I didn’t know until a few years ago was that Asimov was a serial groper of women, a notorious sexual harasser who was enabled by the science fiction community.

Another note: why aren’t there any aliens in Foundation? Well…

Foundation was published in the magazine Astounding. Editor: John Campbell, whose vision and energy drove the Golden Age of science fiction. It would be hard to overstate his influence. However…

Asimov learned of Campbell’s insistence that humans should always be superior to other races in some way. It was clear to Asimov that Campbell’s own views on race were the source of the imperative: just as whites were superior to other humans, so humans had to be superior to any alien race. Asimov didn’t share Campbell’s views, and he didn’t want his stories to reflect them, even allegorically. (In the robot stories, the problem didn’t exist. Campbell didn’t mind if robots were superior to humans.) For the falling Galactic Empire in “Foundation”, however, Asimov chose to sidestep Campbell’s racial views by creating a galaxy-wide civilization with no alien races – a galaxy inhabited only by humans.

– Asimov Online, The History of the Positronic Robot and Foundation Stories

Ouch.

The history of science fiction is not a proud one.

28 Aug 20:28

Windows Terminal Preview 1.3 Release

by Kayla Cinnamon

We are back with another release for Windows Terminal and Windows Terminal Preview! This release adds all of the 1.2 features into Windows Terminal and introduces new features described below for Windows Terminal Preview 1.3. Both builds of Windows Terminal can be installed from the Microsoft Store or from the GitHub releases page. Let’s check out what’s new this month!

Command palette

The command palette is finally here! This new feature allows you to search through all of the commands available to you in Windows Terminal, similar to the one found in Visual Studio Code. You can invoke the command palette by typing Ctrl+Shift+P. If you’d like to change this key binding, you can add the commandPalette command to the keybindings array in your settings.json.

{ "command": "commandPalette", "keys": "ctrl+shift+p" }

The command palette has two modes: action mode and command line mode. Action mode is the mode you will enter by default and will list all of your Windows Terminal commands. Command line mode can be entered by typing > and you can then enter any wt command, which will be invoked on the current window.

You can also customize actions you’d like to add to the command palette by adding commands to your settings.json file. Your key bindings should automatically populate the command palette. Full documentation on how to add your own commands can be found on our docs site.

Image command palette blog

Advanced tab switcher

We have added an advanced tab switcher to help you navigate more easily between your tabs. This is enabled by default with the useTabSwitcher global setting. When enabled, the nextTab and prevTab commands will use the tab switcher. By default, these keyboard shortcuts are Ctrl+Tab and Ctrl+Shift+Tab, respectively.

"useTabSwitcher": true

Image tab switcher

Tab color setting

You can now specify a tab color for each profile! This can be done by adding the tabColor setting to a profile and setting it to a color in hex format.

Image tab color

💡 TIP: Set your tab color to the same color as your background for a seamless experience!

New commands

We have added some new commands that you can add to your key bindings in your settings.json file. None of the following commands are bound by default.

wt commands as a key binding

We have added the ability to execute wt.exe command line arguments with key bindings. This can be done with the wt command. The commandline property defines the command line arguments you would like to invoke on the current window. More information on wt command line arguments can be found on our docs site.

// This command opens a new tab with PowerShell in a pane, a vertical pane running  the Command Prompt profile in the C:\ directory, and a horizontal pane running the Ubuntu profile.
{ "command": { "action": "wt", "commandline": "new-tab pwsh.exe ; split-pane -p \"Command Prompt\" -d C:\\ ; split-pane -p \"Ubuntu\" -H" }, "keys": "ctrl+a" }

Send input to the shell

If you want to send input to the shell by using a keyboard shortcut, you can do so with the sendInput command. (Thanks @lhecker!)

// This command navigates backwards through the shell history.
{ "command": { "action": "sendInput", "input": "\u001b[A" }, "keys": "ctrl+b" }

Tab search

If you are someone who has a lot of tabs open (like myself), this new command is a life saver. You can now search through your tabs in a new search box using the tabSearch command.

{ "command": "tabSearch", "keys": "ctrl+c" }

Image tab search

Change color scheme

You can set the color scheme of the active window by using the setColorScheme command.

{ "command": { "action": "setColorScheme", "colorScheme": "Campbell" }, "keys": "ctrl+d" }

Bug fixes

🐛 You can now specify which types of formats you would like to copy.

🐛 Profiles whose indices are greater than 9 will now properly display their shortcuts in the dropdown. (Thanks @MichelleTanPY!)

🐛 altGrAliasing: false will no longer break AltGr

Top contributors

We had a lot of wonderful contributions this month and we’d like to recognize those who especially made an impact!

Contributors who opened the most non-duplicate issues

🏆 KalleOlaviNiemitalo

🏆 skyline75489

🏆 Fcscanf

🏆 pcgeek86

Contributors who created the most merged pull requests

🏆 j4james

🏆 MichelleTanPY

🏆 javierdlg

🏆 lhecker

🏆 schorrm

Contributors who provided the most comments on pull requests

🏆 mrange

🏆 j4james

🏆 schorrm

Until next time

We hope you like these latest additions to Windows Terminal Preview! All of our documentation can be found at docs.microsoft.com. If you have any questions or feedback, feel free to reach out to Kayla (@cinnamon_msft) on Twitter. If you find any bugs or would like to request a new feature, you can file a new issue on GitHub. We will see you in September for our next release!

Image 08 2020 signatures

The post Windows Terminal Preview 1.3 Release appeared first on Windows Command Line.

28 Aug 20:27

Single, Married, Divorced, Separated, Widowed

by peter@rukavina.net (Peter Rukavina)

Why my dentist needs to know that I’m “widowed” I do not know. But it’s the first time I’ve had to check that box.

28 Aug 20:25

Two.js for two-dimensional drawing and animation in modern web browsers

by Nathan Yau

“Two.js is deeply inspired by flat motion graphics. As a result, two.js aims to make the creation and animation of flat shapes easier and more concise.” It also renders in webgl, canvas2d, and svg, with not much change in your code. Two.js is definitely going on my list of things to try.

Tags: animation, JavaScript

28 Aug 20:23

Triples are Great, Change My Mind

by noreply@blogger.com (VeloOrange)

By Scott

Recently, I've seen an upward trend in sales of Triple Cranksets here at VO. I've talked to more than a few folks on the phone and online about getting their bike set up with a triple system. It's an interesting trend considering that the wider bike world seems to be moving folks onto 1x systems for road and touring bikes.

Three rings, no waiting

I've been a touring cyclist for all my life (OK, I had one summer when I was a teenager when I tried racing, but we all have that one-time deviation from our true love) and for all of it, I've used a triple. Part of it is related to the fact that I started touring by modifying a mountain bike. I took off the heavy mtb knobby tires and put on slicks or semi slick tires. Threw on a rack or used our early 90's versions of frame bags and seat bags to carry stuff along the Oregon coast, around Tasmania or through the wilds of Sweden. I rode primarily in the middle ring (usually a 34-36 tooth ring) and then when the hills went up, you dropped it down into the inner ring (a tried and true 24 tooth, sometimes made of exotic stainless steel) and when the hill went down, you moved the chain up to the 48 tooth outer ring. You pedaled as long as you could and then you coasted/tucked into an aero position. Simple right?

1x systems came into being in the MTB world - Simplicity they said! No more dropped chains or busted chains from shifting under huge strains! Lighter overall weight! I just don't see it being useful in a touring/city world, in spite of the efforts of the big component companies to promote 1x systems for road/touring use. When it comes to 1x systems, I just see a system that replaces weight on one end - the crank, with more weight in the rear - a huge cassette.

For reference, those huge 12-46 T cassettes weigh 498 gr on my scale. A 12-36 cassette I would run - 408 gr. My triple set up here is 90 grams lighter.

For crank weight, I've grabbed a SRAM 1x drive side arm (with axle attached) which weighs 544 gr. Add on external BB cups at 110 gr for a total of 654 gr.  A VO triple crank (drive side) is 544 gr. Add on a BB to ours and that is an extra 226 gr for a total of 770 gr. The 1x system gets the win here being 116 gr lighter.

If you add on the weight of a left shifter and some cables and housing, yes, my triple set up comes out heavier, but by probably less than 200 gr overall. In a touring or commuting set up, I don't see this as something that would push me one way or the other.

I see 1x systems lacking in the gear range they offer. If we use my VO triple with a 24T inner and a 36T rear cassette cog as my example, it gets me a low gear of 18.2 inches. On the 1x system, the front 42T ring combined with a 46T rear cassette results in a low gear of 24.9 inches. So the old school triple gets you a lower gear, which for most of us, is the number we are truly concerned about while riding. Plus on a more traditional cassette, the gaps between cogs are smaller which makes adjusting for my cadence more natural, rather than the huge gaps in 1x systems.

As to simplicity, I think the product designers/marketing types are over emphasizing how much people shift. I always left the chain in the middle ring, unless I hit a steep uphill or downhill. I was essentially in a 1x system 90% of the time, but with the option to get a bail out at any time. A properly set up front derailleur should be fine in 99% of the situations most of us see ourselves in.

So, chime in. Tell me if I'm a stick in the mud or if you agree that triples (along with 26" wheels, but that is a different blog post) aren't dead yet!

28 Aug 20:22

Keeping a Daily Log

by peter@rukavina.net (Peter Rukavina)

After Ton first mentioned Obsidian, I decided to try it out: like Ton I’m looking for a way out of Evernote, but I’m also looking to become better at making notes about projects and plans in a trusted repository so that I can refer back later as a resource (on the job we’ve used Trac for more than a decade now, and it’s proved invaluable to be able to refer to the copious notes my younger self took).

Obsidian has a simple plug-in called “Daily Notes” that makes it slightly easier to create a new note every day, and, on a lark, I started to do this, noting things under three headings: “Work,” “Projects,” and “Home & Family,” with an additional “Accounting” thrown in on money-handling days.

To my surprise, I’ve kept it up for the last 49 days:

Screen shot of a part of Obsidian, showing my daily notes.

My father kept a daily log from the mid-1960s until he died. He started off on paper, and moved to using a computer in 1990. It was that log we consulted when we wanted to known where we watched the walk on the Moon in 1969. I have 28 years worth of his digital log in a file on my computer: it’s a plain ASCII file with 301,543 lines in it. Reading it now, I realize that I use exactly the same style and voice as he did for all those years, and cover much of the same ground, freely mixing work, family and projects.

Here, for example, were his notes from August 27, 1993, 27 years ago today:

  • hot weather continues
  • called for rates of alternative long-distance service
  • called William Dam Seeds and Hank at RBG re winter rye/wheat, when to turn under the buckwheat
  • winter rye not available at Millgrove Feed till September 10
  • to CCIW at 1215 to pickup Chris for goodbye lunch at La Trattoria
  • Chris and I worked through documentation of cleanup of files, gave Harry Pulley the format for numeric data
  • Chris back to university on Monday
  • PM: entered all cash data in budget

Among my notes for today:

  • Moved the explanatory Moon copy from results pages to the generic Moon Phase Calendar index page.
  • DNS updates for gardenplanner.almanac.com.
  • Got confirmation that I could transfer the AccountEdge license to Windows from Mac and did so: worked without problems.
  • Lunch at Madame Vuong’s.
  • Got Oliver’s prescription refilled at Parkdale Pharmacy.

When I cracked open Dad’s log after he died, I thought I might find deeper insight into my father, some undiscovered aspect of his personality that might explain him, and me, and fatherhood.

But I didn’t.

I found “tilled middle garden” and “DLed and tested some BBS files” and “ran memmaker on 386H.”

Where there are references to me they are things like “email from Peter, not interested in Honda after all,” and “call from Peter, their house offer has been accepted,” and “big breakfast of potato pancakes made by Peter with new food processor.” And I realized that he wasn’t writing for anyone other than himself. And I’m doing the same thing.

There is utility, I have found, in creating a running reference: I couldn’t remember when an intake worker had called me from the government in July, and then I remembered that I noted it. And I’ve got our new refrigerator’s serial number noted so that when it breaks in 20 years, I’ll know where to look. But more so than any practical reference, I think there’s value in noting the events of each day as a way of simply processing what happened, developing a sense of progress (or not), realizing that when it feels like nothing at all has been happening, there’s actually been a lot.

So I’ll keep at it.

Screen shot from Obsidian, showing note

28 Aug 20:19

It’s OK If Members Aren’t Building Close Relationships

by Richard Millington

If you’re managing a community, there’s a natural pressure to try and create a destination where friendships are forged and people feel like they can belong.

And in many communities (notably around hobbies, health, and smaller groups) that’s the right approach.

But in many other communities, especially customer communities, that’s neither what members want nor what they need. You can waste a lot of time and cause a lot of frustration trying to build close relationships between members who neither need nor want them.

A sense of belonging is just one of many types of value a community offers. It’s not even the most valuable one.

In almost every member survey I’ve seen, access to information, collaborating with smart people, and seeing what others are doing, ranked higher than building friendships and feeling a sense of belonging.

Yes, the word ‘community’ has clear connotations, but that doesn’t mean those connotations are right to you. If you don’t feel members want to build relationships with each other (you can check with a survey), then you don’t need to push them to. You can focus on what they really want instead.

28 Aug 20:19

Unravelling augmented arithmetic assignment

by Brett Cannon

Prologue

This post is part of a series on Python's syntactic sugar. The latest source code can be found as part of the desugar project.

Introduction

Python has something called augmented arithmetic assignment. If you're not familiar with that phrase, it's basically when you do some math while at the same time doing an assignment, e.g. a -= b is augmented arithmetic assignment for subtraction. Augmented assignment was added to the language in Python 2.0.

Dissecting -=

Because Python does not allow for overriding assignment, how Python implements augmented assignment might not be quite what you're expecting compared to other operations that have a special/magic method.

First, know that a -= b is the same as a = a - b semantically. But also realize that if you know upfront that you're going to be assigning the same object to a variable name, you might be able to do something more efficient than a blind a - b operation. For instance, probably the simplest application of this potential benefit is avoiding creating a new object: if you can mutate an object in-place then returning self  is a lot cheaper than constructing a new object from scratch.

As such, Python supports a __isub__() method. If it's defined on the left side of the assignment (often called the lvalue) then it's called with the right-hand of the assignment (often called the rvalue). So for a -= b, an attempt will be made to call a.__isub__(b).

Now, if that call results in NotImplemented or simply doesn't exist, then Python falls back to a normal binary arithmetic operation: a - b.

And regardless of which approach is used, the returned value gets assigned back to a. As simplistic pseudocode, a -= b breaks down to:

if hasattr(a, "__isub__"):
    _value = a.__isub__(b)
    if _value is not NotImplemented:
        a = _value
    else:
        a = a - b
    del _value
 else:
     a = a - b
Pseudocode for implementing a -= b

Generalizing the approach

Thanks to already having implemented binary arithmetic operations, generalizing augmented arithmetic operations isn't too complicated. By passing in the binary arithmetic operation function and doing some introspection on it (and any potentially raised TypeError), it can be generalized rather nicely.

def _create_binary_inplace_op(binary_op: _BinaryOp) -> Callable[[Any, Any], Any]:

    binary_operation_name = binary_op.__name__[2:-2]
    method_name = f"__i{binary_operation_name}__"
    operator = f"{binary_op._operator}="

    def binary_inplace_op(lvalue: Any, rvalue: Any, /) -> Any:
        lvalue_type = type(lvalue)
        try:
            method = debuiltins._mro_getattr(lvalue_type, method_name)
        except AttributeError:
            pass
        else:
            value = method(lvalue, rvalue)
            if value is not NotImplemented:
                return value
        try:
            return binary_op(lvalue, rvalue)
        except TypeError as exc:
            # If the TypeError is due to the binary arithmetic operator, suppress
            # it so we can raise the appropriate one for the agumented assignment.
            if exc._binary_op != binary_op._operator:
                raise
        raise TypeError(
            f"unsupported operand type(s) for {operator}: {lvalue_type!r} and {type(rvalue)!r}"
        )

    binary_inplace_op.__name__ = binary_inplace_op.__qualname__ = method_name
    binary_inplace_op.__doc__ = (
        f"""Implement the augmented arithmetic assignment `a {operator} b`."""
    )
    return binary_inplace_op
Generalizing the implementation of augmented assignment

This makes defining support for -= to be _create_binary_inplace_op(__sub__) and everything else is inferred: the function name, what __i*__ function to call, and the callable to use for when the binary arithmetic operator is fallen back on.

How I discovered  hardly anyone uses **=

While I was writing the code for this blog post I ended up getting an odd test failures for **=. In all the tests that made sure __pow__ was called appropriately as a fallback, the test failed when I ran against the operator module included in Python's standard library. My code passed fine, but usually when there's a discrepancy between the code I wrote and what's coming from CPython it means I messed up somehow. But no matter how much I scrutinized my code to see how I was doing it wrong, I couldn't see why the test would pass for me but fail in the reference case.

I decided to dig a bit deeper to see what was going on in CPython itself. I started by disassembling the bytecode:

>>> def test(): a **= b
... 
>>> import dis
>>> dis.dis(test)
  1           0 LOAD_FAST                0 (a)
              2 LOAD_GLOBAL              0 (b)
              4 INPLACE_POWER
              6 STORE_FAST               0 (a)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE

That led me to INPLACE_POWER in the eval loop:

        case TARGET(INPLACE_POWER): {
            PyObject *exp = POP();
            PyObject *base = TOP();
            PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
            Py_DECREF(base);
            Py_DECREF(exp);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
https://github.com/python/cpython/blob/v3.8.3/Python/ceval.c#L1677

That then led to PyNumber_InPlacePower():

PyObject *
PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
{
    if (v->ob_type->tp_as_number &&
        v->ob_type->tp_as_number->nb_inplace_power != NULL) {
        return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
    }
    else {
        return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
    }
}
https://github.com/python/cpython/blob/v3.8.3/Objects/abstract.c#L1172

Huh. So the code calls __ipow__ if it was defined, but it would only call __pow__ if __ipow__ was missing. What should have happened is if calling __ipow__  didn't work out due to NotImplemented being returned or simply not existing, then __pow__ and __rpow__ should be called as appropriate. In other words the code was explicitly skipping the a ** b fallback semantics by accident if __ipow__ existed!

This was actually partially noticed and filed as a bug almost 11 months ago. I revived the issue and started a conversation on python-dev about it. As of right now it looks like this will get fixed in Python 3.10 and we will need to add a notice in the documentation for 3.8 and 3.9 about the buggy semantics for **= (the issue probably goes farther back, but older Python versions are in security-only maintenance mode so they won't get the documentation change). This very likely won't get backported as it is a change in semantics and could be rather hard to diagnose if someone is accidentally relying on the buggy semantics. But the fact that it took this long to notice suggests that **= isn't used too extensively as taking the shortcut of implementing just __pow__ rather than __ipow__ would have caused someone to notice this sooner.

28 Aug 20:19

My university degree was life-changing. Putting them out of reach is elitist and wrong

Sarah Maddison, The Guardian, Aug 28, 2020
Icon

When I was young I made a life-changing decision: I wouldn't worry about student debt. "They can't take the knowledge back from me," I reasoned. I was saddled with this debt until I was well into my forties. But my education (not my degree, which I barely valued at all) made all the difference in the world. Most people wouldn't make the decision I made, especially now that the size of student debts has soared. And that's the point of this article. "Putting this education out of reach for students who are already economically insecure is elitist and it is wrong. It will make us a smaller, meaner and stupider society." Every time tuition increases, every time the cost of books increases, every time a new barrier is put into place, we become a little smaller and a little meaner.

Web: [Direct Link] [This Post]
28 Aug 20:18

Overthinking CSV With Cesil: Documentation in 2020

by kevinmontrose

It goes without saying that a library’s documentation is important, and Cesil is no exception. Cesil has two broad kinds of documentation: handwritten wiki documentation, and automatically generated reference documentation.

The handwritten documentation is all in a GitHub Wiki, which means it’s basically just a bunch of markdown files sitting in a git repository. This means there’s revision history, diffing, and editing is as simple as pushing to https://github.com/kevin-montrose/Cesil.wiki.git. I wrote high level documentation in the wiki, covering things like using Contexts and an overview of the Default Type Describer rather than covering individual methods.

The automatically generated documentation is extracted from C#’s Documentation Comments. Every member of a type can have a structured /// comment which, in conjunction with some well known XML tags, can be used to create an XML file that editors understand. As an example this pop in Visual Studio:

comes directly from this code comment. Generating this is built into Visual Studio, you just need to check this box:

or you can pass -doc to the compiler. The C# compiler will raise a warning whenever a public member lacks a documentation comment, so by treating warnings as errors (which can also be seen above) I effectively force myself to write some amount of documentation.

Nothing about Documentation Comments is new, they’ve been in C# since 1.0. What is relatively recent is the DocFX tool, which makes it considerably easier to generate static html for a C# project’s reference documentation than it used to be. With a simple enough script, Cesil’s reference documentation is now easily generated, checked into its repo, and served up as a set of GitHub pages. DocFX does have some limitations currently, the biggest one being that it is not aware of nullable reference types.  I’ve taken a whack at adding that functionality in a draft PR, but it’s not a trivial change unfortunately.

It’s a pity that something so important as documentation is rarely all that interesting to write about. Perhaps something meatier will come out of all the Open Questions raised in previous posts, because that’s what the next post will coverOpen Questions all have corresponding Issues in Cesil’s GitHub repository.

28 Aug 20:14

Building a C program with dependencies in a container with Earthly

Every time I build an open source project from scratch, I end up installing a bunch of dependencies. And often it's tricky to get the build working the same way on multiple systems. And it's even harder to get new people started on a project.

So just containerize it, right? So far I have found that Docker containers work great for web applications. I get an accurate copy of the standard production environment inside a container, and I can still edit files and use my web framework's auto-reload feature. Here's an example, the web.sh script in the Pinfactory project. All the dependencies get installed in the project Dockerfile, and then the source code (including all the HTML templates, CSS, and graphics) is in a volume shared into the container. This way I can do a flask run inside the container, and when I edit a file in the volume, it Just Works and auto-reloads. Pinfactory is easy to work on in containers. You can run one script to do all the unit tests in a container, one script to start up a web server with real data, and there's even a tricked-out demo script. that creates a container with multiple users. Containerizing web applications is a win for small stuff, too. Here's a simple Dockerfile for a Jekyll project that I can use to preview a relatively large Jekyll site locally, without installing any Ruby packages.

Containers for developing and testing web sites locally are great. So what about containerizing a regular software build?

Building a simple tool to sign files

I run my own mail server and other services. (My blog is on a VPS with a static site generator.) That means tracking and deploying a bunch of files that end up in a bunch of different places, on systems running a variety of Linux distributions.

I want to be able to sign important files, and check signatures, so I'm looking for a good, lightweight digital signature tool.

Looking around, I found signify, the OpenBSD tool to sign and verify signatures on files, in a portable version. Looks like just what I need. Sign stuff, check the signatures of files on a remote system, not a lot to configure, easy to script. Also, good practice for a new way to make a software build easy to manage and repeatable.

Signify has a very nice build that facilitates what I want to do, driven by a well laid-out Makefile. I can build a statically linked signify, and the man page, that will work on all my Linux systems of whatever distribution. Signify is also a good example of a program to build and install, because it includes an interesting dependency and a step where the Makefile needs to check a signature of the dependency.

Driving the build with Earthly

Earthly is a build automation tool for container-based tools. It uses the Docker daemon to manage containers. I have run it with both docker.com's Docker Engine and with the Docker packages for Fedora 32: moby-engine and docker-compose.

Earthly is controlled by an Earthfile, which is like a Dockerfile, broken out into targets like a Makefile. Each target produces an entire container image, including all side effects. If anything in your build leaves stray files behind in /tmp or the user's home directory, they will be persisted.

The install is simple—it's a single binary. The install instructions on the Earthly site will put it in /usr/local/bin by default, but there's nothing else to add or configure besides Earthly and Docker. More info: Earthfile reference

There is an example Earthfile for a C++ project with CMake that I'll use as a starting point.

Planning a Signify build.

My Signify build will have to be a little more complicated than just installing the packages I need from the package manager, copying the Signify source code into the container, and then running make.

In order to make a static build with signify's bundled copy of libbsd, I will also need to download and verify a libbsd release. The signify Makefile already knows how to download libbsd and build it into a statically linked signify binary. All I have to add to do is

make BUNDLED_LIBBSD=1 static

But if I do that, every time I do a build, I have to go out on the network. Behind the scenes, the signify Makefile is running wget to download first the signature for the libbsd release...

    $(WGET) -cO $@ '$(libbsd_ASC_URL)'

and then the tar file.

    $(WGET) -cO $@ '$(libbsd_TAR_URL)'

So I really want to separate the download step from the build step. I want something like this.

  1. Set up the base system and save a container image.

  2. Download libbsd and save a container image.

  3. Copy my current version of the code into the container, do the build, save the build artifacts.

Step 3 shouldn't require any network access, so should be really fast. As fast as a regular make, anyway.

First try, first FAIL

Here's my first attempt at step 2. I'll take advantage of the nice libbsd-download target in the signify Makefile, and do this right after I copy the code into the container.

COPY --dir . /code
RUN make BUNDLED_LIBBSD=1 libbsd-download

No, wait, libbsd-download needs to check the signature. Make that:

COPY --dir . /code
RUN gpg --import /root/keys/libbsd.asc
RUN make BUNDLED_LIBBSD=1 libbsd-download
SAVE IMAGE

When I first tried this, I was not able to make the libbsd-download target, because GPG tried to leave a socket behind under .gnupg in the build user's home directory.

+build | ERROR: (RUN [make BUNDLED_LIBBSD=1 static]) executor failed running [/bin/sh -c  /bin/sh -c 'make BUNDLED_LIBBSD=1 static']: buildkit-runc did not terminate successfully: context canceled: context canceled
Error: solve side effects: build error group: solve: failed to solve: rpc error: code = Unknown desc = failed to compute cache key: failed to create hash for /root/.gnupg/S.gpg-agent: archive/tar: sockets not supported

If you found this page by Googling for archive/tar: sockets not supported, here's the answer. It's a known bug in buildkit, the software build system maintained as part of Moby, which is the open-source project that forms the basis of Docker. Earthly has fixed the problem by updating to the new version of buildkit.

If you're still seeing this error, you can (1) upgrade your Earthly and Docker, (2) don't try to do any build steps that run GPG until the final target, or (3) remove the sockets by adding

RUN rm -f /root/.gnupg/S*

before the SAVE IMAGE.

So my first attempt at getting Signify to build was:

  • copy the signify sources over
  • import the key
  • Do a make libbsd-download
  • remove the GPG sockets because they can't be saved in the container image
  • finally, save the image.

In Earthfile, that looks like this.

RUN gpg --import /root/keys/libbsd.asc
RUN make BUNDLED_LIBBSD=1 libbsd-download
RUN rm -f /root/.gnupg/S*
SAVE IMAGE

But that's a sub-optimal solution.

Splitting out download, copy, and build steps

The problem with the above method is that if I change something in the signify source code, the Earthly build has to go download libbsd again.

This is slow, and bad style, and it means if you need to make a quick change to the C source code, the build still goes and gets some unchanged dependencies.

Ideally you have all your dependencies stored locally, so if there's a network outage, or a trade war, or some developer rage-quits and takes their downloads page down, the build will still go brrrrr. Not that anything like that would happen in the case of signify, but you never know. And since Earthly is new enough that early Earthfiles will end up being copied and changed for generations, like Makefiles, I might as well figure out a generally good way to do it.

Making it all work.

So here's the solution I came up with. First, I'll get the base system set up. This should be familiar to Docker users. The root user is going to need a copy of the public key needed to check libbsd, so we'll get that too.

# build.earth
FROM debian:stable

# install build dependencies, then clean up system packages
RUN apt-get -y update && \
    apt-get -y install build-essential file make gcc git pkg-config wget && \
    apt-get -y --purge autoremove && \
    apt-get -y clean 

# Fetch the public key for the libbsd release.  This will be needed in
# the build step.
RUN mkdir -m 700 -p /root/keys /root/.gnupg
RUN wget https://www.hadrons.org/~guillem/guillem-4F3E74F436050C10F5696574B972BF3EA4AE57A3.asc -O /root/keys/libbsd.asc

WORKDIR /code

Now it's time to get the bundled libbsd. Instead of running the entire make libbsd-download, we'll just grab the files. We can apply the "Don't Repeat Yourself" principle to the URLs, by having the Makefile tell us what they are, using the libbsd-print-urls target.

bundle:
  # This target downloads the bundled libbsd.  This should only run again
  # if the Makefile changes.
  RUN mkdir /bundle
  COPY Makefile /bundle

  # The Makefile includes a "libbsd-print-urls" target that prints the 
  # URLs of the libbsd files needed to work with this version of signify.
  RUN (cd /bundle && make BUNDLED_LIBBSD=1 libbsd-print-urls | xargs wget)
  RUN rm /bundle/Makefile

  # Now all that is left in /bundle is copies of the files listed by
  # libbsd-print-urls.
  SAVE IMAGE

At this point, we have a container image with the libbsd code and signature in /bundle, and the key needed to check it in /root/keys. Now it's time to copy in the actual code, and add the libbsd files.

code:
  # Copy everything, then copy the libbsd files in.
  FROM +bundle
  COPY --dir . /code
  RUN cp /bundle/* /code
  SAVE IMAGE

The code target will get re-run any time that anything gets changed. But it's fast because it's just local copies.

Hooray, time to build. We'll do a quick touch on the libbsd files so that the helpful and full-featured Makefile doesn't try to get them again, then make the executable, make the compressed man page, run the test suite, and save the artifacts.

build:
  FROM +code

  # The modification date on the libbsd source and signature needs to be
  # new enough for the build not to try downloading it again.
  RUN find . -maxdepth 1 -name 'libbsd*' -exec touch '{}' ';' 

  # The build requires a GPG verify, so import the key
  RUN gpg --import /root/keys/libbsd.asc

  # Make the statically linked binary and the compressed man page.
  RUN make BUNDLED_LIBBSD=1 static signify.1.gz

  # Run the regression tests. (Even though signify is already built with
  # bundled libbsd, we need to use BUNDLED_LIBBSD to keep from checking
  # for a system installed copy.)
  RUN make BUNDLED_LIBBSD=1 check

  # Save the static binary and the man page
  SAVE ARTIFACT signify AS LOCAL signify
  SAVE ARTIFACT signify.1.gz AS LOCAL signify.1.gz

No need to SAVE IMAGE a container image at this point, because I just need the two artifacts.

And it's all done.

Right now Earthly is pretty new, so most of the discussion is happening on the GitHub page.

There is also a Gitter channel for user questions.

The project is responsive to issues and suggestions—they implemented my suggestion to move the cache out of /tmp and into what I think should be the FHS-compliant place for it. Watch the Examples on their docs site for more sample builds.


This article and modified versions of this article may be copied and redistributed under the same terms as Earthly.

This article and modified versions of this article may be copied and redistributed under the same terms as Signify.

Markdown source for this article: signify/README-earthly.md at earth-wip · dmarti/signify

28 Aug 20:13

Mexican bean shakshuka

The first time I ever tried a shakshuka I cooked it from this recipe by J. Kenji López-Alt. It quickly became my favourite breakfast.

The only good thing about this pandemic is that I've got to spend more time cooking. I've developed a variant on Kenji's shakshuka that I'm calling a Mexican bean shakshuka. It's delicious. Here's how to make it.

Mexican bean shakshuka with three eggs cooking in a cast iron pan

Ingredients

  • Red bell pepper, chopped small
  • Medium-sized red onion, chopped small
  • Olive oil (3 tablespoons)
  • 4 eggs
  • 3 cloves garlic, minced
  • 2 cans tomatoes (I use Muir Glen fire roasted diced tomatoes)
  • Half a can of black beans
  • 2 teaspoons cumin
  • 1.5 tablespoons paprika
  • Some salt
  • A chipotle pepper in adobo sauce (or half a pepper depending on your spiciness tolerance) - finely chopped

The crucial ingredient here is the chipotle pepper in adobo sauce (I use this La Morena one). If you've never encountered these before they are absolute magic: a total explosion of flavour, and I keep on finding new uses for them (most recently spaghetti bolognese). The can contains 6-8 peppers and I only use one for this recipe (finely chopped) - thankfully once opened it lasts in the fridge for a couple of months.

Directions

There are three phases: charring the peppers and onions, cooking the sauce and poaching the eggs. It takes 25-30 minutes total.

  1. Heat 3 tablespoons olive oil in a large frying pan (or cast iron pan)
  2. Add the chopped bell pepper and onion
  3. Cook without stirring for 6 minutes - the idea is to get the ingredients to char a little
  4. Stir once, then cook for another 4 minutes
  5. Stir in the minced garlic and cook for 30 seconds
  6. Stir in the cumin and paprika
  7. Add the two cans of diced tomatoes, half can of black beans and the finely chopped chipotle-in-adobo. Mix well.
  8. Simmer for ten minutes, stirring occasionally.
  9. Make four equally spaced indentations in the sauce using a large spoon, place an egg in each one, then sprinkle the yolk with some salt
  10. Cover with a lid and allow the eggs to poach for six minutes.
  11. Serve!

Kenji's recipe includes photos illustrating how the egg poaching step works.

The great thing about a shakshuka is that it's an incredibly flexible dish. Once you've mastered the basic form it's easy to come up with new tasty variants based around the key idea of poaching eggs directly in the sauce. I sometimes make breakfast "shakshukas" out of leftovers from the night before - bean chiles and Indian curries have worked particularly well for that.

28 Aug 20:12

Apple’s true-wireless earbuds market share falls amid rising sales

by Jonathan Lamont
AirPods

Apple’s AirPods sales continue to grow, but rapid market expansion saw the company’s dominance of the true-wireless (TWS) earbuds market tumbled significantly.

According to data from Counterpoint Research (via Bloomberg), AirPods sales are estimated to rise from 61 million last year to 82 million this year. Despite the increase, Apple’s market share fell from nearly 50 percent to around 35 percent.

That dramatic change, alongside rising sales, suggests the TWS market is growing. Bloomberg notes that affordable alternatives from rival companies have eroded Apple’s market share. Counterpoint suggests China-based Xiaomi holds 10 percent of the market while South Korean electronics giant Samsung takes third place with six percent.

Bloomberg notes two major factors in Apple’s eroding dominance. The first is price, with a variety of new TWS earbuds targeting the mid-range and low-end markets with significantly lower costs than AirPods (which range from $219 to $329 in Canada).

The other factor is support. AirPods work best with Apple devices, like iPhones and iPads. Many of the best AirPods features don’t carry over to Android phones. As such, Android users likely won’t choose AirPods, as they’ll pay more and get less compared to other brands.

The result is a diverse market, with high-end offerings like the $250 Samsung Galaxy Buds Live, $240 Google Pixel Buds and mid-range options like $109 OnePlus Buds. These mostly match Apple’s AirPods capabilities while coming in at a lower price and offering wider capabilities with support for both iPhones and Android smartphones.

Finally, Bloomberg expects competition to intensify between Apple and Samsung. With the South Korean company’s expanded earbuds lineup, it’s expected to more than double its TWS sales this year from 8 million to 17 million.

Source: Bloomberg

The post Apple’s true-wireless earbuds market share falls amid rising sales appeared first on MobileSyrup.

28 Aug 20:10

The American Death Cult

by Anil Dash
The American Death Cult

A significant percentage of conservative culture in America defines “freedom” as death. This is causing a lot more problems right now than even its usual horrible effects.

Some explanation, for those who may not have context. Why do we need to have guns? To protect our freedoms! Well, what about the fact that those guns radically increase the odds of a member of our family shooting themselves or others, either accidentally or intentionally? That’s freedom. Why do we have to build our cities, suburbs, and infrastructure around cars? To protect our freedom! Well, what about the fact that cars kill us either quickly through crashes, or slowly through climate change? That’s freedom.

Why do we still have vaccinations as an optional choice in many circumstances? To protect our freedom! Well, what about the fact that this hurts herd immunity and causes more deaths? That’s freedom.

Why have we carved out reproductive healthcare for non-men as an area where we consistently prevent people from getting access to necessary medical services? To protect our freedom! What about the fact that this kills people regularly? That’s freedom.

Why can’t we provide universal healthcare? Why can’t we reduce pollution and undo environmental racism? Why can’t we prevent police from murdering people? Because, for a small minority of Americans who disproportionately control policy and culture, the only meaningful freedoms they’ll protect are the ones that can cause death, especially for the vulnerable or marginalized, but if it’s the death of their own family members or even themselves, that’s okay too.

I get a lot of criticism when I call this death cult a death cult. I understand why; it seems thoughtless or cruel. Many times we want to ascribe this pathology to a lack of education on people’s part, or a lack of access to critical services or support that might convince them otherwise. I’m generally sympathetic to that point of view, but it’s hard to reconcile that as a fundamental cause when these beliefs are also held by many of the most powerful, wealthy and (conventionally) educated people in the country.

But it's worth noting, even those raised in these cultures call it a cult themselves.


One aspect I may not have much of a grasp on is how people’s faith affects their views on these things. White evangelical Christians have a view on death that is, frankly, impossible for me to understand from outside. They regularly talk about welcoming death, and see things like eagerly encouraging the deadly final reckoning of everyone in the world as a positive that they want to accelerate. This leads to oddities like supporting Zionism because they’re in a hurry to have Jews die in an apocalyptic final battle, which they think is being nice to them? I will readily admit that I can't coherently explain this position; it is hard for me to understand death cults.

The thing is, despite these absurdities, it's really important that we start to call the thing what it is. Because many people aligned along the spectrum of liberals to progressives to leftists are still operating as if we can rationally argue with these viewpoints, and attempting to use logic to persuade people not to participate in the cult.

For example much of the framing for the battles around responding to the COVID pandemic is based on presenting the logical, rational, scientific argument around certain risks, generally culminating in a plaintive declaration, "If we don't do this, more people will die!"

The broken part of this tactic is that it presumes that those being reasoned with are against people dying. Thoughtful, well-intentioned people really struggle with anticipating a response of "So what?" when presented with the incontrovertible risk of innocent people dying. So, we have to fit our views to the facts, rather than to the values that our heart hopes all people would agree upon. Once we actually see the counterargument for what it is, their responses are predictable.

When a gunman shoots a room full of kindergarteners, we attempt an argument saying, "if we don't make these changes, another room full of kindergarteners could die!" And they say, "So what?" We argue that healthcare must be universal, or else people will regularly die simply for not being wealthy. And they say, "So what?"

There is no rational, logical reason for not responding with all of our hearts and minds to save lives in this pandemic. But the small, extremist death cult that controls what's politically possible in this country sees those lives about to be lost, and says, "So what?" And the rest of the rational world looks on aghast, attempting to use whatever persuasion they can to bring these people around, desperately trying to cling to civility and an appeal to decency.

It's not going to work. We have to do the right thing despite the nihilistic desires of the death cult. They're going to get mad about it, and they're going to call us nasty names and accuse us of terrible things for trying to save lives. So what?

28 Aug 20:10

I’m Asking My Friends on the Left to Vote for Joe Biden

by Anil Dash
I’m Asking My Friends on the Left to Vote for Joe Biden

With authoritarianism at our door, the policies that progressives are driving for will be dependent on whether the fundamental institutions of democracy are protected at all.

I believe every vote needs to be earned, and every candidate needs to be worthy of that vote on the strength of their policies. So, no surprise, I know a lot of people who are progressives or leftists who are skeptical or completely unconvinced about voting for Joe Biden and Kamala Harris. Hell, I've been clear that he was one of my least favorite of the many other excellent Democratic candidates during this year's primaries.

I can rattle off the policies to which you all object, but it’s a familiar list, because I probably share most of the same objections. Whether it’s carceral approaches to justice or militarism or centrist or neoliberal fiscal policies on every issue from education to healthcare, I understand (and agree with a lot of) the concerns. I promise you, my argument is not at all like one you'd hear from his campaign.

I also know about the fatigue. After struggling with school debt and no jobs and brutal policing, to hear a bunch of boomers telling you to vote in a tone that too often sounds like you’re being scolded about some obligation to them is just… too much.

My argument is simpler. And it’s predicated on two simple things: The risk is about having the systems and infrastructure to push for justice, and you don’t have to concede power to participate.

What we got wrong

I grew up in the Reagan 80s. For far too many years, I didn’t know how brainwashed we were, how much we were fed lies about compromise and bipartisanship and ended up giving away far too many fundamental needs. So I am thankful to have been taught by so many of today’s activists and organizers, especially young ones, that principles and policies come first.

Looking back, I see how we were inculcated to reward personalities and performativity over substance, and while I still think being an inspiring and passionate leader matters, I know why there's such skepticism or contempt for Democratic voters who seem too willing to focus only on the superficial.

But what I want to argue for here is not respectability politics or why you should be moved by soaring rhetroic. It's simple: There is a fundamental system at risk, and we need your support (and yes, your vote) to protect it. It’s as fundamental as healthcare, education, a living wage, or anything else.

It’s no secret there’s been a massive global rise in authoritarianism in recent years. We see fascists on the street around the world. So many of you have marched to stand up against it, especially in its virulent white supremacist form. But I can’t overstate how fragile democracy is in America right now. We know about voter suppression. We know about misinformation. But the very mechanics that enable the possibility of just laws and fairer systems in the future are in danger.

Counterintuitively, it is with that risk that the more conservative tendencies of a Biden administration have one essential positive trait: they will reinforce the possibility of American democracy in the short term. For all their faults, the people of a Biden administration do believe in a functional American government and are not trying to install a dictator for life.


The comfortable boomers do not understand that this threat to democracy is an actual risk. The #resistance folks with pink hats are too busy getting hyped up in all the ways that make you cringe. Honestly, none of them really get that authoritarianism is at our door.

Interestingly, in this year's Democratic convention, Bernie said it straight out. (Notably, so did Obama.) We're at risk of an unabashedly authoritarian government in America. They’re right. And the bulwark is you, and your energy and organizing and engagement.


It's only a first step

I'm  not under any illusion that authoritarianism can be stopped solely with a ballot. It certainly is not enough. But if we want to have the space and stability to fight that threat, we need to slow the stampede to fascism.

I do understand that for many of you, there are principles you feel you cannot compromise. You can never vote for a person who has Biden (or Harris’) view on the issues you care about most. But I want you to have the chance to elect that candidate who will support you on those issues. There’s a very real threat that you won’t have that option if we aren't able to hold things together this year.

Some folks will say I’m being alarmist, but they're folks who don't have as much to lose. I’m old enough to know, we genuinely have not seen things be this bad, or this fragile, before. The economic crisis on top of the health crisis on top of the climate crisis will only exacerbate the threat. The folks who think this concern is overblown are also the ones who are not going to see what happens when the seas rise.

And finally, I’ll tell you why I’m asking you to vote for Biden even though I’ve never been a Democrat, and never will be. I decided not to sign up for that party when I was 18, because they were wrong being against the (then-new) idea of marriage equality. I still held that policy failure against them as late as when I did vote for Obama, but I took a leap and pulled the lever. I wondered if I’d gotten cynical and too conciliatory as I got older, that maybe I'd gotten too willing to compromise or too swayed by such a charismatic candidate.

But interestingly, a few years later it was Joe Biden who actually helped amplify and strengthen the work of all the activists over the years who’d fought for marriage equality. He had heard them, and gave voice to the simple moral clarity of those activists' demands, before it was party policy. The entire administration's (and then the country's) position was forced to evolve because he had simply found it impossible not to say the compassionate thing when he'd heard the plain arguments activists had been making. I do think that's still a real avenue for activists to drive the change we need.

It doesn’t happen often enough. It doesn’t happen fast enough. But it does happen and you can make it happen just as you’ve made the unimaginable happen around defunding the police and fighting for a $15 wage and so many other vital issues. I want  that to happen for you for Medicare for All and for student loan forgiveness, and for so many other things where Biden's position needs to be pushed to what's right instead of what's a good compromise for centrist swing voters.

If I’m being honest, I don't really even feel like the boomers deserve you saving their asses. They didn’t save the planet for you. But you do deserve a functional democratic infrastructure with which to build a new better, America. My motivation in asking for your vote is based on wanting you to have the chance to get what you want and deserve, and seeing that the only path there is a counterintuitive one.

Things like the Green New Deal or large scale defunding or divestment can only happen if we have our underlying democratic institutions intact. The egregious biases and flaws and injustices of those institutions can only be addressed if they exist.

We’re in that much danger. I don’t say it lightly when I ask you to make a leap of trust you may not be willing to make. And I will always support you being fiercely critical of Biden if he gets into office, with all of the access and voice I can lend in support.

But I’m asking you to vote Joe Biden in. The progress we need to make in the future really will depend on it.

28 Aug 20:10

What Windows 95 Changed

by Anil Dash
What Windows 95 Changed

Twenty five years ago today, Microsoft released Windows 95. It was undoubtedly a technical leap forward, but its biggest, most lasting impacts are about how it changed popular culture's relationship to technology.

For context, when Windows 95 was released in August of 1995, only about 30% of American homes had any computer at all. Less than 10% had any form of internet access — and virtually none had broadband. There were no smartphones, of course.

But more broadly, computers and software were basically not yet something one talked about in polite company. You might have had a friend who “worked in computers” (we didn’t say “work in tech” yet) or call IT for support for your printer at work. But software was not part of culture, and the term "apps" wouldn't come into wide usage for more than another decade. In those days, most job listings didn’t even yet ask for “familiarity with MS Office” (ask your parents what that meant) and the PlayStation hadn’t been released yet in the U.S. or Europe.

The broader business world had started paying a lot more attention to tech just a few weeks before Windows 95 arrived, when Netscape's milestone IPO in early August of 1995 shocked everyone with its extraordinary debut, and kicked off the dot com boom to come. But consumer marketing of PC technology was in its infancy; Intel had just named the Pentium not long before — before that, its chips were just referred to by their model numbers, which read like the license plate on a car, not a brand name. And even the Pentium name really only became famous when a bug was found in the early chips. Jokes about that were as far as pop culture really engaged with tech.

Into that world, Microsoft did a mass consumer launch of… an operating system. A computer's operating system is software that lets other software do interesting things. It's perhaps most abstract product possible. And Microsoft famously put some real money into it — they did a big launch event in Redmond and got Jay Leno to host it, and even licensed the Rolling Stones’ “Start Me Up” as a theme song, tied to the operating system's signature Start button feature. A lot of retrospective views of Windows 95 tend to focus on the kitsch value of Jennifer Aniston and Matthew Perry doing a VHS training video about the product, but the truth is, Friends was not a huge hit yet at the time (let alone a cultural phenomenon) and the video was a fairly obscure release at the time.

But splashy, big-budget ads for Windows 95 were ubiquitous in primetime TV in that era when everyone was still watching TV with ads. And as Brad Silverberg (then the SVP in charge of the Windows 95 launch) notes, "The Stones tv ad was so great because it was a kickass song, completely on message (Start), and showed everyday people around the world doing everyday things with the Win95 PCs."

Wildly, Microsoft's effort worked. For the first time ever, lots of consumer enthusiasts lined up to buy software at stores as it released at midnight. Before that point, that kind of widespread consumer enthusiasm had been limited to album releases and movie opening. Now, technology was part of the new world of fan culture. That fan enthusiasm had been slowly building for almost 2 years by the time of launch. Trade magazines had been writing about “Chicago”, the codename for the product, and geeks tried out the early public betas of the operating system — helping popularize the idea of a “beta” as a pre-final version of something in common usage.

There were even the early hints of toxic fandom that we're wildly familiar with now. Windows enthusiasts were sometimes oddly exuberant advocates for their preferred operating system, diehard fans of Apple (which was then a small player in a very precarious position) felt the new operating system ripped off their favorite OS, and partisans of IBM's offering called OS/2 Warp were the bane of every tech writer of the time, complaining about their favorite software being overlooked with all the fervor and indignation of today's most angry online comic book movie fans.

Despite that noise in the market, Windows 95 was inarguably a hit. And it changed how the rest of the tech industry worked. Modern tech culture and tech trade press still basically follow the conventions that developed back then. Reporters breathlessly cover new codenames and rumors and beta releases, and late night TV hosts don’t just joke about apps, they deliver their shows through them. When Apple talks about new version of its operating system as part of its annual events, they have all the production values of a high-end TV show.

And as a product, Windows 95 itself was fine. The user interface and design were certainly a leap forward over previous generations. There were decided user benefits in making it easier to configure computers, and it set the stage for later innovations where a normal person could plug in a mouse or keyboard into their computer and it would probably work. But the most lasting impact is how it changed the broader cultural perception of technology.

In the 80s, there had been a movie series “Revenge of the Nerds”; its last sequel came out only a year before Windows 95 did. The public perception of Microsoft founder and figurehead Bill Gates was as a caricature almost perfectly defined by the nerds seen in movie and on TV, only missing the tape on his broken glasses. Tech was seen as for those people — nerds who were walking punchlines.

But after Windows 95 arrived, tech quickly became a standard part of people’s lives. The Internet became mainstream, homes got connected, and software became something everyone uses. Eventually, smartphones put a computer in everyone's pocket, not just in their homes, and software became "apps" — and became part of our lives.

Operating systems went from a product that we buy to a fundamental capability that's bundled with the entire tech ecosystems where we live our lives. We don't pay for operating systems directly anymore by purchasing them, but instead we pay with surveillance of our data or by being sold connected cloud services or by the cost being bundled into our devices. Operating systems are both ubiquitous and invisible, and there are now people for whom their allegiance to the operating system of their phone or video game console or even personal computer is part of their identity.

And the Start button is still pretty cool.