Reading the “Where From” meta data using Keyboard Maestro

I was recently presented with this problem. I had dozens of files that had very generic filenames that needed to be sorted. However, the “Where From” meta data contained useful information about the author and content. Problem is, how to use that data?

After searching around, it’s possible to read that information using something similar to:

xattr -px '/Users/name/location/location/location/filename.ext' | xxd -r -p | plutil -p -

That’s great, but not exactly useful. But once again, Keyboard Maestro comes to the rescue and can handle the problem with ease. In fact, it doesn’t really require coding, the functionality is all built in.

The first step is to use the Get Attribute action, and set it to Where from. That is then stored in a variable and you can manipulate things as you like. I used the Switch/Case statement to have Move/Rename files based on the name it found.

This is then nestled inside a For Each and you just keep adding more conditions to the Switch statement.

What looked like a rather convoluted process turned out to take no more than a couple of minutes using Keyboard Maestro. When done, I was able to organize dozens of files using different, but completely valid information.

Another win for Keyboard Maestro.


Other articles of interest:

A deeper look at PathFinder

While it's still on sale, and now that I've done some heavy lifting with it, I wanted to have a deeper look at PathFinder. The TL;DR version is, it's absolutely worth going to Bundlehunt and picking it up for $8. To make things even more powerful, add Default Folder X.

For more explanation, PathFinder is a great file manager with a host of features and customizations. For starters there are dual panes if you want them. And multiple tabs within each pane. On top of that there is a customizable context menu for working with each file, within each tab, within each pane.

Those panes can then display different kinds of information in a different order. One can be an Image view, while the other is a List view. One can be sorted by name, the other by size.

There is also the ability to add multiple buttons to the menu bar. I've added New Folder, New File, Rename, Copy, Move and Move to Trash. This makes light work of moving files around and cleaning out directories. There is even a Cut option, which is nice to have.

When using the sidebar, you can have the Drop Stack feature, which is actually similar to the Dropzone app. Place a bunch of files into a temporary location, then move them all when your collection is complete. A great way to collect things from multiple locations.

Along with Drop Stack are other modules such as Terminal, Image Viewer, Attributes, Hex Dump and Permissions. These can be added and removed so you can get a job done, then recover screen space after you're finished.

When cleaning out my folders the other day, the Search files feature was fantastic. Such a quick way to location similar files that could then be moved or deleted. It saved so much time and worked so very quickly.

Other great features include Folder Sync, Image Viewer, built in Text Editor, Secure Erase, a customizable Get Info screen and the ability to add folders to the main Home nav menu.

Overall PathFinder has just the right amount of power and customization to make it extremely useful without being bloated with features you'll never touch. It has great file management features with everything in reach when you need it, and out of the way when you don't.

At the regular price of $36 it would be a good investment if you want more features than what Finder has to offer. At the current $8 Bundlehunt price, it's a must have.

PathFinder website

Other articles of interest:

We can’t do it that way, we have this exception, just like last time

This has come up a dozen or more times recently. We want/need to take some action and without skipping a beat comes the reply, "We can't do it that way because we have this special …" It was in a meeting about Katalon, "Let's set up that old Selenium project in Katalon, and move forward from there with updates. Nope, can't do that, we have to many exceptions, custom code, and custom ways doing things."

No you don't, you're just lazy.

It has come up with making Agile changes, process changes, UX changes that allow automation, and as above, even getting a project inside Katalon which is where the new code is written. Or at least where it should be written.

I see this all over the place. People think the "one off" is a one off even thought it's happened half a dozen times in a row. Even though it derails the project. Even though it cobbles the code and prevents future updates, we still say it's a one time thing, a special exception and do it anyway.

It's the same as all the other excuses. "We can't do Agile without Gantt charts." "We can't do Agile without a Kanban board." "We have to write all this extra code to handle this one exception, just like we did last year." "We will deploy on Wednesday then do a hotfix deployment on Friday." When did planning a hotfix become a thing?

Point being, we need to stop lying to ourselves and stop calling something an exception when it happens every year, every month or every week. Either plan on it happening or start taking steps to prevent.

Same thing for finances, that out of the blue expense isn't out of the blue when it happened last month.

Like so many other things, it all comes across as poor planning. Or more to the point, failure to plan. When contemplating that "exception," think for a moment about what damage it will cause later down the road. What problems does this open up? What mistake is this exception setting in motion? What other exception is it going to cause?

The issues with importing Selenium into Katalon really burned me, simply because the answer came without a moments hesitation. "We can't do it, we have all this special code." What special code? I didn't know there was "special code" for Selenium?

The fact it was answered so quickly meant that mindset was ingrained.

Katalon IS Selenium, so that was just ignorance and laziness talking.

Instead of exceptions, they need to be seen as features or requirements and incorporated into the schedule, into the code base, into the testing, and into the future expansion of the project. We need to stop one-offing ourselves into a corner.

If it really is an exception, why shouldn't it be done by hand? Why not a separate module we can throw away? Why not a separate process we then turn off forever?

If it's an exception, how about special billing? A one time, one off bill. Just this once.

When faced with those consequences, those exceptions don't seem like exceptions and better solutions can be provided.

Other articles of interest:

Massive System Cleanup with Path Finder and Some Help From Default Folder X

Path Finder is a tool I just got from BundleHunt and put to the test yesterday. Normally Spring Cleaning happens earlier in the year, but Labor Day Weekend is just as acceptable. I dug in and gave my hard drive a serious deep cleaning.

Since the start of quarantine I’ve been collecting training videos, downloading documents, trying out software, grabbing YouTube videos, and it’s all started to add up. My system drive, which is 3TB, was starting to get full. It was time to organize and delete.

I saw Path Finder on BundleHunt and was immediately taken with it’s features. The dual pane viewer is a huge help. But, then you can add tabs within each pane. I was easily able to connect my external drives, then have them arranged within tabs within the different panes. Copying files was an absolute breeze.

Path Finder also has tons of customization. For starters I added the Copy and Move buttons to the Toolbar. This made it easy to move things around. I then added the Trash and Delete buttons so I could just get rid of things without having to right click. I then configured the sidebar with shortcuts to folders I kept going to so I could jump around easily. The file filter option was a perfect way to sift through hundreds of files and folders. How many things are related to Java or JMeter?

It took the better part of a day, but in the end, I deleted or moved over 2TB worth of files off my main drive. It took a few minutes to get up to speed with Path Finder features, but once I had the toolbars and shortcuts in place, the process went shockingly well.

Path Finder is a brilliant tool that has dozens of convenient features, lots of customization, and the ability to have multiple views. The ability to save those views, is fantastic. I’ve never really complained about Finder, but Path Finder has so many features, I didn’t know what I was missing.

I coupled Path Finder with Default Folder X, which offers lots of customization to Open/Save dialog boxes across the OS. I set up Favorite folders. I jumped through directory structures with ease. I was able to span a hierarchy without having to click each and every folder. It was pretty awesome.

Since they are on BundleHunt right now, I would highly recommend getting both of them. I will be configuring Default Folder X, with all sorts of shortcuts on my work machine. I will be able to jump to my Katalon Project, to SnagIt, to my Music, and to my training videos. They will literally be a click away which will be fantastic for attaching items to Jira.

I wasn’t aware of either of these tools until just a couple of days ago. But in that short time they have been a huge help and offer some great feature enhancements to macOS.

Path Finder is a fantastic file manager, and Default Folder X offers some great enhancements to Open dialogs. Finding and organizing files is going to be so much more efficient.

Other articles of interest:

Setting up the long excuse

If you’ve watched shows like Burn Notice, Leverage, or dozens of older movies and television, you should be familiar with the “Long Con.” A series of small and subtle steps that lead to a bigger end game. Strangely, a new practice has shown up in a lot of people that comes across as “The Long Excuse.”

It’s a small series of self-induced hurdles, excuses and roadblocks, so that when a project or task doesn’t complete as expected, the excuses are already at hand. The seeds of doubt have already been sown, ready to be reaped if needed.

It starts with a series of comments being laid down on why a project or task didn’t go as expected. Instead of leaning into the problem, understanding it and coming up with a new solution or approach, the following phrases are presented during meetings and stand-ups.

  • This is a lot harder than I originally thought
  • I “had” to attend this meeting
  • I “had to step in” and work on X
  • This other project was handed to me and needs my attention
  • This person wasn’t in the office so I lost a day
  • “The tool” wasn’t working so I lost a day
  • I didn’t hear back from X so I lost a day
  • I got derailed by situation X
  • “This” wasn’t ready so I couldn’t continue my portion

In every case, it’s a small, but plausible excuse as to why something didn’t get done, took longer than expected or didn’t work out as originally forecast. On the surface, they seem legitimate and reasonable. These things can happen on any project.

However, if you look back over the time and take them together, it’s a clear pattern of creating a scapegoat that can be brought whenever the task fails, a deadline is missed, the requirements don’t contain the correct information, or isn’t what the group expected. It’s basically a pre-emptive way to shift blame.

In the past couple of years I’ve seen this done with Developers, QA engineers and even Product Managers. In every case, they were ready with their reasoning on why a project failed. Their tale of woe was ready to recite, and in so doing, dropped the blame at the foot of someone else.

At first glance it’s hard to see because nothing seems out of the ordinary. Issues arise, roadblocks come up, schedules conflict.

In many cases, the person offering the excuses is good at covering their tracks and shifting blame. It’s subtle so no one questions.

Over time though, a pattern emerges. Questions need to be asked.

  • “Was that person really not available?”
  • “Was the tool really broken?”
  • “Did you really “have” to be in that meeting?”
  • “Does it really make sense that this one day loss has resulted in this outcome?”
  • “How many one day losses can you actually have?”

Not all excuses are created equal. Running into an impediment doesn’t always tell the whole story. One small bump in the road isn’t an issue, but what about dozens?

In looking back, I can cite at least 6 people I’ve worked with that took this route. What’s obvious is that it takes more work to lay the foundation of excuses than doing the actual work.

Other articles of interest:

Recent Comments

  • How To Disable the Quicken Registration Prompt (32)
    • Mike: Hi, for anyone still trying to run older versions of Quicken, mine is 2004, I hope this helps. I managed to get it running on my old laptop by adding the three missing dll files, when I needed to upgrade I thought I would be able...
    • Juani: Hi, I have a registered Quicken 2016 and now my files are being held hostage by Intuit, cannot log in with my ID unless I upgrade therefore buy a subscription, I need to access my files, please HELP. Thanks
    • David: A BIG Thank you! I regularly reinstall Windows OS’s using different hardware configs. In short, Quicken 2011 (it’s March of 2020 as I write this) has been a program I’ve been very happy with and continue to use....
    • Karen L: Today I rang Reckon Australia again, got a different guy and he talked me through the process of getting me a new product key to enter since I already had the licence and it had been extended. Reckon have only extended it by 1...
    • Karen L: I have Australian Quicken 2008 on Windows 8.1. It keeps asking me to renew my licence which Reckon did for me however the activation won’t work. I tried this to disable the registration prompt however it did not stop the...
  • Enter dates into a date picker for Chrome and Firefox (1)
    • Prasanna: Hello, How to enter a previous month FIRST day and LAST day from the system date. Thanks Prasanna
  • Building Relationships with Developers (1)
    • Carlos Herrera: Ah yes. I have a team of software developers and it is genuinely so hard to keep them in the loop during projects. Though the more we work the better the communication becomes and we go from a trail and error process to a...
  • Integrating DevonAgent Pro with Alfred (1)
    • J. Garr: Beautiful, sweet, and simple. I love it; thanks for posting this solution.
  • Round and Round with the For..Next in Katalon Studio (1)
    • Sweet Ophaline Labador: Hello can you help me how to loop this scenario. Checking the elements is just the same. I want to check that the following function is available in Track Shipment – clicking on this can...
  • Parsing Strings in Katalon – Split, Substring and Readlines (6)
    • Don Pedro: String tempText=”Date Month January. Revenue $1,355,721.00″ println(tempText.split(“ \$”)[1]) You need to escape the $ with \$ The [1] on the split captures characters on the right of the split [0]...
    • Prasad: Hi, I need to get the substring from the below string ‘Date Month January. Revenue $1,355,721.00’ I want to extract text after $ value. Please help Thank you
  • Working with Dates and Date Formatting in Katalon Studio (15)
    • Sangeethaa: How to get previous day’s date(Yesterday’s date)? Actually I was using today.previous() before,it was working fine till today morning.Now its not retrieving right date. Can anyone please guide me on this.
    • Don Pedro: That could be a little tricky. First, is the text/format always going to be the same? You will need to do some parsing. Separate the first but of text at 2019. After that, split the text again to get rid of Central Standard...
  • Output status messages and test information by writing to the Log File Viewer in Katalon Studio (6)
    • Saranya: Good One. Could you plz share link to access all your katalon related blogs. ThankQ
    • Rodrigo Calabretta: I’m using the KeywordUtil.markFailed or KeywordUtil.markError and my test stops is being shown as Error and If I use in the @afterTestCase the testCaseContext.getTestCaseSta tus() to show the status test case...