Category Archives: Uncategorized

TClock Redux Redux

2
Filed under Uncategorized

I work with a team that’s pretty geographically distributed, so it’s always nice to have a solid notion of what time it is where-ever the person I’m talking to (or about to talk to) might happen to be.

I stumbled upon TClock (and White-Tiger’s update TClock Redux) quite some time ago and it worked fantastically for what I needed.

Rockin’ that XP Style, oh, yeah!

Yeah, OK, it might be a tad dated, UI-wise, but it easily allows you to put several clocks for different timezones, with labels, right there in the tray. And you still have quick access to calendar, etc.

For me, I used a TClock configuration like this for ages.

Notice 3 timezones, with seconds that update only on the middle zone (I’m in Central), and an uptime clock, day name, and date just for good measure.

But recently, I started working with several folks scattered across India, and their timezones were fractional, something like GMT-7.5.

And TClock didn’t handle that.

I finally got some time several weeks back, so I forked White Tiger’s Redux branch, dusted off my C programming chops and went to work.

And I came up with TClock Redux Redux.

White Tiger might incorporate the pull request into their branch, but until that time, I’m posting the GITHUB project and release here.

Source is located here

An initial release, 64bit only, can be found on the releases page here

How to use it

Stop TClock if it’s running on your machine, download the release Clock64.exe and simply copy it over the existing Clock64.exe. Then restart TClock.

Outwardly, it’s exactly the same as TClock Redux, so please see White Tiger’s page for detailed configuration information.

For this version, the only thing that’s different is the handling of the “w” format specifier.

“w” means “calculate a time that’s an offset of x hours from the “current” timezone.

So, for instance, if I’m in Central US time, and I wanted to show East Coast time as, say, 12:30PM, I’d use “w+1:nntt”.

For Pune, India, however, they’re actually 12.5 hours ahead of Central time.

The original TClock Redux couldn’t handle that, but with this version, you can configure you clock format string with

“w+12.5:nntt”

and you’ll get the time in Pune, offset by 12.5 hours from the current time zone.

So now, my Taskbar can look like this:

I’ve added “day of the year” and “week of the year” just for fun.

LogShift Utility

1
Filed under Uncategorized

tldr; Console app to translate datetime stamps in a logfile into time offsets.
Get it here, with a precompiled release version here.

LOG file format - Free interface icons

I often find myself comparing log files to identify discrepancies or variations in execution timing. And a big problem with doing so is time stamps.

Most modern logging in .net apps happens through log4net, or nlog, or any of a variety of their clones.

In almost all cases, log files will be standard text files that look something like so:


2020-03-03 12:34:22 PM ERROR A problem has occurred…..
2020-03-03 12:34:25 PM INFO Informational message….

This works just fine under normal circumstances, but, when you’re trying to compare two log files that were captured at different times, but for the same sequence of actions, there’s a big problem.

Those timestamps will be different for every single line!

Couple that with comparing multi-megabyte log files, and locating real differences starts to look like finding that one whisperer in a herd of walkers.

In my case, what I really needed were time deltas instead of timestamps in the log files.

So instead of the above, we’d have something like:

...
00:00:00 ERROR A problem has occurred.....
00:00:03 INFO Informational message....
...

In other words, instead of literal datetime stamps on each log entry, I’d see a time delta from each entry to the next.

This solves two major issues:

  • Log entries written at approximately the same time would all have a delta of 0, so they won’t show up as differences in a file diff tool
  • When the time delta is non-zero, the difference is actually meaningful. It represents a differing amount of time elapsed between the two log entries. When comparing two different runs of the same code, this can really help identify specific places in code where performance has been impacted.

Google it!

So, of course, I head to Google to see if there’s anything out there already for this. I did turn up a couple of promising log viewers, but most were either commercial, or required capturing log files into a database for review, which was a bit of overkill in my case.

I just needed something to massage two log files into a more comparable format.

Enter LogShift

After coming up empty with Google, I decided to put a little utility together just for this purpose.

I’d heard that .net core 3.x allowed for “single file executables” but I’d never had a chance to try it out. Bingo! Perfect opportunity!

And so, LogShift was born.

Get it here, and a precompiled release version is here.

First off, a big thank you to Giacomo Stelluti Scala and his CommandLineParser nuget. If you have a need for a simple and powerful command line parser that makes your console app look every bit as flexible as GIT, check it out!

The Nitty Gritty Usage Details

Just download the LogShift.exe, throw it on your desktop, and drag just about any text-format log file onto it.

When the dust settles, there should be a file in the same folder as your original log file, but with an additional “.shifted” extension.

And if you look at that *.shifted file, you’ll find that most if not all date time stamps in it have been converted to “(DURATION)hh:mm:ss”

Type LogShift –help for a typical usage screen:

LogShift 1.0.0
(c) 2020 drVenture
-f, --file Log Filename to process. Can also omit the -f and just put the filename as the only argument.
-d, --durationtag (Default: (DURATION)) String used to preface duration values inserted into shifted log file
-s, --outputsuffix (Default: shifted) The Suffix to append to file name when writing the output file
-m, --monthfirst (Default: true) true if the month should be assumed to be before the day in date stamps
-y, --yearfirst (Default: true) true if the year should be assumed to be before the month and day in date stamps
--help Display this help screen.
--version Display version information.
value pos. 0 The Filename(s) to process. Specify either one or more filenames or use the -f option.

The options should be pretty straightforward.

One question I’ve gotten is “How does it recognize datetime stamps?”

Basically, the program scans each line for a REGEXE that will match most typical date time formats.

It will just work if the datetime stamps have a 4 digit year, esp if the year comes first, because that virtually guarantees that the month comes second and the day third.

If you happen to have log files with oddly formatted date time stamps, you can use the -yearfirst and -monthfirst options to indicate year comes before the day and month, and that the month comes before the day, respectively.

The time portion should automatically get recognized with just hh:mm or with hh:mm:ss. Additionally, fractional seconds will be recognized as hh:mm:ss:fff, with a separator of “:”, “.” or “,”.

Finally, AMPM will also automatically be recognized.

Note that the first recognized timestamp in the file is recorded and all subsequent timestamps are compared to it. Any date time values that are BEFORE the first detected date time stamp will be considered “data” and as such, will not be converted to a time difference.

This is so that any logging of actual date-oriented data values will likely not get translated, which is generally a good thing. Since most data values in the file will be in the past, this should just work. Of course, if your log file contains date data in the future, well… there’s always a pull request!

Multiple files at once

To process multiple files at once, just multi-select 2 or more log files in explorer and drag them onto LogShift.exe. Either that or run it from the command line with more that one filename… for instance:

LogShift a.txt b.txt c.txt

Wrapping up

And that’s about it for this little utility. I hope it helps someone out there as much as it’s helped me.

As usual, feel free to post with any questions or comments! I look forward to hearing from you!

The Disambiguator (A KeePass Plugin)

1
Filed under Uncategorized

The TLDR;

For the impatient crowd 🙂

  • Download The Disambiguator KeePass plugin here.
  • Unzip it and place the PLGX file in the KeePass “Plugins” folder, just like any other plugin.
  • Restart KeePass. You should see a “Compiling Plugins” notice and then KeePass should start normally.
  • In KeePass, click “Tools”, “Plugins” and verify that The Disambiguator is now in the list of loaded plugins.
  • Edit the AutoType entry for a credential set that has an ambiguous Window Title.
  • add “{exe:nameOfExecutable}” (without doublequotes) at the end of the WindowTitle. Replace nameOfExecutable with the filename of the Executable program file that the Target Window belongs to. In the case of Quicken, for instance, that would look like {exe:qw.exe}

Now open your target application and use AutoType as you normally would. If everything is set right, KeePass will now automatically select the appropriate credentials for the target window using both the Window Title and the application executable.

Introduction

I’ve used the password manager KeePass for a very long time. Excellent, simple, clean install, low resource usage and fast.

Editing a Credential Set in KeePass

The AutoType support, while possibly not quite as simple as some full commercial packages, is quite flexible and has never let me down.

Well, almost never.

KeePass’s AutoType feature works by allowing the user to enter one or more “Window Titles”, which it then compares against the target window when you user presses the AutoType hotkey.

When only one configured Window Title matches the Window Title of the target window, KeePass automatically can choose that single set of credentials, and perform the autotype. It’s almost like magic!

Trouble Ahead

But, what happens when there are 2 or more credential sets that have the same Window Title?

For instance, both Quicken and Exodus request the user to login via a login screen with the Window Title “Enter Password”.

If you’re “responsible” with you passwords, and we all are as KeePass users (right?!), then you’re not using the same credentials (username and password) for two different applications. This means you likely have two different sets of credentials stored in KeePass: one for Quicken and one for Exodus. And you’ve setup AutoType for both.

But there’s the rub. Both sets of credentials have AutoType setup to key on the Window Title of “Enter Password”, as they must.

The KeePass Credential Chooser

Unfortunately, when you have, say, the Quicken Login window displayed and press the KeePass AutoType hotkey (normally Ctr-Alt-A), KeePass discovers 2 sets of credentials (and possibly more) that match. Because it can’t magically decide which to use, it pops up the Credential Chooser dialog so that you, the user, can make the choice.

This is all fine and good, but it can be a bit of a pain, and it forces the user to make a choice when the choice should be automatic.

Enter The Disambiguator

The problem here, of course, is disambiguation. Using the Window Title as the only “disambiguating” factor is ok most of the time, but, as the above example shows, it’s not always quite enough to completely identify a single specific credential set to use for autotype.

Alex Vallat has a very nice plugin for KeePass called WebAutoType which specifically allows users to configure matching URLs for autotype entries. This will almost always provide enough uniqueness to properly match a single credential set for Web Pages. But unfortunately, it does nothing for normal desktop apps like Quicken or Exodus.

That’s where The Disambiguator comes in.

to be continued

Automation Virtual Conference

3
Filed under Uncategorized

Ok. I’m not one to typically post notices Re: my employers, but I thought I might make the few readers I have, aware of an upcoming virtual conference that Worksoft is having on testing and robotic process automation on Oct 28.

Click here to learn more.

Tools, Tools, Tools!

0
Filed under Uncategorized

As a software developer, I spend quite a lot of time using tools of the trade. IDE’s, text editors, command line utilities like GIT, quick and dirty BAT files, file searchers, file comparers, you name it. There is a virtually limitless supply of tooling out there for software devs to (hopefully) make our lives easier.

And things like desktop icons, the TaskBar (in Windows anyway), hotkeys, macros, right click context menus, etc, make it so that the right tool is never more than a click or keypress away.

I’ve always been a bit of a “maker” and I’ve collected a pretty sizeable arsenal of actual, physical, tools  over the years. However, as that collection as grown, I’ve found myself more and more frustrated at the prospect of actually building anything because it can be so time consuming to simply find the tools I need for the job.

When I first moved into my current house, I spent a good bit of time building up some pegboard cabinets for storing tools and other bits.

They’ve worked fine for what they are, but I’ve often found that where I need whatever tools is not where they are. So I end up walking back and forth to the garage, picking up the tool I need at the moment and returning 5 minutes later for whatever else I need, repeat continuously….

So I found a toolbox and loaded it up. It’s nice and portable, but I often spend more time finding the tool I need in it, than I do making whatever it is I’m making. Decidedly, as a colleague used to say, “sub-optimal”.

And then, about a month ago, I stumbled across Adam Savage’s (yes, the “MythBusters” guy) new endeavor, Tested,  and this video he did back in 2015.

Basically, he describes several concepts, including:

  • his Theory of First Order Retrievability, meaning you should never have to move any tool to get to any other tool.
  • The F*** Drawers Axiom, basically that drawers are where good tools go to die.
  • and then general idea of “tools should easily end up where you need them”. Ok, this one is my summarization of a good bit of the discuss he has during the video…

Watching that video was an almost transcendental, profoundly eye-opening moment. And it turns out, a lot of other people thought so too. Just google “Adam Savage inspired tool cart” to see what I mean.

And so, a few weekends, and a bunch of scrap I had lying around later, I now have my very own version of Mr. Savage’s tool cart concept.

Every cart I’ve come across while researching the idea is similar but different, depending, of course, on each individuals needs and their own collection of tools.

In my case, lots of pliers, knives, screwdrivers, levels, straightedges, etc.

Starting at the bottom is a simple rack for my lesser used tools, pliers, crowbars, nippers, scissors, etc.

Next, is a hammer rack. I got the inspiration from one of the many tool carts you can find via Google. Mine added small holes for brass hammers, mallets and others.

 

 

 

 

 

 

 

 

Moving up from there is a pliers rack, plus a panel for sockets. The socket holders are Olsa Tools brand I picked up on Amazon. They’re one of the few pieces I purchased because I didn’t have anything already, and scratch building something for that just seemed like too much work.

Next up, I used a red pegboard toolrack I’d had for ages. Just made a panel to screw it to and mounted that. It’s great for screwdrivers, chisels, knives, pencils, etc.

Behind that is a row of removeable (yellow-blue) parts trays that came off my old pegboard cabinets. The fact that they fit there perfectly was a nice bit of serendipity in this build!

 

 

 

 

Up top, I built a small items sorter out of scrap pegboard. I left a small ledge toward the front that I drilled holes in to wrangle all my smaller pliers, wirecutters, calipers, etc.

Over to the side, I made a slide-in rack for my vise-grips, and on top of that, a small rack for a set of adjustable wrenches. You can’t see the embedded magnets in the rack that keep the wrenches from swinging when I move it.

 

 

 

 

 

And finally, there’s space around back for a reasonably sized clamp rack. I also put two steel rods through the inside and hang all my spring clamps off them. They’re easily accessible from the sides or the back, so no violation of the First Order Retrievability theory here!

 

 

 

 

 

 

 

 

It’s very close to “done”, at least for the moment, though there’s still a number of bit to finish out.

  • I’m building holsters for my power drill and hammer drill.
  • Magnetic catches for my various saws, hacksaws, coping saws etc.
  • A tray and magnetic catch for levels, squares, T squares, and rulers.
  • A slide out rack for hex keys, and xacto knives.
  • Magnetic tool bars for sticking smaller items like micro screwdriver bits to.
  • Anything else I can dream up!

And finally, the whole thing is on nice large locking casters I picked up from a garage sale. Makes moving it around the garage and even into the house trivially easy. And since it’s only about 18 inches deep at the base, it’ll go through even the smaller 24″ doors in the house if necessary.

All in all, a fun and easy build that has already saved me a ton of time with getting to the right tool easily and quickly. And a nice side effect from putting it together is that I’ve unearthed tools that were so buried in my toolbox, I’d forgotten I had them. Having everything “out in the open” so to speak, really serves as an inspiration when looking for that “right tool”.

Highly recommended! And my hat’s off to Mr. Savage, for reminding me that many of those things I do in the ethereal world of bits and bandwidth, can actually be applied to the physical world just as effectively.

Using only Specific Monitors with RDP Connections

346
Filed under Uncategorized

I’ve used RDP (Remote Desktop Protocol) for years to work on multiple systems simultaneously.

But one thing that’s bugged me for a while is that, with multiple monitors, you have basically an “All or One” situation.

There’s a nice checkbox on the RDP configuration form that allows you to “Use all monitors”.

 

But that’s all you get. If you have 3 or more monitors, there’s no way to specify only 2 of them to use for the RDP connection.

Or is there?

Turns out, Scott Hanselman turned up an hidden configuration element for RDP connections that does exactly this. Read up about it here.

The gist is to setup an RDP connection as normal, turn on the “Use All Monitors” option you see above, and save the connection.

Then, use a editor (Notepad will do just fine), and edit the *.RDP file you just created.

It’s a plain text file with a pretty straightforward format.

Somewhere in it, you should see:

use multimon:i:1

Just add another line like below:

selectedmonitors:s:0,2

where the 0(zero) and the 2 are the monitors that you want to use.

In my case, 0 is my primary and 2 is my leftmost monitor. You can find the monitors numbers by checking your display properties.

I’ve tried a few terminal apps out there (like Terminals), but, unfortunately, none of them seem aware of this either.

Launching into a Zoom Meeting directly from a Windows Shortcut

246
Filed under Uncategorized

Zoom has rocketed to prominence lately as just about the choice when it comes to online meetings.

I’m not yet convinced its the best, but it is pretty good, easy to use (my 16yo uses it for school during this wonderful quarantining time!), fast (worked perfectly well at my mom’s lake house with absolutely terrible internet), and doesn’t really pull any surprises, other than the myriad security issues that have turned up over the past few months.

Still, it does work well, but there’s one thing that was annoying me.

I have several meetings that I jump onto regularly, and when I do from a browser, or an Outlook link, etc, I get this annoying window from Edge Chromium:

Now, true, it’s not that big a deal, but it is annoying, so I set out to figure out a way to launch a meeting from a regular ol’ Windows shortcut with no annoying prompt.

I had a number of false starts, but eventually discovered a blindingly simple command line that works perfectly, as long as you follow a simple rule.

The command line?

            %appdata%\Zoom\bin\Zoom.exe --url=zoommtg://zoom.us/join?confno={your meeting number}

And the Rule?

Don’t put any dashes in your meeting number.

That’s it.

Now, you can put that in a good ol’ BAT file easily enough, or, just open Explorer, enter %appdata%\Zoom\Bin in the address bar and press enter.

Then scroll down to find the Zoom.exe application.

Right click on that and drag it to your desktop to create a Shortcut to the Zoom.Exe app.

Now right click on the shortcut and choose Properties:

You’ll get the standard Shortcut properties dialog.

Scroll to the end of the “Target” value, and paste in part after Zoom.exe from above, so, this:

                           --url=zoommtg://zoom.us/join?confno={your meeting number}

If you’ve done it right, the value in the Target field should be just like the command line at the top of this article.

Click Ok, and you’re done.

No more annoying “The Site is trying to open Zoom” messages.

And you can create as many shortcuts to as many meetings as you need!

Shout out to NameCheap.com

0
Filed under Uncategorized

Just wanted to make a quick shout out for Namecheap.com. I’ve used ServerGrid.com for many years as my web hosting provider and they’ve been really great. But some recent problems (and a price hike) made me start looking elsewhere.

NameCheap turned up in some googling I did and after a month or so now, I have to say I’m very pleased.

I don’t get anything for this. Just wanted to post about my experiences. Their support has been very fast, knowledgeable and spot on when I’ve needed them. They use the latest CPanel, which is quite nice.

Email support, domain forwarding etc all work just like you think they would. WordPress was very easy to set up, even without going the “Managed WordPress” route, which they also have.

They may have “cheap” in the name, and their pricing is definitely competitive, but so far, they’re anything but low rent!

Unable to PING under Windows 10 anymore

1
Filed under Uncategorized

About a month back, my main workstation updated itself to Windows 10 Creators Edition overnight.

I really didn’t even notice it at the time.

However, over the last month, I’ve had several bits that had been working stop for unexplained reasons.

The most recent that I could no longer PING other machines (specifically a RaspberryPiZero W) on my network. Worse, at least in this particular case, was that I couldn’t PUTTY into it iether.

However, I could browse to a Samba share I’d set up on the Pi and view it just fine.

After a LOT of gnashing of teeth, I discovered that for some reason, the PING hostname lookup had become CASE SENSITIVE!? What? DNS lookups should never be case sensitive.

Sure enough, though,

ping pictureframe

failed but

ping PICTUREFRAME

worked just fine.

Further, using the UPPERCASE version in Putty worked, but using the lowercase version failed.

There’s a ton of posts about this very thing, with equally as many ideas on how to fix it.

I really did not want to write up yet another BAT file and add it to my startup process, so I kept digging.

The Simple Solution

Turns out, I had IPV6 disabled in Network Properties. Turning it on fixed the lookup, even in IPV4 mode.

To do this:

  1. Got to Settings/Network/Change Adapter Options/
  2. Right Click on the network adapter in use and Click Properties.
  3. Scroll down till you find Internet Protocol Version 6
  4. Click the checkbox to enable it and close all the Setting windows.

In my case, it didn’t even take a reboot.

Granted, now, when I do a ping, I usually get a very unfriendly IPV6 address, but that’s easily remedied by using

ping computername -4

On to the next problem!

Another Contract Down…

1
Filed under Uncategorized

I’ve read that one of the marks of a good programmer is that they’re able to code themselves out of a job. I’m not sure about that, but, I did finish up this contract earlier than expected, so once again, it’s time to get out there and find a new gig.

If you or your company has any needs for an experienced VB guy (VB.net, VB6, or even farther back, but seriously, anyone still use VB3?), .net guy (I can do C#, despite the blog title<g>), SQL guy (I’m particularly proficient in MS-SQL, stored procs, DB design, normalization, index tuning, etc), or even Javascript/jQuery/Knockout/jQueryMobile, etc, give me shout.

Reply here or use the Contact Link at the top to send me a private message.