Git bundle converts your whole repository into a single file kind of like webpack

WHAT

Pretend you just spent a few minutes, hours, or days trying something out, and now you want to get the project off your janky laptop’s hard drive that you just know is gonna die soon.

You’ve been tracking work with git locally because it is trivial to set up:

$ cd myproject
$ vi README # pretend this is your brilliant code.
$ git init
$ git add *
$ git commit -a -m "Let's get this party started"

Now you want a single file that has your whole project and all the commits you’ve made.

You can use git bundle for this! Here is how:

$ cd myproject
$ git bundle create myproject.bundle --all
$ scp myproject.bundle example.com:/tmp/

If it helps, you can think of git bundle as kind of like tar or zip or even webpack. Those are all things that convert a big tree of stuff and spit out a single doodad.

HOW

Here is how to make a single file with everything from all branches:

$ git bundle create myproject.bundle --all

Or you can make a single file (a bundle) that has only the master branch:

$ git bundle create myproject.bundle master

Or make one just with whatever branch you’re working in now:

$ git bundle create myproject.HEAD.bundle HEAD

Now move the bundle to a remote box via scp or rsync or whatever other method you want.

You might ask why you would use rsync or scp, because they both copy a file over a secure tunnel. The only advantage of rsync is that it checks if the file needs to be copied again:

$ rsync -e ssh --verbose myproject.bundle example.com:/tmp/myproject.bundle

sent 2,793 bytes received 35 bytes 377.07 bytes/sec
total size is 2,705 speedup is 0.96

$ rsync -e ssh --verbose myproject.bundle example.com:/tmp/myproject.bundle

sent 100 bytes received 59 bytes 16.74 bytes/sec
total size is 2,705 speedup is 17.01

See how the second time I ran rsync, it only sent 100 bytes? That’s because it tested if the version of myproject.bundle on example.com was out of sync with the one here. That can really, really help when you’re on a slow connection or working with big files.

Here is how to make a new repo based on that bundle:

$ ssh example.com
$ git clone -b master /tmp/myproject.bundle myproject2
$ cd myproject2

Pretty fresh, right?

Also, the list-heads command is pretty useful for spying on what is inside a bundle file:

$ git bundle create myproject.all-branches.bundle --all
$ git bundle list-heads myproject.all-branches.bundle
5702b7e5d8dd16839850e3fbad44ee69a9411586 refs/heads/master
82a0cd0d59b4929df8ff439cede8a33bbf850cfe refs/heads/more-docs
5702b7e5d8dd16839850e3fbad44ee69a9411586 HEAD

$ git bundle create myproject.master.bundle master
$ git bundle list-heads myproject.master.bundle
5702b7e5d8dd16839850e3fbad44ee69a9411586 refs/heads/master

$ git bundle create myproject.HEAD.bundle HEAD
$ git bundle list-heads myproject.HEAD.bundle
5702b7e5d8dd16839850e3fbad44ee69a9411586 HEAD

Unless you use --all, you won’t get all your branches in your bundle! Sometimes, that’s exactly what you want. But for rookies, usually, you’re just trying to ship everything.

WHY

First of all, you can’t beat how easy it is to make a bundle and ship it:

$ git bundle create myproject.bundle --all
$ scp myproject.bundle example.com:/tmp/

Second, sure, usually, I would make a new repository on some hosted service like github or bitbucket or gitlab. And I might also make a private repository on a box I rent from Linode (that link has my referral code) or AWS EC2 or Digital Ocean.

But maybe I’m in a coffeeshop with slow wifi, and my friend is sitting right next to me, and I want to share the code with him or her, and it seems crazy for us both to communicate by sending packets around the world.

Also, Using git bundle vs pushing to a remote repository ain’t an either-or thing!

There is nothing wrong with setting up a few cron jobs to run git bundle to create some bundle files and shove them to AWS S3 or dropbox or wherever, even though you’re still paying that exorbitant github bill.

My notes from reading 12 Rules for Life by Jordan B. Peterson

Summary

I finished 12 Rules of Life book a little while ago, then put it down for a while, so I could think about it.

As simply as possible: I agree with JBP’s rules, but mostly disagree with how he gets to them. Also, these are good rules, but there’s some important stuff missing!

In other words, these 12 rules are not the only rules you need to follow. I think there are more important things out there to pay attention to.

I feel like JBP’s greatest accomplishment is bringing back the message that we need more in our life than just having a good time (aka hedonism).

But I totally disagree that we need to go back to traditional values of the past! That strikes me as too easy of an answer. No. The answer is unknown right now.

Now, on to the details…

His writing style is often needlessly complex

I wonder if his editors encourage him to write that way or if years of academic writing has made it habitual.

Actually, this is only true in some chapters. I love his writing style in the “listen as if they know something you don’t” chapter. The sentences are short and crisp, and he doesn’t go on too many tangents. I think there is the academic JBP and the clinician JBP. He seems like a decent clinician. He knows that he needs to speak clearly and simply so that somebody on the other side, the patient, can easily understand his idea.

But the academic JBP does not speak in those short sentences. He uses words way outside of common day-to-day speech. It’s jarring to read.

I don’t buy the “chaos is feminine” idea

I don’t care if this is one of those things that people that study literature have all already agreed on. It doesn’t sit well with me.

JBP says order is masculine, chaos is feminine. I don’t see it. Watch a group of boys play, and a group of girls play. Boys are chaotic!

He writes about the feminine world as the unknown. This is only true depending on who you are. If you’re a male, and you spend time mostly around males, then sure, the girl world is foreign and seemingly chaotic.

But if you’re a girl, and you grow up around girls and women, then the male world is what seems unknown and chaotic, while the world of women seems seems orderly and predictable.

There’s a part where he talks about how in war time, people discover that they have the capacity to do evil, or commit atrocities, or be sadists. He doesn’t exactly say “this is what causes PTSD” but he implies it strongly. I agree with the idea that it is no fun to discover that we all have a demon within us. But I don’t think that’s the cause of PTSD in general. I think it’s a thing worth exploring, but PTSD occurs in people that survive horrific events like plane crashes too, where they didn’t take any action.

His Garden of Eden analysis doesn’t work for me

He talks about how Adam and Eve gain self-consciousness, and points out how women have been making men self-conscious forever. That rings true to me.

Here’s what he doesn’t talk about: the creator wanted his creations to stay in the role he created for them! This is the same reason why he expelled Lucifer, at least according to all the Sunday classes I ever attended. Lucifer wasn’t content to exist within a hierarchy. He’d rather rule in hell than serve in heaven.

This is a recurring pattern in the old testament. YHWH gets jealous when the Israelites don’t give him his props.

Perhaps JBP might say that God wants only the best for his creation, and the rules are set out to help them reach their potential, if only they stay on the straight and narrow.

But that’s not the only explanation! Imagine God just wants to keep us in a state of childlike innocence and awe, because he can’t handle facing an equal!

Take the Tower of Babel myth, located just a few pages after creation myth. God sees all the humans getting along peacefully, doing their own thing, and he watches them all get together and work on building a tower up to heaven. God sees this as a threat, and ruins the project.

Dick move!

Over and over, JBP and I read different meanings into the same text. He sees God wanting to keep us on the straight and narrow path. I see a bitter parent fearful that his children will outshine him.

What you get for reading the whole book instead of just the 12 rules

The rules are good rules! They’re easy to understand. They don’t demand huge changes right away.

So what do you get extra when you read all the hundreds of pages? You get lots of anecdotes around each rule. For example, the second rule is something like “treat yourself like a friend you care about”. There’s a neat story in the chapter about how people often don’t follow doctors orders after they go to the doctor, and so they don’t always take their pills. But if those same people go to the vet with their dog, they are more likely to make sure their dog takes their pills!

That is a really interesting story!

Then JBP spins an interesting idea for why people do that — why do they take care of other people (or dogs) better than they take care of themselves. It seems like according to JBP, people get really freaked out about the monster that lives within us all, and so somehow we don’t believe we deserve the help. Because we’re rotten people on the inside.

I think that’s plausible. I think that there are also other plausible explanations too. Like, for example, most of us deep down think we’re so special that the rules don’t really apply to us.

Going backwards verses going forwards

I had an economics professor that said something like “The first wave of economists wrote math formulas to describe how the world works. Then the next wave came in and said those formulas were trash. Then the third wave came in and saw how the formulas weren’t perfect, but they weren’t trash either, so they improved the models, based on the criticisms from the second wave.”

This is what I keep hoping JBP will do: combine the wisdom of the ancients with the valid critiques of the ancient world. But he doesn’t! Over and over, he suggests that our problems stem from abandoning tradition. But he doesn’t explore why it is we tossed out traditions.

He talks about this epidemic of nihilism. I want him to figure out where that came from.

The answer cannot be “well, people stopped doing what they were supposed to.”

My view is that technology has made it possible for people who used to have no voice to get more attention, and now, the garden of eden doesn’t look so great any more.

People lost faith in “the standard model” for valid reasons!

We can’t go backward, even if we tried. The toothpaste is out of the tube.

JBP doesn’t seem to think of atheism and nihilism as different things

This particularly bugs me. This is something atheists hear all the time.

I don’t buy the notion that Christianity was so great, and the 20th century tyrannies came because we abandoned it. Go read any book about the Spanish conquest of South America and you’ll be on my side.

I don’t buy the argument that deceit caused tyranny either.

I’m willing to bet a dollar that most atheists would not describe themselves as nihilists. And it’s certainly hard to argue that self-professed atheists live and act like nihilists. They don’t! They get up, go to work, pay taxes, raise families, etc.
I’m guessing, but I bet JBP believes any belief in human rights / objective truth or even just human decency is ultimately the same as believing in God. In other words, if you’re not a school shooter, you’re a Christian.

He sees Christianity as the champion of a grand battle between all the great ideas of history

I wish I could state his idea more shortly. JBP suggests that the bible survived where other holy texts disappeared because it has better messages.

I don’t see it that way. The way I see it, Christianity had as much effect on the dominance of the west as the mascot does on which team wins the Super Bowl.

In other words, our texts were largely along for the ride, rather than being the forces behind the dominance of the west. I don’t agree that Christianity sponsored the age of reason. I prefer the “guns, germs, and steel” explanation.

Consider that white supremacists read the about the Mark of Cain and see that as proof that black people are cursed.

Consider the stuff that Martin Luther inferred about Jews from Paul’s writing.

Now consider how the liberation theology movement comes to radically different points of view.

I see the bible (or nearly any big book) as kind of like Rorschach test (those inkblot cards where the doctor asks you what you see).

His Cain and Abel analysis also doesn’t work for me

I have my own theory on Cain and Abel. I have to give a lot of credit to Daniel Quinn’s book Ishmael, Franz Kafka’s cryptic notes about the pit of Babel, and my own research with magic mushrooms.

Cain was a farmer, Abel was a hunter. Farming is arguably the beginning of civilization. For the same reason why God wanted Adam and Eve to stay as perpetual children in the garden of Eden, he resents Cain for learning to grow his own food, and change the nature of his existence.

The Old Testament god YHWH is like the antithesis of the Greek myth of Prometheus. Both are our creators. But after Prometheus made people, he felt sad because we were all cold and living in the dark, so he brought fire down from Olympus and gave it to us.

That’s cool. He wanted us to thrive. Then Prometheus got punished pretty bad for it — chained to a rock and an eagle swoops down and eats liver every day, and then it grows back overnight — but he was glad that we had fire!

More generally, there’s a whole bunch of Greek poems and plays and myths where Prometheus helps / encourages us as we use technology to grow more powerful, more free, etc.

Like I said, that’s like the antithesis of YHWH.

My favorite rules

  • stand up straight (or whatever he says)
  • treat yourself like somebody you’re supposed to take care of
  • be friends with people that want what is best for you
  • listen as if the other person knows something you don’t

My least favorite rules

I don’t think any of JBP’s rules are wrong. They’re just imperfect. Of course any simple rule will have these problems.

Here’s a simple example that explains what I mean: “always wash your hands after using the bathroom” is a good rule to follow. But if you had to, you could imagine some weird scenario where you should break this rule. Like maybe you hear somebody screaming “HELP I AM BEING ABDUCTED BY A UFO” in the next room. Or maybe there’s an earthquake. Or maybe there’s a drought and you want to save every drop of water for an emergency.

In other words, there are instances when people should not follow these rules. If these instances are really uncommon, like earthquakes and droughts and alien abductions, then the rule is great. But as the frequency of these instances increase, the rule stops being such a good rule to follow in general.

I took a paragraph to state the obvious, but that is the nature of what I dislike about JBP’s pronouncements. They’re generally pretty good. But there are real-life examples where they are just not good guidelines.

Not a favorite rule: Be precise in your speech

Consider that some people repress their own thoughts and feelings so much. You ever met somebody so withdrawn that they only express themselves through quoting song lyrics or lines from movies?

You ever met somebody that’s trapped in a miserable job or relationship and they’ve been stuck there so long that they’ve lost the ability to imagine what they personally would like? They’re out there. In large numbers.

So many people have said they had to leave their relationship because they reached some point where they’ve forgotten who they are.

For these folks, just getting them to blurt out anything is critical. If they worry about speaking precisely, they won’t speak.

They’ve lost their internal voice.

Everything else held equal, being precise in speech is great. But it is a secondary goal, only after somebody overcomes not speaking whatever.

Not favorite: The skateboarding rule

Again, I don’t think the rule is bad from JBP’s explanation. It’s good! Skateboarding is a little dangerous, but boys need a way to prove themselves.

But that can’t be the end of the conversation on the topic.

Instead of letting them ride skateboards in the park, which isn’t awful, but is generally just a fun hobby, they really need role models that can direct the adolescent desire to master a skill into something socially useful.

Otherwise, you end up with drunks at the bar, talking about how high school sports were the greatest time of their lives.

And, also, you don’t have to buy into toxic masculinity to acknowledge that bored adolescent boys can be very destructive. Let a bunch of boys be bored and maybe they’ll skateboard. Maybe they’ll take up graffiti. Maybe they’ll see who can be the biggest badass at the bar.

They probably won’t learn how to restore old engines or learn to program computers or study hard enough to get into medical school unless somebody helps them get started.

Really good civilizations / cultures give everyone a chance to contribute meaningfully. But that doesn’t happen without hard work.

I would have preferred that the rule was more about how the older generation has a responsibility to mentor the youth, rather than see the youth as a threat to peace and quiet.

Conclusion

It is an OK book. But would it have helped somebody out, in the darkest period of their life?

I don’t think this book would helped me out in times like that. I think it would have made it worse. You can do all the stuff he says to do, and you’re still going to feel like garbage. I might have read that book, followed it desperately, then gotten really bitter when I felt no relief. I would have thought that I must have been a hopeless case.

I felt better later, years later, when I got out of the toxic relationships I had, got out of a miserable living situation, found friends that actually liked what made me special, found work that lined up with what I was good at so I could prove myself.

Incidentally, in that dark time of my own life, I read a ton of books.

I read The True Believer by Eric Hoffer. After I read that book, I saw my desire to belong somewhere as something that could really get me in trouble.

I saw everybody around me just looking for a chance to fit in somewhere, to lose themselves in something greater.

Man’s Search for Meaning was another great book I read during that time. I remember feeling like we all need a purpose. A mission, so to speak, and if we have that, and we really believe that, then we can overcome hardship. It can’t just be hedonism. That’s a dead end. Hedonism won’t inspire anybody to sacrifice themselves for the greater good.

Hedonism is just a fancy word that means that you value pleasure above anything else. Read the wikipedia page if you want lots of details.

I read Siddhartha and Damien and Narcissus and Goldmund and The Glass Bead Game and a bunch more books by Hermann Hesse during that time too. And a bunch of stuff by Camus, and a bunch of science fiction from the 1960s.

You know what I learned from all those authors? People feel really fuggin lonely.

Review: -100 by Jonathan Maas

Just finished this book this weekend: -100: A Time-travel Horror Romance.

All in all, I really enjoyed this story, and I’ll likely explore other stuff that Jonathan Maas writes. I found three tiny possible typos, so if the author stumbles on this review, email me ([email protected]) and I’ll send them over.

What I liked

  • The story is written cleverly. The first section starts on day 50 and centers on Kela’s point of view, and then each subsequent chapter covers a day before the previous chapter. So the reader reads in reverse order. Then the second section, which is much more detailed, starts at the beginning, on day 1, and then goes forward, and centers on Adam’s point of view.

  • Science fiction authors have spent a ton of words on the logistics of time travel. This book doesn’t spend too much time laying out the rules of how it works in this scenario, and I was grateful for that. I really enjoyed how this book had an idea I hadn’t heard about before: they figure out how to send your own thoughts back in time, so you get a message from your future self.

  • I really liked how sparse the whole story was. Nearly the entire story happens in Adam’s apartment, when he and Kela are alone. There are a few scenes elsewhere, but they also only have two or three people.

    I read that the writer, Jonathan Maas, is working on making this into a film, and I think the small number of locations would help with that. A team could film almost the whole story in one or two locations.

  • Related to how sparse and minimal and stripped down the whole story is, I love how there were no pyrotechnics in the story. Like, in the time travel scenes, there was never any blue flame, lightning bolts, ear-splitting roars, etc. Instead, when Kela describes to Adam the cosmic horrors waiting for us all at the end of time, it works better, because the reader fills in with their own imagination. I love it when science fiction focuses more on drama and less on spectacle.

What I wasn’t thrilled about

  • Kela’s character is a “once in a lifetime genius” according to her colleague Raj. And, of course, she is also completely aloof and oblivious to social graces. This is such a god damn science fiction cliche! It reminds me of Data from Star Trek: The Next Generation, that blonde chick from those awful “Species” movies, Valentine Michael Smith (the guy from Mars) in Stranger in a Strange Land, etc, etc, etc.

  • The plot line set up several mysteries, and then drops hints and clues along the way, but ultimately, the hints and clues don’t really resolve the mysteries. For example, I’m not really satisfied with the explanations of what forces drive Kela to such unearthly rage. Also, throughout the plot lines, when Kela enters these fugue states, she ofte carves bizarre glyphs. Adam studies them, and meets a few times with a symbols expert. But in the end, they don’t turn out to resolve anything. Other than setting a mood, they could have been cut out of the plot entirely.

Random thoughts

  • The title of this is literally “-100: A Time Travel Horror Romance”. I suspect this is some kind of way of describing / tagging / encoding what this book is about, so that people that see the title online in a long list of titles might be drawn to it more. Is an interesting way that art and commerce intersect and affect each other.

  • Ultimately, after finishing the story, I really wanted a ton more. Kela apparently discovers some existential horror out there in the cosmos so terrifying she decides that existence is a terrible idea. And then she backs away from this state of mind, and uses her technology to help Adam’s dad.

    This all feels like the end of the first act, rather than a story in itself. I wonder if there is more coming.

Grab all the rows when parameter is null, or just grab the rows that match

If I pass in NULL for xyz, I want to get all the rows.

If I set xyz to a value, I only want the rows in the table where the xyz column matches the value I pass in.

And I don’t want to do build up a string in my app code.

Here is how:


select *
from my_table
where
case
when %(xyz)s is null then true
when %(xyz)s = xyz then true
else false
end
;

And here’s a slight tweak if you want to pass in an array of allowed values:


select *
from my_table
where
case
when %(xyz)s is null then true
when xyz = any(%(xyz)s) then true
else false
end
;

I hope this helps! If you know a better way, let me know!

Meaningful primary keys beat sequences and UUIDs

Summary

Instead of serial primary keys or UUIDs for primary keys, when possible, you should make a PK that somehow describes the underlying data. This is not as hard as you might think!

In detail

Everything you read about databases will say that every table really ought to have a primary key, in other words, some value that is unique in every row. The clumsiest, crudest, simplest way to do that is to use something like a sequence (or a row number) for that primary key.

Here’s a table where I track schedules at golf courses:

create table loops -- a "loop" is what people call a game of golf
(
loop_number serial primary key,
club_short_name text not null references clubs (short_name),
tee_time date not null default today(),
golfer integer not null references golfers (golfer_id),
number_holes integer not null check (number_holes in (9, 18)),
unique (club_name, golfer, tee_time, number_holes) -- prevent duplicates!
);

Every time somebody inserts a row in that loops table, the loop_number column will automatically get a unique number. Now if we’re making some kind of web app, it is easy to make a link to a particular game (aka loop) by just making a URL with the loop_number in there, like this:

https://example.com/loop?loop_number=99

or this:

https://example.com/loop/99

Depending on how fancy you like your URLs.

This style was super-popular in the Ruby on Rails heyday.

Then maybe a few years after that, when distributed databases started catching on, it wasn’t as easy to get the next sequential value, because you couldn’t check all the nodes quickly. So people started using stuff like UUIDs like this:

row_id uuid not null default uuid_generate_v4() primary key

instead of

row_number serial primary key

And then URLs started looking more like this:

https://example.com/loop/5f7664e6-15c2-4d08-858e-3306f7a8ca07

Sidenote

I’ve heard a lot of people argue that replacing sequential primary keys with UUIDs is somehow more secure because it is very easy for some malicious person to change

https://example.com/loop/99

to something like

https://example.com/loop/100

and possibly spy on information not meant for them. Doing the same trick with UUIDs is not so easy; in other words, if you hand out a URL like

https://example.com/loop/5f7664e6-15c2-4d08-858e-3306f7a8ca07

to some customer, they probably won’t find any valid rows by just slightly incrementing that UUID (and that’s if they can figure out HOW to increment it).

I personally don’t think that switching from serial PK’s to UUID’s is always enough to block this attack, but it is absolutely a great first step! In practice, it seems pretty hard to guess another valid UUID, but it certainly is not impossible, and the RFC for UUIDs has this little nugget of advice:

Do not assume that UUIDs are hard to guess; they should not be used
as security capabilities (identifiers whose mere possession grants
access), for example. A predictable random number source will
exacerbate the situation.

Incidentally, this URL tweaking is a big source of data breaches! I’ve seen it in the wild numerous times. I found this post that describes this kind of attack in more detail.

Unfortunately, the web popular frameworks don’t offer much help for this issue. They all make it easy to check that a user is authenticated (they are who they say they are), and maybe they offer some kind of role-based permissions, but you’re pretty much on your own when building a multi-tenant system with data privacy.

In other words, if you want to block user X from spying on data that should only be seen by user Y, you need to check that yourself, in all the different places in your code where you pull back data.

All that said, my favorite reason to go with UUIDs is that you don’t reveal that you only have like three clients on your system when you’re out doing demos, and that’s pretty dang important when you’re fundraising!

Back to the main point

Based on the table above, any loop is a unique combination of a club, a golfer, a tee time, and a number of holes of golf. For example, one row might track that Thurston Howell III is playing 18 holes at snooty-snooterton country club on April 1st, 2018.

It would be great if we could have a primary key like this:

snt-2018-04-01-th3-18

The snt part identifies the club, the 2018-04-01 part identifies the tee time, the th3 identifies the golfer, and the 18 part identifies the number of holes.

This makes for vastly easier to understand data! And it isn’t hard to do this. Just add a trigger on your table that fires before insert and update that sets your primary key column:

create or replace function set_loop_pk ()
returns trigger
as
$$
begin

NEW.loop_pk = NEW.club_short_name
|| '-'
|| to_char(NEW.tee_time, 'yyyy-mm-dd')
|| '-'
|| NEW.golfer_initials
|| '-'
|| number_holes,
;

return NEW;

end;
$$ language plpgsql;

create trigger set_loop_pk
before insert or update
on loops
for each row
execute procedure set_loop_pk();

Of course I replaced columns like golfer with golfer_initials, but hopefully that didn’t trip you up.

Also, the code above assumes you’re using the postgresql database, but you can translate it into whatever other database environment you want.

If you’re some kind of crazy person, I suppose you could even build that PK in your ORM layer.

Why is this better? This is better because anyone that sees a meaningful PK can infer a lot about the inner data. This is one of those things that will save you tons of time in a crisis because you don’t need to write lots of joins to understand who the heck is user ‘ac29a573-35f2-4200-b10a-384999426ee6’ or which club has club_id 876.

Your end-users will be more confident in the system as well. Labels printed with a meaningful PK are self-evident. URLs hint about the contents.

Sure, there are times when you need obfuscation, but it easy to have a meaningful PK and then scramble it somehow, with a real cryptographic solution, rather than leaning on a UUID.

Or really, the best approach in my opinion is to keep your meaningful PK, but also tag on another parameter that combines that meaningful PK with a secret value and then hashes it. People call this approach an HMAC.

Last point: if your data is only unique because you’re using a sequence or because you’re using a UUID, well, you’re not really “doing databases right”. Using a meaningful PK means you’ve figured out enough about what you’re storing to know what makes a row unique.

I see a path to 1984-style thought crimes from where we are now

A little while ago I got admonished online.

I posted a remark that I was shocked by the sex assault allegations against Charlie Rose.

I wrote, “who’s next — Lurch from Addams Family?”

A friend wrote back I was trivializing sex assault. Then she went on to say something about how I was part of the problem. I thought about it for a while and I just didn’t agree with it.

So I decided not to spend time debating the issue and I deleted the comment.

Then an hour later my friend posted a screenshot showing how I deleted the comment and said I was gaslighting her.

And these were not short posts she was making. These were full-on rants. From somebody I’ve known for 20 years.

Again I decided there was no way we were going to have a good conversation about this, so I deleted the post and blocked this person. I’m not going to host somebody insulting me on my story.

After that, I heard through someone else that she had posted a rant about my behavior calling me a bully.

It seems like at this point in the game, just expressing a regressive point of view is apparently the same as committing acts of violence.

If you see me in the labor camps, please say hi!

I learned a little about the origin of the states secret privilege today

Just finished this book about the CIA, written a by a career employee.

The most interesting part to me was at the end of the book, when he explained the origin of the “state secrets” privilege that gets used so often these days.

It started when a bomber crashed in 1948 and killed a few civilian contractors on board, and their families sued the government.

The government said they couldn’t release details about the plane or the flight without revealing classified information.

Lower courts rejected this and ordered the government to cough up the data. The Supreme Court ruled in favor of the government and created the idea of the state secret privilege.

Plot twist: 50 years later, the daughter of one of the contractors used a FOIA request to get the data.

The reports had no secure information. The plane crashed because of garden-variety incompetence.

The state secret privilege was BORN out of a desire to cover up embarrassing information.

Product review: todoist

I’ve been using Todoist for a few months. It’s not bad!

What I like

  1. Since there’s a mobile app and a web interface, it is really likely I’ll get stuff stored in there.
  2. Nearly no extra data is required to store a task. I just can just put “bananas” in a new task’s title and hit save. Again, this increases the likelihood I’m actually going to use the product. If a bunch of fields were required and didn’t have defaults, I might put off using the app.
  3. The alexa interface is fun. I can say “alexa add to my todo list …” and then add a line. I can also have alexa read back my to-do list.
  4. I like how projects and tasks can both be nested. I like how a task only belongs to one project, but can have many labels on it. And I like the priority feature.

What isn’t perfect

  1. There’s no obvious way to track the estimated size / difficulty / required work for a task. In other words, I can’t mark a task as “easy” or “really tricky” and then rank by that.
  2. Linking to tasks isn’t fun or easy. Links look like this:
    https://todoist.com/showTask?id=2179109422

    I found that link buried behind two mouse clicks. Meanwhile, github issues start at #1 in each project and increment up from there. That is so much nicer! I can easily tell somebody “hey look up task XYZ-432” but I can’t remember ten digits!

  3. A task has a title, but I want another field where I can add more description of the task. For example, some times, I want to add add links to screenshots, or blog posts with discussions, etc.
  4. Tasks need more statuses, like “in progress” and “will not do this”. Right now, as far as I can tell, a task is either not finished or finished or deleted. I need more statuses!
  5. There’s not an easy way to put tasks in order relative to each other. It is possible to set priority levels on tasks, but if three tasks are all at the same priority level, it isn’t easy to put them in a particular order.
  6. This is kind of complex, and expects a lot from a single application, but there a lot of times that I want to store stuff related to a project that aren’t to-do entries. For example, say I have a conversation with a client. We probably talked about a bunch of things:
    • near-term to-do items
    • stuff that would be nice, but not immediately planned
    • background information about the project

    The last point doesn’t fit that well into the todoist model!

  7. You can’t (as far as I can tell) upload attachments to tasks. Update! You can, but you have to add them as comments!
  8. There’s a developer API, but not an official CLI program. Instead, there’s a bunch of half-finished CLI programs on github.

Book report: Winter’s Gambit by Dana McSwain

This is the book that I’m reviewing.

That link has my referral code in it, so I’ll get a few pennies if you buy it after clicking that link.
And you really should buy it, because Dana McSwain is brilliant.

Summary

I’ve read a bunch of Dana McSwain’s stuff over the last few years. Generally speaking, I go through her stuff in the same way as I go through a big tube of Sour Cream and Onion Pringles. There’s no stopping until it’s all gone and then I feel bad. But in this case, it’s because I envy how she writes such clever twisty plotlines and beautiful characters, rather than because of carbohydrate poisoning.

You know how hard it is to find an album where every song is really good? Even your favorite bands rarely crank out albums like that. This books is like those cherished albums.

The Alex and Frank Mythos

This is the fourth book Dana McSwain has published about characters named Alex and Frank and all four books vaguely exist in the same cosmos (kinda / sorta, anyway). Alex, Frank, Alexei, the pizza story, and many other things, places, and people are recurring icons in her books.

Incidentally, the books don’t build on each other and you can read them in any order.

Nothing about her style or subject matter reminds me at all of H. P. Lovecraft, but he also wrote a whole bunch of stories about different people running around in the same setting.

You won’t find any purple prose or eldritch horror here; instead, you’ll find music preference mockery and truck stop food poisoning and skeeball anecdotes. That’s not my point with this comparison. My point is that for both writers, us readers build up in our own heads a composite sketch of this universe from all these partial hints of unseen actors.

Trope synthesis

Don’t get me wrong — they’re characters beyond this overly glib description, but Frank drips with 1980s action movie imagery. And of course, he is tortured by his brutal past doing shady stuff for the government.

Meanwhile Alex projects a caustic exterior protecting an sweetness underneath, which reminded me so much of female roles in 90s movies like Reality Bites and Singles and Before Sunrise. Same thing with how she dresses.

The title

A gambit in chess is when you make a risky move that could put you in a much better position or a much worse position depending on how it plays out.

A gambit strategy is the opposite of building up a fortress and staying inside it. It requires optimism and vulnerability.

The text is breezy and you might fly right past all these poignant struggles between hope and fear, but this is so much more than just an exciting adventure story.

So is this book kind of like an exploration of what would happen if Die Hard and Winona Rider from Heathers took a cross-country road trip to a meeting with a Hollywood movie producer while pursued by Russian mobsters?

Yes. And it works. You’ll probably read it one setting.

Notes from Fight To Win 32 in Cleveland

I noticed a few themes at last night’s Fight To Win 32:

  1. Takedowns are hard unless you’re Darren Branch. I am pretty sure he landed more takedowns in his match (which was like the 20th match) than in all previous fights summed up.
  2. A few fighters hopped back up to their feet once the fight went to the ground, and it usually led to good things. BJJ exposes how other martial arts don’t train what to do when the fight hits the floor. Last night exposes how few fighters can keep the fight on the floor, except when both sides agree to play along.
  3. A good part of the crowd (the casual fans) stop watching when the match begins with one fighter pulling half guard. If the goal is selling tickets, I can understand discouraging this stuff.
  4. Fundamental whitebelt stuff like guard recovery / retention, mount escapes, and surviving in bad positions define the game at all skill levels. This sport really is a lot like chess. You learn the basics quickly and then spend a lifetime mastering them.
  5. Classic submisssions like triangles, cross chokes, and kimura attacks were just as effective and popular as heel hooks at finishing fights.
  6. The crowd was great! I brought my 12-year-old kid there and he had a wonderful time. I never saw any drunk meathead behavior. In fact, the crowd was absolutely quiet during a lot of matches.