splitting the last git commit into two

April 23, 2020 C/C++ development and debugging. No comments , ,

In the blog post, Split a commit in two with Git, Emmanuel provides a super clear explanation of how to split an old commit into multiple commits, separating that commit into different commits, each with a subset of the files initially committed.

It took me a while before I could figure out how to apply this to the very last commit.  Here’s the required git magic:

git log -n 1 > m
git reset HEAD^
git add ...
git commit -m "First part"
git add ...
git commit -m "Second part"


The differences are really to just skip the first and last rebase steps (don’t do an interactive rebase, and don’t continue that rebase when done.) This was probably obvious to the author of the more general instructions.

Note that before resetting HEAD to the previous commit, I collect the current commit message, under the assumption that portions of it will be used in either of the two (or more) new commit messages.  If you don’t do that, you can fish it out of your history by looking at ‘git reflog’ to see what the message was before mucking around with HEAD.

How absurd: facebook marketplace has promoted me to arms-dealer.

I tried giving away some of Lance’s old model rocket stuff, but facebook has determined, even after appeal, that I am an arms dealer:

My listing description was:

Rocket launching base and trigger, a few engines (2x B6-6 and 2x 1/2A3-T4) and igniters, and some recovery wadding. The metal post that was originally on the launching base got lost somewhere along the way, but any straight conductive rod of the same diameter should do the job.

Available for porch pickup (M4X1C2, cabbagetown: Parliament and Wellesley)

The message from them, after my appeal, specifically says that this has been determined to be a weapon:

It’s been a long time since I’ve been in trouble with the law for weapons sales (there was that time back in grade 3 when I made the best ninja stars in my school and opened a little business for myself.)  I used to call myself a drug pusher when I worked for Bowles pharamacy, making sure that all the little old ladies (and that super stinky guy at 59 Edgewood) got their fixes.  Now I can add arms dealer to my resume along with drug dealer.

Incidentally, if you want some old model rocket stuff, including 4 weapons grade engines, please send me a message, and you can have it.

Shon Hopwood’s “Law Man” book.

March 22, 2020 Uncategorized No comments , , ,

I’d heard Shon Hopwood interviewed on the Rubin report quite a while ago.  Now that I’m living in Toronto, I have the Toronto Public Library at my disposal (which has a far superior selection to the Markham Public Library).  They had Hopwood’s book, which I’d been meaning to read for a while, and luckily was able to pick it up before the current coronavirus mass hysteria shut down the library and most of the world:

The story in this book is really amazing.

Part of the book describes life in prison.  What I know of prison comes from a couple sources.  The first of those sources is the most unreliable (movies), the second is an old childhood friend who I saw after he’d served some time (*), and the last is a family member who is now a guard in the US prison system.  This book added a bit more color to my understanding of that very different world.  There are probably lots of prison memoirs, but this is one that is exceptionally well written.  I really loved the way it starts by telling a story right off the bat.

The improbability of Shon’s story is truly phenomenal and inspiring.  The subset of Shon’s life that is described in this book ends with him starting as a law student, but I knew from the Rubin interview and Wikipedia others that he completed that schooling and went on to work as both a lawyer and a law professor!  In his book Shon ends up, somewhat reluctantly, attributing some of his miraculous story to a higher power.  Perhaps a higher power was at work, but so was a lot of very hard work.

I’d highly recommend this book.  It provides a glimpse of prison life, some peeks of aspects of injustice of the US justice system (which is probably mirrored by Canadian law), and shows how Shon managed to avoid the trap of perpetually cycling through iterations of prison and crime with a with a combination of hard work and luck.  Along the way, it tells a very entertaining and inspiring story.

Footnotes:

(*) I had a friend who had the misfortune to end up dating the daughter of one the Toronto Chinese mafia kingpins when we were both in high school.  Things didn’t go well for him after that dating selection, to say the least, and it’s been over 25 years since I heard from him.  He did tell me all about guards on the take, butt smuggling of drugs and cigarettes into prison, and the absurdity of airport security theater given how many airport staff were effectively paid mafia employees.  I’m sure that airport mafia payroll is still essentially the same, despite airport security theater now being far worse than it was in the 90s — criminals can still get the guns and drugs through the system easily, but we have to throw away our toothpaste and finger nail clippers, and dangerous too-big water bottles.

Kitchen reno progress: Cabinets are installed!

March 19, 2020 Uncategorized No comments , ,

Our kitchen installers, Umair and Khazir, worked really hard for four very long days, and wrapped up their work today.  Their work was superb, with lots of attention to detail, and I’m really happy with the result.

Our cabinets (and appliances) were purchased from IKEA.  Think of this as the IKEA assembly from hell, producing enough waste cardboard to completely fill our RAV to the ceiling twice.  Here is the end result:

Here’s a little video, panning the kitchen:

IMG_1150

What’s still TODO:

• Electrical box and outlet in the cupboard above the microwave+range hood.
• Countertop selection and installation.
• Plumbing (sink and dishwasher connections.)
• Electrical connection for the dishwasher.
• Take the wrapping off the appliances, plug in and test.
• Clean the (drywall) dust off the fridge and stove.
• Backsplash.
• New casing for the window.

For the countertop selection, take a look at this view of the floor tile:

and compare that to the following possible stone:

That stone is pricey, and we have about 34 square feet of counter to put in, so the cost will add up if that’s what we choose, but it would look really classy.

Of all the stones I saw today in my quick trip to the decimated Markham Home Depot, it was obviously and immediately clear that the one above was the best match.  It happens to also be the stone that we used for our master bathroom counter too, so I can simply bring some left over kitchen tile up to the bathroom next time I’m at the house to see how they look together.

Inka brand “coffee”: a silly nostalgic find

Dad was never functional before his morning coffee.  He usually headed down to the “Goof” for his fix.  He’d complain bitterly that it was horrible coffee, but that didn’t stop him from drinking it daily.  When he didn’t go to the goof for his fix, he’d stand beside the percolator like a zombie waiting long enough that he could interrupt it and pour his first cup of the day.

Dad, who survived on coffee and cigarettes while seated long hours at the glass blowing torch must have known you could have too much of a good thing.  So, when he’d finished mainlining coffee for the day, he switch to Inka brand “coffee”, a roasted grain beverage.  I didn’t know the brand was still in business, but blundered upon it today at the local grocery store:

I was looking to buy such a roasted grain “coffee” mix today anyways, as I’m now old enough that coffee after 7:30 pm equates to a high probability of a night of insomnia.  Finding dad’s old brand triggered a surprising number of memories, and provided the perfect way to cross off that shopping list item!

patching plaster and lathe: no strapping required!

February 29, 2020 Home renos 1 comment , ,

I’d never had to patch holes in plaster and lathe before, and proceeded in the normal fashion, trying to slip strapping into the hole like you would with drywall.  That was really difficult (at least in the small holes I was trying to patch.)

I got smarter on my second hole, and used the lathe itself as the strapping.  All I had to do was cut the hole a bit bigger than my hole, like so:

then I was able to anchor my filler piece of drywall nicely using the lathe

my first coat in the closet side is a bit messy since that side it just plaster and lathe and very uneven

but on the outside side of this wall, where we have drywall on plaster on lathe, the patch will be nice and smooth:

This is a new switch for the wall sconce light outlet that we presume was a wall sconce that had its own switch initially.

I had some trouble using my new trick on one of my four holes, since the plaster and lathe in that section was thinner than my drywall.  In that section, I tried trimming my filler drywall edgewise, which didn’t work too well, since it cracked once screwed in, but it was good enough to hold the mud in place, so it all worked out in the end.

Kitchen progress, we have a floor!

February 24, 2020 Home renos No comments , , ,

Our contractor installed the new kitchen tiles this weekend, and I think it’s looking pretty good, even without the grout:

There’s still some finicky work with the thresholds to do, but we should be able to get the cabinet installers in to do their work soon.

We spent some time at the house too.  Sofia got tons of the remaining chaos under control, and I putzed away, patching up the giant holes in Connor’s old room’s closet, which we ripped the plumbing and electrical out of (there was improperly installed plumbing and electrical in there for a 2nd floor laundry.)

The holes in the floor are because the old owner didn’t properly replace the subfloor that he massacred to run his plumbing and electical (on one side he didn’t have anything at all, and just covered it up the hole with some click-together hardwood).  I have some nice solid plywood that I’ll put in here to replace the missing OSB, but I couldn’t do that this weekend (at least easily) without my table saw, which was at the new-house.  I’ll also screw in a parallel section of 2×6 on the right hand side of the closet to strengthen the joist, which was also massacred a bit — that’s probably overkill, but I may as well while the floor is open.

Building a cantilever TV stand

February 17, 2020 Home renos No comments , ,

The basement den in the new house has a really nice built in TV cabinet.

The problem is that gargantuan TVs are too cheap these days, and the one we bought a couple years ago doesn’t fit.  We’ve had the TV propped up in front of the built in cabinet on a temporary stand (the one we used at the old house.)  Our plan was to build a cantilever shelf that just fits into the built in cabinet, which would support the TV, and is non-destructive.  Should we get rid of the current behemoth for a smaller TV, we could just take out the cantilever unit, and things would basically be back to the original state.

I wanted to match character with the original unit, which appears to be built from 3/4″ MDF, and has tasteful lips around all the basic boxes like so

These edges are all 1.5″ thick, 2x the width of the stock used for the box portions of the unit.  Here’s what I built (still not sanded, nor painted)

This is a big shelf, “weighing in” at 51″ wide.  Since I had a left over wide shelf reinforcing bar, I’ve used that underneath

My joinery isn’t perfect, and looked pretty bad before sanding, especially with the glue smears, showing.

After a hand-sand this looked much better.  Only the portion at the very front really needs to be sanded, since the rest will be hidden.  I’ve got to pick up my sander from the old house, and give things a good once over before priming and painting.

Because the shelf and the TV are both big and awkward, I’ve installed it temporarily, even though it’s not sanded and painted yet.  This will keep the TV out of the way for now:

Kitchen renovation progress.

February 1, 2020 Uncategorized 2 comments ,

We are making good progress on the kitchen renovation (a _lot_ of it over the last couple days).  Here’s a couple weeks ago with the cabinets and backspash removed

then Friday with some of the tile removed:

yesterday, with the tiles, subfloor and unsavable drywall removed

and finally today, after piles of back breaking work and bruises and scratches (removing old tile is not easy!), we’ve got things cleaned up

The wall that had been butchered by the first owners of the house is rebuilt, ready for new drywall on both sides (no more microwave cavity in the stairwell.)

We’ll have to take out the electrical outlet in the stairwell, and fix up the stairwell sconce, which had been “installed” without a standard octagon box.

I was glad to see that the kitchen outlets were all run properly, so we don’t have to cut into the subfloor to run new lines back to the panel.

Next steps:

• choose and order tile, and underlay material
• rough in plumbing
• drywall and flooring installation
• priming
• cabinet and appliance installation
• trimwork and finishing.

Lines and planes in geometric algebra.

January 30, 2020 Uncategorized No comments

[Click here for a PDF of this post with nicer formatting]

Motivation.

I have way too many Dover books on mathematics, including [1], which is a nice little book, covering all basics, plus some higher level material like gamma functions, Fourier series, and Laplace transforms. I’d borrowed this book from the Toronto Public Library in my youth. I’ve been meaning to re-read it, and bought my own copy to do so (too long ago.)

Perusing the chapter on vectors, I saw his treatment of lines, specifically the distance from a point to a line, and realized I’d left that elementary geometry topics out of my book.

Let’s tackle this and the similar distance from a plane problem here.

Distance from a line.

Given a point $$\Bx$$ on a line, and a direction vector $$\Bu$$ for the line, we can parameterize all points $$\By$$ on the line by
\label{eqn:lineAndPlane:20}
\By(t) = \Bx + a \Bu.

In particular, the vector $$\Bx – \By$$ is directed along the line if
\label{eqn:lineAndPlane:40}
\lr{ \Bx – \By } \wedge \Bu = 0.

While \ref{eqn:lineAndPlane:40} holds in $$\mathbb{R}^2$$ (and in fact $$\mathbb{R}^N$$), this relationship is usually written in the $$\mathbb{R}^3$$ specific dual form
\label{eqn:lineAndPlane:60}
\lr{ \Bx – \By } \cross \Bu = 0.

Given a vector $$\Bs$$, representing a point, not necessarily on the line, we can compute the (shortest) distance from that point to the line.

Fig 1. Distance to line.

Referring to fig. 1, it’s clear that we want this distance is just the rejection of $$\Bu$$ from $$\Bd = \Bx – \Bs$$. We can decompose $$\Bd$$ into components parallel and perpendicular to $$\Bu$$ using the usual trick
\label{eqn:lineAndPlane:260}
\begin{aligned}
\Bd
&= \Bd \Bu \inv{\Bu} \\
&=
\lr{ \Bd \cdot \Bu }
\inv{\Bu}
+
\lr{ \Bd \wedge \Bu }
\inv{\Bu},
\end{aligned}

where the first component is the projection along $$\Bu$$, and the last is the rejection. This means that the
directed distance to the line from the point $$\Bs$$ is
\label{eqn:lineAndPlane:80}
\BD = \lr{\lr{\Bx – \Bs} \wedge \Bu } \inv{\Bu}.

Should we want the conventional cross product formulation of this vector, this product may be expanded within a no-op grade-1 selection, applying the duality relation ($$\Bx \wedge \By = I \lr{ \Bx \cross \By }$$) twice
\label{eqn:lineAndPlane:100}
\begin{aligned}
\Bd \wedge \Bu \inv{\Bu}
&=
\gpgradeone{
\Bd \wedge \Bu \frac{\Bu}{\Bu^2}
} \\
&=
\inv{\Bu^2}
\gpgradeone{
I (\Bd \cross \Bu) \Bu
} \\
&=
\inv{\Bu^2}
\gpgradeone{
I (\Bd \cross \Bu) \cdot \Bu
+
I (\Bd \cross \Bu) \wedge \Bu
} \\
&=
\inv{\Bu^2}
\gpgradeone{
I^2 (\Bd \cross \Bu) \cross \Bu
} \\
&=
\frac{\Bu \cross (\Bd \cross \Bu)}{\Bu^2}.
\end{aligned}

Distance from a plane.

Given two linearly independent vectors $$\Ba, \Bb$$ that span a plane, and a point $$\Bx$$ in the plane, the points in that plane are parameterized by
\label{eqn:lineAndPlane:140}
\By(s,t) = \Bx + s \Ba + t \Bb.

We can form a trivector equation of a plane by wedging both sides, first with $$\Ba$$ and then with $$\Bb$$, yielding
\label{eqn:lineAndPlane:160}
\lr{ \Bx – \By } \wedge \Ba \wedge \Bb = 0.

This equation is satisfied by all points $$\Bx, \By$$ that lie in the plane

We are used to seeing the equation of a plane in dot product form, utilizing a normal. That $$\mathbb{R}^3$$ representation can be recovered utilizing a dual transformation. We introduce a bivector (2-blade) representation of the plane itself
\label{eqn:lineAndPlane:180}
B = \Ba \wedge \Bb,

and then let
\label{eqn:lineAndPlane:200}
B = I \Bn.

With such a substitution, \ref{eqn:lineAndPlane:160} can be transformed
\label{eqn:lineAndPlane:220}
\begin{aligned}
0
&= \lr{ \Bx – \By } \wedge B \\
&= \gpgradethree{
\lr{ \Bx – \By } B
} \\
&= \gpgradethree{
\lr{ \Bx – \By } I \Bn
} \\
&= \gpgradethree{
I \lr{ \Bx – \By } \cdot \Bn
+
I \lr{ \Bx – \By } \wedge \Bn
} \\
&=
I \lr{ \Bx – \By } \cdot \Bn,
\end{aligned}

where the last wedge product could be discarded since it contributes only a vector grade object after multiplication with $$I$$, and that is filtered out by the grade three selection. Multiplication of both sides with $$-I$$ yields
\label{eqn:lineAndPlane:240}
\lr{ \Bx – \By } \cdot \Bn = 0,

the conventional form of the equation of an $$\mathbb{R}^3$$ plane.
If we want a more general representation, then we are better off using the wedge product form of this equation
\label{eqn:lineAndPlane:280}
\lr{ \Bx – \By } \wedge B = 0,

where we use \ref{eqn:lineAndPlane:180} to drop the references to the original spanning vectors $$\Ba, \Bb$$. As with rotations, in geometric algebra, it is more natural to encode the orientation of the plane with a bivector, than to use a spanning pair of vectors in the plane, or the normal to the plane.

For the question of shortest distance from a point to our plane, we want to compute the component of $$\Bd = \Bx – \Bs$$ that lies in the plane represented by $$B$$, and the component perpendicular to that plane. We do so using the same method as above for the line distance problem, writing
\label{eqn:lineAndPlane:300}
\begin{aligned}
\Bd
&= \Bd B \inv{B} \\
&=
\lr{ \Bd \cdot B } \inv{B}
+
\lr{ \Bd \wedge B } \inv{B}.
\end{aligned}

It turns out that these are both vector grade objects (i.e. there are no non-vector grades that cancel perfectly). The first term is the projection of $$\Bd$$ onto the plane $$B$$ whereas the second term is the rejection. Let’s do a few things here to get comfortable with these components. First, let’s verify that they are perpendicular by computing their dot product
\label{eqn:lineAndPlane:320}
\begin{aligned}
\lr{ \lr{ \Bd \cdot B } \inv{B} }
\cdot
\lr{ \lr{ \Bd \wedge B } \inv{B} }
&=
\gpgradezero{
\lr{ \Bd \cdot B } \inv{B}
\lr{ \Bd \wedge B } \inv{B}
} \\
&=
\inv{B^4}
\gpgradezero{
\lr{ \Bd \cdot B } B
\lr{ \Bd \wedge B } B
} \\
&\propto
\gpgradezero{
\lr{ \Bd \cdot B } B^2
\lr{ \Bd \wedge B }
} \\
&\propto
\gpgradezero{
\lr{ \Bd \cdot B }
\lr{ \Bd \wedge B }
} \\
&=
0,
\end{aligned}

where we first used $$B^{-1} = B/B^2$$, then $$\lr{ \Bd \wedge B } B = \pm B \lr{ \Bd \wedge B }$$ (for $$\mathbb{R}^3$$ $$B$$ commutes with the wedge $$\Bd \wedge B$$ is a pseudoscalar, but may anticommute in other dimensions). Finally, within the scalar selection operator we are left with the products of grade-1 and grade-3 objects, which can have only grade 2 or grade 4 components, so the scalar selection is zero.

To confirm the guess that $$\lr{ \Bd \cdot B } \inv{B}$$ lies in the plane, we can expand this object in terms of the spanning vector pair $$\Ba, \Bb$$ to find
\label{eqn:lineAndPlane:340}
\begin{aligned}
\lr{ \Bd \cdot B } \inv{B}
&=
\lr{ \Bd \cdot \lr{ \Ba \wedge \Bb} } \inv{B} \\
&=
\lr{
(\Bd \cdot \Ba) \Bb

(\Bd \cdot \Bb) \Ba
} \inv{B} \\
&\propto
\lr{
u \Ba + v \Bb
}
\cdot \lr{ \Ba \wedge \Bb} \\
&\in \setlr{ \Ba, \Bb }
\end{aligned}

Similarly, if $$\lr{ \Bd \cdot B } \inv{B}$$ has any component in the plane, dotting with $$B$$ should be non-zero, but we have
\label{eqn:lineAndPlane:360}
\begin{aligned}
\lr{ \lr{ \Bd \cdot B } \inv{B} } \cdot B
&=
\gpgradeone{ \lr{ \Bd \cdot B } \inv{B} B } \\
&=
\gpgradeone{ \Bd \cdot B } \\
&= 0,
\end{aligned}

which demonstrates that this is the component we are interested in. The directed (shortest) distance from the point $$\Bs$$ to the plane is therefore
\label{eqn:lineAndPlane:380}
\BD
=
\lr{ \lr{ \Bx – \Bs } \wedge B } \inv{B}.

There should be a dual form for this relationship too, so let’s see what it looks like. First note that for vector $$\Bd$$
\label{eqn:lineAndPlane:400}
\begin{aligned}
\Bd \wedge B
&=
\gpgradethree{
\Bd I \Bn
} \\
&=
I (\Bd \cdot \Bn),
\end{aligned}

so
\label{eqn:lineAndPlane:420}
\begin{aligned}
\BD
&=
I \lr{ \lr{ \Bx – \Bs } \cdot \Bn } \inv{I \Bn} \\
&=
\lr{ \Bx – \Bs } \cdot \Bn \inv{\Bn}.
\end{aligned}

This would conventionally be written in terms of a unit vector $$\ncap$$ as $$\lr{\lr{ \Bx – \Bs } \cdot \ncap} \ncap$$.

Summary.

We can write the equation of a line, plane, (volume, …) in a uniform fashion as
\label{eqn:lineAndPlane:440}
\lr{ \By – \Bx } \wedge V = 0,

where $$V = \Bu_1, \Bu_1 \wedge \Bu_2, \Bu_1 \wedge \Bu_2 \wedge \cdots \wedge \Bu_n$$ depending on the dimenion of the desired subspace, where $$\Bu_k$$ are linearly independent vectors spanning that space, and $$\Bx$$ is one point in that subspace.

The (directed) distance from a vector $$\Bs$$ to that subspace is given by
\label{eqn:lineAndPlane:460}
\BD = \lr{ \Bx – \Bs } \wedge V \inv{V}.

For the $$\mathbb{R}^3$$ special case of a line, where $$V = \ucap$$ is a unit vector on the line, we showed that this reduces to
\label{eqn:lineAndPlane:480}
\BD = \ucap \cross \lr{ \lr{ \Bx – \Bs } \cross \ucap },

For the $$\mathbb{R}^3$$ special case of a line, where $$V = I \ncap$$ is a unit bivector representing the plane, we found that we could write \ref{eqn:lineAndPlane:460} as a projection onto the normal to the plane
\label{eqn:lineAndPlane:500}
\BD = \lr{ \lr{ \Bx – \Bs } \cdot \ncap } \ncap.

Again, only for $$\mathbb{R}^3$$ we were also able to write the equation of the plane itself in dual form as
\label{eqn:lineAndPlane:520}
\lr{ \By – \Bx } \cdot \ncap = 0.

These dual forms would also be possible for other special cases (like the equation of a volume in $$\mathbb{R}^4$$ and the distance from a point to that volume), but should we desire general relationships valid in all dimension (even $$\mathbb{R}^2$$), we can stick to \ref{eqn:lineAndPlane:440} and \ref{eqn:lineAndPlane:460}.

References

[1] David Vernon Widder. Advanced calculus. Courier Corporation, 1989.