Arizona Desert Midwinter Championship 2020

This past week, I traveled to Phoenix, Arizona to compete in the Arizona Desert Midwinter Championship.

Here’s a bit of a teaser video and then you can continue reading the rest of the post if you’d like. πŸ˜„

Initially, my only interest in this match was for the service pistol and rimfire EIC matches that were being held. So, my plan was to arrive Friday night, shoot on Saturday afternoon, and then book it back home on Friday. Wichita Falls is a bit more than 14 hours away from Phoenix, so that would’ve been a lot of miles in just a few days. This was fine with me though because I’ve had that points monkey on my back ever since I got my hard legs for both service pistol and rimfire pistol.

A month or so before the trip, another Texas shooter, Mason Talbert, posted in a Facebook group asking if other Texas were traveling to the matches and whether they wanted to plan travel together. The catch, Mason wanted to go all of the matches in the week. This meant that I would need to extend my travel from 3 days to at least 7 days. More importantly, that meant that I would need to miss an entire week of work instead of just one day. 😱

That’s a lot of time, especially considering that I’d like to go to the national matches this summer as well, which will be 1-2 weeks. But, getting to hang out with, and learn from, Mason and others made it worth the trip. So, I ran it by the bosses (wife and work) and got permission to go. πŸŽ‰

Travel

As mentioned above, the trip from Wichita Falls to Phoenix is about 14 hours by car. My route would normally be go north through Amarillo, through Albuquerque, and then on to Phoenix. But, since Mason lives in College Station, I ended up taking the southern route, which went through El Paso and Las Cruces, so that Mason and I could meet up in Midland.

Wichita Falls, TX to Phoenix, AZ

The trip itself was pretty simple on the way there. We met in Midland, loaded Mason’s stuff in my car, hit the road again, and then stopped in El Paso for the night. The next morning, we took off around 7am and got to Phoenix by 3pm.

The way back, however, was a bit of a drag. πŸ˜‚ We didn’t leave until after the awards were given out on Sunday afternoon, which was about 2:30pm. Since we were leaving late, we knew that it wasn’t a great idea for either of us try to make it all the way back home. So, we decided that we’d stop in Midland for the night. This was about a 10.5 hour drive, which meant that the earliest that we’d arrive was about 1am. With various stops, we didn’t actually arrive to Midland until 3am.

Results

Overall, I was pretty happy with my results. The week started out rough, but got better as it went along. I did less than my average for air pistol, standard pistol, service pistol 900, and EIC matches. But, after getting some advice from Mason, I was able to start the 2,700 match with a new focus and shoot a personal best.

That personal best was shooting a 2,398/2,700. This also means that I’m shooting nearly 89% and getting close to being reclassified as an expert. πŸŽ‰ I believe that score was also good for second overall sharpshooter.

Photos

Takeaways

Competing in large matches takes a lot in general, whether it’s time, money, effort, etc. The payoff in going to large matches though are:

  1. Getting access to matches, such as centerfire pistol, air pistol, standard pistol, and EICs
  2. Getting to interact with and learn from great shooters

The second of those, interacting with and learning from great shooters, is really the biggest payoff for me. Below are some of the takeaways that I got from this match:

  • “Ask the trigger” to go instead of “tell the trigger” to go.
    • This nugget comes from Mason. I understand this as a different way to describe triggering, instead of using “squeeze the trigger” or “slowly pull the trigger”.
  • Treat the trigger like your best friend, which means spending time with it and understanding its preferences.
    • This nugget also came from Mason. I understand this as dry fire more and don’t be afraid to try a slightly different approach to triggering if something stops working. Mason described that second bit as taking your friend to the arcade if your friend decided that they didn’t like going to the movies anymore.
  • Be bored shooting 10s. Shooting 10s are great, but you shouldn’t jump for joy every time you shoot a 10. You should expect to shoot a 10.
  • “Just do that thing you know how to do.”
    • When talking to Mason about the recent funk I’ve been in, he mentioned that sometimes he tells himself to “do that thing he knows how to do”. When he gets to the line, he’ll think that to himself before and in between shots.
  • “Push your legs down and out” for more stability.
    • This was a suggestion from John Zurek to Mason.

Pistol Training 1-26-2020

Since 4-H rifle and pistol classes were today, and I was already going to conveniently be at the range to coach a few kids. I got to the range about 1.5 hours early to set the range up and get some practice in.

To get the most out of the limited time I had before students and coaches started showing up, with my 45 calibre pistol, I did a few minutes of dry fire followed by about 80 shots of progressive training. For more about progressive training, see my last training post.

I had a bit of a rough time with the first 40 shots. But, I ended up with a solid target for my next 40 shots:

Some takeaways/thoughts that I had:

  • Many of my misses were low, which could be relaxing or jerking the trigger (which definitely happened several times)
  • After getting home and cleaning the pistol, including the trigger parts, the trigger was MUCH SMOOTHER. I should probably clean the trigger parts much more often, or find a way to keep them lubricated better
  • I often lost the front sight in the aiming black (with center hold). I’ve noticed that my white dot no longer shows on the front sight. I need to paint this back on.

Pistol Training 1-20-2020

With 3 pistol matches coming up in February, and having spent a majority of my time training in December on slow fire, I needed to get out to the range to focus on sustained fire.

So, tonight, after work and dinner were done, I headed out to the range to focus on sustained fire.

Rough Training Plan

  • Dry fire
  • Group fire
  • Blank face timed and rapid fire
  • Rapid fire practice

In reality, I ended up adding the following:

  • Progressive training
  • Rapid fire practice

Blank Face

After talking to Daniel Miller at the January bullseye match at Dallas Pistol Club, I decided that I would add some blank face firing to my sustained fire training. The idea with a blank face is that you don’t have a definite aiming point. Because of that, you’re able to focus much more on trigger pull and cadence since there is less pressure.

Here is a picture of 40 shots fire on a blank face target.

Just looking at that group, with no scoring rings on the repair center, what do you think the rough score percentage would be? Well, let’s look at the front of the repair center with the scoring rings.

By my count, the shots are as follows:

  • 10 14
  • 9: 14
  • 8: 9
  • 7: 2
  • 6: 1

Added up, the total score was 358. Out of 400, that’s 89.5%! ???? Not too bad for just pointing the pistol down range and pulling the trigger, eh?

Needless to say, after shooting 40 shots on a blank face, I was feeling pretty confident. So, I moved on to rapid fire.

Rapid Fire Training

When I started rapid fire training, I noticed that I was shooting very quickly and that my shots were grouping quite low and to the left. After several strings of this, and after grouping quite well in the center of the target for group fire, I was certain that I was jerking the trigger.

So, I paused on rapid fire and moved to progressive training.

Progressive Training

Progressive training is a fun game/drill that I read about in a reply from Ed Hall on Bullseye-L forum. I did quite well with the progressive training, keeping all of the shots in the black (my chosen ring), until…

My first string of 5 shots. On that string, I jerked the trigger on nearly every shot and ended up putting 4 low left, out of the black. I recovered in my next string of 5 though by putting all of the 5 shots in the black.

Overall, I was happy with how the progressive training went. It effectively acted like a reset from when I was consistently throwing shots low left in rapid fire. Feeling happy with the results, I moved on to a few strings of rapid fire and did much better.

Takeaways

In the future, perhaps I should schedule sustained fire training like this:

  • Dry fire
  • Group fire
  • Blank face
  • Progressive training
  • Rapid fire practice

The thinking behind this is that I’ll warm up with dry fire and then from there add little by little until I’m shooting full rapid fire strings. My hope is that this will minimize jerking the trigger.

Another thing I noticed was occasionally breaking my wrist. I even specifically pointed that out on one of my targets above. It’s not a big concern at the moment, but something to keep an eye on.

Simple age shortcode for WordPress

As I was updating the about page on this blog today, I decided that I wanted to make my age in the following string dynamic: “I am a 31-year-old Texan”. After considering options, creating a shortcode seemed like a simple enough route. Here’s the code that I came up with:

/**
 * A simple shortcode for displaying a person's age within WordPress content. This was
 * created with an "about" in mind, so that I wouldn't have to keep updating my age. :)
 * 
 * Usage: [simple_age birthday="January 1 2020"]
 */
function simple_age_shortcode( $atts ) {
	if ( empty( $atts['birthday'] ) ) {
		return '';
	}
	
	// If the birthday couldn't be parsed, then show some numeric output at least Β―\_(ツ)_/Β―
	$birthday = strtotime( $atts['birthday'] );
	if ( ! $birthday ) {
		return 0;
	}
	
	$time_diff  = time() - $birthday;
	$years_diff = floor( $time_diff / YEAR_IN_SECONDS );
	
	return intval( $years_diff );
}
add_shortcode( 'simple_age', 'simple_age_shortcode');

Then, in my about page, I modified the content to look like this:

I am a [simple_age birthday="January 1 2020"]-year-old Texan...

To add this code to your site, you can add it as a plugin, in the functions.php file of your theme, or you could use a plugin like Code Snippets (which is my favorite option for small bits of code like this).

If you land here, then hopefully you find this simple age shortcode for WordPress handy. ???? If there’s some interest, I may consider adding the plugin to the core repo to make it easier for people to use the shortcode. Feel free to leave a comment below if you’d prefer that.

NWTFS September Rifle Match

Last month, Destiny and I attended the high power rifle match at Northwest Texas Field and Stream Association. This was the first match that Destiny and I had competed in at the club, and it was only the second time that we had ever competed. The first time that we competed being at the Rifle SAFS competition at Camp Perry in 2019.

Below are some pictures and video from the match. ????

Camp Perry Pistol Week– 2019

I spent last week, July 8th-14th, at Camp Perry in Port Clinton, Ohio for the National Precision Pistol Championship.

The Trip

The trip was about a 17 hour drive to get from Wichita Falls, Tx to Port Clinton, Ohio.

And with 4 people and all of our gear, you can imagine that the van we took was pretty packed! The picture below is with the two back seats folded down. ????

We left on Saturday the 6th, directly following the Don James Memorial match at Northwest Texas Field and Streams, stayed in St. Louis for the night, and then finished the trip on the 7th. On the way back, we left Port Clinton at about 7:15am and drove through until we got to Wichita Falls.

The Hut

While at Camp Perry for pistol week, the group of folks from Wichita Falls stayed in a hut. Huts cost $52 per night, have four beds, power outlets, and an air conditioner. Here’s a panorama picture of what our hut looked like from the front door.

And here’s a picture of what our hut looked like from the outside. Notice all of the mayflies on the building. ????

Results

The match results for pistol week at Camp Perry can be found at the following links:

To summarize, I took third marksman for the NRA championship but did not receive any points or win for the CMP matches. All the same, it was a great week.

Photos

Install Unison 2.48.4 on Mac OS X with Homebrew

I use Unison to sync code between my local machine and my dev servers. To sync between two servers, it requires that the same version of Unison be installed on both servers.

Now, this isn’t usually a big deal, because once you get Unison set up, it’s set up. But, I usually get a bit frustrated when setting up a new development machine and ensuring that it has the same Unison version as my remote server.

Most recently, I needed to get Unison 2.48.4 on my local Mac so that it matched my remote server. BUT, homebrew didn’t support Unison 2.48.4.

So, after getting some feedback from one of my coworkers, we came up with the following. Maybe you’ll find it helpful.

# Get rid of existing Unison
brew uninstall --force unison

# Checkout version of homebrew with Unison 2.48.4
cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core
git checkout 05460e0bf3ae5f1a15ae40315940b2d39dd6ac52 Formula/unison.rb

# Install
brew install --force-bottle unison

# Set homebrew-core back to normal
git checkout master
git reset HEAD .
git checkout -- .

NOTE: If you get error: fatal: reference is not a tree: 05460e0bf3ae5f1a15ae40315940b2d39dd6ac52 after running git checkout 05460e0bf3ae5f1a15ae40315940b2d39dd6ac52 Formula/unison.rb, we’ve been able to fix the issue by recloning homebrew-core. If you get the same error, you’ll want to add these steps before retrying starting at the git checkout 05460e0bf3ae5f1a15ae40315940b2d39dd6ac52 Formula/unison.rb command above.

cd /usr/local/Homebrew/Library/Taps/homebrew
rm -rf homebrew-core
git clone https://github.com/Homebrew/homebrew-core.git
cd homebrew-core

How to download a gif from Giphy

Recently, when I was trying to download a gif file from Giphy, I noticed that when I went directly to the file, https://media.giphy.com/media/14kdiJUblbWBXy/giphy.gif for example, that it was actually loading a web page instead of the gif file. ????

Now, on this page, you could choose to alternative/right click on the image and then click “Save Image”. But, this will download the image with a .webp extension. From there, you can choose to change the extension to .gif if you’d like. But, I’ll be honest and tell you that I didn’t consider switching the extension at first. So, I dug further.

I figured that Giphy was probably detecting that based on who/where the request was coming from, so I tried downloading the gif file by running a cURL command. This worked, but it’s not convenient to have to open up a terminal window to run a cURL command.

Luckily, a kind person left a very helpful comment below with an even simpler approach, which I think is the simplest approach overall.

Simple approach

When we go to a standard Giphy source URL, like https://media.giphy.com/media/14kdiJUblbWBXy/giphy.gif, a web page is loaded instead of the gif that we want. Now, the only thing we have to change for the actual gif to load is to change media.giphy.com to i.giphy.com.

So, if we take the above example, we could load the actual gif by going to https://i.giphy.com/media/14kdiJUblbWBXy/giphy.gif

From here, we can alternate/right click to download the gif with the correct extension and go on about our day.

Downloading via cURL

curl https://media.giphy.com/media/KXgJsSeOfvSgg/giphy.gif --output ~/Desktop/download.gif

This resulted in the actual gif file that I wanted being placed on my Desktop as download.gif. ????

Recursively cast to array in PHP

I recently ran into an issue where JSON encoding some objects in my code wasn’t working properly. After experimenting, I realized that casting everything to an array before JSON encoding magically fixed things.Β 

Casting an object to an array is simple enough:

$variable_to_array = (array) $object_var;

But, what happens when an object or array contains references to other objects or arrays? The answer is that we then need to recursively cast a given input to an array. But, we don’t necessarily want to recursively castΒ everything to an array. For example, this is what happens when we cast 1Β to an array:

return (array) 1;
=> array(1) {
  [0]=>
  int(1)
}

A simple fix is to recursively cast non-scalar values to an array. Here’s an example of how we would do that:

/**
 * Given mixed input, will recursively cast to an array if the input is an array or object.
 *
 * @param mixed $input Any input to possibly cast to array.
 * @return mixed
 */ 
function recursive_cast_to_array( $input ) {
	if ( is_scalar( $input ) ) {
		return $input;
	}

	return array_map( 'recursive_cast_to_array', (array) $input );
}