2026 Robert Fisher Lead: Roosevelt Lake

Does the comment section of YouTube know more about the whereabouts of fugitive Robert Fisher than the FBI? According to one commenter, Fisher is living in the woods around Roosevelt Lake in Arizona.

Another commenter thinks she saw Fisher in Williams, AZ:

And the last tip I could find was from a woman referencing a 2021 sighting in Christopher Creek, AZ:

 

How to add a GitHub personal access token via the command line on a Mac

It’s been a little while since I’ve had to add a new GitHub personal access token via the command line to be able to clone a GitHub repo. When I first started using GitHub I always used to go the easy route and just use a password. Developers and security people especially love to make things complicated though, so you can’t use a password anymore. This is actually an old change, not something new, but I found today that the easiest way to add a new PAT has actually change. According to Claude, you can use the GitHub CLI, “gh”, to add new PATs. This seems a little different than what I used to do before, so I wanted to write up a quick post on how to do this in case anyone else happens to be looking for the same information.

  1. Create your new Personal Access Token at github.com. After logging in, click on your profile icon > settings > developer settings > Personal access tokens > Tokens (classic) > Generate new token > Generate new token (classic)
  2. After Creating your new token, make sure to save it somewhere you aren’t going to lose it.
  3. Assuming you have brew installed on your Mac, run $ brew install gh
  4. In a new terminal window, login: $ gh auth login
  5. Select paste an authentication token, then paste in your PAT
  6. Last, in a new terminal window, clone your desired repo (assuming it’s your own repo which you have access): $ git clone https://github.com/orgNameHere/repoNameHere
 

I’m back

For the past year every time I’ve randomly checked on my blog to see if it’s still up and running okay, it’s always down. I’ve been hosting this blog myself on DigitalOcean using a Linux Virtual Server for the past 7 or 8 years, and once upon a time it used to run no problem for months or years without any maintenance or anything. Occasionally I’d have to log in to DigitalOcean and restart the server to get the site back up, but that was rare and would normally always do the trick.

Today I saw the site was down again and in the WordPress dashboard it advised that I should update my PHP version which required me to log in to the Linux server from the command line. Then it dawned on me… I’ve never upgraded my server ever. It’s still running the same version of Linux it was running back when I started the blog 7 or 8 years ago.

So then when I actually tried to go and update stuff, I noticed I couldn’t update anything. I think the Linux version on this thing is so old that none of the linux/ubuntu commands work for updating things like they normally would (or at least that’s my theory on why I wasn’t able to update or upgrade anything).

Anyway, I’ve got the site back up and running again, and I updated my WordPress version, but I was not able to upgrade PHP or my Ubuntu Linux version, but I’m glad my old site is back up and running. I used to get a decent amount of traffic from Google but I think I’ve lost all my SEO because the site was always down and unavailable for months and months on end without me noticing. But I’m back! And maybe when I’m feeling up to it, I’m sure WordPress has a feature where I can go export the blog to some sort of file, then I can go into DigitalOcean and just make a brand new virtual server and move everything over to the new virtual server, but I’m not really feeling like doing that much work tonight for my silly website. But hey I updated my header image here on the blog and wrote my first post in a year, so it’s good to be back. Hopefully I’ll have something worth writing about soon. Most things these days get posted to social media and hosting your own site is becoming much less common, but there’s something cool about the free and open web / internet, and I love having my own little slice here at www.topherpedersen.blog on my $7 per month DigitalOcean virtual linux server.

 

Client Side Web Scraping with React-Native

This blog post is going to be really short, and if you happen to have stumbled up on it, hopefullly I’ve got some answers for you. However, I’m really just writing this post because I want to bookmark this information for my future self! haha

With a lot of web scraping technologies, they’re typically intended to be run on a desktop computer or a server that’s able to simulate a web browser. However, setting up your project like this is going to cost you some money to do because you’ll need to spin up a server instance that you have to pay for each month. I have a massive graveyard of dead projects that I’ve had to kill off because I couldn’t afford the server costs. So personally, I’ve been trying to build things that truly don’t need a server and can operate without a centralized backend that costs me money each month.

And fortunately, I discovered a couple of guys on the internet that have run into the same problems and created a solution that you can use in your React-Native apps.

  1. Check out Gift Banda’s Web Scraping in React-Native on Medium
  2. And take the cheerio-without-node-native library for a spin

Cheerio-without-node-native is a fork of the cheerio webscraping library that removes/replaces the modules that make cheerio incompatible in a client-side environment.

I’m sure there are some downsides to doing this client side. I imagine that some things that involve JavaScript rendering and what not you probably won’t be able to do client-side. My guess though is you’ll probably be able to scrape 50 to 80 percent of the stuff you could normally scrape with cheerio.

I haven’t actually used this library yet, so we’ll see if it actually can get the job done. If not, I suppose I’ll just setup a server and a backend and all of that the old fashioned way.

 

How to get the Claude API return a single response instead of multiple messages.

I’ve been working on my first ai powered project recently using the Claude API, but I keep running into this problem that I haven’t been able to get around… Claude won’t give me back a single answer, instead it returns an array of answers of “content blocks.” I actually asked Claude via claude.com and ChatGPT via chatgpt.com how to fix this, but I didn’t get back a working solution. However, I asked Grok via x.com and it actually did give me the solution to this problem! Grok’s solution here: https://x.com/i/grok/share/RgTd0eJc35sUhAg19KtxuVA4L

 

How to Use Anthropic’s New Web Search Tool

This past weekend I tried building my first ai project using ChatGPT’s API. I want to build an app that tells me what bands are playing on any given night in Austin, TX and includes Spotify embeds so I can listen to the bands music so I can decide if I want to go see them or not. This is something I can sort-of do on chatgpt.com, but when trying to do the same thing via OpenAI’s API, I wasn’t actually able to get it to work.

While I was a little deflated that my weekend project was a failure, fast forward a few days and Anthropic launched their new web search tool today! And sure enough, I tried giving Claude via the Anthropic API the same prompt I had given ChatGPT and Claude is able to tell me what bands are playing tonight in Austin, TX at Hotel Vegas, a cool venue by my apartment that has shows 7 days a week 365 days a year.

If you’re interested in using the new web search tool via the Anthropic API, make sure you set the model you’re using to claude-3-7-sonnet-20250219, and add “tools” block when you instantiate your Claude client:

import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
apiKey: 'YoUR-APi-KeY-GOEs-HeRE', // This is the default and can be omitted
});
async function main() {
const message = await client.messages.create({
max_tokens: 1024,
messages: [{ role: 'user', content: 'What bands are playing tonight at Hotel Vegas in Austin, TX?' }],
model: 'claude-3-7-sonnet-20250219',
// Enable Claude Web Search
tools: [{
type: "web_search_20250305",
name: "web_search",
max_uses: 5
}],
});
console.log(message.content);
}
main();
view raw websearch.js hosted with ❤ by GitHub
 

javascript for loop over properties in an object

Today at work I was tasked with iterating over a JavaScript (TypeScript) object to find a particular property or key nested somewhere within the object. The tricky part is the object can have infinite nesting, so we don’t know how deep we need to dig to find the needle in the haystack.

I thought someone else may end up needing a solution to this problem, so I decided to write this blog post. I found a StackOverflow article which was pretty helpful, however the author of the answer to that question only posted partial bits of the solution, and didn’t post a complete function.

After a little work on replit.com, I came up with a function that does the job for me. For my use case, I only needed to find one needle in the haystack. If you need to find multiple instances of the same property or key, then you’ll need to re-work my function.

Hope you find this function helpful internet friend!

const originalObject = {
foo: {},
bar: "BAR",
baz: {
a: {},
b: {},
c: {
d: "DDD",
e: "EEE",
f: "FFF",
g: "GGG",
h: "HHH",
i: "III",
j: "JJJ",
k: "KKK",
l: "LLL",
m: "MMM",
n: "NNN",
o: "OOO",
p: "PPP",
}
},
}
function findValueOfPropertyInNestedObject(obj: Object, propertyName: string) {
for (var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
const valueOfProperty = obj[prop];
const valueOfPropertyIsObject = typeof valueOfProperty === "object";
const propertyFound = prop === propertyName;
if (propertyFound) {
return valueOfProperty;
}
if (valueOfPropertyIsObject) {
const childValue = findValueOfPropertyInNestedObject(valueOfProperty, propertyName);
if (childValue) {
return childValue;
}
}
}
}
return undefined;
}
const p = findValueOfPropertyInNestedObject(originalObject, "p");
console.log(p);
 

[SOLVED]: node_modules/metro-hermes-compiler/src/emhermesc.js:77 throw ex; Error: EMFILE: too many open files

If you’re a React-Native developer and you’re running into this error when attempting to run your Metro bundler, “too many open files,” the fix is really simple: You need to install watchman.

$ brew install watchman

While setting up my new company issued MacBook Pro with Apple Silicon, I thought this error had something to do with the new chipset and Rosetta, but this did not turn out to be the case. All I ended up having to do was install watchman, which we accidentally removed from our company’s README.

Well I was really hoping for this blog post to be a little bit longer, but that’s all I’ve got! Install watchman and then restart the Metro bundler and you should be good to go.

 

How to Fix 502 Bad Gateway Errors in Production Flask Apps Running NGINX & Gunicorn

Today I deployed some new code to production for a Flask app that I’m currently building. On my local machine the code which I wrote was running fine without any issues. However, after deploying the code to production I noticed my new endpoint was not working at all and was consistently returning 502 Bad Gateway errors.

A few things I tried tweaking to fix this included updating the config files for NGINX and Gunicorn and explicitly setting timeout durations because the new code that I pushed to production was pretty long running and slow, so I thought maybe something was just timing out. However, after updating my timeout settings in my NGINX and Gunicorn config files to 5 minutes, my code continued to fail in production.

Then I happened to stumble upon a forum post where someone mentioned that this error can sometimes occur if you run out of memory or compute resources. My production server at the time was pretty weak, especially compared to my laptop, running a single CPU with 1 gigabyte of RAM.

The next fix I tried was bumping the resources for my server via DigitalOcean’s server hosting dashboard. And voila! After bumping the resources to 2 CPUs and 4 gigabytes of RAM my code started running as expected, and the 502 bad gateway error went away.

So there you have it. If you have tried bumping the timeout setting for NGINX and Gunicorn and are still running into 502 bad gateway errors, try allocating more CPU and memory resources to your production flask app, and that may fix the issue, especially if the code that is failing is something long running and slow.

UPDATE: I ended up having to bump the resources again, this time to 4 CPUs with 8 gigabytes of RAM.

 

CacheMoney Spending Tracker Privacy Policy

The CacheMoney Spending Tracker app collects anonymized user data such as screens viewed and buttons pressed to help with product development. We do not collect any personal information or record information entered by users regarding their finances.