It's the holidays, and you know what that means. … I've had enough time off from programming professionally that now I want to do some of it for fun!
I previously wrote a tool that syncs statuses from Mastodon to my FeoBlog instance. I was thinking about making some updates to that, and then I remembered that I'd read that Threads got around to testing their federation support.
Maybe I can update my tool to also sync posts from Threads, then? Let's test that out and see how their interoperability is coming along. (Spoiler: So far, not great.)
Nushell's built-in support for HTTP requests, JSON, and structured data makes it pretty nice for doing this kind of experimentation, so that's what I'm using here. Let's start by fetching a "status" with the Mastodon REST API:
def getStatus [id: int, --server = "mastodon.social"] {
http get $"https://($server)/api/v1/statuses/($id)"
}
let status = getStatus 111656384454261788
$status | select uri created_at in_reply_to_id
This works, and gives us back (among other data):
╭────────────────┬──────────────────────────────────────────────────────────────────────╮
│ uri │ https://mastodon.social/users/Iamgroot11/statuses/111656384454261788 │
│ created_at │ 2023-12-28T05:26:57.877Z │
│ in_reply_to_id │ 111656368951064667 │
╰────────────────┴──────────────────────────────────────────────────────────────────────╯
So does this, even though that status is coming from a different server. (Yay, federation!)
let status2 = getStatus $status.in_reply_to_id
$status2 | select uri created_at in_reply_to_id
╭────────────────┬───────────────────────────────────────────────────────────────╮
│ uri │ https://spacey.space/users/kmccoy/statuses/111656368910605303 │
│ created_at │ 2023-12-28T05:23:00.000Z │
│ in_reply_to_id │ 111656361314256557 │
╰────────────────┴───────────────────────────────────────────────────────────────╯
We can use the ActivityPub API for retrieving objects from remote servers to confirm that the version we got from our server matches the one published by this user:
def getActivityStream [uri] {(
http get $uri
--headers [
accept
'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'
]
| from json
)}
let remote_status2 = getActivityStream $status2.uri
$remote_status2 | select url published inReplyTo
╭───────────┬──────────────────────────────────────────────────────────────────╮
│ url │ https://spacey.space/@kmccoy/111656368910605303 │
│ published │ 2023-12-28T05:23:00Z │
│ inReplyTo │ https://www.threads.net/ap/users/mosseri/post/17928407810714224/ │
╰───────────┴──────────────────────────────────────────────────────────────────╯
But there's no such luck with Threads. We can fetch the status from mastodon.social
:
let status3 = getStatus $status2.in_reply_to_id
$status3 | select uri created_at in_reply_to_id
╭────────────────┬──────────────────────────────────────────────────────────────────╮
│ uri │ https://www.threads.net/ap/users/mosseri/post/17928407810714224/ │
│ created_at │ 2023-12-28T05:15:53.000Z │
│ in_reply_to_id │ │
╰────────────────┴──────────────────────────────────────────────────────────────────╯
But threads.net
seems to be misrepresenting that it has an ActivityPub (ActivityStream) object at that URL/URI:
getActivityStream $status3.uri
Error: nu::shell::network_failure
× Network failure
╭─[entry #182:1:1]
1 │ def getActivityStream [uri] {(
2 │ http get $uri
· ──┬─
· ╰── Requested file not found (404): "https://www.threads.net/ap/users/mosseri/post/17928407810714224/"
3 │ --headers [
╰────
I discovered that the URL (not URI) advertises that it is an "activity":
http get $status3.url | parse --regex '(<link .*?>)' | find -r activity | get capture0 | each { from xml }
╭──────┬──────────────────────────────────────────────────────────────┬────────────────╮
│ tag │ attributes │ content │
├──────┼──────────────────────────────────────────────────────────────┼────────────────┤
│ link │ ╭──────┬───────────────────────────────────────────────────╮ │ [list 0 items] │
│ │ │ href │ https://www.threads.net/@mosseri/post/C1YndCeuddr │ │ │
│ │ │ type │ application/activity+json │ │ │
│ │ ╰──────┴───────────────────────────────────────────────────╯ │ │
╰──────┴──────────────────────────────────────────────────────────────┴────────────────╯
… but that URL doesn't serve an Activity either. (It just ignores our Accept
header and gives back a Content-Type: text/html; charset="utf-8"
.)
So what we seem to have here is Threads doing juuuust enough work to shove ActivityPub messages into Mastodon. But it's certainly not yet supporting enough of the ActivityStream/ActivityPub API to validate against spoofing attacks, as the W3C docs recommend:
Servers SHOULD validate the content they receive to avoid content spoofing attacks. (A server should do something at least as robust as checking that the object appears as received at its origin, but mechanisms such as checking signatures would be better if available). No particular mechanism for verification is authoritatively specified by this document, [...]
Is Mastodon just accepting those objects from a peered server without any sort of validation that they match what that peer serves for that activity? That would allow Threads to inject ads into (or otherwise modify) statuses that it pushes into Mastodon.
Or maybe Threads is only responding to ActivityStream requests if they're coming from a peer server that has been explicitly granted access? That would let them "federate" with peers on their terms, while not letting us plebs peek into the walled garden of data.
I'll reservedly concede that this may just be the current unfinished state of Threads's support for ActivityPub/ActivityStreams. But let's wait and see how much they actually implement, and how interoperable it ends up being.
@NfNitLoop ("Cody C. #BLM") retweeted:
@Jack_Petocz ("Jack Petocz 🏳️🌈") wrote:
Today is a dark day for LGBTQ+ people. Ron DeSantis just BANNED:
-Gender-affirming healthcare for minors.
-Trans people from using the bathroom that aligns with their gender identity.
-Students and staff from using their preferred pronouns in a public school.
No words.
@NfNitLoop ("Cody C. #BLM") retweeted:
@thingskatedid ("Kate") replied to a tweet by @IanColdwater:
@IanColdwater @thegrugq jesus christ i just want to write code without being breathed on and dying
@NfNitLoop ("Cody C. #BLM") retweeted:
@gaywonk ("Carlos Maza") wrote:
Elon Musk is a white supremacist.
@NfNitLoop ("Cody C. #BLM") retweeted:
@LolOverruled ("Lolo") wrote:
His motives remain mysterious
with quote tweet:
@oneunderscore__ ("Ben Collins") wrote:
The Allen, Texas shooter had Nazi and SS tattoos. He wrote that Josef Mengele was his "hero." In an online screed, he wrote "this post is inspired by LibsOfTikTok," before ranting about "drag queen story hour." That post ended with the words "Heil Hitler."
@NfNitLoop ("Cody C. #BLM") retweeted:
@tozozozo ("tonči zonjić") wrote:
the new Ted Chiang article is absolutely required reading https://www.newyorker.com/science/annals-of-artificial-intelligence/will-ai-become-the-new-mckinsey
@NfNitLoop ("Cody C. #BLM") wrote:
Replace Bash with Deno:
https://blog.nfnitloop.com/u/42P3FTZoCmN8DRmLSu89y419XfYfHP9Py7a9vNLfD72F/i/4Y5PuPA1cpSfSDBDaayHowAtMFLmfk69jyAu5N6Tefo68YwyfpjehuRHzCanjkaiEbHUqdcZxVdi1M25LubAL2f3/#Bash #Deno #TypeScript #JavaScript #scripting #cicd #automation #programming
@NfNitLoop ("Cody C. #BLM") replied to a tweet by @NfNitLoop:
I've had this rant about other languages too. One Big Tech employer required every Java method parameter or local variable be declared `final`. So much ceremony, tedium, and diff churn for no gain.
I like types. I like immutable types. I do not like cargo cult software eng.
@NfNitLoop ("Cody C. #BLM") wrote:
I was just complaining elsewhere about linters overzealously recommending `const` for local variables in #JavaScript/#TypeScript and came across @buildsghost's excellent rant:
https://jamie.build/const
@NfNitLoop ("Cody C. #BLM") retweeted:
@kayla_denker_02 ("Pinko Scum") wrote:
5/6/1933, exactly 90 years ago today the Nazis sacked Magnus Hirschfeld's Institute of Sexology, destroying countless scientific research into queer Healthcare including transition procedures for trans people. The most famous pictures of a Nazi book-burning are from this event.
@NfNitLoop ("Cody C. #BLM") retweeted:
@LolOverruled ("Lolo") replied to a tweet by @LolOverruled:
It’s always framed in a way that suggests the violence belongs in certain spaces and not others. The violence doesn’t belong anywhere
I'm starting to get a reputation as a bit of a Deno fanatic lately. But (if you haven't seen the title of this blog post) it might surprise you why I'm such a fan.
If you visit deno.com, the official documentation will tell you things like:
While all of those are great features, in my opinion the most underrated feature of Deno is that it's a great replacement for Bash (and Python/Ruby!) for most of your CLI scripting/automation needs. Here's why:
Bash is great for tossing a few CLI commands into a file and executing them, but the moment you reach for a variable or an if
statement, you should probably switch to a more modern programming language.
Bash is old and has accumulated a lot of quirks that not all programmers will be familiar with. Instead of removing the quirks, or warning about them, they're kept to ensure backward compatibility. But that doesn't make for a great programming language.
For example, a developer might write code roughly like:
if [ $x == 42 ]; then
echo "do something"
else
echo "do something else"
fi
Can you spot the problems?
$x
is undefined, the test expression will fail with an error.$x
is a string that includes spaces and/or a ]
character, the tester will likely return an error.$x
may silently return false positives for this match. (I leave crafting them as an exercise to the reader. Share your favorites!)These gotchas are even more dangerous when you're writing a script to manage files. Several versions of rm
now have built-in protections against accidentally running rm -rf /
because it is such a common mistake you can make in Bash and other shells when your variable expansion goes awry.
Do you need an array? As recently as a couple years ago (and possibly even still?) the default version of Bash on MacOS is old enough to not support them. If you write a bash script that uses arrays, you'll get different (wrong) behavior on MacOS.
Seriously, stop writing things in Bash!
My theory is that Bash scripts are the default because people want to just write a self-contained file to get a thing done quickly.
Previously, Python was what I would reach for once a task became unwieldy in Bash. But, in Python you might need to include a requirements.txt
to list any library dependencies you use. And if you depend on particular versions of libraries, you might need to set up a venv to make sure you don't conflict with the same libraries installed system-wide at different versions. Now your "single-file" script needs multiple files and install instructions.
But in Deno you can include versioned dependencies right in the file:
import { range } from "https://deno.land/x/better_iterators@v1.3.0/mod.ts"
for (const value of range({step: 3}).limit(10)) {
console.log(value)
}
There is no install step for executing this script. (Assuming your system already has Deno.) The first time you deno run example.ts
, Deno will automatically download and cache the remote dependencies.
You can even add a "shebang" to make the script executable directly on Linux/MacOS:
#!/usr/bin/env -S deno run
import ...
While Windows doesn't support shebang script files, the deno install command works on Windows/Linux/MacOS to install a user-local script wrapper that works everywhere.
Not only that, you can deno install
and deno run
scripts from any URL!
deno run https://deno.land/x/cliffy@v0.25.7/examples/ansi/color_themes.ts
Deno makes TypeScript a first-class language instead of an add-on, as it is in Node.js, so the file you write is strongly typed right out of the box. This can help detect many sorts of errors that Bash, Python, Ruby, and other scripting languages would let through the cracks.
By default, Deno leaves type checking to your IDE. (I recommend the Deno plugin for VSCode.) The theory is that you've probably written your script in an IDE, so by the time you deno run
it, it would be redundant to check it again. But, if you or your teammates prefer to code in plain text editors, you can get type-checking there as well by updating your shebang:
#!/usr/bin/env -S deno run --check
Now, Deno will perform a type check on a script before executing it. If the check fails, the script is never executed. This is much safer than getting half-way through a Bash or Python script and failing or running into undefined behavior because you typo'd a variable name, or had a syntax error.
Don't worry, the results of type checks are cached by Deno, so you will only pay the cost when the file is first run or modified.
While I have not been a fan of JavaScript in the past, Deno modernizes JavaScript/TypeScript development so much that I find myself very productive in it. It's replaced Bash and Python as my go-to scripting language. If you or your team are writing Bash scripts, I'd strongly recommend trying Deno instead!
@NfNitLoop ("Cody C. #BLM") retweeted:
@jbillinson ("Josh Billinson") wrote:
incredible to watch them immediately invent the verification program they just scrapped
I try to be pragmatic when it comes to programming languages. I've enjoyed learning a lot of programming languages over the years, and they all have varying benefits and downsides. Like a lot of topics in Computer Science, choosing a language is all about tradeoffs.
I've seen too many instances of people blaming the programming language they're using for some problem when in fact it's just that they misunderstood the problem, or didn't have a good grasp of how the language worked. I don't want to be That Guy.
However, I still really haven't understood the hype behind Go. Despite using it a few times over the years, I do not find writing Go code pleasant. Never have I thought "Wow, this is so much nicer in Go than [other language]." If asked, I can't think of a task I'd recommend writing in Go vs. several other languages. (In fact, part of my reason for finally compiling my issues with Go into a blog post is so I'll have a convenient place to point folks in the future w/o having to rehash everything.)
Before I get into what I don't like about the language, I'll give credit where credit is due for several features that I do like in Go.
Go doesn't suffer from "Function Coloring". All Go code runs in lightweight "goroutines", which Go automatically suspends when they're waiting on I/O. For simple functions, you don't have to worry about marking them as async
, or await
ing their results. You just write procedural code and get async performance "for free".
Defer is great. I love patterns and tools that let me get rid of unnecessary indentation in my code. Instead of something like:
let resource = openResource()
try {
let resource2 = openResource2()
try {
// etc.
} finally {
resource2.close()
}
} finally {
resource.close()
}
You get something like:
resource := openResource()
defer resource.Close()
resource2 := openResource2()
defer resource2.Close()
// etc.
The common pattern in other languages is to provide control flow that desugars into try/finally/close, but even that simplification still results in unnecessary indentation:
try (val fr = new FileReader(path); val fr2 = new FileReader(path2)) {
// (indented) etc.
}
I prefer flatter code, and defer
is great for that.
I've been hearing "[Prefer] composition over inheritance" since I was in university (many) years ago, but Go was the first language I learned that seemed to take it to heart. Go does not have classes, so there is no inheritance. But if you embed a struct into another struct, the Go compiler does all the work of composition for you. No need to write boilerplate delegation methods. Nice.
Now that we have the nice parts out of the way, I'll dig into the parts I have problems with. I'll start with a story about my experience with Go. Feel free to skip to the "TL;DR" section below for the summary.
Back in 2016, my team was maintaining a tool that needed to make thousand HTTP(S) requests several times a day. The tool had been written in Python, and as the number of requests grew, it was taking longer and longer to run. A teammate decided to take a stab at rewriting it in Go to see if we could get a performance increase. His initial tests looked promising, but we quickly ran into our first issues.
The initial implementation just queried a list of all URLs we needed to fetch, then created a goroutine for each one. Each goroutine would fetch data from the URL, then send the results to a channel to be collected and analyzed downstream. (IIRC this is a pattern lifted directly from the Tour of Go docs. Goroutines are cheap! Just make everything a goroutine! Woo!) Unfortunately, creating an unbounded number of goroutines both consumed an unbounded amount of memory and an unbounded amount of network traffic. We ended up getting less reliable results in Go due to an increase in timeouts and crashes.
Given the chance to help out with a new programming language, I joined the effort and we ended up finding that we had two bottlenecks: First, our DNS server seemed to have some maximum number of simultaneous requests it would reliably support. But also (possibly relatedly), we seemed to be overwhelming our network bandwidth/stack/quota when querying ALL THE THINGS at the same time.
I suggested we put some bounds on the parallelism. If I were working in Java, I'd reach for something like an ExecutorService, which is a very nice API for sending tasks to a thread pool, and receiving the results. We didn't find anything like that in Go. I guess the lack of generics meant that it wasn't easy for anyone to write a generic high-level library like that in Go. So instead, we wrote all the boilerplate channel management ourselves. Because we had two different worker pools to manage, we had to write it twice. And we had to use low-level synchronization tools like WaitGroups to manually manage resource.
Disillusioned by how gnarly a simple tool turned out, I did some searching to find out if Go had plans to add Generics. At the time, that was a vehement "No". Not only did the language implementors say it was unnecessary (despite having hard-coded generics-equivalents for things like append()
, make()
, channels, etc.), but the community seemed downright hostile to people asking about it.
At that point I'd already played with Rust enough to have a fair idea that such a thing was possible. In a weekend or two, I wrote a Rust library called Pipeliner, which handles all of the boilerplate of parallelism for you. Behind the scenes, it has a similar implementation to our Go implementation. It creates worker pools, passes data to them through channels, and collects all the results (fan-out/fan-in). Unlike the Go code, all that logic gets written and tested in a separate, generic library, leaving our tool to just contain our high-level business logic. Additionally, this was all implemented atop Rust's type-safe, null-safe, memory-safe IntoIterator interface. All of our application logic could be expressed more succinctly and safely, in roughly:
let results = load_urls()?
.with_threads(num_dns_threads, do_dns_lookup)
.with_threads(num_http_threads, do_http_queries);
for result in results {
// etc.
}
Recently, I interviewed with a company that wrote mostly/only Go. "No problem," I thought. "I'm pragmatic. Go can't be as bad as I remember. And it's got generics now!"
To brush up on my Go, and learn its generics, I decided to port Pipeliner "back" into Go. But I didn't get far into that task before I hit a road block: Go generics do not allow generic parameters on methods. This means you can't write something like:
type Mapper[T any] interface {
func Map[Output](mapFn func(T) Output) Mapper[Output]
}
Which means your library's users can't:
zs := xs.Map(to_y).Map(to_z)
This is due to a limitation in the way that interfaces are resolved in Go. It feels like a glaring hole in generics which other languages don't suffer from. "I'm pretty sure TypeScript has a better Generics implementation than this", I thought to myself. So I set off to write a TypeScript implementation to prove myself wrong. I failed.
IMO, good languages give library authors tools to write nice abstractions so that other developers have easy, safe tools to use, instead of having to rewrite/reinvent boilerplate all the time.
OK this post is already really long, so I'm just going to bullet-point some of my other complaints:
foo = append(foo, bar)
instead of just foo.push(bar)
?Foo
implement Bar
? Better check all its methods to see if they match Bar
's. You can't just declare Foo implements Bar
and have the compiler check it for you. (My favorite syntax for this is Rust's: impl Bar for Foo { … }
, which explicitly groups only the methods required for implementing a particular interface, so it's clear what each method is for.override
as such so that the compiler can check it for you.@NfNitLoop ("Cody C. #BLM") retweeted:
@gaywonk ("Carlos Maza") wrote:
He does this shit because dumb people think it means he’s working hard.
He spends literally all day tweeting. He sleeps at the office because he’s an absent father who needs to be surrounded by sycophants at all times to feel okay.
with quote tweet:
@AndyLalwani ("Andy Lalwani") wrote:
Elon Musk says he is sleeping at the Twitter HQ these days in his latest conversation with the BBC. https://whatstrending.com/elon-musk-sleeps-at-twitter-hq-and-claims-company-breaks-even-in-conversation-with-bbc/
@NfNitLoop ("Cody C. #BLM") retweeted:
@Esqueer_ ("Alejandra Caraballo") wrote:
This is exactly what they did when courts enforced the end of segregation and Jim Crow. Rather than integrate, they closed down community pools, packed up, and left for private suburban communities built on exclusion.
The end goal is eliminating libraries and public schools.
@NfNitLoop ("Cody C. #BLM") retweeted:
@JohnFPfaff ("John Pfaff") wrote:
Man drives car into BLM protestors, then shoots and kills one of the BLM protestors, and then the governor races to pardon him before he’s even filed his appeal.
One could think the GOP governor is signaling something abt defending violence towards left-leaning protesters.
with quote tweet:
@tplohetski ("Tony Plohetski") wrote:
BREAKING: Texas Gov. Greg Abbott said he is working “as swiftly as Texas law allows regarding the pardon of Sgt. Daniel Perry.”
Perry was convicted of murder Friday in Austin in the shooting death of protester Garrett Foster.
@NfNitLoop ("Cody C. #BLM") retweeted:
@AlishaGrauso ("Alisha Grauso") wrote:
"Republicans are willing to shoot themselves in the foot if that shot can go through and hit a Black person." - @ElieNYC with a spot-on dagger of a line
@NfNitLoop ("Cody C. #BLM") retweeted:
it *should* be destroyed. they destroyed it. admitting reality is important.
with quote tweet:
@themaxburns ("Max Burns") wrote:
Clarence Thomas deserves a full Senate investigation and possible impeachment, but Congress likely doesn't have the appetite for that.
As one Democratic House member tells me via text, "Public trust in SC is already bad. A big circus would destroy it completely."
@NfNitLoop ("Cody C. #BLM") replied to a tweet by @timClicks:
@timClicks https://youtu.be/MpmGXeAtWUw?t=89
More seriously -- I don't know if you can avoid it long-term. But avoiding feature creep, or saying "that's a different problem/project" can help, maybe?
OTOH maybe death is just a natural part of the software lifecycle. Makes room for new growth.
@NfNitLoop ("Cody C. #BLM") retweeted:
@mr_modular ("Allen Nemo") wrote:
Republicans knowingly supported one of the most noxious, amoral people to the top office of the land. A man laden with a documented history of criminality and outright fraud. The “unprecedented” stuff started in 2016, not 2023. #GOP
@NfNitLoop ("Cody C. #BLM") retweeted:
@NfNitLoop ("Cody C. #BLM") retweeted:
@Greg_Palast ("Greg Palast") wrote:
In the war on voting, we just lost another battle: Idaho will now ban student ID for voting to “prevent vote fraud.” No evidence was given that Idaho’s youth are more criminally minded than the Idaho gun owners, who can still use their ammo ID to vote. I https://www.democracydocket.com/news-alerts/idaho-removes-student-ids-from-list-of-acceptable-voter-id/… https://twitter.com/i/web/status/1637507018130067457
@NfNitLoop ("Cody C. #BLM") retweeted:
@LolOverruled ("Lolo") wrote:
Damn that’s crazy that’d make it no different than any drug prosecution
with quote tweet:
@nypost ("New York Post") wrote:
Pence says an arrest of Trump would be a ‘politically charged prosecution’ https://trib.al/LVyWbO2
@NfNitLoop ("Cody C. #BLM") retweeted:
@Tim_Tweeted ("Marjorie Gaylor Queen 🏳️🌈") wrote:
A lawyer on TikTok is performing a weekly list of recently arrested pedophiles in America simply to point out that it’s all youth pastors and politicians, not drag queens https://twitter.com/i/web/status/1635294916015460353
@NfNitLoop ("Cody C. #BLM") wrote:
When someone takes a person and keeps them confined against their will: kidnapping and false imprisonment.
When corrupt agents of the state do it: "oopsie".
😡
with quote tweet:
@DyjuanTatro ("Dyjuan Tatro") wrote:
Here’s @CNN using “botched” to hide the fact that police, prosecutors, and the judge in this case knowingly used fabricated & misleading evidence to wrongfully convict Sheldon Thomas & imprison him for 18 years. The media constantly works to cover-up systemic injustice.
@NfNitLoop ("Cody C. #BLM") retweeted:
@uspsveteran ("pendejoe") wrote:
weird how it’s ok to bail some people out but not others
@NfNitLoop ("Cody C. #BLM") retweeted:
@RevDJEsq replied to a tweet by @paleofuture:
@paleofuture @ParkerMolloy I love how in the tweet above that, he admits the site he paid $44 billion for in borrowed Saudi Royal Family Bonesaw murderer money is basically a poor substitute for a phone call.
@NfNitLoop ("Cody C. #BLM") wrote:
That burning sensation when you breathe in the air or drink the water? Freedom!
Freedom for wealthy corporations to pollute without restraint or consequence. There is no nobler American goal. … our children and our grandchildren will know it as well. Freedom!
with quote tweet:
Biden: There's no sweeter word than freedom. There's no nobler goal than freedom. There's no more higher aspiration than freedom. Americans know that, and you know it. And all that we do now must be done so our children and our grandchildren will know it as well. Freedom.
@NfNitLoop ("Cody C. #BLM") retweeted:
@bdurette ("Brandon DuRette") wrote:
Periodic reminder: Refactoring isn't something that we do when we're not writing new code. It's what we do to prepare our codebase to accept the new code we're writing.
If your "refactoring" requires a project plan, that's a rewrite, not a refactoring.
@NfNitLoop ("Cody C. #BLM") retweeted:
@NfNitLoop ("Cody C. #BLM") replied to a tweet by @meakoopa:
@meakoopa There should be a South Park where Cartman inherits some money, buys Facebook, and basically does everything that’s been done at Twitter.
@NfNitLoop ("Cody C. #BLM") replied to a tweet by @meakoopa:
@meakoopa There should be a South Park where Cartman inherits some money, buys Facebook, and basically does everything that’s been done at Twitter.
@NfNitLoop ("Cody C. #BLM") retweeted:
@engramsoftware ("Engram Software / Leo (they/them)") replied to a tweet by @engramsoftware:
@PaolaNotPaolo "What is the last time you disagreed with someone in a PR review? What was it about and how did you resolve it?"
"What is a architectural change/implementation that you put into place at your current company and how did you evaluate it over time to assess it?"
@NfNitLoop ("Cody C. #BLM") wrote:
Deno Embedder
I've really been enjoying writing code in #Deno. It does a great job of removing barriers to just writing some code. You can open up a text file, import some dependencies from URLs, and `deno run` it to get stuff done really quickly.
[...]
I've really been enjoying writing code in Deno. It does a great job of removing barriers to just writing some code. You can open up a text file, import some dependencies from URLs, and deno run
it to get stuff done really quickly.
One nice thing is that Deno will walk all the transitive dependencies of any of your code, download them, and cache them. So even if your single file actually stands on the shoulders of giant( dependency tree)s, you still get to just treat it as a single script file that you want to run.
You can deno run foo.ts
or deno install https://url.to/foo.ts
and everything is pretty painless. My favorite is that you can even deno compile foo.ts
to bundle up all of those transitive dependencies into a self-contained executable for folks who don't have/want Deno.
This doesn't work if you're writing something that needs access to static data files, though. The problem is that Deno's cache resolution mechanism only works for code files (.ts
, .js
, .tsx
, .jsx
and more recently, .json
). So if you want to include an index.html
or style.css
or image.jpg
, you're stuck with either reading it from disk or fetching it from the network.
If you fetch from disk, deno run <remoteUrl>
doesn't work, and if you fetch from the network, your application can't work in disconnected environments. (Not to mention the overhead of constantly re-fetching network resources every time your application needs them.)
In FeoBlog, I've been using the rust-embed crate, which works well. I was a bit surprised that I didn't find anything that was quite as easy to use in Deno. So I wrote it myself!
Deno Embedder follows a pattern I first saw in Fresh: You run a development server that automatically (re)generates code for you during development. Once you're finished changing things, you commit both your changes AND the generated code, and deploy that.
In Fresh's case, the generated code is (I think?) just the fresh.gen.ts file which contains metadata about all of the web site's routes, and their corresponding .tsx
files.
Deno Embedder instead will create a directory of .ts
files containing base64-encoded, (possibly) compressed copies of files from some other source directory. These .ts
files are perfectly cacheable by Deno, so will automatically get picked up by deno run
, deno install
, deno compile
, etc.
I'm enjoying using it for another personal project I'm working on. I really like the model of creating a single executable that contains all of its dependencies, and this makes it a lot easier. Let me know if you end up using it!
@NfNitLoop ("Cody C. #BLM") retweeted:
@reduct_rs ("ReductRs") wrote:
Nice! This Woman Spent Her Entire Workday Re-Reading a PR She Already Merged
@NfNitLoop ("Cody C. #BLM") replied to a tweet by @NfNitLoop:
@NfNitLoop ("Cody C. #BLM") wrote:
Anybody have home router recommendations?
#ASUS is not it. 👎
My New ASUS Router Wants To Spy On Me
After a recommendation from coworkers, and reading/watching some reviews online, I decided to get a new router. I purchased the "ASUS Rapture GT-AXE11000 WiFi6E" router in particular for its nice network analytics and QoS features.
On unpacking and setting up said router, I'm disappointed to find that the features I purchased the router for require that I give network analytics data over to a third-party.
The last line of that popup says:
If you would like to disable sharing your information with Trend Micro through the above functions, please go to: Router web GUI > Advanced settings > Administration > Privacy
For a brief few seconds I was naive enough to think that the issue was just that this behavior was opt-out instead of opt-in. So I headed over to the Privacy settings to opt out.
However, please note that such features/functions may not work if you stop sharing your information with Trend Micro.
"May not work" my ass! If you withdraw consent it just disables the features entirely, and then tells you:
Please note that users are required to agree to share their information before using [the features that I bought this router for].
At least now (after a couple router restarts to apply settings) they're telling the truth. This is not an "option", it's a requirement.
If I go back to the "Statistic" or "Bandwidth Monitor" tabs, they're now disabled:
I'm considering returning this router for one that won't try to spy on me. There is NO reason for this kind of thing in my home router, a device which should be prioritizing my own security and privacy. And certainly not for features like QoS or bandwidth usage monitoring.
Does anyone have recommendations? I want something that:
I do not trust myself to write software without some form of type checking. And I prefer more typing (ex: nullability, generics) when it is available.
This comes from a long history of realizing just how many errors end up coming down to type errors -- some piece of data was in a state I didn't account for or expect, because no type system was present to document and enforce its proper states.
Relatedly, I trust other programmers less when they say they do not need these tools to write good code. My immediate impression when someone says this is that they have more ego than self-awareness. In my opinion, it's obvious which of those makes for a better coworker, teammate, or co-contributor.
@NfNitLoop ("Cody C. #BLM") retweeted:
@BernieSanders ("Bernie Sanders") wrote:
“This country has socialism for the rich, rugged individualism for the poor."
– Martin Luther King, Jr.
Fixing your code before the weekend is like cleaning your house before you go on vacation. So much nicer to come back to. 😊
@NfNitLoop ("Cody C. #BLM") wrote:
The point of a strike is the cost to the business. Your workers are the business. No workers, no businesses. The cost to the business is you taking your sweet time to learn that.
with quote tweet:
This could effectively end the right to strike. The "cost" of a strike could be stretched to include anything--lost revenue, expenses for union busting lawyers, the wages of scabs--with the aim of bleeding unions of resources. https://twitter.com/MorePerfectUS/status/1612880860243709953
Me: I dislike that the usual software engineer career path is to move into management. I just want to write cooode!
Also me: (leading standup today, being taskmaster, making sure we capture details into tickets, unblock people, shuffle priorities from Product Mgmt, volunteering to help other devs w/ something they're stuck on) I am actually quite good at this.
😑
@NfNitLoop ("Cody C. #BLM") retweeted:
@JohnFugelsang ("John Fugelsang") wrote:
1. These were not illegal aliens
2. Seeking asylum is not illegal
3. GOP Christianity is a grotesque fraud
4. Red State is still racist, bc that gets the clicks
5. None of these fascists realize the symbolism of doing this on Christmas.with quote tweet:
Texas Governor Abbott's Gift to Kamala on Christmas Eve: A Busload of Illegal Aliens
https://buff.ly/3Wrj8rK
@NfNitLoop ("Cody C. #BLM") retweeted:
@meakoopa ("Anthony Oliveira") wrote:
“18k people saw your silly little tweet” like cmon elon at least make it believable this is the lie of a child
with quote tweet:
@zachsilberberg ("zach silberberg") wrote:
hey remember when facebook inflated video view analytics so a lot of companies pivoted to facebook video and then saw no return on investment and lost a ton of money? anyway looove this new twitter view feature
@NfNitLoop ("Cody C. #BLM") retweeted:
@HillaryClinton ("Hillary Clinton") wrote:
💅
with quote tweet:
@MikeSington ("Mike Sington") wrote:
“Hillary Clinton was right all along”, and so was everyone else. Mika Brzezinski eviscerates Donald Trump. (Video: MSNBC)
@NfNitLoop ("Cody C. #BLM") replied to a tweet by @deno_land:
@deno_land I ❤️ Deno AND Rust, and this sounds like a great opportunity.
But FYI, posting without a salary range these days is a bit of a red flag. And it may be illegal in states that are passing laws like Colorado's:
So Twitter came out with a great new feature today: You're not allowed to link to other social media web sites.
What is a violation of this policy?
At both the Tweet level and the account level, we will remove any free promotion of prohibited 3rd-party social media platforms, such as linking out (i.e. using URLs) to any of the below platforms on Twitter, or providing your handle without a URL:
- Prohibited platforms:
- Facebook, Instagram, Mastodon, Truth Social, Tribel, Post and Nostr
- 3rd-party social media link aggregators such as linktr.ee, lnk.bio
It's a laughable attempt to stop the bleeding of people fleeing to other social networks, and it's going to Streisand Effect itself into the (figurative) Internet Hall of Fame. Most of the point of Twitter for many is finding and posting links to interesting stuff online.
What's next, a ban on "free promotion of prohibited 3rd-party news sources" that point out what a ridiculous policy this is? (Though, I suppose that's not far from what they're already doing -- banning reporters who unfavorably cover Musk.)
FeoBlog is not yet banned, of course, because it's not on anyone's radar. What can I do to get some more users and get it noticed?
If you want to give it a try, it's open source software, so you can download it and run your own server. Or, if you don't want to bother with all that, ping me and I'll get you set up with a free "account" on my server. :)
@NfNitLoop ("Cody C. #BLM") retweeted:
@TracketPacer ("TracketPacer @tracketpacer@noc.social") wrote:
twitter was never perfect, but damn do i despise him for destroying this place
with quote tweet:
@TwitterSupport ("Twitter Support") wrote:
We recognize that many of our users are active on other social media platforms. However, we will no longer allow free promotion of certain social media platforms on Twitter.
@NfNitLoop ("Cody C. #BLM") retweeted:
@LolOverruled ("Lolo") wrote:
How many millionaires live in NYC
with quote tweet:
NYC mayor Eric Adams is demanding city libraries to cut their budgets by $13.6 million by the end of fiscal year 2023, and another $20.5 million over the next 3 fiscal years. This will be devastating for the services and operations of the library system.
https://jacobin.com/2022/12/eric-adams-new-york-public-library-budget-cuts-austerity/
@NfNitLoop ("Cody C. #BLM") retweeted:
if you’re wondering why twitter spaces is gone it’s bc some journalists asked elon like 3 questions so he left and got rid of the entire feature
@NfNitLoop ("Cody C. #BLM") wrote:
I've used AWS's SQS at several companies now. In general, it's a pretty reliable and performant message queue.
Previously, I'd used SQS queues in application code. A typical application asks for 1-10 messages from the SQS API, receives the messages, processes them, and marks them as completed, which removes them from the queue. If the application fails to do so within some timeout, it's assumed that the application has crashed/rebooted/etc, and the messages go back onto the queue, to be later fetched by some other instance of the application.
To avoid infinite loops (say, if you've got a message that is actually causing your app to crash, or otherwise can't be properly processed), each message has a "receive count" property associated with it. Each time the message is fetched from the queue, its receive count is incremented. If a message is not processed by the time the "maximum receive count" is reached, instead of going back onto the queue, it gets moved into a separate "dead-letter queue" (DLQ) which holds all such messages so they can be inspected and resolved (usually manually, by a human who got alerted about the problem).
That generally works so well that today we were quite surprised to find that some messages were ending up in our DLQs despite the fact that the code we had written to handle said messages was not showing any errors or log messages about them. After finally pulling in multiple other developers to investigate, one of them finally gave us the answer, and it came down to the fact that we're using Lambdas as our message processor.
So here's the issue, which you'll run into if:
Whatever Amazon process feeds SQS messages into that lambda will fetch too many messages. (I'm not sure if there's a way to tell if it was in a large batch, or lots of individual fetches in parallel, but either way the result is the same.)
Every time it does this, it increments the messages' receive counts. And of course when they reach their max receive count, they go to the DLQ, without your code ever having seen them.
This happens outside of your control and unbeknownst to you. So when you get around to investigating your DLQ you'll be scratching your head trying to figure out why messages are in there. And there's no configuration you can change that fixes it. Even if you set the SQS batch size for the lambda to 1.
If you think you might be running into this problem, check two key stats in the AWS console: the "throttle" for the lambda, and the DLQ queue size. If you see a lambda that suddenly gets very throttled which correlates with lots of messages ending up in your DLQ, but see no errors in your logs, this is likely your culprit.
It seems crazy that it works this way, and seemingly has for years. AWS's internal code is doing the wrong thing, and wasting developer hours across the globe. Ethically, there's also the question of whether you're getting billed for all of those erroneous message receives. But I'm mostly worried about having a bad system that is a pain in the ass to detect to work around.
Me, minutes before a meeting: Just one more line. One more line of code.
(15 minutes later, seeing a clock): Dangit, I'm late for my meeting.
Me: "Why do I put the cap back on my water bottle after every sip? This is annoying even to myself."
Also me: Knocks over the full bottle I just minutes before had placed between me and my keyboard and yet had somehow forgotten existed.
(Thankfully, the cap was on! 😆)
@NfNitLoop ("Cody C. #BLM") wrote:
For a while I'd been maintaining 2 versions of the FeoBlog TypeScript client:
But maintaining two codebases is not a great use of time. So now the Deno codebase is the canonical one, and I use DNT to translate that into a node module, which I then import into the FeoBlog UI, which you are probably using right now to read this post. :)
@NfNitLoop ("Cody C. #BLM") retweeted:
@jwz ("j͕̠̦̪͕̓͛̊̾̄ͅw̧̧̳̪̘͊̋͗̾͢͠z̢̘̞͈̺̞̩̓̽̐̋͗̆̋̚͟͜") wrote:
joshuatopolsky: 'If you’re wondering about Mastodon’s impact, Twitter is now automatically marking links to mastodon as “sensitive” (aka dangerous) and forcing users who get them to “appeal” the claim.' https://mastodon.online/@joshuatopolsky/109501217476449536
@NfNitLoop ("Cody C. #BLM") wrote:
Is it weird that I'm starting to feel like having a phone number is not worth it?
First, I use actual phone conversations VERY rarely. If I'm home and want to have a voice conversation with someone, I usually use VoIP (usually: FaceTime Audio) because it has higher quality than cell phone calls. If I'm out and about and want to communicate meeting time/place with someone, I'm going to send (or expect) a text message. So there's the question about whether it's worthwhile continuing to pay for a service that I don't use.
But the real problem is that modern apps and online services use your phone number as if it's a unique ID. If you give some organization your phone number, they'll definitely use it to uniquely identify you. Possibly to third parties.
And, even if you don't give them your phone number directly, since apps can slurp your contact info from any of your friends' contact lists, they've still got it.
And if companies can store this data about you, that data can get hacked and leaked. "HaveIBeenPwned" recently added phone numbers to their search because it's become such a concern.
If you worry about giving out your Social Security number, you should probably worry just as much about giving out your phone number. To companies or your friends.
This doesn't even touch on the problem of spam/phishing/fraudulent calls, which is another real problem w/ the phone system.
So, despite having the same phone number since 1998, I'd love to get rid of mine. Unfortunately, I can't yet because so many systems (ex: banks, messaging apps) do use it to identify you.
Plus, imagine you give up (or just change) your phone number. Now your old number is available for re-use. If someone were to claim it, they could then use it to impersonate you on any systems that haven't been updated with your new (lack of) phone number.
@NfNitLoop ("Cody C. #BLM") retweeted:
@joshtpm ("Josh Marshall") wrote:
There seems to be little limit to Elon Musk's predatory and malevolent nature. He is now insinuating that the fmr head of Trust & Safety at Twitter, an openly gay Jewish man, is a pedophile. Just another level of this is that Roth actually stayed on for several weeks under Musk..
@NfNitLoop ("Cody C. #BLM") retweeted:
@briantylercohen ("Brian Tyler Cohen") wrote:
Imagine crying because you can't strip rights away from other Americans.
with quote tweet:
@NoLieWithBTC ("No Lie with Brian Tyler Cohen") wrote:
Holy shit. A Republican just started crying on the floor of Congress begging them to vote against protecting marriage equality.
@NfNitLoop ("Cody C. #BLM") retweeted:
@fringetracker ("Benjamin Pope") wrote:
this is why US companies want healthcare to be tied to employment: you can use it for strikebreaking
with quote tweet:
@TheNewSchool ("The New School") replied to a tweet by @TheNewSchool:
As announced on Monday, we have made the difficult decision to stop paying wages and premiums for healthcare benefits for employees who are striking. Up to this point, we have continued to compensate our faculty and staff who have chosen to exercise their right to strike.
@NfNitLoop ("Cody C. #BLM") wrote:
Programmer self care: putting a giant
// START HERE TOMORROW
in the code when you turned off your laptop (and brain) mid-refactor yesterday.
@NfNitLoop ("Cody C. #BLM") retweeted:
@faizsays ("Faiz Siddiqui") wrote:
NEW: Ads from roughly 40 brands, including Amazon, Uber and Snap, are appearing on white nationalist pages after Elon Musk granted amnesty to previously suspended Twitter accounts. The inadvertant placement of brand ads is fallout from new amnesty policy. https://www.washingtonpost.com/technology/2022/12/06/twitter-ads-elon-musk/
@NfNitLoop ("Cody C. #BLM") wrote:
Looking at this again today, I'm reminded of all the AI ethicists warning about training AI models on biased data.
Here: an example of an AI taught to mansplain. Confidently incorrect. No hedging. 😆
with quote tweet:
@abreslav ("Andrey Breslav") wrote:
All you need to know about the current state of "AI"
https://www.reddit.com/r/ProgrammerHumor/comments/zdzlwj/am_i_too_stupid_for_this_or_is_chatgpt_just_not/P.S. Large language models are still very cool for many things and will get even cooler
@NfNitLoop ("Cody C. #BLM") retweeted:
@abreslav ("Andrey Breslav") wrote:
All you need to know about the current state of "AI"
https://www.reddit.com/r/ProgrammerHumor/comments/zdzlwj/am_i_too_stupid_for_this_or_is_chatgpt_just_not/P.S. Large language models are still very cool for many things and will get even cooler
@NfNitLoop ("Cody C. #BLM") retweeted:
@WajahatAli ("Wajahat Ali") wrote:
An overwhelming majority of white Evangelical Christians voted for Herschel Walker, a man who paid for abortions, lied, allegedly physically threatened and traumatized his wife, and fronts for Trump, a criminal vulgarian. Their religion is white supremacy, not Christianity.
@NfNitLoop ("Cody C. #BLM") retweeted:
@EronMain ("Eron Main") replied to a tweet by @heyMAKWA:
@heyMAKWA @NeolithicSheep "Why does the academic definition of fascism sound like much of modern conservativism?"
I dunno dude, maybe ask yourself why much of modern conservativism sounds like the academic definition of fascism.
@NfNitLoop ("Cody C. #BLM") retweeted:
@GoodVibePolitik ("James Ray ☭") wrote:
Now THIS is a headline
@NfNitLoop ("Cody C. #BLM") retweeted:
@RussellGlasser ("Russell Glasser 💙") wrote:
Matt Taibbi really cracked the case there. He exposed the fact that when you carefully and consistently apply policies to prevent harassment and disinformation, they mostly seem to impact the right wing. Real ace reporting.
@NfNitLoop ("Cody C. #BLM") retweeted:
@tqbf ("Thomas H. Ptacek") wrote:
I’m sorry, I simply cannot be cynical about a technology that can accomplish this.
@NfNitLoop ("Cody C. #BLM") retweeted:
@herosnvrdie69 ("🌽🌽 Erica, The White Trash Socialist 🌽🌽™️") wrote:
“But a rail worker strike would disrupt the entire countries supply chain!!”
Yeah dog that’s the point it’s almost like the actual workers hold all the power. Maybe they should get what they want and deserve. Hope that helps.
@NfNitLoop ("Cody C. #BLM") retweeted:
@NfNitLoop ("Cody C. #BLM") replied to a tweet by @AOC:
@AOC Agreed. If rail is so crucial to the economy, perhaps workers need to get paid what they’re worth so they don’t strike. And get paid sick time so that they don’t make their coworkers sick and impact this crucial service.
@NfNitLoop ("Cody C. #BLM") replied to a tweet by @AOC:
@AOC Agreed. If rail is so crucial to the economy, perhaps workers need to get paid what they’re worth so they don’t strike. And get paid sick time so that they don’t make their coworkers sick and impact this crucial service.
@NfNitLoop ("Cody C. #BLM") retweeted:
@AOC ("Alexandria Ocasio-Cortez") wrote:
Railroad workers grind themselves to the bone for this country as their labor produces billions for Wall St.
They demand the basic dignity of paid sick days. I stand with them.
If Congress intervenes, it should be to have workers’ backs and secure their demands in legislation.
with quote tweet:
@POTUS ("President Biden") replied to a tweet by @POTUS:
At this critical moment for our economy, in the holiday season, we cannot hurl the U.S. into a devastating rail freight shutdown.
Congress should get this bill to my desk as soon as possible so we can avoid disruption.
I’m thankful for when the cat comes and gets me to come to bed, as if to say: “uh? Hey. I’m sleepy and I need some warm legs to curl up on. Can you get in bed already?” ❤️
@NfNitLoop ("Cody C. #BLM") retweeted:
@Esqueer_ ("Alejandra Caraballo") wrote:
We're starting to see a wave of suspensions of anti fascist accounts all over Twitter. Yesterday, it was the Elm Fork John Brown Gun Club. Today, it was Chad Loder. It's clear Twitter is now targeting the accounts of ideological opponents of the far right.
@NfNitLoop ("Cody C. #BLM") retweeted:
@nandoodles ("Nandini Jammi") wrote:
ok but first I'm going to shout out the fact that u make 2.9% + 30¢ USD off every "Stop Grooming Our Kids" mug and t-shirt sold by Libs of TikTok
with quote tweet:
it's officially pride month so I think you should shout out your fave queer owned biz in the comments
@NfNitLoop ("Cody C. #BLM") retweeted:
@alilleybrinker ("Andrew isn't here") replied to a tweet by @mountain_ghosts:
@mountain_ghosts @steveklabnik C: "This is a float, but it might instead be an int"
Me: "Can you tell me which one?"
C: "..."
C: "No."
@NfNitLoop ("Cody C. #BLM") retweeted:
@davenewworld_2 ("Fifty Shades of Whey") wrote:
Police and law enforcement lobbyists in Minnesota have come out against a rule banning applicants or officers from participating in or supporting white supremacist, hate, or extremist groups.
Remember this the next time every city in America proposes more funding to cops.
@NfNitLoop ("Cody C. #BLM") retweeted:
@chadloder ("Chad Loder - @chadloder@kolektiva.social") wrote:
NEW: The 22-year-old Colorado Springs mass shooter whose record was mysteriously sealed after making a bomb threat last year is the grandson of GOP California State Assemblyman @RandyVoepel from San Diego, who voiced support for the Jan 6 Capitol attack. https://heavy.com/news/anderson-lee-aldrich/
@NfNitLoop ("Cody C. #BLM") retweeted:
@HeidiBeedle ("Heidi Beedle @heidibeedle@mastodon.lol") wrote:
The last year has seen a concerted effort to demonize LGBTQ people as “groomers” or worse. CSPD has not released a motive for last night’s shooting, but for queer people it seems like a natural consequence of the political environment.
https://coloradotimesrecorder.com/2022/06/how-republicans-are-waging-war-on-transgender-coloradans/46524/
@NfNitLoop ("Cody C. #BLM") retweeted:
@RepAdamSchiff ("Adam Schiff") wrote:
The United States should take no action to shield those who murder journalists, let alone those who kill and dismember residents of our country.
Far from it. We should seek justice, and relentlessly so.
Life — not oil — is what we must treasure.
with quote tweet:
The Biden administration has determined that Saudi Arabia’s Crown Prince Mohammed bin Salman should be granted immunity in a case brought against him by the fiancée of Jamal Khashoggi, whom the administration has said was murdered at the prince’s direction https://cnn.it/3V5vqVF
@NfNitLoop ("Cody C. #BLM") retweeted:
@juliacarriew ("Julia Carrie Wong") wrote:
I know this is all happening fast but if you have 75% of a workforce (if that ends up being true) willing to walk over management’s unilateral changes to working conditions, one idea is to start signing union cards
@NfNitLoop ("Cody C. #BLM") retweeted:
@JoshuaPHilll ("Read Jackson Rising by @CooperationJXN") wrote:
The most important thing I learned after Uvalde is that there are over 50,000 school police officers in this country, but they haven't stopped even one school shooting. Instead they've arrested over 1 million kids, mostly students of color.
with quote tweet:
"Don't make a wrong move," an officer said as he pinned a struggling second-grader to the ground, ultimately for 38 minutes. "Period." https://cbsn.ws/3E6QwvT
@NfNitLoop ("Cody C. #BLM") retweeted:
@LolOverruled ("Lolo") wrote:
lmao what a baby
with quote tweet:
@CaseyNewton ("Casey Newton") wrote:
NEW: Employees who have criticized Elon Musk in Twitter’s Slack channels were fired overnight over email.
“We regret to inform you that your employment is terminated immediately,” they’re being told over email. “Your recent behavior has violated company policy.”
@NfNitLoop ("Cody C. #BLM") replied to a tweet by @NfNitLoop:
Related: Anybody want an account on my experimental social network, FeoBlog? 😊
Go to https://blog.nfnitloop.com/client/#/login/create-id, create an ID, and send it to me on here.
#SocialNetwork #FeoBlog #Distributed #P2P
@NfNitLoop ("Cody C. #BLM") wrote:
So recently Elon has:
It sure is starting to seem like he paid a lot of money to delegitimize it as a communication platform.
Guess you can't get "cancelled" if people and bots are indistinguishable.
@NfNitLoop ("Cody C. #BLM") retweeted:
@drvolts ("David Roberts") wrote:
Your periodic reminder that:
1. Various quirks of the US constitutional system give non-urban voters greater power & representation than urban voters.
2. There is no credible argument that non-urban voters deserve that disproportionate power.
@NfNitLoop ("Cody C. #BLM") retweeted:
@sarahana ("Sarahana for Assembly") wrote:
As someone who (1) ran as a democratic socialist candidate (2) personally spoke to thousands of voters, including Republicans (3) WON by 20 points, I can tell you that hardly anyone thinks the problem is that the party has moved too far to the left.
with quote tweet:
@CityAndStateNY ("City & State NY") wrote:
Jay Jacobs denied that Hochul had a detrimental effect on other candidates and refused to accept blame for both her performance and losses in Congress...
Instead, he placed blame on progressive politicians who have shifted the party too far to the left. https://www.cityandstateny.com/politics/2022/11/hochul-won-her-election-what-cost/379559/
@NfNitLoop ("Cody C. #BLM") wrote:
Coworker joked that I wasn't enthusiastic enough in my announcement that a stressful project had finally launched. My response:
@NfNitLoop ("Cody C. #BLM") retweeted:
@FaithfullyBP ("Benjamin Perry") wrote:
For the love of God, pundits: Long voting lines aren’t enthusiasm. They’re suppression.
The weather finally got decently cold and we turned on the heat in the new house. Woke up at 3:15am broiling in my own bed. It turns out the previous owner had programmed the thermostat to go up to 75°F at some point in the night.
75!? I barely let the house get that warm during the summer! So I’m currently in the living room with the sliding door to the back patio cracked so I can cool off. 🥵
@NfNitLoop ("Cody C. #BLM") wrote:
How many “red” states are just vote-suppressed states?
with quote tweet:
@scalawagmag ("Scalawag") wrote:
In every decade since the federal Voting Rights Act was passed, federal courts have found that Texas lawmakers disenfranchised voters in one way or another when drawing maps. https://scalawagmagazine.org/2021/01/texas-gerrymandering-2021-partner/?utm_campaign=scal-social&utm_source=twitter&utm_medium=social&utm_content=1667499840
@NfNitLoop ("Cody C. #BLM") wrote:
I also dislike #federation for #decentralization. This is why I’m working on (admittedly, slowly) my own decentralized system:
https://github.com/nfnitloop/feoblog/Here’s my own instance:
https://blog.nfnitloop.com
with quote tweet:
@bascule ("Spooky cohost.org/bascule 👻🎃🦀🌹") replied to a tweet by @bascule:
For Mastodon fans, you can find me here:
Although I gotta say I strongly dislike Mastodon and probably won't use it much.
Federation seems inherently incompatible with content moderation, and the UX is generally awful.
We can do better.
@NfNitLoop ("Cody C. #BLM") retweeted:
@CursedGloryHole ("Matt The Outlaw 🤠") wrote:
Lady behind me at The Thing screening last night to her partner "why are they shooting at the dog?" and her partner says very firmly "have you never seen a film before? You watch it and information is revealed"