Thursday, May 22, 2025

I Went Shooting Today

Or at least, I tried.  I am a member of Homedale Gun Club which is a very nice private facility.   For some reason it rejected my card today.   I have gone shooting there this calendar year so I know I must have paid my annual dues.  

Instead, a friend from church and I went to public range at Pickle Butte.  It is free and it is about the condition you can expect of something open to everyone with no supervision.   No metal plate targets, no target holder frames, lots of broken bottles and cans, stuffed (and now terribly perforated) stuff animals.

I had no easy way to verify that I have the M1A properly zeroed but the 2x4s out at 98 yards looked like they had suffered 7.62 NATO chew marks.   

The only thing we could do with pistols involved shooting cans and even shotgun shells.  This is only useful for getting the experience of recoil and sight picture.  The Walther is so much fun and so cheap to shoot that I do not see it as a complete waste of time.   I also got to know Chey a little better.

The Walther is picky about ammunition.   This is typical for .22 pistols.  The American Eagle brand jammed several times over a box or so. Had I been a bit more organized, I would have looked through my range bag.  I had some Armscor and Federal in there as well.   One of these has functioned well in it before. 

Wednesday, May 21, 2025

The Downside of Tiny Batteries

There is really no alternative when you need to fit in the dimensions of a cartridge case.  But when taking the batteries out of this chamber bore sighter, they went flying and only two deigned to be found.  They are round so they have great rolling power.

CV Life Bore Sighter Review

Widener's sent me a bore sighter for review, along with some premium .223 and .308.  (Thanks.)   It appears to be identical to many similar units of Amazon.  Same factory, different product names, of course.  

The laser has little adapters for different calibers. You screw the adapter into the laser and slide it in the end of the barrel, turn on the laser, and adjust your sights to coincide with the bright dot on the far wall.  Simple, right?  

I did not seem to have enough adjustment range my scope.  Or in my iron sights, which are not far off.  My son is not an experienced shooter and he was able to hit the 100 yard plate with iron sights st the range.

It works fine in my Remington Model 660, and the scope is adequately aligned.  My M1A, no.  The flash hider is too long for the adapter to reach the muzzle.  

I considered removing the flash hider but that requires a castle nut wrench.  I have lots of weird tools (a huge die wrench, 4' long tweezers) but not one of those.

It is a clever design that accommodates 32 different calibers.  The laser is bright.   I do not know if it would useful outdoors, but inside my house it is adequate. 

I have ordered a chamber bore sighter, the kind that goes in the chamber.  Reviews on Amazon are generally positive.   It has no on,/off switch so get your coarse alignment done quickly.

I may machine an extension to allow the adapter to reach the barrel.   This is not so hard to do.  Maybe.  It needs a screw that goes into the laser extension and a way to attach the adapter which uses a tiny little screw.  The extension on which the adapter sits is continuous with the laser so it is going to need to be a tight fit to be useful.

UPDATE: I was putting rifle back in safe, a .308 chamber bore sighter fell out!

UPDATE 2: Once I figured out battery direction,  it was painless.  Whatever fiddling I did on the scope while discovering the CV Life bore sighter was loose in the muzzle, I was fractions of an inch from the red dot. I should be close enough to hit paper at 100 yards. 

Tuesday, May 20, 2025

Remember the Scene in Star Trek 4: "Save the Whales"

Where Scotty impresses the engineer in 20th century San Francisco, then blows it all picking up the mouse and assuming the computer will take voice instructions?  (Interesting trivia, you never see all of James Doohan's fingers in Star Trek.  One was blown off during D-Day.  Greatest Generation where you least expect them.)

The more controls you have that are operated by switches that are a reach to get, the riskier it is. So, as an experiment,  I hit the voice button on the steering wheel and said "Turn off air conditioning."  it did.  "Set temperature to 70 degrees."  It did.  "Turn on driver's seat heater."  Yay!  It does not seem to understand,  "Turn on driver's seat massager."  To change the 33-inch wide dash to show the full navigation map, "Show map" works.  I still have not figured out how to command it show the radio display.  There is a button on the console to do that, but the obvious,  "Show radio" or "Show YouTube music" seems to tell YouTube Music to start playing some song other than the one that was already playing.  There must be a manual that shows all the Cadillac Customer User Experience (CUE) commands.  I just need to hunt it down.

UPDATE: Thanks to all you Trekkies that remembered Save the Wheels was 4 no 2 to save us from the giant Hostess Ho-Hos.

Monday, May 19, 2025

Cutting Slots

 I mentioned the need to cut slots.  First I wrote a bash script to produce the needed gCode.  Then, because one little enhancement took me into direct conflict with bash's unobvious math comparisons, I rewrote in C.  The code is much clearer.

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <float.h>

int main (int argc, char* argv[])
{
  int inDebugger = 0;
  if (argc < 12+inDebugger || argc > 12+inDebugger)
  {
    printf("wrong number of arguments\n");
    displayValidArgs();
    exit(2);
  }
  float xStart=atof(argv[1+inDebugger]);
  float yStart=atof(argv[2+inDebugger]); 
  float xEnd=atof(argv[3+inDebugger]); 
  float yEnd=atof(argv[4+inDebugger]);
  float zStart=atof(argv[5+inDebugger]);
  float zStep=atof(argv[6+inDebugger]);
  float zEnd=atof(argv[7+inDebugger]);
  float xyFeed=atof(argv[8+inDebugger]);
  float zFeed=atof(argv[9+inDebugger]);
  float millDiameter=atof(argv[10+inDebugger]);
  char* outputFileName=argv[11+inDebugger];
  FILE* outputFile=fopen(outputFileName, "w");
  if (outputFile == NULL)
  {
    printf("unable to create file %s\n", outputFileName);
    exit(2);
  }
  /* is slot wider than mill? */
  float slotWidth=yEnd-yStart;
  if (millDiameter > slotWidth)
  {
    printf("mill too wide for reequested slot\n");
    exit(2);
  }
  showArgs(argc, argv);
  float millRadius = millDiameter/2.0f;
  float xCutStart = xStart+millRadius;
  float yCutStart=yStart+millRadius;
  float xCutEnd=xEnd-millRadius;
  float yCutEnd=yEnd-millRadius;
  /* copy prolog */
  copyFile("/home/clayton/subs/prolog.nc", outputFile);
  /* raise tool */
  fprintf(outputFile, "G1 Z1 F25\n");
  fprintf(outputFile, "G1 X%0.4f Y%0.4f F25\n", xCutStart, yCutStart);
  /* lower to just above contact */
  fprintf(outputFile, "G1 Z0.05 F25\n");
  /* to contact */
  fprintf(outputFile, "G1 Z0 F25\n");
  float z;
  for (z=zStart; z > zEnd; z += zStep)
    {
      fprintf(outputFile, "G1 Z%0.4f F%0.4f\n", z, zFeed);
      float y;
      for (y = yCutStart; y < (yCutEnd - millDiameter); y += millDiameter)
    {
      fprintf(outputFile, "G1 X%0.4f Y%0.4f F%0.4f\n",
          xCutStart, y, xyFeed);
      fprintf(outputFile, "G1 X%0.4f F%0.4f\n", xCutEnd, xyFeed);
    }
      /* out of loop.  Did we complete section between y and yCutEnd? */
      if (y < yCutEnd)
    {
      y = yCutEnd - millRadius;
      fprintf(outputFile, "G1 X%0.4f Y%0.4f F%0.4f\n",
          xCutStart, yCutStart, xyFeed);
      fprintf(outputFile, "G1 X%0.4f F%0.4f\n", xCutEnd, xyFeed);
    }
    }     
  fprintf(outputFile, "G1 Z2 F25\n");
  fprintf(outputFile, "G1 x0 Y0 F25\n");
  fprintf(outputFile, "m2\n%\n");
}


displayValidArgs(void)
{
  printf("xstart ystart xend yend zstart zstep zend xyfeed zfeed milldiameter outputFilename\n");
}

showArgs(int argc, char* argv[])
{
  int i;

  for (i=0; i < argc; i++)
    {
      printf("%s ", argv[i]);
    }
  putchar('\n');
}
 
copyFile(char *srcFileName, FILE* outputFile)
{
  char copyBuffer[80];
  FILE* srcFile = fopen(srcFileName, "r");
  if (srcFile == NULL)
  {
    printf("unable to open file %s\n", srcFileName);
    exit (4);
  }
  while(NULL != fgets(copyBuffer, sizeof(copyBuffer), srcFile))
  {
    fputs(copyBuffer, outputFile);
  }
}


The prolog.nc file:

%
g17 g20 g54

Yes, I should just fprintf for those two lines.


How Long Has It Been Since I Wrote C?

I forgot the sequence of expressions in a for loop.  The test comes second; the increment operator third.

Sunday, May 18, 2025

Crimes Against History

My wife and I have been enjoying a series called Sons of Liberty.  It does for the American Revolution what Shakespeare did for British and Roman history: provided important lessons about human. nature from a very loose version of what 

It is focused on Sam Adams, John Adams, and John Hancock.   Sam Adams as action hero in places.  There are riots in Boston in an era that was pretty peaceful so that they could move the destruction of the Governor’s residence back too many years.  The Boston Massacre is utterly unrecognizable.   Adams is scrounging guns and powder to arm militias when I have read the documents to know this is all wrong.  The Battle of Concord is unrecogniably wrong.  The deadly retreat from Concord, which is perfect for drama is missing.  The Battle of Bunker Hill is wrong on more levels than I can begin to count.  One or two parts they got right.  They move the decision to declare independence before or contemporaneous with the 1775 Battle of New York.  

There are so many parts of the history that would make an historically accurate and rousing film.  While entertaining,  it was about as accurate as Star Wars physics.

As you might expect, I am not someone with whom to watch historical fiction.

So Much Wit in Metaxas' Writing

Discussing the Queen Caroline Affair in which George IV's wife had the unmitigated gall to have an adulterous affair (which likely put her at about 1/1000th of her husband's transgressions count):
"[George] made no secret of finding his bride stout and tedious,  not to say hygenically unscheduled.  Nor did Caroline think her lothario prince much of a catch either. It seems miraculous that they produced a cold,  and given their mutual repulsion, parthenogenesis must not be ruled out....  Caroline eventually settled in Italy,  like seeds in an appendix,  and the prince remained in England to return to the never-ending fox hunt, as it were."

Slots Are Good For You

As I have been piecing together this CFC mount, I had a revelation.   Once I explain, you will realize that I am not the first time have Aha! moment.

If you know exactly the dimensions of what you are building to the .01" range, you just measure and build.  If you are working from your imagination,  you will find that you need room for changes in those dimensions. 

The mount has some components whose exact relationships are not entirely clear.   What I am doing is holding these parts together with screws.  I use slots to let me move the parts relative to each other.

As an example this slotted part allows me to attach it to the tube assembly and still move it up and down (z-axis) to adjust position of the motor assembly.  

Similarly,  how this attaches to the underlying base plate gives me movement in the x-axis.  Slots in the last piece allow movement in the y-axis.

My plan is to make these slots long enough (typically an inch ir more) that even substantial movement is possible.  Once I have made a part of Delrin and I have adjusted everything to the right positions, I can make the parts of CFC with the right dimensions and much shorter slots (say, .25" for fine adjustment).