Shared posts

20 Jan 03:12

An Amsterdam Kind of Life

Several conversations have brushed up against each other in interesting ways recently.

  1. Last week I tooted that everyone knows the word “startup”, which refers to company that is young and trying to grow rapidly, but we don’t even have a word for one that is mature and trying to sustain itself at its current size. Adjectives like “sustainable” don’t quite capture the idea; terms like “lifestyle company” feel dismissive, and “static” implies unchanging or unresponsive, which is just plain wrong. The Japanese use the word shinise (literally, “old shop”) to describe a restaurant that has been serving satisfied customers for decades or a hotel that has been in operation for over a thousand years. I think our industry (and our society) would be better if we celebrated the act of keeping things going rather than chasing the illusion of perpetual growth.

  2. Several of my friends got divorced during the pandemic. One said to me that after a year of being cooped up with their partner, they realized that they weren’t growing any longer. That comment didn’t strike me as odd at the time, but looking back, I wonder if they were stuck in the same paradigm trap as most tech companies—if they believed that everything is either growing or dying because that’s what late-stage capitalism drums into us. I enjoy novelty, but I also enjoy listening to albums I’ve heard a hundred times before or re-reading a particularly good book.

Startups and new relationships are exhilirating, but I don’t want to climb a new hill every day forever—the mere thought of it is exhausting. That doesn’t mean I want to see or do the same thing every day, though, and it certainly doesn’t mean I have to. The stewards of a shinise face new challenges all the time; they just don’t believe that growth is the only way to meet them. I can enjoy wandering around Amsterdam without thinking, “Damn, I wish there were more hills.” And as I said five years ago, I am content now to play the standards.

20 Jan 03:12

Virtualbox and Chrome Crashes

by Martin

Starting at some point in December last year, I suddenly started to get Chrome crashes on a Windows 10 installation running in Virtualbox virtual machine. Over time, the crashes got more frequent and annoying, so I started an investigation. What I found out totally took my by surprise.

Searching for the problem on the Internet brought up a lot of ideas such as renaming the Chrome executable, moving it to another directory and using a number of command line options to disable some features. However, no matter what I did, Chrome tabs kept crashing after some time and in the end, it felt like it occurred every quarter of an hour. OK, there are alternatives, so I tried Firefox, which also promptly started to crash for some content after a while. Strangely enough, all other programs, including very CPU intensive applications kept running on that Windows 10 installation without a hitch. When using Chrome on physical machines running Windows and Linux with those web pages, everything worked as it should. Next, I tried a Windows 10 installation in Virtualbox on another computer, and Chrome ran fine in there as well.

Could it be a hardware problem and if so, why would only web browsers crash while other programs would just run fine!?

Finally, I noticed that the Virtualbox version I was using was rather old, while the Virtualbox version on the PC where I didn’t observe the crashes was much more up to date. But why would it have something to do with the hypervisor? I couldn’t really answer that question, but a few days later when I started running out of ideas, I updated Virtualbox to the latest version. And gone where the Chrome crashes! Instantly! Not a single one in several days! So it was definitely a hypervisor problem! But what kind of problem could it be?

Perhaps it has something to do with hypervisor components that emulate physical hardware like the graphics card!? Here, for example, there’s quite a bit of software to simulate different graphics cards which also support dynamic changes of the screen resolution when changing the window size of the virtual machine client.

So long story short, it was an old Virtualbox version that caused the Chrome browser issues. That’s a bit of a shame, because it destroys my world view that programs run just the same in a virtual machine as they do on physical hardware. In theory, yes, but in practice, software drivers for virtual hardware can play nasty tricks. Lesson learned!

20 Jan 03:11

The Best Smart Strip Lights

by Rachel Cericola
A multi-color light strip, partially rolled out, and displaying segments of different colors.

Every year, I look forward to holiday lights. They remind me of when my son was little, and we would drive around as a family to take in all of the spectacular light displays around the neighborhood. It also signifies a time where there will be a lot of family togetherness — and cookies.

When January rolls around and the lights get packed away, sadness always sets in. I know I’m not alone, it’s a thing. However, there are ways to extend that twinkle in your eye and your living room.

Smart strip lights give me the dopamine fix I need throughout the year. They can add a burst of special effects to your kitchen counter, your fireplace mantel, or your Zoom or social videos. And they’re a popular way to add pizzazz to an otherwise dungeon-like dorm room. We have tested dozens, and like the Govee Strip Light 2 Pro because it delivers bright, accurate colors, includes more special effects and features than most other models we tested, is easy to fit into any space, and supports all the major smart-home platforms via Matter.

20 Jan 03:11

David Suzuki: Fossil gas is not healthy for children and other living things

by Staff

Pancouver is primarily focused on underrepresented artists, but it also publishes David Suzuki’s weekly column to advance education about critical environmental issues. Without a habitable planet that relies on biodiversity, there will be no arts and culture.

By David Suzuki

Cooking with gas has some advantages over cooking on conventional electric stoves, as gas stoves heat and cool instantly. But it’s not difficult to prepare amazing meals on an electric range, and efficient induction ranges offer even more versatility than gas—without the problems.

Those problems are significant, from household pollution to global heating. Gas stoves release dangerous pollutants into homes, buildings and the atmosphere, including nitrogen dioxide, carbon monoxide, formaldehyde and particulate matter.

recent analysis of 27 studies on the effects of gas appliances on children concluded 12.7 percent of current childhood asthma in the U.S. can be attributed to gas stove use—ranging from three per cent in Florida to 21.1 percent in Illinois. (The percentage of homes with gas stoves is much higher in Illinois than in Florida.) About 40 million U.S. households, 38 percent, have gas stoves.

The U.S. Environmental Protection Agency found nitrogen dioxide concentrations are 50 to 400 percent higher in homes with gas stoves than homes with electric appliances.

Nitrogen dioxide can cause cardiovascular and respiratory problems and exacerbate illnesses like flu and COVID-19. As a Vox article notes, “Outside, the EPA would consider the level of NO2 produced by the stove illegal. Inside, though, there is no regulation.”

Gas furnaces and water heaters cause less indoor air pollution because many jurisdictions require them to be vented outside—contributing to outdoor air pollution and climate change. (Research shows buildings in California emit more nitrogen oxides than power plants, and almost as much as cars.)

Gas dangers denied

So-called “natural” gas is almost entirely methane, a greenhouse gas pollutant about 80 times more potent than carbon dioxide over the short term. All along the supply chain, from extraction and production to transportation and use, considerable amounts of it escape into the atmosphere.

Health issues around gas appliances have been known since the 1980s. But as with other problems fossil fuels cause, industry has put considerable resources into downplaying or denying the dangers, and into promoting gas appliances.

Those efforts are heating up as many jurisdictions consider banning gas stoves for new homes and buildings. The tactics are wide-ranging: massive ad and “influencer” campaigns, fake grassroots groups and supporters (known as “astroturfing”) to support gas over electric, lobbying politicians and, sometimes, outright threats. Even the term “natural gas” was coined back in the 1930s as a way to portray it as a clean, affordable fuel. As a Mother Jones article points out, industry also adopted the slogan “cooking with gas” in the 1930s.

Industry argues proper ventilation will resolve indoor pollution issues. Putting aside the fact that this just moves pollution outdoors, most jurisdictions don’t require venting that would keep indoor air pure. Many people can’t afford to install adequate range hoods and fans, and renters often have no say.

Incentives can reduce gas use

The advantages of cooking with gas over conventional electric are mostly about convenience, and newer induction stoves, which use magnetics to heat, are more efficient, safer and better for indoor and outdoor environments. They’re also not subject to the volatility of fossil fuel markets.

However, shifting to electricity in all areas of our lives also means using cleaner sources, such as wind and solar. The main disadvantage of induction stoves is that they don’t work with all types of cookware—including copper and aluminum—but even that can be overcome by placing those pots and pans on a suitable metal heat plate.

Not everyone can immediately replace their polluting gas appliance, but incentives, regulations and building codes can ensure gas becomes a thing of the past. Of course, if you continue to use a gas stove, you should vent to the outside, or at least keep windows open while using it.

As with fossil fuels wastefully burned in cars, gas for cooking was never really about efficiency or affordability. The goal was to get people to buy and burn more to enrich the most profitable industry in history. Instead of recognizing the true value of these limited stores of concentrated solar energy that took millennia to create, our growth-driven economic system has long relied on burning them up as quickly as possible.

Its’ time to change that, for the health of our children, ourselves and the planet.

David Suzuki is a scientist, broadcaster, author and co-founder of the David Suzuki Foundation. Written with contributions from David Suzuki Foundation Senior Writer and Editor Ian Hanington.

Learn more at davidsuzuki.org.

The post David Suzuki: Fossil gas is not healthy for children and other living things appeared first on Pancouver.

20 Jan 03:11

Alex Sangha: It’s time to give international students in Canada a break on their tuition

by Staff

By Alex Sangha

The high cost of international student fees is becoming a major problem in Canada. Many international students are forced to work full-time jobs, including overtime, in addition to their full-time studies. Unfortunately, very often the jobs that are available to them are low-paid, and exploitive, which no one else wants to do.

Many international students have little support to help them adjust to a new country, which further compounds their stress, worry, trauma, and anxiety.

The colleges and universities in Canada are directly responsible for creating many of these difficult and challenging life situations because of the high cost of international student fees.

International students should be encouraged to come to Canada to study and enhance our educational system. They should not have to devote a lot of their time, effort, energy, and money just to survive and pay high tuition fees.

Lower tuition attracts best and brightest

If international student fees were lower, then it would increase the quality of international applicants because more people could afford to study in Canada. Canadian post-secondary institutions would benefit from more ideas, innovation, and cross-cultural learning, and attract the best and brightest from around the world.

Being able to attract top global students boosts the reputation, research, and educational experience offered by the school.

Some countries in Europe have already figured this out. For example, tuition is free for international students studying in Norway and at public universities in Germany. Not surprisingly, Norway and Germany are two of the most successful developed countries in the world, in part due to their affordable and accessible post-secondary education system.

Education is the great equalizer in society. It should not matter if you are rich or poor. The best and brightest should not have to worry about a financial barriers. It’s a great disservice to our world that only the rich can afford to attend many of the top universities in Canada.

God knows, how many future Nobel Prize winners were not given an opportunity to reach their potential or capacity as students in Canada because they had to work poor, minimum-wage, exploitive jobs to survive and pay their international tuition fees.

Although I feel domestic and international students should both have access to free universal post-secondary education in Canada, we can start by providing financial relief to the best and brightest from around the world who choose Canada as a place to learn and grow.

Delta resident Alex Sangha is the founder of Sher Vancouver, the Sundar Prize and Festival, and Goodness Pictures Ltd. Visit his website at AlexSangha.com.

The post Alex Sangha: It’s time to give international students in Canada a break on their tuition appeared first on Pancouver.

19 Jan 15:16

Apple Announces Second-Generation HomePod

by John Voorhees
Source: Apple.

Source: Apple.

Over the weekend, Mark Gurman said that Apple would be releasing a new HomePod soon. As it turns out, he was correct because today, Apple released a new second-generation HomePod. According to Apple’s press release,

With convenient new ways to manage everyday tasks and control the smart home, users can now create smart home automations using Siri, get notified when a smoke or carbon monoxide alarm is detected in their home, and check temperature and humidity in a room — all hands-free.

The HomePod is powered by an S7 chip and appears to feature a sound system similar to the first-gen model.

Source: Apple.

Source: Apple.

The new HomePod also adds a temperature and humidity sensor, which can be used as a trigger for home automations, and supports the Matter home automation standard.

The second-generation HomePod is available to order today, with deliveries beginning Friday, February 3rd for $299, which is $50 less than the original HomePod’s price.

Update: Thanks to the Wayback Machine, I’ve gone back and checked the second-generation HomePod’s tech specs against the original model, and there are some interesting differences. The new model weighs less at 5.16 pounds (2.3 kg) versus 5.5 pounds (2.5 kg). The new model is a little shorter, too, at 6.6 inches (168 mm) compared to the original’s 6.8 inches (172 mm), but the same width.

The new HomePod has two fewer tweeters at five compared to the original’s seven. No mention is made of direct and ambient audio beamforming in the tech specs for the new HomePod, although it does support Spatial Audio and Dolby Atmos, which is a nice addition. The latest HomePod has four far-field microphones compared to the original’s six too.

In addition to the temperature and humidity sensor, the new HomePod also features an accelerometer and will support Sound Recognition later this spring with a software update. It’s not clear whether that software update will work with the original HomePod or not.

The new HomePod is also getting a WiFi upgrade with 802.11n support. The new model also includes a Thread radio and Ultra Wideband chip, which the original did not.

Last but not least, the new HomePod’s tech specs appear to suggest that the power cable may be detachable, unlike the original model, because it’s listed as an item ‘in the box,’ whereas that wasn’t the case when the HomePod debuted.


Support MacStories and Unlock Extras

Founded in 2015, Club MacStories has delivered exclusive content every week for over six years.

In that time, members have enjoyed nearly 400 weekly and monthly newsletters packed with more of your favorite MacStories writing as well as Club-only podcasts, eBooks, discounts on apps, icons, and services. Join today, and you’ll get everything new that we publish every week, plus access to our entire archive of back issues and downloadable perks.

The Club expanded in 2021 with Club MacStories+ and Club Premier. Club MacStories+ members enjoy even more exclusive stories, a vibrant Discord community, a rotating roster of app discounts, and more. And, with Club Premier, you get everything we offer at every Club level plus an extended, ad-free version of our podcast AppStories that is delivered early each week in high-bitrate audio.

Join Now
19 Jan 15:15

Software Design by Example 14: Style Checker

Programmers argue endlessly about the best way to format their programs, but (almost) everyone agrees that the most important thing is to be consistent. Since checking rules by hand is tedious, most programmers use linting tools to make sure their code meets a set of rules and to reformat it if it doesn’t. Chapter 14 of Software Design by Example builds a simple linter inspired by ESLint, which I used to check all the code samples in the book. This tool parses source code to create a data structure, then goes through that data structure and applies rules.

As with many previous chapters, it emphasizes the idea that a program is just another kind of data. It also re-introduces the Visitor design pattern that carries an action to each element of a data structure. If I’d had time and energy, I would have also implemented this tool using the Iterator pattern that brings each element to the action so that I could compare and contrast the two approaches. If anyone feels motivated to give this a try, please give me a shout.

Walking a tree
Figure 14.2: Walking a tree to perform an operation at each node.

Terms defined: abstract syntax tree, Adapter pattern, column-major storage, dynamic lookup, generator function, intrinsic complexity, Iterator pattern, linter, Markdown, row-major storage, walk (a tree).

This chapter got me thinking about why Lisp-like languages such as Scheme have remained a niche interest despite computer scientists using them in introductory courses for several decades. These languages’ distinguishing features are (a) their preference for recursion instead of iteration and (b) the fact that programs are explicitly represented as data structures (in this case, nested lists), which makes the kind of introspection and manipulation described in this chapter much easier. I firmly believe that recursion is harder for most people to wrap their heads around than loops, though I accept that true believers won’t ever agree with me. What took me longer to realize, though, is that Lisp’s homoiconic representation of programs as lists is irrelevant to most novices because it solves a problem they aren’t ready to worry about yet. Looking over Software Design by Example now, I’m not sure it introduces challenges in the order that readers will be ready for; I’m going to have to think hard about this for the Python edition.

19 Jan 15:14

Another Standard Model

Back in 2004 I summarized the new Standard Model of computing. I was taught its predecessor, which included:

  • a character-oriented editor (usually Vi or Emacs);
  • C (which mutated into C++);
  • Unix command-line tools like cat and grep;
  • lines of text as a data exchange format;
  • Make for task automation;
  • CVS for version control; and
  • “power tools” like Yacc and Awk for more complex tasks.

By 2004, that had become:

  • Eclipse and its many plugins for editing;
  • Java;
  • XML as a data exchange format;
  • Ant for building and JUnit for testing;
  • reflection and things it enabled, like JavaBeans; and
  • an online project dashboard that includes a ticket manager and a searchable mailing list archive.

So what’s in the standard model of the early 2020s? Based on my experience over the last four years, my first stab is:

  • Python and a relational database (SQLite or Postgres);
  • HTTP and JSON for data exchange;
  • JavaScript and a front-end framework (e.g., React);
  • Docker and [name of cloud goes here] for deployment;
  • Slack for communication;
  • Git for version control;
  • GitHub as a project dashboard;
  • GitHub again for linting and testing; and
  • Stack Overflow as an external brainspace expander.

Lots of substitutions are obviously possible, like Mongo instead of a relational database or Linear instead of GitHub for issues, but I think this is the baseline against which variations are defined. If I’ve missed anything or included anything that you think people don’t now take for granted, please let me know.

19 Jan 15:14

HomePod 2 looks like HomePod – but it’s not

by Volker Weber
HomePod 2

HomePod 2 looks remarkably similar to the original HomePod, but internally they are quite different. Unfortunately, the dark picture that Apple chose this time does not reveal much.

When I read the description a couple of things stuck out. The first one that hit me was the five-tweeter array. I thought I remembered seven tweeters. And I was right. This is the original:

Original HomePod

I am curious about the “built-in bass-EQ mic”. HomePod tends to resonate with furniture surfaces and it would be quite an improvement if HomePod 2 mitigates this issue. This one is interesting:

The new built-in temperature and humidity sensor can measure indoor environments, so users can create automations that close the blinds or turn on the fan automatically when a certain temperature is reached in a room.

The same sensors are already present in the HomePod mini, so I shall have more sensors around the house. The press release also talks about the new home automation standard, so my hope is that HomePod 2 is also a Thread router like HomePod mini.

19 Jan 15:14

Prompting AI Generators Is Like Prompting Students

by Eugene Wallingford

Ethan Mollick tells us how to generate prompts for programs like ChatGPT and DALL-E: give direct and detailed instructions.

Don't ask it to write an essay about how human error causes catastrophes. The AI will come up with a boring and straightforward piece that does the minimum possible to satisfy your simple demand. Instead, remember you are the expert and the AI is a tool to help you write. You should push it in the direction you want. For example, provide clear bullet points to your argument: write an essay with the following points: -Humans are prone to error -Most errors are not that important -In complex systems, some errors are catastrophic -Catastrophes cannot be avoided

But even the results from such a prompt are much less interesting than if we give a more explicit prompt. Fo instance, we might add:

use an academic tone. use at least one clear example. make it concise. write for a well-informed audience. use a style like the New Yorker. make it at least 7 paragraphs. vary the language in each one. end with an ominous note.

This reminds me of setting essay topics for students, either for long-form writing or for exams. If you give a bland uninteresting question, you will generally get a bland uninteresting answer. Such essays are hard to evaluate. A squooshy question allows the student to write almost anything in response. Students are usually unhappy in this scenario, too, because they don't know what you want them to write, or how they will be evaluated.

Asking a human a more specific question has downsides, though. It increases the cognitive load placed on them, because there are more things for them to be thinking about as they write. Is my tone right? Does this sound like the New Yorker? Did I produce the correct number of paragraphs? Is my essay factually accurate? (ChatGPT doesn't seem to worry about this one...) The tradeoff is clearer expectations. Many students prefer this trade, at least on longer form assignments when they have time to consider the specific requests. A good spec reduces uncertainty.

Maybe these AI programs are closer to human than we think after all. (Some people don't worry much about correctness either.)

~~~~

On a related note: As I wrote elsewhere, I refuse to call ChatGPT or any program "an AI". The phrase "artificial intelligence" is not a term for a specific agent; it is the name of an idea. Besides, none of these programs are I yet, only A.

19 Jan 15:13

Microsoft to cut 10k jobs, about 5% of workforce

by Rui Carmo

Today wasn’t a good day.

I’m (thankfully) not impacted, but with an approximate 1/20 ratio, of course many of my friends were (not just in the US, although I do know a fair amount of people there), and I’m very sad for all of them–and hoping this won’t be a recurring process.

Also, it bears noting that this kind of thing was only generally in my predictions, which of course fall under my disclaimer


19 Jan 15:06

Technology that performs at the speed of news - Nieman Journalism Lab at Harvard

Technology that performs at the speed of news  Nieman Journalism Lab at Harvard
19 Jan 15:01

#validation pic.twitter.com/Xs54FTKwXQ

by the Awkward Yeti (Nick Seluk) (theawkwardyeti)
mkalus shared this story from theawkwardyeti on Twitter.

19 Jan 15:00

It's Time To Let Coal Die | Climate Town

19 Jan 15:00

Twitter revokes third-party API access without warning or explanation

mkalus shared this story from Twitter is Going Great!.

On Thursday evening, Twitter suspended without warning access to part of their API. The part that was suspended provided the data to power many of the most popular third-party clients used by Twitter users, including Tweetbot and Twitterific. Those apps no longer function.

Nobody at Twitter has officially acknowledged the move, but The Information reported that the move was intentional.
[A] senior software engineer wrote Thursday night that “Third-party app suspensions are intentional,” in an internal Twitter command center Slack channel, used by employees to handle outages and interruptions to Twitter’s services.
Third-party apps generally do not bring in ad revenue for the platform. Three days later, no official announcement has been made about the sudden change.

The reaction to this has been universally negative. The founder of Twitterific, Craig Hockenberry, wrote:
"What bothers me about Twitterrific’s final day is that it was not dignified. There was no advance notice for its creators, customers just got a weird error, and no one is explaining what’s going on. We had no chance to thank customers who have been with us for over a decade. Instead, it’s just another scene in their ongoing shit show. But I guess that’s what you should expect from a shitty person."
18 Jan 01:23

Replying to people on the social web used to be...

Replying to people on the social web used to be “simple” before #socialMedia, when we used blogs. You would either write:

1. a short reply — directly on someone’s blog post comment form, OR

2. a longer reply — on your own blog, in-reply-to & linking to the other post and send a Pingback, expecting at least the other post’s author to see your reply, or you would also write a short comment in their blog post comment form with a brief summary & link to your longer reply post

Aside: web forums^1 at the time were proto-silos^2, and replies/threads were generally self-contained therein.


Then social media exploded and eventually everybody was replying everywhere all at once.

This was so burdensome that some even hired social media managers to perform the labor of how (and if) to reply on each silo, and attempt to keep up with every new silo that popped up.


After a few years of this mid-to-late-2000s social web chaos, in the early 2010s many of us went back to option 2. above from the pre-social-media era, and as part of owning our data^3, started posting our replies in general on our own #IndieWeb sites:

1. Regardless of brevity or length, we resumed posting peer-to-peer replies on our personal sites (now sent site-to-site with Webmentions^4), watched destinations retrieve & display our comments, and were pleased that our peer-to-peer comments looked like any other comments (except with permalinks back to our originals).

2. We also started posting replies to tweets, GitHub issues^5, etc. on our own sites, and automatically POSSE-threading them into their sites of origin.

3. When we wrote site-to-site replies where the original post had itself been syndicated to social media^6, we did both 1 & 2. This let readers follow the conversation in either place, providing an #IndieWeb record for if/when the social media thread was taken down, or disappeared along with another silo shutdown^7.


Following this 1,2,3 approach helped conceptually simplify replying on the social web, and worked well except for a couple of interesting ongoing challenges:

* What is the most efficient user interface path from viewing someone else’s post to writing a reply from your own site?

* How should you @-mention someone you are replying to? (and how can our tools write or pre-fill that for us?)

Regarding the latter, on day 14 I wrote a bit about how should we @-mention in general https://tantek.com/2023/014/t4/domain-first-federated-atmention though that was more of a general @-mention exploration.

As a follow-up to day 14, it’s worth looking into @-reply mentions in particular, specifically for each of the above 1,2,3 contexts, analyzing examples of each, and looking for patterns of @-reply mentions best practices that we can document & recommend.

This is day 16 of #100DaysOfIndieWeb #100Days, except I didn’t finish writing it (mostly) til the morning after, and editing later that afternoon.

← Day 15: https://tantek.com/2023/015/t1/publish-indieweb-decide-distribute
→ Day 17: https://tantek.com/2023/018/t1/elevate-indieweb-above-silo


^1 https://en.wikipedia.org/wiki/Internet_forum
^2 https://indieweb.org/silo
^3 https://indieweb.org/own_your_data
^4 https://tantek.com/2023/012/t1/six-years-webmention-w3c
^5 https://indieweb.org/GitHub#POSSE_to_GitHub
^6 https://tantek.com/2023/015/t1/publish-indieweb-decide-distribute
^7 https://indieweb.org/site-deaths
17 Jan 22:59

Software Design by Example 13: Module Loader

The previous chapter showed how to use eval to load code dynamically. This chapter uses some of those ideas to build a small version of JavaScript’s require function. This function takes the name of a source file as an argument and returns whatever that file exports (typically, a bunch of constants and functions). The key requirement for such a function is to avoid accidentally overwriting things: if we just eval some code and it happens to assign to a variable called x, anything called x already in our program might be overwritten.

The real focus of the chapter is therefore how to encapsulate what we’re loading, i.e., how closures work and how to use them to implement namespaces. Our approach is based on the excellent tutorial in Casciaro and Mammino’s book Node.js Design Patterns, which contains a lot of other useful information as well.

Implementing modules with IIFEs (part 1)
Figure 13.2: Using IIFEs to encapsulate modules and get their exports (part 1).
Implementing modules with IIFEs (part 2)
Figure 13.3: Using IIFEs to encapsulate modules and get their exports (part 2).

Terms defined: absolute path, alias, circular dependency, closure, directed graph, encapsulate, immediately-invoked function expression (IIFE), inner function, Least Recently Used cache, namespace, plugin architecture.

17 Jan 22:58

Schutz, der nicht schützt

by Volker Weber

Eigentlich hat man ja ein Case auf seinem Telefon, damit ihm nichts passiert, wenn es runterfällt. Hier ist etwas geschehen, bei dem ich das Case für den Schaden verantwortlich sehe.

Das iPhone ist bei Aufstehen vom Sofa auf den Steinboden gefallen. Fallhöhe zwischen 50 und 70 cm. Das ist mir ohne Case in den letzten sieben Jahren sicher in mehreren Dutzend Fällen passiert. Nie ist etwas passiert. Hier aber fiel das Telefon sehr unglücklich auf den Metallring, der die Kamera schützen soll. Und Metall ist halt steif und gab den Stoß punktförmig weiter an eine Stelle, die normalerweise einen flachen Boden gar nicht berührt. PENG – kaputt. Ich habe den Knall deutlich gehört.

Nun lebt das iPhone dauerhaft in diesem Pitaka Case, das zwar die Zerstörung nicht aufhielt, aber hoffentlich das Eindringen von Staub bremst. Der Unfall passierte im Dezember, aber noch zeigen sich keine Folgen.

17 Jan 22:57

Here’s what’s going on in the world of extensions

by Sarah Vasquez
Credit: Nick Velazquez

About one-third of Firefox users have installed an add-on before – whether it’s an extension to add powerful and customizable features or a visual theme to personalize the web browsing experience. But if you’re unfamiliar, add-ons are sort of like apps for your browser. They can add all kinds of features to Firefox to make browsing faster, safer or just more fun.

The past year introduced some exciting new changes to the extensions world. The majority of these changes are foundational and take place in the deeply technical back-end of the system, typically out of sight of most Firefox users. However, if you pride yourself on hanging out in popular cybersecurity hubs, reading the latest tech news or developing your own extensions then you might have caught wind of some of these changes yourself.

If you’re not in the loop about the new changes in extensions, let us break it down for you!

Several years ago, Google proposed Manifest V3 (aka a number of intrinsic changes to the Chrome extension framework). Many of these changes would introduce incompatibilities between Firefox and Chromium-based browsers. This means developers would need to support two very different versions of their extensions if they wanted them available for both Firefox and Chromium-based browser users – a heavy burden for most developers that could result in some extensions only being available for one browser.

We believe that Firefox users benefit most when they have access to the broadest selection of useful extensions and features available, thus we’ve always placed long-term bets on cross-browser compatibility and a standards-driven feature for extensions.

With that, we agreed to introduce Manifest V3 support for add-ons, maintaining a high level of compatibility to support cross-browser development. However, there are some critical areas — like security and privacy — where our principles call for a different course of action. In a few targeted areas we decided to depart from Chrome’s implementation and incorporate our own distinctively Mozilla elements. Thus Firefox’s version of Manifest V3 will provide cross-browser extension interoperability, along with uniquely improved privacy and security safeguards, and enhanced compatibility for mobile extensions.

If ads give you the ick, then one distinction we’ve made around ad blockers has been especially crucial to privacy-lovers everywhere.

Content blockers are super important to privacy-minded Firefox users and tend to be the most popular type of browser extension. They not only prevent ick-inducing ads from following you around the internet, but they also make browsing faster and more seamless.

So we weren’t surprised to hear that Chrome users were concerned after learning that several of the internet’s most popular ad blockers, like uBlock Origin, would lose some of their privacy-preserving functionality on Google’s web browser, resulting from the changes Manifest V3 brings to Chrome’s extensions platform – changes that strengthen other facets of security, while unfortunately limiting the capabilities of certain types of privacy extensions.

But rest assured that in spite of these changes to Chrome’s new extensions architecture, Firefox’s implementation of Manifest V3 ensures users can access the most effective privacy tools available like uBlock Origin and other content-blocking and privacy-preserving extensions.

The new extensions button on Firefox gives users control

Adopting Manifest V3 also paved the way for a handy new addition to your Firefox browser toolbar: the extensions button. This gives users the ability to inspect and control which extensions have permission to access specific websites you visit.

The majority of extensions need access to user data on websites in order to work, which allows extensions to offer powerful features and cater to a variety of user needs. Regrettably, this level of site access can be misused and jeopardize user privacy. The extensions button essentially provides users with an opt-in capability and choice that didn’t exist before.

The panel shows the user’s installed and enabled extensions and their current permissions. Users are free to grant ongoing access to a website or to make that decision per visit and can remove, report, and manage extensions and their permissions directly from the toolbar. 

And if you’re not seeing those controls for a beloved extension of yours, it’s most likely because it’s not yet available in its Manifest V3 version. Don’t fret! Changes take time.

We love choice, especially when tied to enhancing user privacy and security – a double-win!

At Mozilla, we’re all about protecting your privacy and security – all while offering add-ons and features that enhance performance and functionality so you can experience the very best of the web. If interested, you can find more information about the extensions button at support.mozilla.org.

And if you’re a longtime Chrome user, don’t sweat it! Exploring a safer and more private alternative doesn’t have to be challenging. We can help you make the switch from Chrome to Firefox as your desktop browser in five simple steps. And don’t worry, you can bring along your bookmarks, saved passwords and even browsing history with you!


Interested in exploring thousands of free add-ons created by independent developers from all over the world? Please visit addons.mozilla.org to explore Firefox-recommended add-ons.

The post Here’s what’s going on in the world of extensions appeared first on The Mozilla Blog.

17 Jan 22:57

(via Gunshow - On Fire) Most of the time we just see the first...



(via Gunshow - On Fire)

Most of the time we just see the first two panels – which have become a meme. We never see the dog’s eyeballs popping out of their sockets and his face melting.

17 Jan 22:57

Apple Updates the MacBook Pro and Mac mini with New Chipsets and Other Features

by John Voorhees
Source: Apple.

Source: Apple.

Today, Apple announced new MacBook Pro 14” and 16” models and a new Mac mini via press releases and a video on its YouTube channel. The new laptops are available in M2 Pro and Max chip configurations and feature faster memory bandwidth, WiFi 6E, and the same design as the models they replace. The Mac mini has also been updated to add the M2 and M2 Pro options, as well as other features.

Source: Apple.

Source: Apple.

In its press release, Apple had this to say about the new M2 Pro and M2 Max SoCs:

M2 Pro scales up the architecture of M2 to deliver an up to 12-core CPU and up to 19-core GPU, together with up to 32GB of fast unified memory. M2 Max builds on the capabilities of M2 Pro, including an up to 38-core GPU, double the unified memory bandwidth, and up to 96GB of unified memory. Its industry-leading performance per watt makes it the world’s most powerful and power-efficient chip for a pro laptop.

The 13” MacBook Pro and MacBook Air were upgraded to the base model M2 last year, but the laptops announced today are the first to include the Pro and Max versions of that SoC. Regarding the MacBook Pro, Apple says:

With M2 Pro and M2 Max — the world’s most powerful and efficient chip for a pro laptop — MacBook Pro tackles demanding tasks, like effects rendering, which is up to 6x faster than the fastest Intel-based MacBook Pro, and color grading, which is up to 2x faster. Building on the unprecedented power efficiency of Apple silicon, battery life on MacBook Pro is now up to 22 hours — the longest battery life ever in a Mac. For enhanced connectivity, the new MacBook Pro supports Wi-Fi 6E, which is up to twice as fast as the previous generation, as well as advanced HDMI, which supports 8K displays for the first time. With up to 96GB of unified memory in the M2 Max model, creators can work on scenes so large that PC laptops can’t even run them.

Source: Apple.

Source: Apple.

The MacBook Pro with M2 Pro comes in 10 and 12-core CPU configurations that Apple says deliver up to 20% faster performance than the M1 Pro, about what you’d expect from an SoC with 20% more cores. The laptops can be configured with up to 32GB of unified memory that has 200GB/s of bandwidth, which is double the standard M2. The GPU has 19 cores and delivers 30% faster performance, according to Apple. The laptop also features Apple’s media engine that handles encoding and decoding video.

The M2 Max version of the MacBook Pro can be configured with up to 38 GPU cores for what Apple says is 30% better performance than the M1 Max, while the CPU has 12 cores. The MacBook Pro with M2 Max also supports up to 96GB of unified memory with 400GB/s of bandwidth.

Source: Apple.

Source: Apple.

Apple also updated the Mac mini today. Greg Joswiak, Apple’s senior vice president of Worldwide Marketing, said:

With incredible capabilities and a wide array of connectivity in its compact design, Mac mini is used in so many places, in so many different ways. Today, we’re excited to take it even further with M2 and M2 Pro. Bringing even more performance and a lower starting price, Mac mini with M2 is a tremendous value. And for users who need powerful pro performance, Mac mini with M2 Pro is unlike any other desktop in its class.

The Mac mini, which was among the first Macs to be updated to the M1, is gaining an M2 SoC, with an option to configure the desktop Mac with an M2 Pro. The M2 mini has two Thunderbolt 4 ports, and the Pro version comes with a total of four. The M2 model can power two displays, and the Pro model three.

The updates bring WiFi 6E to all of the Macs announced today for the first time too. The only other devices Apple makes that support the faster wireless networking standard are the 11” and 12.9” iPad Pros.

These look like solid updates across the board, but I’m especially interested in the Mac mini, which seems to be the best value among the Macs announced today.

Both Macs can be preordered today, with deliveries starting January 24th.


Support MacStories and Unlock Extras

Founded in 2015, Club MacStories has delivered exclusive content every week for over six years.

In that time, members have enjoyed nearly 400 weekly and monthly newsletters packed with more of your favorite MacStories writing as well as Club-only podcasts, eBooks, discounts on apps, icons, and services. Join today, and you’ll get everything new that we publish every week, plus access to our entire archive of back issues and downloadable perks.

The Club expanded in 2021 with Club MacStories+ and Club Premier. Club MacStories+ members enjoy even more exclusive stories, a vibrant Discord community, a rotating roster of app discounts, and more. And, with Club Premier, you get everything we offer at every Club level plus an extended, ad-free version of our podcast AppStories that is delivered early each week in high-bitrate audio.

Join Now
17 Jan 22:52

Ocean Beach (2022-23)

Ocean Beach (2022-23)

Chiyogami and paper on wood. 12 x 36 inches. This piece is availble for sale.

17 Jan 22:51

Extremely Hardcore Twitter

by Rui Carmo

I’m wary of giving too much exposure to the Twitter drama (especially given their recent moves), but this makes for some pretty fascinating reading, and seems like a fairly complete (albeit sometimes hard to believe as accurate) summary of what is turning out to be the ultimate tech cautionary tale.

And I’m sorry to write this given the amount of pain and frustration the situation is sure to be causing to folk who were fired from Twitter, but the whole thing is better than most movie scripts.

Outlandish, simply outlandish.


17 Jan 22:50

LunarFest Vancouver aims higher by elevating awareness of Indigenous perspectives to start the New Year

by Charlie Smith

Some things are quite predictable about Lunar New Year.

In non-pandemic years, there will always be lion dances on West Pender Street. Moreover, someone in the English-language media will invariably interview a person of Asian ancestry about the animal for which the New Year is named. And politicians of all stripes will issue Lunar New Year greetings to their constituents of Asian origin.

All of this reflects Canada’s multicultural society.

However, it’s much rarer to hear discussions about what Lunar New Year might mean for First Nations and Métis people. In addition, it’s unusual to hear perspectives from those whose ancestral roots go back to countries outside of East Asia.

The Asian-Canadian Special Events Association is trying to change that with its annual LunarFest Vancouver celebrations. On Friday (January 20)—two days before the start of the Year of the Rabbit—its Lantern City exhibition kicks off at three outdoor locations: Jack Poole Plaza, šxwƛ̓ənəq Xwtl’e7énḵ Square (formerly known as the Vancouver Art Gallery North Plaza), and Ocean Artworks on Granville Island.

Walis Labai (Wu Diing-Wuu) designed one of the large lanterns at Jack Poole Plaza. His father was born on the Chinese mainland and his mother is Indigenous Taiwanese of Seediq ancestry. This artwork is part of Coastal Lunar Lanterns, which includes designs by Coast Salish artist Ovila Mailhot, Plains Cree artist George Littlechild, and Taiwanese Paiwan artist Arucanglj Rusagelet.

The Coastal Lunar Lanterns gallery was created to acknowledge that Vancouver was built on unceded Indigenous territory. This display explores the relationship between people, culture, and nature.

Walis Labai
Walis Labai has created a series of images about the founding legend of the Seediq people.

Tree-born people celebrated on Lunar New Year

According to legend, the Seediq were born from the root of a tree that grew on Baishi Mountain in Central Taiwan.

It’s worth noting that Labai grew up thinking of himself as Taiwanese and Chinese. But after studying in the United States, he returned to Taiwan with a much broader worldview. Since then, he’s become a strong advocate for Indigenous traditional culture, which is reflected in his artwork.

His hybridized name demonstrates the revitalization process of Indigenous peoples in the island nation. This coincides with Indigenous people in North America rolling back the effects of colonialism on their cultures.

Moreover, Labai’s lantern at Jack Poole Plaza is part of his Tree Myth series of his images combining human portraits with images of trees. He’s been inspired by the Seediq’s “tree-born” legend. In creating these works, uses image-processing software.

“It conveys to modern society the innocence and purity of the natural world, and urges the return to the endlessly caring heart of nature,” Labai says in his artist’s statement.

Pancouver’s art director, Jessica Sung, chose Labai’s artwork for the Lunar New Year cover image because of the message it conveys. She points out that Canadian multiculturalism is, in a sense, about making ourselves smaller so that we can see the richness of more perspectives.

By combining lantern art with Indigenous art, she says Asian immigrants like herself can express gratitude to these lands, which Indigenous people have not ceded. To Sung, it’s also a way of offering thanks to the imagination of a better model of life upon these lands.

Peaceful and Free Together
The beadwork on rabbits gives a Métis feel to the lantern design by Phyllis Poitras-Jarrett.

Bringing cultures together

Starting on Friday (January 20), Indigenous-designed lanterns are also on display at the two other Lantern City locations. At šxwƛ̓ənəq Xwtl’e7énḵ Square (formerly known as the Vancouver Art Gallery North Plaza), Métis artist Phyllis Poitras-Jarrett and culture keepers Ocean Hyland and Jessie Recalma’s lanterns will stand alongside those created by Malaysian-born and Vancouver-based muralist and illustrator Arty Guava and South Asian artist and sociology professor Angela Aujla.

Over at Ocean Artworks will be lanterns designed by Kwakwaka’wakw carver and artist Richard Hunt and Kwakwaka’wakl-Oweekeno artist Rachel Smith. They will be beside other lanterns designed by South Asian artist Jessie Sohpaul and students at Arts Umbrella.

These installations are just one of several ways in which LunarFest Vancouver is bringing different cultures together to usher in the Year of the Rabbit. On January 24, there’s also major concert at the Orpheum Theatre, entitled Together We Are! This will featuring conductor Nicholas Urquhart and the Harmonia Orchestra, family folksinger-songwriter Ginalina, Vivaldi Chamber Choir, West Van Youth Band, Out in Harmony, and renowned Ukrainian pianist Anna Saglova.

In addition, the Asian-Canadian Special Events Association is presenting The Colours of Formosa by the National Taiwan Craft Research and Development Institute. Also taking place at Ocean Artworks at Granville Island, it will show how Taiwanese dye and fabric artists, including the legendary Ching-Lin Chen, are inspired by the wondrous natural beauty of the island nation. Chen has developed a persimmon dye workshop, which is being offered to thousands of schoolchildren in Vancouver and Burnaby.

“The workshops are intended to help encourage youths to be closer to Mother Nature and to be curious about our surroundings in exploring their creativity,” said Charlie Wu, managing director of the Asian-Canadian Special Events Association.

For more information on LunarFest Vancouver, visit the website.

The post LunarFest Vancouver aims higher by elevating awareness of Indigenous perspectives to start the New Year appeared first on Pancouver.

17 Jan 22:50

Datasette is my data hammer

Datasette is my data hammer

Jeremia Kimelman - a data journalist at CalMatters in Sacramento - enthuses about how he uses Datasette as his default hammer for all kinds of data projects - in particular how much he appreciates Datasette's focus on URLs. So nice to see this!

Via @jeremiak

17 Jan 04:11

How Catherine Died

by peter@rukavina.net (Peter Rukavina)

Catherine died three years ago today.

The next day, I wrote this email to a good friend, subject line How Catherine Died:

Oliver1 spent yesterday in the Palliative Care Centre; they kindly set aside the family room for him, put a do not disturb sign on the door, and secured a DVD player. During movie intermissions he would come and visit with Catherine. 

By this point Catherine had been asleep and unresponsive for almost 48 hours. In the middle of the afternoon I was laying down in the recliner beside her; it was quiet, and I didn’t expect anyone to stop in for a while, so I leaned over and told her that we were going to be okay, and that it was okay for her to die. 

It felt strange doing this, both because it feels strange telling someone it’s okay to die, and because it’s strange talking to someone who’s asleep. 

But I felt I had to say it, out loud, so she knew.

Around 5:00 p.m. Oliver got ready to go home for supper with my mother and my brother Mike; he came to see Catherine and gave her a big hug.

After seeing them off, I came back into Catherine’s room, and one of the volunteers brought in supper for me. I picked up my tray, then I heard a subtle change in Catherine’s breathing and put my tray down. Something had changed. I wasn’t sure what. But she was breathing a new rhythm.

I settled down, took my dinner tray, and ended up eating only the dessert, a strange kind of cold pear crisp.

Around 7:30 p.m., the nurses came in to freshen Catherine up, as they did every night she was in palliative care. I waited in the kitchen next door. 

While I was waiting I had a chat with a volunteer, someone I’d met a few nights earlier. She was finishing up her shift, and told me she hoped my mother would be okay. I didn’t correct her. On either front.

I got settled in the reclining chair beside Catherine’s bed, and felt restless. I alternated between trying to have a nap, and reading a book. The book was one given to me by a friend last week about a Hollywood actor who died from lung cancer; it was written by her husband, and made up mostly of the email newsletter he sent out to friends and family every night. 

After 9:00 p.m. I was well past the place in the book where the protagonist died and was several months into the husband’s grieving.

At 9:15 p.m. I looked over at Catherine and her eyes, the the first time since Tuesday, seemed to be open. 

“KD?”, I asked.

She made a sort of cough or a sneeze, grimaced, scrunched her nose, and seemed to stop breathing. But she’d seemed to stop breathing a hundred times over two days and so… 

Then she did breathe a couple of breaths.

And then repeated the cough/sneeze. I think at this point I half expected her to wake up and say “surprise!” 

But she didn’t: after a few more breaths, she stopped. 

And everything was still.

Until I re-read that email, just now, I’d forgotten that I’d told Catherine that it was okay to die.

It’s uncomfortable writing that out loud here.

It remains in the mystical realm whether Catherine heard me, and whether my words had any effect; it was something, I suspect, that I had to say out loud for my own benefit more than for hers.

But, also, we knew she was going to die, if not that day or that night, within the next few, and releasing her from any obligation to hold on seemed important.

We are so collectively terrified of death that it’s something we seldom talk about, and that itself is part of what amplifies the terror. For six years, since she was given an incurable diagnosis of metastatic breast cancer, I knew that Catherine was going to die. But I had no idea how or what that would be like, and the world around me seemed aligned in a desire to keep my eye off that ball.

And that’s why I’m repeating here those words I wrote three years ago: I want to help, if not “normalize” death, at least make it more possible, more permissible, to talk about, to write about, to anticipate death without abject terror.

The grief that followed Catherine’s death, three years worth of it, has been the roller-coasterest part of my life to date. I’ve felt my lowest lows, and my highest highs. I’ve had times when I have woken up, for weeks on end, in a cold sweat at 3:30 a.m. and not been able to get back to sleep. I’ve felt the freedom of being able to consider the future again. I’ve imagined being coldly fearfully alone, forever. I’ve tried my best to help Olivia process the loss of her mother. And I’ve found great new love. A way forward. Happiness.

What I’ve arrived at, three years in, is that grief is only on the surface about the things it appears to be about: deeper below is a complicated web of trauma connected to the bottom falling out of everything, maintaining daily life in the face of certain death (at some random point), the exhaustion of trying to buoy everyone else’s spirits, the (unspoken) frustration of not being able to plan anything, of having the future capped. Grief fucked me up, and for many, many more reasons than “I’m really sad that Catherine’s gone.”

And so, more recently, it’s been this that I’ve been quietly confronting, walking through, accepting.

For all of you who knew and loved Catherine, I am thinking of you today, in solidarity, and with the hope that you’re finding your own ways through the forest.

1. Oliver (he/him) now identifies as Olivia (she/her).

17 Jan 04:11

dslreagle

by nobody@flickr.com (ecstaticist - evanleeson.com)
mkalus shared this story from Uploads from ecstaticist - evanleeson.com:
Majestic.

ecstaticist - evanleeson.com posted a photo:

dslreagle

Full zoom with a 55-300 Pentax HD-DA f/4.5-6.3 ED PLM WR RE. I don't know what all those designations mean, but the add up to a great lens. I took this from 50M away on a dreary day.



17 Jan 04:11

Mastodon relationship graphs

by Jon Udell

The new release of Steampipe is all about relationship graphs. Our blog post shows how these graphs provide contextual awareness for devops and security pros who can now see all the resources related to an EC2 instance, or determine at a glance whether the permissions related to an IAM role are properly scoped. As always, developers can explore and remix the code that builds these graphs, and adapt the idioms for their own purposes in any data domain.

These relationship graphs are driven by SQL queries that define nodes and edges. Such queries can use any column of any table provided by any Steampipe plugin to form nodes, and then edges between nodes. If you want to see connections among the people and objects represented by diverse APIs, you can now use SQL idioms to graph them. The only limit is your imagination.

Naturally I imagined graphing Mastodon relationships. So far I’ve built two graphs that visualize my home timeline. Here’s the first one.

Here we’re looking at the most recent 50 boosts (the Mastodon version of retweet) in my homeline. This is the query to find them.

select
  *
from
  mastodon_toot
where
  timeline = 'home'
  and reblog_server is not null
  limit  50

If we focus on Brian Marick we can see that:

  • Brian belongs to mastdn.social
  • Brian boosted a post by Tim Bray
  • Tim belongs to hachyderm.io

So this graph shows people on a selected server boosting people on other servers. In this case mastdn.social is the selected server, but we can refocus the graph on any other server that’s sending boosts.

The second graph zooms out to show the web of boost relationships among servers. If anyone on infosec.exchange boosts anyone on mastodon.world, there’s an edge connecting the two nodes. Although it’s not happening anywhere in this graph, the arrow can point both ways and would if anyone on mastodon.world were also boosting anyone on infosec.exchange.

Let’s build up the first graph step by step.

Step 1: Identify the selected server

Here’s the definition of the node that represents the selected server.

node {
  category = category.selected_server
  args = [ self.input.server.value ]
  sql = <<EOQ
    select
      server as id,
      server as title,
      jsonb_build_object(
        'server', server
      ) as properties
    from
      mastodon_boosts()
    where
      server = $1
  EOQ
}

Per the documentation, a node’s query must at least select a column aliased as id. Here it’s the server column in a row returned by the above query. I’ve packaged that query into a SQL function, mastodon_boosts, to hide details (timeline = 'home' reblog_server is not null limit 50) and make it easier to focus on what’s special about each node. In this case the special quality is the server column that gives the node its identity matches the selected server.

If the graph block includes only this node, and mastdn.social is the selected server, here is the rendering. Not much to see here yet!

The node defines a bag of properties that can be any of the columns returned by the underlying query; these appear when you hover the node. The node also refers to a category that governs the node’s icon, color, and link. Here’s the category for the selected server.

category "selected_server" {
  color = "darkgreen"
  icon = "server"
  href  = "https://{{.properties.'server'}}"
}

Step 2: Identify boosted servers

Now we’ll add boosted servers. This node uses the same set of records: the 50 most recent boosts in my feed. Again it finds just those whose server column matches the selected server. But the id is now the reblog_server which is the target, instead of the origin, of boosts from the selected server.

node {
  category = category.boosted_server
  args = [ self.input.server.value ]
  sql = <<EOQ
    select
      reblog_server as id,
      reblog_server as title
    from
      mastodon_boosts()
    where
      server = $1
    EOQ
}

Here’s the graph with both selected_server and boosted_server nodes. We’ve used another category to differentiate the boosted nodes.

There’s only one selected server but it can send boosts to more than one boosted server. The default rendering folds them into one node but you can click to unfold and see all of them.

Step 3: Identify people who boost others

Where are the people? Let’s add them next, starting with the people who are sending boosts.

node {
  category = category.person
  args = [ self.input.server.value ]
  sql = <<EOQ
    select
      username as id,
      display_name as title,
	    jsonb_build_object(
        'instance_qualified_account_url', instance_qualified_account_url
      ) as properties
    from
      mastodon_boosts()
    where
     server = $1
    EOQ
  }

The username column gives the node its identity. Note also the property instance_qualified_account_url. That’s the synthetic column we added to the Mastodon plugin last time to ensure that links to people and toots will work properly in the Mastodon client. Because it’s included in a property here, and because category.person refers to that property, links representing people in the graph will resolve properly.

Step 4: Identify people who are boosted

This node takes its identify from the reblog_username column, and uses the synthetic column instance_qualified_reblog_url to provide the link.

node {
  category = category.boosted_person
  args = [ self.input.server.value ]
  sql = <<EOQ
    select
      reblog_username as id,
      reblog_username as title,
      jsonb_build_object(
        'instance_qualified_reblog_url', instance_qualified_reblog_url
      ) as properties
    from
      mastodon_boosts()
    where
      server = $1
  EOQ
}

Step 5: Connect boosters on the selected server to that server

So far we’ve seen only nodes, whose queries minimally return the id property. An edge connects nodes by way of a query that minimally returns columns aliased to from_id and to_id.

edge {
  sql = <<EOQ
    select
      username as from_id,
      server as to_id,
      'belongs to' as title
    from
      mastodon_boosts()
  EOQ
}

You’ll also want to provide a title to label the edge. Here this edge occurs twice to represent “John Mashey belongs to mstdn.social” and “Brian Marick belongs to mstdn.social.”

Step 6: Connect people on boosted servers to their servers

This edge works the same way, but captures the relationship between boosted people and their servers.

edge {
  args = [ self.input.server.value ]
  sql = <<EOQ
    select
      reblog_username as from_id,
      reblog_server as to_id,
      'belongs to' as title
    from
      mastodon_boosts()
    where
      server = $1
  EOQ
}

Step 7: Connect boosters to the people they boost

Finally we add an edge to connect boosters to the people they boost.

edge {
  category = category.boost
  args = [ self.input.server.value ]
  sql = <<EOQ
    select
      username as from_id,
      reblog_username as to_id,
      'boosts' as title,
      jsonb_build_object(
        'reblog_username', reblog_username,
        'reblog_server', reblog_server,
        'content', reblog ->> 'content'
      ) as properties
    from
      mastodon_boosts()
    where
      server = $1
  EOQ
}

And now we’ve completed the first graph shown above.

Graphing GitHub relationships

You can use this grammar of nodes and edges to describe relationships in any domain. Here’s a graph that looks across all the Steampipe-related repos and shows recently-updated PRs from external contributors.

And here’s one that uses any Steampipe plugin to show recently-updated pull requests for a selected repo.

These two views share a common SQL query and serve complementary purposes. The table is handy for sorting by date or author, the graph highlights one-to-many relationships.

Lifting the burden of context assembly

In What TimeDance got right I mourned the passing of a tool for scheduling meetings that had excelled at bringing together the messages and documents related to a meeting. I called this “context assembly” — a term I’d picked up from Jack Ozzie, cofounder of Groove, another collaboration tool whose passing I mourn. Context assembly is hard work. Too often the burden falls on people who only need to use that context and would rather not spend time and effort creating it.

We’ve seen how SQL can unify access to APIs. Now it can also help us see relationships among the data we extract from those APIs.


1 https://blog.jonudell.net/2022/11/28/autonomy-packet-size-friction-fanout-and-velocity/
2 https://blog.jonudell.net/2022/12/06/mastodon-steampipe-and-rss/
3 https://blog.jonudell.net/2022/12/10/browsing-the-fediverse/
4 https://blog.jonudell.net/2022/12/17/a-bloomberg-terminal-for-mastodon/
5 https://blog.jonudell.net/2022/12/19/create-your-own-mastodon-ux/
6 https://blog.jonudell.net/2022/12/22/lists-and-people-on-mastodon/
7 https://blog.jonudell.net/2022/12/29/how-many-people-in-my-mastodon-feed-also-tweeted-today/
8 https://blog.jonudell.net/2022/12/31/instance-qualified-mastodon-urls/
9 https://blog.jonudell.net/2023/01/16/mastodon-relationship-graphs/
10 https://blog.jonudell.net/2023/01/21/working-with-mastodon-lists/
11 https://blog.jonudell.net/2023/01/26/images-considered-harmful-sometimes/
12 https://blog.jonudell.net/2023/02/02/mapping-the-wider-fediverse/
13 https://blog.jonudell.net/2023/02/06/protocols-apis-and-conventions/
14 https://blog.jonudell.net/2023/02/14/news-in-the-fediverse/
15 https://blog.jonudell.net/2023/02/26/mapping-people-and-tags-on-mastodon/
16 https://blog.jonudell.net/2023/03/07/visualizing-mastodon-server-moderation/
17 https://blog.jonudell.net/2023/03/14/mastodon-timelines-for-teams/
18 https://blog.jonudell.net/2023/04/03/the-mastodon-plugin-is-now-available-on-the-steampipe-hub/
19 https://blog.jonudell.net/2023/04/11/migrating-mastodon-lists/
20 https://blog.jonudell.net/2023/05/24/when-the-rubber-duck-talks-back/

17 Jan 04:10

Drag Queen story time supporters shout down protesters in Coquitlam, B.C. | CBC News

mkalus shared this story .

British Columbia

Supporters of an inclusive reading event in Coquitlam on Saturday were the latest to shout down a small group of protesters who have been targeting the events.

Event in Coquitlam latest to be targeted, while children and families defend inclusion

Supporters of an inclusive reading event in Coquitlam, B.C., on Saturday were the latest to shout down a small group of protesters who have been targeting the events.

It's the second time the Coquitlam Public Library has hosted a Drag Queen Story Time, similar to events that have been held across North America since 2015 as a way to create diverse, accessible, and culturally-inclusive family programming.

Saturday's event hosted drag queen Conni Smudge, whom police escorted as she arrived.

Meanwhile, about 100 supporters of the event played loud music, waved rainbow flags and shouted at about 10 protesters who held signs that read, "Stop Drag Queen Story Hour," "Gays against Groomers," and "Sexualizing Children is Child Abuse."

"Yes there were some haters outside but I would say we blew them out of the water," said Smudge, who is the creation of drag artist Chris Bolton.

"I couldn't feel the haters," Smudge added.

"All those children inside, and all of their clever parents who want these kids to grow up exactly who they are, being their authentic selves, and being loving and caring about each other — I wouldn't want to be involved in anything else."

In 2019, a similar event in Kelowna created controversy when the Okanagan Regional Library's CEO spoke out against the event, saying it could be divisive.

Smudge said she was drawn to the drag story time events because libraries were a safe haven for when her creator, Bolton, was growing up.

"A nice comfy place that I could read and find out about the world. Libraries are about belonging and I never felt like I belonged."

Detractors of the events argue that cross-dressing storytellers could indoctrinate or sexualize children, while supporters say the glitzy story times aim to celebrate diversity in a safe space, saying it's prejudice that hurts children, not drag queens.

WATCH | Coquitlam resident talks about the importance of inclusion in her community: 

Port Coquitlam, B.C., resident joins crowd in supporting Drag Queen Story Hour at local library

A group of around 100 supporters of an inclusive reading event at the Coquitlam Public Library were met by a small group of protesters on Jan. 14, 2023.

Children at the event told CBC News they enjoyed the story hour and were excited to see a drag queen in real life.

Samantha Wink, who speaks for the Coquitlam Public Library, said Saturday's large, positive turn-out was evidence the events are resonating with the city. More are slated to be held, she said.

"I think having a turnout of this size really shows that there is an appetite for the community in attending events that really promote inclusion," said Wink.

Selina Robinson, the MLA for Coquitlam-Maillardville and minister of post-secondary education and future skills, also showed up in support of the event.

"Love is louder than hate. Coquitlam is my community and I was elected by a strong majority to represent folks who call Coquitlam home," she tweeted afterwards.

With files from Yasmin Gandham

17 Jan 04:10

Twitter Favorites: [Planta] I’m still saying ‘Happy New Year, if you celebrate it’ sixteen days into 2023.

Joseph Planta @Planta
I’m still saying ‘Happy New Year, if you celebrate it’ sixteen days into 2023.