With the introduction of the rewritten mail send there has been a huge
uptick in the number of folk having issues sending mail from
Thunderbird. The changes have also brought with them a new way of
logging the sending of mail in Thunderbird to provide diagnostic
information.
Logging is now done using the error console (Ctrl+Shift+J) in the
developer tools, but for this to occur you need to enable logging using
the config editor. Modify/set the preference mailnews.smtp.loglevel to All using the linked config editor instructions
Now open the Error Console and clear any existing entries by clicking on the trash icon.
Send a mail, debug logs should show up in the Console tab looking something like what is shown below.
If you have been asked to supply a log, or are seeking support somewhere with failures in sending then the following will provide a text file with the log in it.
Right click the console/log window and select all from the menu.
Right click again and select the rather oddly named "copy message"
Open windows notepad.(Windows key+R type notepad and press enter)
Save the file to your documents and either copy and paste or upload the file to provide the log to others. Be aware that the From and To addresses in the email are in the log you are sharing.
----ooo00O00ooo----
This part will certainly not work in versions after 91.
Again using the config editor set the preference mailnews.smtp.jsmodule to false. This will invoke the old mail sending code that has been replaced and already removed from Thunderbird from V93 onwards. This will allow the diagnosis of the problems to ensure it is the new send code that is at issue. It will also allow a few months of using the old code while bugs are fixed. Please file bug in bugzilla if you identify a bug in the new code.
Telegra.ph is a really simple, no-login hosted individual blog post publishing from the makers of Telegram which has been around for a few years. I was looking at it again today thinking that it would be cool if, instead of publishing posts to a server you don’t control and could be taken down at any time, you could publish posts to IPFS.
It turns out that someone else more technically able than me had the same idea, and this GitHub repository allows you to do just that. In fact, you don’t even have to host the place in which you compose the blog, but instead can run it locally!
In practice, this means that I could just have a static web page (e.g. dougbelshaw.com) and link to a series of IPFS-powered pages. The downsides are that I can’t change what I’ve written, there’s no RSS feed, and I’m dependent on IPFS gateways to serve content to users of most web browsers.
But, hey, it’s cool.
If you have the right things installed and configured, the example at first link below should work for you. If not, the second has exactly the same content, served up from an IPFS gateway.
Update: I subsequently learned about the importance of ‘pinning’ so if the Cloudflare link doesn’t work, try this one.
It’s four years since I presented on IPFS and other censorship-resistant technologies in Barcelona. I was there during the vote for Catalonian independence, something that was only possible due to disseminating information via decentralised technologies.
Since then, Cloudflare has created an IPFS gateway, and Brave has built-in support for IPFS. These things happen slowly, often taking a decade to mass adoption as bugs and annoyances are ironed out. We’re getting there.
Interestingly this came up yesterday at the FOSS4G-NL conference I visited, where Amélie A Gagnon talked about scenius as communal genius, a scene that jams together and creates results no single genius could. She also mentioned Austin Kleon’s quote ‘don’t be a genius, create a scenius’ (see his post on scenius, and about mapping a scenius, something I’ve elsewhere seen done based on LinkedIn profiles to see what is missing in terms of capabilities, roles and skills, to make a scene somewhere ‘explode’)
…and call it collective creativity: without a collective, the creativity of each genius partaking in the above meetings would never have reached that far.
Although browser accessible versions of VS Code have been available for some time, for example in the form of cdr/code-server or as a Jupyter server-proxied application, there is now an “official” hosted in-browser VS Code editing enviorment in the form of vscode.dev[announcement: vscode.dev(!)].
My personal opionion is that this could be useful for open distance education, at least in situations where users have access to a network connection, not least because it provides a reasonable balance between who provides what resource (storage, bandwidth, compute).
To begin with, the editor provides integration with a local file system, allowing you to open and save files to your own desktop. (If the local filesystem support does not work for some reason, you can also upload/download files.) This means that students can keep work on files stored on their own desktop, albeit at the requirement of having a network connection to access the online vscode.dev environment.
Even though VS Code is perhaps best known as a code development environment, it can also be used as a text editor for editing and previewing markdown documents. Whilst the full range of VS Code extensions that support rich media markdown authoring are not currently available (in many cases, this will only be a matter of time…), some of the extensions are already available, such as the Markdown Preview Mermaid Support extension.
This extension lets you use fenced code blocks for describing mermaid.js diagrams that can be previewed in the editor:
Being able to generate Javascript rendered diagrams from text in markdown documents is now quite a widely recognised pattern (for example, here’s a recipe for creating IPython magics to pipe diagram code to javascript renderers). That said, it’s perhaps not widely adopted in institutionally provided authoring systems that tend to lag behind the feature offerings of contemporary authoring environments by several years.
Exploring different editor configuration views would probably be worth exploring in terms of how different layouts may be suited to different sorts of workflow.
As well as editing and previewing rendered markdown documents, we can also edit and execute HTML+Javascript+CSS applications (as you might expect) and Python code (which you might not expect).
In-browser code execution support for Python code is provided by the joyceerhl.vscode-pyodide extension [repo], a WASM powered environment that bundles a scipy stack.
Usefully for education purposes, the pyodide Python environment is available as a code execution environment for Jupyter notebooks, which can also be edited in the vscode.dev environment:
This means we can run Jupyter notebooks with a Python kernel purely within the browser without the need for a local or remote Python environment. But it does mean you need a browser that’s powerful enough to run the pyodide environment. And a network connection to access the vscode.dev environment.
The ms-toolsai.jupyter-renderers extension is also supported, which means rich outputs can be rendered inline in edited and executed Jupyter notebooks:
Some of the backend renderers may not be preinstalled as part of the default pyodide environment. However, additional Python packages can be installed using micropip. For example:
import micropip
await micropip.install("plotly")
To prove it works, here’s an example of a notebook that installs the plotly package and then renders a rich plotly chart output, inline, in the browser:
If it’s anyhting like jupyterlite, there may be some issues trying to read in data files into pandas. If so, some of the tricks in ouseful_jupyterlite_utils might help…
For files opened from a local filesystem, edits will be saved back to the file system. But what about users who are working across several machines? In this case, it might make sense to edit files against an online file source. Once again, vscode.dev provides one possible solution, this time in the form of its integration with Github: simply add a path to one of your github repos (for example, https://vscode.dev/github/USERNAME/REPONAME/) and you will be prompted to grant permissions to the application:
Once in, you will be able to open, edit, and commit back changes to files contained in the repository:
This means that a user can edit, preview, and potentially run files stored in one of their Github repositories (public or private) from vscode.dev. Once again, a network connection is required, but this time the editor and the storage are both provided remotely, with editing and code execution, for example using pyodide, provided in the browser.
From this briefest of plays, I can see myself starting to edit and check simple code execution using vscode.dev opened over a Github repo.
Of course, at least two big questions arise:
what user interface layout(s) will best support users for different sorts of workflow (we don’t want to bewilder users or scare them away by the complexity of the UI);
how would course materials need tuning to make them useable in a VS Code environment.
In terms of distance education use, the overhead of requiring a network connection is offset by removing the need to install any software locally, or provide a remote code execution service. Networked file persistence is available via a (free) Github account. In order to run code in browser, for example Python code using the pyodide environment, loading the environment may take some time (I’m not sure if it gets cached in the browser to remove the requirment for repeatedly downloading it? Similalry any additionally installed packages?); the pyodide environment also requires a reasonably powerful and recent browser in order to work smoothly.
Last month we wrote that
we wouldn't review any more papers on test-driven development,
but Fucci2020 isn't really about TDD.
Instead,
the authors measured how well students wrote tests
in order to gauge the effects of going a night without sleep.
By comparing those who slept with those who didn't,
they found that a single sleepless night reduced code quality by 50%.
This is consistent with what we know from a century of other studies
(see here
for a short summary,
and here for a shorter one);
I don't expect companies or universities will suddenly start paying attention to the evidence,
but perhaps now that so many of us are working from home
it will be easier for us to take naps when we need them.
We present a quasi-experiment to investigate whether, and to what
extent, sleep deprivation impacts the performance of novice software
developers using the agile practice of test-first development
(TFD). We recruited 45 undergraduates, and asked them to tackle a
programming task. Among the participants, 23 agreed to stay awake
the night before carrying out the task, while 22 slept normally. We
analyzed the quality (i.e., the functional correctness) of the
implementations delivered by the participants in both groups, their
engagement in writing source code (i.e., the amount of activities
performed in the IDE while tackling the programming task) and
ability to apply TFD (i.e., the extent to which a participant is
able to apply this practice). By comparing the two groups of
participants, we found that a single night of sleep deprivation
leads to a reduction of 50 percent in the quality of the
implementations. There is notable evidence that the developers'
engagement and their prowess to apply TFD are negatively
impacted. Our results also show that sleep-deprived developers make
more fixes to syntactic mistakes in the source code. We conclude
that sleep deprivation has possibly disruptive effects on software
development activities. The results open opportunities for improving
developers' performance by integrating the study of sleep with other
psycho-physiological factors in which the software engineering
research community has recently taken an interest in.
The upshot of this post is that there is no real desire on the part of traditional residential universities to change after the pandemic, mostly because there is a continued demand for this sort of educational experience. At the same time, the pandemic revealed how unprepared they were, because they had't really invested any effort into online and distance education. The main result was that they learned something about what it takes to provide quality online learning, and are beginning to augment their capacity in the area. All of this seems accurate enough, especially as those already privileged enough to enjoy the residential university experience no doubt want to continue. In my view, change, as always, comes from the outside, and will be found in the millions of voices who began to enjoy MOOCs and other forms of online learning, and are wondering why governments are supporting the privileged experience for the few, when there's such a widespread demand for alternatives from the many.
The common definition of respite sucks, no matter whether you’re the carer or the cared-for:
a short period of rest or relief from something difficult or unpleasant
Olivia started a two-night respite at Stars for Life today: she left home this morning at 9:45 a.m. and won’t return until I pick her up, 48 hours later, on Saturday morning.
Technically I’m on a respite “from her,” but you could equally say she’s on a respite “from me.” Either way, I don’t think we regard each other as difficult or unpleasant; certainly from my side, I love her dearly, and being her father is a source of great joy.
But, boy oh boy, do I need a short period of rest or relief from time to time.
Parenting, plus grieving, plus working, plus trying to chart a course forward for myself, that all adds up to more time than there is, leaving precious little room for what my friend Mitch calls “unstructured fun time.” Respite time provides a small dose of that, time where I can be the star of my own show for 24 or 48 hours, not simply a member of the supporting cast.
For me the great joy of respite is as much the relief from the punctuation of the clock: it’s 4:30 p.m. as I write this, and simply not having to worry about family supper is about The Greatest Thing in the World right now, followed quickly by the endless panorama of freedom offered by an unencumbered evening. And I get to do it all again tomorrow.
These brief relief periods—Olivia is funded by AccessAbility Support for two nights a month—make me a better parent, and a better person. I’m enormously grateful for them, and I’m enormously grateful to Olivia for having the courage to adventure into her part of the deal.
My own experience, and observing others, suggests that many carers regard respite as self-indulgent, and are reluctant to seek it out, or take it when offered.
There’s a complex thicket of reasons for this including the seeming-necessary conceit that if caring is genuine we should be strong enough to power through without breaks; otherwise the “difficult and unpleasant” rears its head, and who wants to make the cared-for feel that they’re a burden to be briefly unshackled from.
We would be well-served by getting over this, and by raising respite to a level of personal responsibility, recognizing that it is a disservice to those we love and care for to not take care of ourselves.
Back in mid-2018, there wasn’t a single Macintosh computer that was free of major drawbacks or otherwise ridiculously out of date. After yet another disappointing WWDC, I took to my keyboard to air some grievances, with a lengthy complaint entitled “On The Sad State of Macintosh Hardware“. That post was written out of a deeper frustration with Apple’s failure to keep the Mac product line current.
A little over three years later, it’s time to do the opposite. With Apple’s announcement of new M1 Pro- and M1 Max-based MacBook Pros, they are more than halfway through their transition from Intel to their own Apple Silicon chips. The state of Macintosh hardware is now much closer to “Jubilant” than “Sad”.
Beyond the spectacularly powerful new CPUs, I want to make note of the more pragmatic improvements that have happened. Apple in 2018 was at the height of their quest to remove every port, selling a MacBook that offered a pitiful single USB-C port (which was also needed for charging). Other laptops were besmirched by TouchBars and faulty butterfly keyboards. Apple is not a company to change its mind lightly, but nevertheless they’ve corrected every single one of these missteps.
I’m not sure who exactly deserves the credit at Apple for all these improvements, but my hat is off to you, whoever you are.1 In 2018, we couldn’t recommend buying a single current Macintosh model. Now? You almost can’t go wrong. That turnaround deserves a round of applause.
Footnotes:
Whoever it is, I’m guessing their name doesn’t rhyme with “Ronnie Five”. ↩︎
Several friends have asked about my camera/videoconferencing setup, so some notes on that.
Picture from my desktop camera. Lighting isn’t quite as even as I’d like (and as always in stills, my smile is goofy) but you can see the background blur clearly.
Why?
I’ve joked that for lawyers, a good videoconferencing setup is now like a good suit—sort of pointless but nevertheless can help make a good impression in a field where impressions, for better and for worse, matter.
I picked up the new book “Presenting Virtually” from Duarte and it starts with something that’s pretty basic, but also not always obvious—you can’t control networks, and often don’t control what presentation software you’re using. What you do control is your hardware, so make that the best you can.
Camera
I bought a Canon 77D to take baby pictures and… it was in a closet when the pandemic hit. I use it with a 24mm pancake lens. Canon provides a driver that lets you use the camera as a webcam.
Given the cost, I’m not sure this makes sense for most people to do unless they already have a compatible Canon laying around. But if you do have a supported one it works great!
I cheat by having good natural light in my office and then supplementing it, rather than having to blast light all over to make up for the gap. This means my light was cheap; the primary criteria was being able to change the color (from a bright white to yellow-ish) so that things looked right.
The exact model I got is no longer available, but is basically similar to this one.
Pro tip for new-ish home workers: if you have two rooms, one dark and one bright, make your bedroom dark and cramped and your office big and light. The previous residents of our place made the reverse choice and I don’t understand it at all.
Microphone
I have a Blue Yeti mic. I’m not sure I’d recommend it for most people. The audio quality is very good, but positioning it over a desk is finicky. (I use these for both my camera and mic, and they work once you get them set up, but they’re a pain.) In addition, it has a headphone jack—which is fine except it insists on reporting to the operating system that it is live even when it has nothing plugged in, so I frequently have to say “no, bad zoom, use the speakers that are actually speakers”.
If I were doing it over again, I’d get something designed more specifically for the home office use case. A friend swears by their Jabra 510, and this new thing from Logitech looks pretty interesting.
What I’m not doing (at least not yet)
I’m sorely tempted to get a teleprompter, but Stephen has mostly convinced me not to. In my experience, at this time, the bar is pretty low—having a good camera and light really does make things noticeably better for people on the other end, even if your eye contact isn’t perfect while doing a slide deck. So you can get a lot of bang for a lot less effort than Stephen spent. Still, tempting some days :)
It's no secret that between product designing, testing, the uptick in order processing from our restock, and life, we've all been extremely busy. And since it's been a bit since we've done a "general happenings" around HQ and since I have a few minutes here to catch my breath, I thought it would be a good time to update our readers and followers.
Shipping
We'll start off with some of the boring but important stuff (for visibility). If you live in New Zealand or Australia, shipping is going up. US Postal Service has discontinued First Class and Priority shipping, so the only options to send packages is Postal Express or Fedex - both of which are quite pricey and sometimes go over the price of the order. So if you need larger items like fenders, handlebars, racks, etc... please contact your local VO Dealer. They order in larger quantities, and can often accommodate customer requests:
Shipping around the US is slower than it has been in the past, due to natural disasters, staffing issues at the shipping companies, and just a high overall volume of items moving around the country. Please be patient. There have been several shipments that are marked as delivered, but are not. I've experienced this personally for my own stuff. They often times get delivered the next day. Sometimes weird things happen in their system. Sorry for the potential delays, but rest assured we will ensure your package will get to you!
Fedex has very calculated shipping routes so if you live in Chicago, don't be surprised if your package goes through Memphis. These are major hubs and transition packages to different areas of the US.
The redesigned Velo Orange Crazy Bars are pretty wacky looking, but when broken down, actually make quite a lot of sense. The combination of rise, sweep, and width hits a sweet spot and could work for many styles of bikes and riding styles. It’s also great to see Velo Orange manufacturing them out of a lightweight 6061 Aluminum, because some steel bars seem excessively heavy by comparison. So, yeah, they’re crazy, but I actually think they have the potential to add another dimension of comfort to a wide variety of rigs.
While they are currently sold out, we are getting a lot more around mid/late December 2021.
Seven Day Cyclist reviewed the Rubbery Bar Tape and gave it a very high score! It has quickly become a top seller for us. In addition to classic black, the tape also comes in a light, rich brown - a nice alternative for an almost-leather look.
The Velo Orange Rubbery Bar Tape is, as the name implies, made from a textured rubbery compound and is long enough for the biggest flared drops. Generous length is only rivalled by its 3.5mm density, which lends itself perfectly, not only to gravel but drop bar mountain bike conversions, rough stuff touring lorries and frankly, anyone else who wants the best of grip and damping.
Randos - The Rumors Are True!
We have next generation prototype Rando framesets. They are rim brake, 700c, and very spritely. I built mine (below) with 2x12sp with no lightweight bits (but I'm getting carbon wheels soon!) and it sits at 23lbs. The design of the frameset was truly an exercise in minimalism and only has what is absolutely necessary.
Our friend Matt suggested we keep a "Frame Diary" of the design, prototyping, and production process. I think that's an awesome idea.
We also have a bunch more colors and sizes that are in the process of being built and tested.
Granola-Moose Bars
We actually teased these on an Instagram post a bit back and the stoke was high. We're making a couple small tweaks to the angle relative to the stem for a better position.
We're also doing away with the tall clamp. We had an overwhelming number of requests for a model that could be used with a stem adaptor for older mtbs, so it only makes sense. This is the way.
More Sensah
The Sensah products we've brought in have been very popular. We recently got some more Sensah products in to test, specifically this 12sp Empire group. It's really good and it has some carbon bits because, you know, carbon.
The neat thing about the front shifter is that it has 4 trim positions, kind of like the older Campagnolo integrated shifters. The shifting is very tactile, just like the SRX 11sp stuff, and is crisp. I'm pleased.
New Digs!
We're moving! We've been in our current spot for 8 years and it's become very apparent that we've grown out of it. We're doubling our square footage to 15,000 sq ft with over 11,000 sq ft dedicated to just warehousing and shipping. It will allow us to keep more inventory on hand, hire more awesome people, and provide consumers and shops with more product availability and cool, new designs.
It's a brand new build and everything needs to go through permitting, so it's been a little longer of a process than we hoped. At any rate, we're in the final stretch and the ORANGE racking is going up as I type this out.
We should actually be moving within the next couple weeks, so keep an eye out for more info.
We'll also be posting a couple warehouse job openings, so if you're in the Glen Burnie, MD and surrounding areas, keep your eyes peeled.
(“This Week in Glean” is a series of blog posts that the Glean Team at Mozilla is using to try to communicate better about our work. They could be release notes, documentation, hopes, dreams, or whatever: so long as it is inspired by Glean.) All “This Week in Glean” blog posts are listed in the TWiG index).
I’ve just recently started my sixth year working at Mozilla on data and data-adjacent things. In those years I’ve started to notice some patterns in how data is approached, so I thought I’d set them down in a TWiG because Glean’s got a role to play in them.
Data Engagements
A Data Engagement is when there’s a question that needs to engage with data to be answered. Something like “How many bookmarks are used by Firefox users?”.
(No one calls these Data Engagements but me, and I only do because I need to call them _something_.)
I’ve noticed three roles in Data Engagements at Mozilla:
Data Consumer: The Question-Asker. The Temperature-Taker. This is the one who knows what questions are important, and is frustrated without an answer until and unless data can be collected and analysed to provide it. “We need to know how many bookmarks are used to see if we should invest more in bookmark R&D.”
Data Analyst: The Answer-Maker. The Stats-Cruncher. This is the one who can use Data to answer a Consumer’s Question. “Bookmarks are used by Canadians more than Mexicans most of the time, but only amongst profiles that have at least one bookmark.”
Data Instrumentor: The Data-Digger. The Code-Implementor. This one can sift through product code and find the correct place to collect the right piece of data. “The Places database holds many things, we’ll need to filter for just bookmarks to count them.”
(diagrams courtesy of :brizental)
It’s through these three working in concert — The Consumer having a question that the Instrumentor instruments to generate data the Analyst can analyse to return an answer back to the Consumer — that a Data Engagement succeeds.
At Mozilla, Data Engagements succeed very frequently in certain circumstances. The Graphics team answers many deeply-technical questions about Firefox running in the wild to determine how well WebRender is working. The Telemetry team examines the health of the data collection system as a whole. Mike Conley’s old Tab Switcher Dashboard helped find and solve performance regressions in (unsurprisingly) Tab Switching. These go well, and there’s a common thread here that I think is the secret of why:
In these and the other high-success-rate Data Engagements, all three roles (Consumer, Analyst, and Instrumentor) are embodied by the same person.
It’s a common problem in the industry. It’s hard to build anything at all, but it’s least hard to build something for yourself. When you are in yourself the Question-Asker, Answer-Maker, and Data-Digger, you don’t often mistakenly dig the wrong data to create an answer that isn’t to the question you had in mind. And when you accidentally do make a mistake (because, remember, this is hard), you can go back in and change the instrumentation, update the analysis, or reword the question.
But when these three roles are in different parts of the org, or different parts of the planet, things get harder. Each role is now trying to speak the others’ languages and infer enough context to do their jobs independently.
In comes the Data Org at Mozilla which has had great successes to date on the theme of “Making it easier for anyone to be their own Analyst”. Data Democratization. When you’re your own Analyst, then there’s fewer situations when the roles are disparate: Instrumentors who are their own Analysts know when data won’t be the right shape to answer their own questions and Consumers who are their own Analysts know when their questions aren’t well-formed.
Unfortunately we haven’t had as much success in making the other roles more accessible. Everyone can theoretically be their own Consumer: curiosity in a data-rich environment is as common as lanyards at an industry conference[1]. Asking _good_ questions is hard, though. Possible, but hard. You could just about imagine someone in a mature data organization becoming able to tell the difference between questions that are important and questions that are just interesting through self-serve tooling and documentation.
As for being your own Instrumentor… that is something that only a small fraction of folks have the patience to do. I (and Mozilla’s Community Managers) welcome you to try: it is possible to download and build Firefox yourself. It’s possible to find out which part of the codebase controls which pieces of UI. It’s… well, it’s more than possible, it’s actually quite pleasant to add instrumentation using Glean… but on the whole, if you are someone who _can_ Instrument Firefox Desktop you probably already have a copy of the source code on your hard drive. If you check right now and it’s not there, then there’s precious little likelihood that will change.
So let’s assume for now that democratizing instrumentation is impossible. Why does it matter? Why should it matter that the Consumer is a separate person from the Instrumentor?
Communication
Each role communicates with each other role with a different language:
Consumers talk to Instrumentors and Analysts in units of Questions and Answers. “How many bookmarks are there? We need to know whether people are using bookmarks.”
Analysts speak Data, Metadata, and Stats. “The median number of bookmarks is, according to a representative sample of Firefox profiles, twelve (confidence interval 99.5%).”
Instrumentors speak Data and Code. “There’s a few ways we delete bookmarks, we should cover them all to make sure the count’s correct when the next ping’s sent”
Some more of the Data Org and Mozilla’s greatest successes involve supplying context at the points in a Data Engagement where they’re most needed. We’ve gotten exceedingly good at loading context about data (metadata) to facilitate communication between Instrumentors and Analysts with tools like Glean Dictionary.
Ah, but once again the weak link appears to be the communication of Questions and Answers between Consumers and Instrumentors. Taking the above example, does the number of bookmarks include folders?
The Consumer knows, but the further away they sit from the Instrumentor, the less likely that the data coming from the product and fueling the analysis will be the “correct” one.
(Either including or excluding folders would be “correct” for different cases. Which one do you think was “more correct”?)
So how do we improve this?
Glean
Well, actually, Glean doesn’t have a solution for this. I don’t actually know what the solutions are. I have some ideas. Maybe we should share more context between Consumers and Instrumentors somehow. Maybe we should formalize the act of question-asking. Maybe we should build into the Glean SDK a high-enough level of metric abstraction that instead of asking questions, Consumers learn to speak a language of metrics.
The one thing I do know is that Glean is absolutely necessary to making any of these solutions possible. Without Glean, we have too many systems that are fractally complex for any context to be relevantly shared. How can we talk about sharing context about bookmark counts when we aren’t even counting things consistently[2]?
Glean brings that consistency. And from there we get to start solving these problems.
Expect me to come back to this realm of Engagements and the Three Roles in future posts. I’ve been thinking about:
how tooling affects the languages the roles speak amongst themselves and between each other,
how the roles are distributed on the org chart,
which teams support each role,
how Data Stewardship makes communication easier by adding context and formality,
how Telemetry and Glean handle the same situations in different ways, and
what roles Users play in all this. No model about data is complete without considering where the data comes from.
I’m not sure how many I’ll actually get to, but at least I have ideas.
:chutten
[1] Other rejected similes include “as common as”: maple syrup on Canadian breakfast tables, frustration in traffic, sense isn’t.
Working is hard, and when your laptop is close to dying, it’s even harder. Fortunately, a high-capacity power bank can save the day when you’re low on battery and outlets are out of reach — or if you need to charge your phone and other small devices during a power outage.
The Anker 747 PowerCore 26K is the best power bank for laptops that charge via USB-C because it fully recharges most laptops at least once and does so as quickly as possible, yet it’s compact enough to carry in a backpack, a laptop bag, or even some purses.
If you’ve ever heard of “the Whilhelm Scream” — an audio file of a man screaming, which has been used in literally thousands of movies and TV shows — this prop, with its blinking neon light tubes, could be the … Continue reading →
In progress free online book by Pavel Panchekha and Chris Harrelson that demonstrates how a web browser works by writing one from scratch using Python, tkinter and the DukPy wrapper around the Duktape JavaScript interpreter.
“More than anyone else, John von Neumann created the future. He was an unparalleled genius, one of the greatest mathematicians of the 20th century, and he helped invent the world as we now know it. He came up with a blueprint of the modern computer and sparked the beginnings of artificial intelligence. He worked on …
Your irregularly scheduled reminder that macOS polish and overall user experience have been degrading steadily over the past few years in various ways, compiled in Jamie’s usual direct fashion.
The slow but steady normalization of continuous integration (CI)
has changed software development just as profoundly as reliance on Q&A sites:
by the time I have merged a pull request into the main branch
of one of the project's I'm working on,
a dozen different checks and actions have run automatically,
at least half of which could reject the merge.
I believe this automation has made developers more productive,
but like any tool it can be used badly,
so Zampetti2020 used interviews and mined Stack Overflow posts to find out how.
Their complete catalog
divides 79 distinct smells into seven categories—repository issues,
infrastructure choices,
build process organization,
build maintainability,
quality assurance,
delivery process,
and culture—and the underlying data is
available online.
As with evidence-based taxonomies in other domains,
I hope this work will be taken up by people building CI tools
(and linters for those tools).
Continuous Integration (CI) has been claimed to introduce several
benefits in software development, including high software quality
and reliability. However, recent work pointed out challenges,
barriers and bad practices characterizing its adoption. This paper
empirically investigates what are the bad practices experienced by
developers applying CI. The investigation has been conducted by
leveraging semi-structured interviews of 13 experts and mining more
than 2,300 Stack Overflow posts. As a result, we compiled a catalog
of 79 CI bad smells belonging to 7 categories related to different
dimensions of a CI pipeline management and process. We have also
investigated the perceived importance of the identified bad smells
through a survey involving 26 professional developers, and discussed
how the results of our study relate to existing knowledge about CI
bad practices. Whilst some results, such as the poor usage of
branches, confirm existing literature, the study also highlights
uncovered bad practices, e.g., related to static analysis tools or
the abuse of shell scripts, and contradict knowledge from existing
literature, e.g., about avoiding nightly builds. We discuss the
implications of our catalog of CI bad smells for (i) practitioners,
e.g., favor specific, portable tools over hacking, and do not ignore
nor hide build failures, (ii) educators, e.g., teach CI culture, not
just technology, and teach CI by providing examples of what not to
do, and (iii) researchers, e.g., developing support for failure
analysis, as well as automated CI bad smell detectors.
Pyodide provides "Python with the scientific stack, compiled to WebAssembly" - it's an incredible project which lets you run a full working Jupyter notebook, complete with complex packages such as numpy and pandas, entirely in your browser without any server-side Python component running at all.
It turns out it also now includes a working version of the standard library sqlite3 module, by bundling a WebAssembly compiled version of SQLite!
Trying this in the REPL
pyodide.org/en/stable/console.html provides an interactive REPL for trying eut Pyodide. You can run a one-liner to demonstrate the available SQLite version like this:
Welcome to the Pyodide terminal emulator 🐍
Python 3.9.5 (default, Sep 16 2021 11:22:45) on WebAssembly VM
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> sqlite3.connect(":memory:").execute("select sqlite_version()").fetchall()
[('3.27.2',)]
Querying an existing database file from JupyterLite
JupyterLite is "a JupyterLab distribution that runs entirely in the web browser, backed by in-browser language kernels."
(Downloading this via fetch() works because Datasette includes CORS headers for these files.)
from js import fetch
res = await fetch("https://global-power-plants.datasettes.com/global-power-plants.db")
buffer = await res.arrayBuffer()
# Now write that to the in-memory simulated filesystem:
open("tmp/power.db", "wb").write(bytes(buffer.valueOf().to_py()))
# And run some queries against it:
import sqlite3
c = sqlite3.connect("tmp/power.db")
c.execute('select * from "global-power-plants" limit 10').fetchall()
This is a pretty clear message. Apple has undone all the damage they did to the MacBook Pro. Magsafe charger, HDMI, SDcard reader, keyboard with full size function keys. It took six years, but Apple went full circle with the enclosure. Say goodbye to dongle hell. Great display with a notch that houses a 1080p webcam, better speakers and microphones. It looks pretty perfect to me.
These clearly are expensive Pro machines, starting at 2249 Eur for the 14″ M1 Pro and going up to 3849 Eur for the 16″ M1 Max model.The sweet spot for me are the 2749 Eur 14″ and the 2979 Eur 16″ model. There will be people who browse Facebook on these machines.
The less than a year old 13″ Pro is now offically old. And last year’s 13 Air found its rightful place. Still incredibly fast, quiet and relatively affordable.
The event kicked off with music and three newsbytes: new AirPods 3, now sweat and waterproof, with a new shape, HomePod mini in three new colors, and an entry level Apple Music subscription for 5 Eur a month. There is a catch: you have to use Siri to ask for your music, and it only plays on Siri-enable Apple devices.
I think the AirPods 3 will set a new standard because they adapt to your hearing with Adaptive EQ, much like the AirPods Max. I expect them to sound amazing. Now with Spatial Audio and “improved quality for Facetime calls”. Oh yes, there is room for improvement.
The common definition of a 'valid
hostname' is often reduced
to a simple regular expression, but as the saying
goes: 'Now you have two problems.' Because hostnames
are DNS labels and those... well, it's the DNS. All
bets are off.
I am delighted to share that Imo Udom has joined Mozilla as Senior Vice President, Innovation Ecosystems. Imo brings a unique combination of strategy, technical and product expertise and an entrepreneurial spirit to Mozilla and our work to design, develop and deliver new products and services.
While Mozilla is no stranger to innovation, this role is a new and exciting one for us. Imo’s focus won’t only be on new products that complement the work already happening in each of our product organizations, but also on creating the right systems to nurture new ideas within Mozilla and with like-minded people and organizations outside the company. I’m convinced that our brightest future comes from a combination of the products we offer directly and our connection to a broad ecosystem of creators, founders, and entrepreneurs in the world who are also trying to build a better internet.
“People deserve technology that not only makes their lives better and easier, but technology that they can trust,” said Udom. “Mozilla is one of the few companies already doing this work through its core products. I am thrilled to join the team to help Mozilla and others with the same mission build next generation products that bring people the best of modern technology while still keeping their best interests at the center.”
Previously, Imo was the Chief Strategy and Product Officer at Outmatch where he was responsible for ensuring the business and product strategy delivered value to customers, while never losing sight of its mission to match people with purpose. Prior to Outmatch, Imo co-founded and served as CEO of Wepow, a video interviewing solution that reduces interviewing time and improves hiring quality. Imo helped grow Wepow from a small side-project in 2010 to a successful enterprise platform supporting hundreds of global brands that was later acquired by Outmatch.
Beyond Imo’s impressive experience and background, it was his passion for learning and commitment to impacting the world in a positive way that made it clear that he was the right person for this work. Imo will report directly to me and will also sit on the steering committee.
I look forward to working closely with Imo as we write the next chapter of innovation at Mozilla.
I’ve been working at Mozilla for six years today. Wow.
Okay, so what’s happened… I’ve been promoted to Staff Software Engineer. Georg and I’d been working on that before he left, and then, well *gestures at everything*. This means it doesn’t really _feel_ that different to be a Staff instead of a Senior since I’ve been operating at the latter level for over a year now, but the it’s nice that the title caught up. Next stop: well, actually, I think Staff’s a good place for now.
Firefox On Glean did indeed take my entire 2020 at work, and did complete on time and on budget. Glean is now available to be used in Firefox Desktop.
My efforts towards getting folks to actually _use_ Glean instead of Firefox Telemetry in Firefox Desktop have been mixed. The Background Update Task work went exceedingly well… but when there’s 2k pieces of instrumentation, you need project management and I’m trying my best. Now to “just” get buy-in from the powers that be.
I delivered a talk to Ubisoft (yeah, the video game folks) earlier this year. That was a blast and I’m low-key looking for another opportunity like it. If you know anyone who’d like me to talk their ears off about Data and Responsibility, do let me know.
Blogging’s still low-frequency. I rely on the This Week in Glean rotation to give me the kick to actually write long-form ideas down from time-to-time… but it’s infrequent. Look forward to an upcoming blog post about the Three Roles in Data Engagements.
Predictions for the future time:
There will be at least one Work Week planned if not executed by this time next year. Vaccines work.
Firefox Desktop will have at least started migrating its instrumentation to Glean.
I will still be spending a good chunk of my time coding, though I expect this trend of spending ever more time writing proposals and helping folks on chat will continue.
"'Next year, we'll be able to see each other in person!'" says the host. Unnoticed, about a third of the attendees wince. They're the folks in Alaska, New Zealand, or Israel, who in normal times would struggle to attend." Count me as among the wincers. Sure, pre-pandemic I got to travel a lot, but that was only through invitations to speak, which meant that I was basically never returning to conferences. During the pandemic, however, I have been treated to a virtual wealth of conferences, and even though I have to pay for are coming in at a much lower cost. That's why the future is hybrid. (This post also has commentary on employee activism at tech companies and the absurdity of depicting 'view source' as a form of hacking).
This article says that the province has seized all the assets of Little Mountain Place Care Home (site of the worst LTCH outbreak) and its two sister LTCHs.
Influenza Season Opener
One way to reduce the pandemic burden is to not increase hospitals’ burden with influenza (and to not burden COVID-19 testing sites when you have influenza). So go get your influenza vaccination, available now where all flu shots are given. AND THIS YEAR IT IS FREE!!! SO GO GET A FLU SHOT!
Last year, we didn’t have any (literally! zero. none. nada.) influenza cases except for cases that probably came from pediatric live virus vaccines. This year, we’ve already had one influenza case, probably because we have more international travel this year.
Mitigation measures
The province has relaxed some Orders. At events with vax card requirements (like weddings, funerals, or sporting events), the capacity limit has been raised to 100%. Also, you do not have to remain seated at restaurants and bars. Still no dancing, however, and you have to keep your mask on if you are mingling.
Press Briefing
In addition to the announcement about the relaxation of some Orders, and the exhortation to get a flu shot, the press briefing covered information about COVID-19 in schools.
There was a big increase in cases after the start of the school year, but it’s coming down fast now:
During Q&A, a reporter asked, “doesn’t that show that you should have had a mask mandate for the little kids from the beginning?”, and Dr.H pointed out that there was always a mask mandate for the 9-11 y/o.
This chart shows where there was infection:
There have been big drops in kids in Interior Health recently. (DrH also spoke of a big drop in Northern Health, but I’m not seeing it.) She notes that in places with high vax rate — VCH and VIH — the pediatric case rate is low.
DrH pointed out that there is really high testing of kids now, mostly because they have all kinds of other respiratory diseases right now — RSV, rhinoviruses, enteroviruses — that look like COVID-19 so they get tested for COVID-19. Dark blue is number of tests, light blue is positivity rate:
DrH says that they have been watching very carefully for severe cases. Other countries, like the US, had more severe cases in children. She says they are not seeing more severity here. Cases continue to be mild, with very very few hospitalizations. Last week there were six hospitalizations of people under 17, with none in the 5-12 y/o cohort. Hospitalization is incredibly rare in vaccinated 12-17 y/o kids.
They have done some more in-depth analysis of transmission in schools, especially in IH. In IH, there have been 80 clusters where there might have been transmission, which is about 1/4 of the cases. In 46 schools (which is 12%), with an average cluster size of about 3. Last year, the average was more like 1.2.
Less than 1/3 of the schools across the province have had an exposure. This is slightly increased but still under control, she says. Most of the source is from outside the classroom, she says.
She then switched to boosters. She said in LTCHs, the first boosters went to those which were most at risk (i.e. which had cases), then ones which were earliest and so had the short dosing interval. In the question period, she said that the first cohort to get boosters was the severely immunocompromised, and those are done. The second cohort is LTCH/AL, and those are in progress. Next will be people who are still immunocompromised, but not as badly. She mentioned that in the past week, there have been more boosters than first doses.
She emphasized that people who had had COVID-19 infection should still go get a vaccination. The post-infection durability is really variable.
Dix gave lots of statistics, much to my non-surprise.
We are near or slightly above the ICU base beds kind of everywhere. Some surgeries, but a minority of them, are getting delayed. Province-wide, we have about 10% of base beds vacant.
LTCH and Assisted Living workers have been getting vaxxed. Across the entire HC system, 96% are vaccinated.
+560 cases, +5 deaths, +2,240 first doses, +5,622 second doses, +5,049 “other” doses, probably boosters.
Currently 382 in hospital / 146 in ICU, 4,913 active cases, 191,476 recovered.
first doses
second doses
of adults
89.7%
84.2%
of over-12s
89.2%
83.5%
of all BCers
81.2%
75.9%
Note that there is a discontinuity in all-of-BC first doses; today’s takes into account the number of shots that were booster shots while previous numbers did not. I apologize for the overly-high estimate in the past.
This preprint is yet another study showing that infection+vaccination gives a stronger and more durable response that vaccination alone or infection alone. There have been so many studies showing that result that I am getting tired and bored with them, and probably will not post any more.
Pregnant or lactating women had lower COVID-19 antibody levels than other women after one dose, but their levels popped up to comparable with a second dose.
Mothers carrying boy fetuses had lower COVID-19 antibody levels than mothers with girl fetuses.
COVID-19 antibody levels were lower in boys’ cord blood than girls’ cord blood.
SWI swissinfo.ch’s main office in Bern and a swissinfo.ch chart created with Datawrapper
SWI swissinfo.ch is a national public media outlet with a distinctly international mission: to offer reporting on Switzerland to readers around the world, and connect Swiss expatriates with the news from home. As part of the Swiss Broadcasting Corporation, it goes without saying that swissinfo.ch publishes in the national languages of German, French, and Italian. But to reach a truly worldwide audience, their journalists are also at work reporting and translating articles for Arabic, Chinese, English, Japanese, Portuguese, Russian, and Spanish-speaking readers.
Pauline is a data journalist at SWI swissinfo.ch, a public media outlet in Switzerland
Pauline Turuban is one of two dedicated data journalists at swissinfo.ch, and her role is only getting more important. “We use a lot of graphics at swissinfo.ch because it supports our standards of credibility and international comparison,” she explains. “It’s something that’s really spread in the minds of our journalists: the fact that with data, you can have a better story and make your statements more understandable and more credible.”
But Pauline doesn’t mind admitting that fluent Chinese isn’t one of the skills she brought to the table when she joined swissinfo.ch in April 2020. So how does she manage up to ten translations of every chart, in five different scripts, without so much as a tick mark out place? We gave her a call to find out.
According to Pauline, four things made Datawrapper a natural fit for swissinfo.ch: it’s accessible to all reporters, supports a variety of alphabets and characters, automatically translates chart elements, and is easy to teach to new colleagues.
Accessible to the whole staff
1. “Every journalist at swissinfo.ch uses Datawrapper”
The first piece of the puzzle is getting colleagues from every language team involved in the chart-making process. “It’s not our own private garden,” Pauline says. “Every journalist at swissinfo.ch uses Datawrapper.”
With no software to install, sharing a Datawrapper chart with colleagues is as simple as sending them a link. Swissinfo.ch chooses to organize their team accounts by language. “Every French-speaking person, for example, will use the account ‘French Datawrapper,’” Pauline explains. “We have access to every graphic in the house, but this way we know which language has been creating which graph. We also use folders to organize the charts by topic.”
Two members of the Japanese-language team at work on a Datawrapper chart
To keep things orderly, each translation goes through a standard series of steps. “We try to have a fixed process for the translations: start by duplicating the original graphic and change the title into your language so that everyone knows which language is working on which graph.” Making the task simple and accessible means that Pauline can draw on the language skills of all her colleagues — not just those who have training in data or design. “It’s important to keep the graphics looking similar in every language, so we ask people not to change the colors,” she says. “But we trust everyone to make the best translation to their language.”
Supports other alphabets and characters
2. “I’m amazed by how well Datawrapper supports these alphabets”
Support for non-Latin characters was nonnegotiable at swissinfo.ch, Pauline tells us. “One of the reasons why Datawrapper was picked in the first place is that, in our ten working languages at swissinfo.ch, we have four languages that don’t use the Latin alphabet — Arabic, Chinese, Russian, and Japanese. I’m always amazed to see how well Datawrapper supports these alphabets and characters. It’s never been a problem to translate the graphics in any of those languages. And that’s not the case with other tools, to have this wide spectrum of languages that are supported.”
Automatically translates chart elements
3. “It’s like magic”
Datawrapper charts come with a lot of text built in: names for months and weekdays, words for “page” and “search” in tables, or labels like “Source” and “Get the data” in footers. Luckily, users can translate these automatically using the “Output locale” setting. By letting them select a language and country whose standards to use, it also converts numbers to the right local format (for example, 1,000.00 instead of 1.000,00). According to Pauline, setting the output locale is the very first thing translators are taught to do after duplicating a chart.
For her team juggling so many translations, output locales also provide a big organizational benefit: the locale label in each chart’s thumbnail makes it easy to tell the versions apart. “It’s great to see, just by looking: this is the Russian version, this is the English version, the Japanese version. You see it at the top right. And so you can tell immediately which is your graphic, which one you’re supposed to work on.”
Language-country codes help distinguish chart thumbnails on the Datawrapper dashboard
With basic chart elements translated automatically, all that’s left for journalists to do by hand are titles, tooltips, and annotations. “A simple chart can be translated in five, ten minutes,” Pauline reports. “Once the graphic is translated in Datawrapper, the person who was translating just has to copy the embed code into the content management system, and the story looks exactly the same as in its original version.”
Easy onboarding for new colleagues
4. “So easy to teach”
All the technical tools in the world won’t help to create a Japanese chart if no one using them speaks Japanese. Swissinfo.ch’s most important translation asset is its multilingual staff — most of whom have no background in data visualization. As a result, Pauline explains, the best tool for their needs will always be one that’s easy for coworkers to learn and use.
“Datawrapper is great because it’s simple,” she says. “It’s easy to convey the message to our colleagues that Datawrapper is easy to use, that everyone can do it, that they don’t need to be afraid of this tool. After one hour or two hours of training, people mostly know how to use it. It’s great to have a tool that’s so easy to teach, because I couldn’t translate every graphic into 10 languages myself!”
Part of the Italian-language team at work
Seeing results with Datawrapper
“Something we can all be proud of”
With everyone pitching in together, a visualization can really travel the world. “I like it when I see one of my graphics, for example, in Arabic,” Pauline says. “I can’t understand anything, but just to see it and see that it looks fine, perfect, exactly the same — but in Arabic! That’s something that we can really all be proud of.”
A donut chart from the Arabic edition of an article on arms deals, originally written in French
The teamwork and flexibility that Datawrapper enables are a perfect fit for swissinfo.ch’s international staff and outlook. “Datawrapper is the most suitable tool for how we work and what our audience is,” Pauline reflects. “It's perfect, really. Knowing how we work at swissinfo.ch, I couldn't think of another tool to do what we want to do.”
A big thanks to Pauline for taking the time to speak with us! To see more charts, go to swissinfo.ch or follow Pauline on Twitter @PaulineTuruban.
Can’t even begin to fathom how this will fare as a brand clean-up, or if it is true at all, but everyone wants to get a word in and all the suggestions are pretty much on the money.
Facebook is planning to rebrand the company with a new name. — The Verge Good morning, and welcome to our annual Connect conference. We’re glad to have you all here. Facebook, the company — as you’ve come to know us — has grown enormously since its founding so many years ago. What was once a … Continued
I was in Enschede today for a conference, and had dinner in ‘Foodies’ right across the square from the railway station. I had planned it differently, but my used-to-be-favourite watering hole didn’t have the Grolsch fall bokbier I wanted, and my fav ‘for old times sake’ mutton shoarma restaurant had closed down because of the pandemic. I walked back towards the station and ended up in Foodies. Here there used to be La Cucina, previously La Cuisine in a different spot, which was E’s and my favourite restaurant in Enschede for many years. After they went out of business something else took over, and now it’s called Foodies. Good beers on tap, and some good wines, it turned out today. The food is nice enough, well above pub grub and at very reasonable prices (I think they should want to charge more for dishes and up their game), and as they are near the railway station you can eat there and never miss your connection.
The real story however is about the current proprietor. He used to be a student at the Leeuwarden hospitality management school. He was supposed to do an internship, but as everything was locked down due to the pandemic there was no internship to be had. Instead he decided to open up his own pub and restaurant, and with the help of his parents chose Foodies. His mom served me my drinks, temporarily she hoped/thought, and he ran the place, chatted with customers while serving. Becoming a restaurant owner is his internship.
I admire his entrepreneurial guts, and wish him well, a lot. He definitely succeeded in making the large venue look and feel cosy, something our fav restaurateurs of old never quite succeeded in in the same spot. I will return to Foodies on my next Enschede visit.
This past weekend I found myself in Portland. Technically this was the third time I was in town, but the first two times were at the end of the Seattle to Portland ride, and both times I was there for less than an hour before being driven back to Seattle. This was the first time that I had time to explore a bit.
One of the first sights was this sign at the airport.
Bike share
The bike share system is 100% e-bike. It requires that you download both the Biketown app, and the Lyft app. The bikes themselves are scattered about the downtown area either at an official station like this:
or you can drop off or pick up at any bike rack. However there are additional charges associated with picking up or dropping off away from one of the orange stations.
Open either app, scan a QR code, and then you can unlock the bike.
A locked bike.
After you unlock the bike, you stow the short cable like this and off you go.
The bikes themselves are tanks with wide 26″ wheels, but the weight really isn’t much of a factor since they are electric.
A bad picture of the rear nuvinci hub.
Bafang motor in the front.
I thought that this control on the right was for throttle, but it was just for the Nuvinci hub. The assist is pedal actuated.
Overall, they worked really well. One quirk is that you have to use the app to see the battery level, and you only get to see the battery level (in terms of an estimated range remaining) once you unlock a bike, but if it is low, you can immediately relock a bike without charge.
River City Bicycles
Although Portland has many bike shops, I wanted to visit River City Bicycles because I had one of their wool jerseys that I bought off of eBay about 20 years ago when I still lived in Michigan.
Lots of good stuff to look at.
Many interesting bikes hung from the ceiling. Here is a Teledyne Titan, one of the first production Ti bikes.
An Exxon Graftek, one of the first carbon fibre frames.
A Rigi, which has two thin tubs for the lower part of the seat tube so that the rear tire can overlap where a normal seat tube would be. Hence the super short wheelbase.
The highlight was a Naked Bicycles Baba Ghanoush by Sam Whittingham, a variation of the bike that won best of show at the National Handmade Bike Show. The original was a one speed.
I couldn’t leave empty handed. They were clearing out the last of their wool jerseys with the stripes (I already had the short sleeve version). I also got their current jersey with 40% wool content made locally by Anthm Collective.
If you’re in the area, you might as well have a meal at Afuri Izakaya.
Robata-yaki i,e, grilled stuff.
yakitoriyuzu-shio ramen. Really really good.the custard pudding on the left was to die for
Bike infrastructure
A quick glance of downtown with the bike routes toggled on Google Maps shows a pretty dense network of bike routes. That combined with very courteous drivers made biking around town a pleasure. Also, many of the bridges across the Willamette had bike bikes. Take a look at this spiral off ramp for cyclists and pedestrians on the east side of the Morrison Bridge.
Riding north on the east bank, part of the route is a pontoon bridge.
Heading west on the Burnside Bridge.
I’ve never seen a passing bike lane before (headed west on the Hawthorne Bridge).
Liking this bridge over the 405.
Beyond the intersection, you can see that this one way street has parking on both sides, one car lane, and one bike lane of equal width. Amazing.
Sadly, there are a large number of homeless encampments, especially in the Old Town area.
The perpetual line at Voodoo donuts.
and just across the street is this famous sign.
which I first saw in this video.
A fun couple of days in Portland. I’ll have to go back when I have the chance.