Showing posts with label computers. Show all posts
Showing posts with label computers. Show all posts

Tuesday, October 28, 2025

Adding Moon Void of Course Events to Org-Agenda via Diary

In a previous post, I demonstrated how to create an Org file that has Moon Void of Course events. However, I found that the events don't show up in all Custom views of Org Agenda, such as when a Custom Command defines a single org file. So here's an alternate method for displaying the events in the Agenda, which I prefer. It involves adding the events to a special diary file, such as mvoc.

To make this work, you'll need to use fancy diary display, which means setting diary-display-function to diary-fancy-display. As well, evaluate and add these statements into your Emacs config / init file, as explained in the Emacs manual in the Fancy Diary Display node.1

(add-hook 'diary-list-entries-hook 'diary-include-other-diary-files)
(add-hook 'diary-mark-entries-hook 'diary-mark-included-diary-files)

Recall that we created a spreadsheet document in the first post on this topic.2 Then we modified it in a subsequent post3 to create the mvoc.org file. Now we'll modify it again so we end up with something like this in the mvoc diary file:

Oct 28, 2025 22:38 Moon Void of Course
Oct 28, 2025 22:55 Moon entering Aquarius after void

The date format shown above is the default. Alternatively, you can use a date format specified by calendar-date-style.

Here are the steps to create a diary file with Moon void of course events like the ones shown above. Again, we begin with the spreadsheet that was created in steps 1 through 4 of the initial post.

  1. Add a new sheet to the document; name it mvoc.
  2. Enter the following in cell A1. Please note that the tilde character represents a line continuation character. In fact the content should be entered without line breaks:
    1. =TEXT($moon_void_of_course_table_2025.A2,"MMM D, YYYY HH:MM") & ~
    2. " Moon void of course" & UNICHAR(13) & UNICHAR(10) & ~
    3. >TEXT($moon_void_of_course_table_2025.B2,"MMM D, YYYY HH:MM") & ~
    4. " Moon void of course entering " & $moon_void_of_course_table_2025.C2
  3. Set the row height to at least two times its default height so that you can see the result in its entirety.
  4. Save the spreadsheet in its native format (Excel as an XLSx file; LibreOffice Calc, ODS). A lot of work went into entering the formula in A1 -- it would be highly frustrating if that got lost!
  5. As before, we will pause and breathe for discussion.
    1. The reference to $moon_void_of_course_table_2025.A2 in 6.1 returns the date and time that the void begins. Similarly, $moon_void_of_course_table_2025.B2 in 6.3 returns the date and time that the void ends.
    2. The aforementioned dates and times are formatted with the TEXT worksheet function to ensure that the date is represented in MMM D, YYY format (Oct. 28, 2025, for example), followed by the time in 24-hour notation, where 23:45 is 11:45 pm. We omit the seconds because it won't show up properly in the Agenda. And anyway, seconds are omitted from the data; the event's timing probably isn't determined with enough accuracy to warrant it.
    3. In 6.2 we define the description of the start time; it will say simply, "Moon void of course." That text is terminated by a line ending for DOS/Windows; the two "UNICHAR" worksheet functions resolve to Carriage Return / Linefeed characters. You might need to specify this differently for non-Windows systems.
    4. Similarly in 6.4, we define the description of the end time, for example "Moon void of course entering Aquarius." Although instead of "Aquarius" it could be any Zodiac sign specified in Column C of the source sheet.
    5. The formula in cell A1 will create two lines in the diary file that define the start and end of the event.
  6. Starting at cell A1, fill down until all the data of the first sheet is included.
  7. Save the spreadsheet again.
  8. In step 8 of the initial post, I instructed to "Export the new sheet as a CSV file." We'll want to do that again. But this time it's necessary to pay attention to LibreOffice's "Export Text File" dialog box that precedes the Save dialog box (as we did when creating the mvoc.org file). Ensure that the Field Delimiter and String Delimiter dropdown boxes are blank as shown in Figure 1. Otherwise, each heading will be preceded by a double quote character, and the lines might end with a comma.
  9. Remove the extension from the newly-created CSV, and copy it to your home directory. Now there should be a file called mvoc; to verify, use Emacs to visit the file. The default keystrokes would be C-x C-f ~/.mvoc followed by ENTER.
  10. Open the diary file. By default the file is named diary and it's located in the home directory. Add the following in the first line: #include "mvoc" and save it.
  11. Press C-c a a to view the default agenda view. A screenshot of today's agenda is shown in Figure 2 below.
Figure 1: The LibreOffice Export Text File dialog box with Field delimiter and String delimiter fields blank
Figure 1: The LibreOffice Export Text File dialog box with Field delimiter and String delimiter fields blank


Figure 2: Agenda View for Tuesday, October 28.  It shows that Moon is void of course from 10:38pm to 10:55pm.

Please let me know if you found this useful or if you have suggestions for improvement.


1https://www.gnu.org/software/emacs/manual/html_node/emacs/Fancy-Diary-Display.html

2https://ludditegeek.blogspot.com/2025/10/add-moon-void-of-course-dates-to-google.html

3https://ludditegeek.blogspot.com/2025/10/an-org-file-to-report-when-moon-is-void.html

Tuesday, October 14, 2025

An Org File to Report When Moon is Void of Course (in 2025)

In my previous post I wrote about how to create a custom calendar in a spreadsheet and then add it to Google calendar. I used the dates and times when Moon is void of course in 2025 as an example. 1

In this post, I'll show how to add those events to an org-mode file so that they show up in the Agenda View. And while there are Lisp add-ons that create org files from ICal files, it's easier to create the org file directly, since we don't actually have an ICal file.

Begin with the spreadsheet that was created in steps 1 through 4 of the previous post. But note that the new sheet in step four will be in the format that Org can read.

Here are the next steps:

  1. Add the following content in the first 5 rows of column A. These define the recommended file-level settings for the Org file:
    1. #+STARTUP: content
    2. #+STARTUP: hidestars
    3. #+STARTUP: indent
    4. #+CATEGORY: MVoC
    5. #+FILETAGS: :MVoC:
  2. Leave row 6 blank and then enter the following in cell A7. Please note that the tilde character represents a line continuation character. In fact the content should be entered without line breaks:
    1. ="* Moon void of course entering " & ~
    2. $moon_void_of_course_table_2025.C2 & ~
    3. UNICHAR(13) & UNICHAR(10) & "<" & ~
    4. TEXT($moon_void_of_course_table_2025.A2,"YYYY-MM-DD NN HH:MM") ~
    5. & ">--<" & ~
    6. TEXT($moon_void_of_course_table_2025.B2,"YYYY-MM-DD NN HH:MM") ~
    7. & ">" & UNICHAR(13) & UNICHAR(10)
  3. Set the row height to at least three times its default height.
  4. Save the spreadsheet in its native format (Excel as an XLSx file; LibreOffice Calc, ODS). A lot of work went into entering the formula in A7 - it would be highly frustrating if that got lost!
  5. Then pause and breathe for discussion.
    1. In paragraphs 6.1 and 6.2, we have code for a heading that will say, "Moon void of course entering Aquarius." Although instead of " Aquarius" it could be any Zodiac sign specified in Column C of the source sheet.
    2. The "UNICHAR" worksheet functions in paragraphs 6.3 and 6.7 resolve to the Carriage Return / Linefeed characters when called with arguments of 13 and 10 as they are here. These two characters define line endings on Windows. It's your spreadsheet's way of pressing ENTER.
    3. The reference to $moon_void_of_course_table_2025.A2 in 6.4 returns the date and time that the void begins. Similarly, $moon_void_of_course_table_2025.B2 in 6.6 returns the date and time that the void ends.
    4. The aforementioned dates and times are formatted with the TEXT worksheet function to ensure that the date is represented in YYYY-MM-DD format (2025-10-14, for example), followed by an abbreviation for the name of the day of the week (Tue, which, by the way, is optional) 2, and finally followed by the time using the 24-hour notation, where 23:45 is 11:45 pm.
    5. The start date & time and the end date & time each are surrounded by angle brackets; the bracketed start and end elements are separated by two hyphens. Today the duration that the Moon is void of course is denoted this way:
      1. <2025-10-14 Tue 00:05>--<2025-10-14 Tue 05:47>
  6. Starting at cell A7, fill down until all the data of the first sheet is included.
  7. Save the spreadsheet again.
  8. In step 8 of the previous post, I instructed to "Export the new sheet as a CSV file." We'll want to do that again. But this time it's necessary to pay attention to LibreOffice's "Export Text File" dialog box that precedes the Save dialog box. Ensure that the Field Delimiter and String Delimiter dropdown boxes are blank as shown in Figure 1. Otherwise, each heading will be preceded by a double quote character, and the lines might end with a comma.
  9. Change the extension of the newly-created CSV file to org. Edit it with Emacs and press C-[ to add it to the Agenda File List.
  10. Press C-c a a to view the default agenda view. A screenshot of today's agenda is shown in Figure 2 below.
Figure 1: The LibreOffice Export Text File dialog box with Field delimiter and String delimiter fields blank

Figure 2: Agenda View for Tuesday, October 14.  It shows that Moon is void of course from 12:05am to 5:47am.

Please let me know if you found this useful or if you have suggestions for improvement.


1 https://ludditegeek.blogspot.com/2025/10/add-moon-void-of-course-dates-to-google.html
2 The reference for org-mode's date range timestamp format can be found here: https://orgmode.org/worg/org-syntax.html#Timestamps

Monday, October 13, 2025

Add Moon Void of Course Dates to Google Calendar

Google calendar can be configured to show the phases of the moon.  This view can be enabled in the settings. 1, 2  You can find other calendars in Settings, too, such as various religious holidays and sports.

But you can also create your own calendar and upload it as a ICAL file.  Or you can import it as a CSV file.  I used the import CSV method to add the dates and times that Moon is void of course.

What does it mean that Moon is void of course?  In astrology, Moon visits each of the twelve signs of the Zodiac.  As well, Her position may form Major Aspects with other celestial bodies.  When Moon transitions from one house of the Zodiac to the next, and fails to be in a Major Aspect, She is considered void of course.  It is believed to be a time to avoid important business, for example. 3  Thus, believers will want to have this on their calendars.  Here's how to add these times to your Google calendar.

  1. Locate a list of dates and times that Moon is Void of Course.
    1. I used the list at voidofcoursemoon.com 4
  2. Download or copy the data to a CSV text file.
  3. Import the CSV into a new spreadsheet.  I copied the data, so for me, the columns were tab-delimited.  As well, I defined the first two columns as Date/Time and the last column as Text.  Delete any lines that do not contain the desired data; I kept the first line as "Void begins: Void ends: Moon enters after void:."
  4. Create a second sheet that will link to the content in the first sheet.  You'll export this sheet as a CSV file in a format that Google calendar can read.
  5. Add these nine column headings in row 1 of the "Export Sheet"  5
    1. Subject
    2. Start Date
    3. Start Time
    4. End Date
    5. End Time
    6. All Day Event
    7. Description
    8. Location
    9. Private
  6. Enter the following content into the cells of the second row:
    1. Moon Void of Course (or whatever you'd like to see as the title of each event).
    2. =$moon_void_of_course_table_2025.A2 (with format code MM/DD/YYYY)
    3. =$moon_void_of_course_table_2025.A2 (with format code HH:MM:SS AM/PM)
    4. =$moon_void_of_course_table_2025.B2 (with format code MM/DD/YYYY)
    5. =$moon_void_of_course_table_2025.B2 (with format code HH:MM:SS AM/PM)
    6. FALSE
    7. ="Moon will enter " & $moon_void_of_course_table_2025.C2 & " after void" (or whatever you want to see in the event description).
    8. Eastern US & Canada (This is the time zone name, but put whatever you want to see for the event location).
    9. FALSE
    10. Select all nine occupied cells in row 2 (columns A through I) and fill down until all the data of the first sheet is included.
  7. Save the spreadsheet as XLSx (Excel) or ODS (LibreOffice Calc).
  8. Export the new sheet as a CSV file.
  9. Create a new Google calendar and import the CSV file into it. 5

Or you can skip all that and just use the calendar I created, which you can find here. 6  But note that it's limited to events in 2025.

Here's how it looks in my calendar; the Phases of the Moon calendar also is enabled...

I hope you find this useful.  Next, I'll describe how I got these events into Org-mode.


1 href="https://support.google.com/calendar/answer/13748650?hl=en&co=GENIE.Platform%3DDesktop

2 href="https://www.maketecheasier.com/display-alternate-calendar-google-calendar/

3 https://www.astrologybyjudithryan.com/void-of-course-moon-info

4 href="https://voidofcoursemoon.com/void-of-course-moon-2025-calendar/

5 href="https://support.google.com/calendar/answer/37118#advanced&zippy=%2Ccreate-or-edit-a-csv-file

6 href="https://drive.google.com/file/d/1WqS678DtfBI9J0MQzuAphMrURAC3kK8T/view?usp=sharing

Saturday, August 16, 2025

Define Emacs as Editor in Altap Salamander

I’ve been a devotee of the Servant Salamander / Altap Salamander file manager1 for decades. I migrated from Norton Commander (NC)2 soon after I started to work on a multi-tasking OS, Windows NT.

Likewise, I’ve been a fan of the (extensible) text editor Emacs3 for decades, having given up on Brief4, eventually. While on WinNT, I stayed with Brief a long time. But I seem to recall that Brief didn’t respond well to having one of its open files changed by another application. (This rarely happened in environments that it was designed for.)

Norton’s F4 key invoked a built-in text editor to open the selected file. The Salamander F4 key is configured to use Notepad.exe to open the selected file. But it can be configured to use other editors based on the selected file’s extension. I configure F4 to use Emacs for all text-like files.

Once I open Emacs, I like to keep that instance open for as long as possible. That’s because I build up a history usage, including:

  • Regular expression searches
  • Kill ring contents
  • On-the-fly macros

Switching to a new Emacs instance is a major interruption to my workflow.

Enter Emacs server. Emacs includes a server that can open a file in a running instance when invoked from an external application, such as Norton, ...er, Salamander. This allows a user to edit new files while maintaining the previous Emacs instance.

To use this active server process feature, you’d invoke Emacs with this command5 (all entered on a single line): C:\Path_to_Emacs_bin\emacsclientw.exe -a C:\Path_to_Emacs_bin\bin\runemacs.exe

But I find that configuring Salamander’s F4 to call the Emacs server to be difficult sometimes. In fact I spent an embarrassingly long time yesterday trying to figure it out. But it’s not at all difficult if you really understand two things:

  1. Only the Emacs executable should appear in the Custom Editor Target box; any switches go into the Arguments box before the $(Name) parameter.
  2. Emacs doesn’t like file names that contain quote marks. So if there’s a space in the path to the executable, you should specify the 8.3 name and not the path seen in Explorer.6 Please see the figure below.

I’ve heard Emacs gurus advise against installing Emacs in a location other than the default. The default on Windows currently is C:\Program Files\Emacs\emacs-30.1\. And I followed that advice unfortunately. But it caused me a great deal of grief, because it forced me to surround the paths in quotes and was incompatible with the server process. On my previous computers I had been installing Emacs in C:\Users\Public\Programs, which all users have access to and conforms to the DOS 8.3 file name format. That’s why this error is new to me.

So here’s advice from a wannabe guru:

  • Follow the instructions above to configure Salamander’s F4 to invoke Emacs if you already have Emacs and Altap Salamander installed.
  • When you install Emacs, change the installation location to ensure that the path is made up of only alpha-numeric characters and that all users will have Read and Execute permisions.


1 https://www.altap.cz/
2 https://en.wikipedia.org/wiki/Norton_Commander
3 https://www.gnu.org/software/emacs/
4 https://en.wikipedia.org/wiki/Brief_(text_editor)
5 https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html
6 Eli Zaretskii, https://lists.gnu.org/archive/html/help-emacs-windows/2014-04/msg00013.html

Wednesday, May 21, 2025

Invalid and Inconvenient File Name Characters in DOS

File names that include a space require special handling. Specifically, the name or path needs to be surrounded by quotation marks when they’re referred to.

For that reason I have an aversion to using space characters in my file names. Whenever I download a file, I find myself replacing them with underscore characters. It’s easy to do in Altap Salamander1. Open the Rename tool with Ctrl-Shift-R, put a space in the Search box, an underscore in the Replace box, press Alt-Y to uncheck “Only Once” and finally Alt-R to perform the action.

Since I’m learning Python, I thought it would be fun to write a script to do this. And while I’m at it, I should create the script so it also replaces any illegal characters in a string.

Thus I went down the rabbit hole of searching for a list of illegal characters.

According to Microsoft2, there are these: < > : " / \ | ? *. But I realized that I didn’t want a list of illegal characters; I wanted a list of characters whose use is a bad idea – inconvenient characters. To me, they are ( ) + & , ^ ! %.

So I looked at a popular thread on Stackoverflow3, where, to my chagrin, a Python script similar to mine4 was waiting for me. I enjoyed reading the answers, the comments, the opinions. But not once did anyone mention an inconvenient character except for space. And so I revved up my “expertise engine” and looked for the post editor in which to write my response.

Alas, I did not have enough “reputation points” to answer the question. And anyway, I thought the whitelist idea was the best.

But in case you’re curious, here are explanation of why these characters are inconvenient:


Parenthesis: They confuse the DOS FOR command. Create my(file).txt. Then enter the following at the cmd prompt:5

for /F %s in (my(file).txt) do echo %s

I’m using Windows 10 and verifying these examples with it. On older Windows (7, XP?) parenthesis caused a problem even if the file name is placed after the do, like this:

for %i in (2 4 6 8) do copy my(file).txt my(file)%i.txt


Plus sign: The DOS copy command can be used to concatenate two or more files into one. What’s the concatenation operator? You guessed it – it’s the plus sign. How would you concatenate my+1.txt with my+2.txt? This doesn’t work:

copy my+1.txt+my+2.txt ex2.bat

You can do this instead, which is just as bad as using spaces:

copy "my+1.txt"+"my+2.txt" ex2.bat


Ampersand: Two statements can be placed on one line when they’re separated by an ampersand. If you wanted to copy one file to another and then print the contents to the screen you could enter:

copy ch2.txt ch42.txt & type ch42.txt

But if instead of ch2.txt you had ch2&3.txt, it gets tricky. For example, enter:

copy ch2&3.txt ch42.txt & type ch42.txt

It gives up rather quickly, saying that ch2 and ch42.txt could not be found and that 3.txt is not a command. That’s because DOS interprets it as three separate commands, not two:

copy ch2

&3.txt ch42.txt

type ch42.txt


Comma: My only concern about commas is that I work with CSV data files frequently. If a file name needed to be included in such a file, the comma could be interpreted as a delimiter and screw up the layout.


Percent and Exclamation mark: These are used in batch files to reference variables or command line parameters. Consider what special handling you’ll need for a file named my%100.txt:

set x=2

copy my%100.txt my%100%x%.txt

The %1 is replaced by the first command line parameter, which is not what you want. When this is run with no parameters, the batch file tries to copy my00.txt to my002.txt.

When delayed environment variable expansion is enabled, the second statement could be written as shown below, which can be inconvenient when the file name includes an exclamation mark:

copy my%100.txt my%100!x!.txt

If the file is named my!100.txt, you can make this example work by escaping the ! that’s part of the file name. Use ^ as the escape character, but you’ll have to double it:

copy my^^%100.txt my^^%100%x%.txt

Unfortunately, there is no way (that I know of in DOS) to escape the percent character in %1.

And that brings us to caret. If you use it in a file name such as my^100.txt, you’ll need to escape it, as well.

copy my^^100.txt my^^100%x%.txt

Command prompt help lists even more characters that require quotes if they’re used in filenames. You can find this at the end of the output from cmd /h:

The completion code deals correctly with file names that contain spaces or other special characters by placing quotes around the matching path…. The special characters that require quotes are:

<space>

&()[]{}^=;!'+,`~

Note that % isn’t among them.

I hope I’ve convinced you to avoid any characters other than alphanumeric, hyphen, underscore and dot. If not, try to avoid the command prompt.


1 https://www.altap.cz/

2 https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file

3 https://stackoverflow.com/questions/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names

4 The one in my head that I hadn’t yet written

5 Some code samples can be found at my incovenient_characters repo

Saturday, February 03, 2024

Excel VBA -- Named Range Automation

A few weeks ago, I was working with an Excel workbook that had 18 sheets that were similar in structure. Half the sheets had names L1_1, L1_2, … L1_9; the other half, R1_1, R1_2, … R1_9. They contained dimensions of structures on the left and right of a substrate.

I wanted to display a summary of a few averages from each sheet on a new sheet. I knew this would involve the tedious process of selecting a range of cells for each average, so I decided I would write VBA code to create a named range for each group of cells that I wanted averaged.

I turned on the Macro Recorder and then manually created the range so I could get some idea of what object and property to set. It recorded this:

    ActiveWorkbook.Names.Add "PGC_1”, "=L1_1!$D$3:$D$84"

This told me that the Add method of the Names collection would require the Name and the Address of the desired named range.  And so I wrote this subroutine:

Sub CreateNamedRanges()
Dim objN As Name
Dim i As Integer, s As String

For i = 1 To 9
s = CStr(i)
ActiveWorkbook.Names.Add "PGC_" & s, "=L1_" & s & "!$D$3:$D$84"
ActiveWorkbook.Names.Add "PGL_" & s, "=L1_" & s & "!$D$190:$D$376"
ActiveWorkbook.Names.Add "PTL_" & s, "=L1_" & s & "!$D$101:$D$173"
ActiveWorkbook.Names.Add "PGR_" & s, "=R1_" & s & "!$D$190:$D$376"
ActiveWorkbook.Names.Add "PTR_" & s, "=R1_" & s & "!$D$101:$D$173"
Next i

For Each objN In ActiveWorkbook.Names
Debug.Print objN.Name, objN.RefersTo
Next

End Sub


But the code crashed on the fourth Add method; it complained about an invalid address.

It didn’t make sense. I looked carefully at the fourth Add method. There were no illegal characters or trailing whitespace or other pitfalls. I found references to the error online, but none of the content pertained to what I was working on.

Eventually it dawned on me that perhaps Excel was confusing the “=R1_” & s as an R1C1 style address. Perhaps I needed to make sure it knew that “=R1_” & s was a sheet name. And so I placed two single quotes in each address: one right after the equal sign, and one right before the exclamation mark, like this: "=’R1_" & s & "’!$D$190:$D$376"

After this correction, the code ran quickly.

Saturday, September 16, 2023

Foray into Fiber Optic Internet Service

The letter from my ISP stated that it would be installing optical fiber. The letter encouraged me to upgrade (warned me, actually) because repairs to my DSL soon would incur a service fee.

I ignored the first two letters, but then decided I’d look into the matter.

The upgrade process started with a call to customer service. The agent went over the available tiers of service and their costs. I chose 500Mbps because I know that bottlenecks in speed occur at the server and the device. Higher speed service is good for large families that have several users and devices all vying for bandwidth, but that’s not me. (I was happy enough with 20Mbps, actually, but that was just the download speed. I was limited to about 1.6Mbps upload speed, which made teleconferencing problematic.) The 500Mbps was for both download and upload.

The agent scheduled a date and time for a technician to visit – I had to be home for this. She also looked into the details of my account and informed me that I had overhead service. This was wrong. The neighborhood had overheard wires; however my wire was (mostly) underground. But the agent was unconvinced. It didn’t matter too much; the technician would see it and correct the record.

I liked the technician. He saw the DSL wire – it was lying on the ground near the house. He pointed out that the wire was meant for overhead installations. He showed me where the fiber would come down from a different utility pole – he even pointed out that box it would connect to. So the new “wire” would need to be trenched on the other side of the property. Since the ISP didn’t realize I needed the fiber buried, he decided to expedite the order. But first, the property needed to be surveyed by the “Call Before You Dig” (CBYD) program. I did not need to be home for CBYD or for the cable to be buried. But I was glad I was present for both.

When the CBYD technician arrived, I went out to meet with him. He was puttering around the pole to which the old DSL was connected. I told him that the ISP would be digging at the other pole. Nevertheless, he indicated “No Water / No Gas” and placed flags over the electrical service. He didn’t bother to mark the cable or DSL – I guess that service doesn’t matter.

The guy came out the next day to put down the new cable. It was a rainy Sunday afternoon. I didn’t know he was there until I heard some sort of thumping and went out to investigate. He was attempting to manually dig a trench on the wrong side of the house, navigating near the cable! I explained how the installation needed to go, and he was relieved because it meant that he could use the gas-powered trench digger. He seemed not fluent in English, so he probably didn’t read the ticket. Anyway, he completed the job, and I took photos of the two exposed ends.

The technician would return on Friday, but someone still needed to connect the cable to the box on the pole. Would he do that? I hoped so.

The next day, I got a frantic text from my wife. The (VoIP) land line phone was not working. And the cellphone service was dropping her calls after 20 seconds. So she had no way to call anyone!

It turned out that the ISP canceled our service. So we were without Internet service for four days!

The weather forecast for the Friday installation day included a severe thunderstorm watch. And still the cable was not attached to the box on the pole. But eventually the guy came in the bucket truck and made the connection pretty quickly. I guess he was spurred on by the thunder clouds roiling nearby. About 30 minutes later the deluge began.

Then the technician came to put in the new modem, router and WiFi. This all went amazingly well. He even set the WiFi passcode to what it was before; I didn’t have to re-authenticate all my devices to the new WiFi. The only surprise was that I was left with no battery backup. The technician removed the old UPS, which had only 12Vdc output -- it was useless for the new system. He said he was glad to see I had my own UPS for the computer and cordless phone system, and he plugged the Modem and Router into that. Indeed, I got a message afterward alerting me to the fact that the VoIP system would not work in the event of a power failure.

I’ve had the service for several weeks. At first the Ookla speed test reported about 500Mbps for both upload and download when connected to the ISP’s own server. However, when connected to the nearest (non-ISP) server, the speed was under 30Mbps. As well, DNS lookup was problematic, and I’ve had to restart my computer prior to the start of my work-from-home day.

Voice mail was the next problem. The upgrade came with a whole new voice mail system. We opted out of the voicemail system that came with DSL As before, the new voicemail answered when our line was in use, and callers would leave messages expected that we’d hear them. We had no idea this was going on, and we missed some messages from medical providers. So I used the web interface to set the number rings before pickup to 12. But that did nothing. I needed to spend about 45 minutes over two sessions with customer service before eventually it could be disabled.

But lately, things have improved. In fact during a recent severe thunderstorm, the Internet connection remained steady even though cable and electrical power was intermittent. Wet weather would always degrade the DSL service – now this seems to be another tale of hardship we had to endure, like 9600 baud rate modems, text-based message board systems, and 1.2 MB removable media.

Lately, the speeds to local non-ISP servers have improved; although the advertised rate still isn’t being met.




Friday, July 28, 2023

Quarterly Reports in Org-Agenda

Org-mode comes out-of-the-box with Agenda views for these time spans: Day, Week, Fortnight (aka bi-weekly, but why?), Month and Year.  Oddly, there’s no built in option for Quarter.

Ideally, Org-agenda would come preconfigured to respond to the keystroke sequences of vq1, vq2, vq3, vq4 to display reports for Q1, Q2, Q3, Q4.

After searching online and struggling with customizations, I came across a two-step method to show a quarterly report that doesn’t require code.

First, invoke org-agenda with a prefix argument of 91 like this:

M-91 M-x org-agenda <ENTER> a

The “M-91” means you hold down the Alt key while pressing “9” and then “1” but you can also do this:

C-u 91 M-x org-agenda <ENTER> a

Second, press “j” (while visiting the *Org-Agenda* buffer) to invoke org-agenda-goto-date.  Choose the first day of whatever quarter you’re interested in.  Today I was interested in reviewing content for the previous quarter.  Thus I choose 2023-04-01 to show the second quarter (Q2) of 2023.

If you want to choose more Agenda options such as Search, Matching or other, or if you want 91 days to be the default view always, try setting org-agenda-span to 91, which will eliminate the need for the prefix argument to org-agenda.  You can do this in two ways:

Invoke M-x customize and then search for org-agenda-span

Or press C-h v org-agenda-span and then click customize.

Once you're in the customize buffer, click the Value Menu button and then enter 91, or whatever number of days you're interested in.  Note that this entry must be an integer. It can accept a negative value, but the results are undesirable.  So stick with positive integers.

Friday, December 09, 2022

Get Path to Current LibreOffice Spreadsheet

There are two comments related to the previous post:
  1. The blood draw wasn’t scheduled for the next morning. It was for the following morning! What a dummy I am!
  2. The code that I use in LibreOffice Calc to return the Current Working Directory can be found below. I call it with this worksheet function as an argument: CELL("FILENAME",$A$1).  Please note that the module in which this resides has the following statement at the top: Option VBASupport 1

Function LG_GetPath(s As String) As String

' 2019-02-26 LG  Created, mostly to derive Current Working Directory
	Dim sTemp As String
	Dim i As Long, j As Long
	' MsgBox "Contents of s: " & s
	If IsNull(s) Then
    	LG_GetPath = "ERROR"
    Else
    	sTemp = CStr(s)
    	i = InStr(s, "///") + 3
    	j = InStrRev(s, "/")
    	j = j - i
    	If j > 0 Then
    		sTemp = Mid(s, i, j) & "/"
    		LG_GetPath = sTemp
    	Else
    		LG_GetPath = "ERROR"
    	EndIf
    EndIf	
End Function ' LG_GetPath

Wednesday, December 07, 2022

High Blood Pressure vs. Computer Use -- Correlation?

Tonight I prepared for a 7:20AM fasting blood draw. Here’s how.

I have an outstanding balance with the lab, so I decide to pay it online and add a record to my database of paid medical balances.

I fire up my brand new laptop and navigate to the lab’s patient portal to accesse my account.

But before I pay any medical bill, I always verify that the balance does not exceed the Patient Responsibility as determined on the Insurance Provider’s Explanation of Benefits (EOB). So I also go to the insurance company website. While at the login prompt, I open my password manager to get the password for the site.

Unfortunately, the site rejects the username / password combination. The password had been created in 2018, so it must have expired.

At this point I could just reset the password. But then I would need to update both my work computer and the old computer. So I decide to start up my old, slow laptop and check the password manager on that computer. But the password manager offers the same old password for that site.

That’s not a problem. All I have to do is open Chrome, in which I save nearly all my passwords. But Chrome is running extremely slowly; seconds turn into minutes, so I take a break to feed the animals.

After I feed the animals, Chrome finally is loaded, and I find the new password in its password manager. I write that down on the invoice and transfer it over to the new computer via “SneakerNet.”

And this is where things spiraled into high blood pressure territory. The insurance company decided it was time to do maintenance on its website; it refused to display the login page any more!

I decide to call the insurance company, which is open after hours and also a few time zones behind me. Hold times are long. “Of course they are,” I told myself. “No one can log into the website!”

Finally, an agent picks up. “Hi, I just wanted to verify a Patient Responsibility – I can’t get into the website to do it.” The agent says, “I’m sorry but I can’t get that for you -- our computers are down. But they’ll be back up tomorrow morning.” “Oh, you too, huh?”

So then I decide that I’d just pay the darn balance. I’d rather pay online and download a receipt for my records than pay in person and get a paper receipt.

I switch tabs back to the lab’s invoice of my previous blood draw, the one I need to pay. But the information is gone – too much time had elapsed! So I’m required to re-enter the account details. I do that, and I’m able to transact the payment easily.

Next, I want to enter a record of the transaction in my database. I have a flat file database implemented in spreadsheet form with LibreOffice’s Calc. A brand new installation of LibreOffice, it loads quickly. Unfortunately the links to all my receipts and EOBs are showing up as #NAME. Now what?

It takes a while, but I figure out that I use =CELL(“FILENAME”, $A$1) to obtain the spreadsheet’s full path and file name. And then I use a home made function LG_GetPath() to strip away the spreadsheet’s file name and extension, returning a string that contains just the drive letter and directory. It’s this string (CWD) that prefaces all the links to the receipts and EOBs.

I go back to the old computer, open the Macro Editor, export the module, email it to myself (in case I can’t get it through the home network) and enter it into the LibreOffice installation on my new computer.

Finally I’m able to enter a record of the bill payment, the last step of my procedure for paying medical bills.

How long did this take? I recall that I finished feeding the cats at about 6:30PM and that I was able to finish my supper at 7:30Pm (thereby reducing the 12 hour fast to eleven-and-change). Given that it took me at least 15 minutes to eat, the process took nearly 45 minutes.

But from the way my heart was beating and the arteries throbbing in my neck, I’d say the time that was wasted was secondary to the increase in blood pressure.

And now, exactly eleven hours before tomorrow morning’s fasting blood draw, I’m quaffing the dregs of a Murphy’s Irish Stout.

We do not need medication to control blood pressure; we need new lives.

Friday, December 02, 2022

Add Command Prompt Here to Explorer Without Mucking About With the Registry

Windows 10 computers are missing the “Open Command Prompt Here” on the shortcut menu.

You can find a registry change online that will bring it back. But that “fix” involves changing the Permissions / Ownership of that part of the registry, so I declined to try it.

Instead I came up with a solution that uses the SendTo feature to call a batch file that calls CMD with the /K switch. To use it, create a batch file in your SendTo directory called OpenCMD.cmd. Add the content below, between the “BEGIN--------” and “END--------” tokens, and save it. Then Right-Click any file, choose SendTo OpenCMD.cmd, and a command prompt will be opened in the directory in which that file resides (if the path is on a local hard drive or mapped drive).

The SendTo directory can be found under your user profile; the <UN> in the path below is your user name:

C:\Users\<UN>\AppData\Roaming\Microsoft\Windows\SendTo

You can also enter the following in the explorer address bar to navigate to SendTo: shell:SendTo

Here’s the batch file source code. Please note that most of the lines are either comments (which start with REM) or debugging statements (which start with Echo). In fact the only lines that are necessary are the ones between the labels :OpenCMD and :END.  And please don't include the “BEGIN--------” and “END--------” tokens

Begin--------

REM OpenCMD.cmd (c) 2022 Luddite Geek

REM Opens the command prompt in the directory of the given path

REM

REM 2022-11-04 LG Created.

GOTO OpenCMD

GOTO BEGIN

cmd /?

:BEGIN

@echo off

Echo %0 %1

Echo DRIVE: %~d0

Echo PATH: %~p0

Echo NAME: %~n0

Echo EXT: %~x0

Echo.

Echo Drive and Path of parameter 1: %~dp1

pause


:OpenCMD

%~d1

cd %~dp1

CMD /D /K CLS

:END

End--------

Sunday, June 04, 2017

Hard Drive Thrashing? Maybe It's Windows Update

In a previous post, I wondered if my computer problems were due to AntiVirus interfering with Windows Update.

Perhaps.  But there's definitely a problem with Windows Update. The following seemed to get rid of the excessive and endless thrashing of the hard drive:

http://www.cagedrat.com/microsoft-windows/microsoft-windows-updates-cab-files-filling-up-hard-drive/

And yes, I plug in my computer and set it to Stay Awake before downloading and installing updates.

Saturday, March 18, 2017

Is AntiVirus as Bad as Malware?

I've been using and recommending AVG AntiVirus Free for over a decade.  Whenever a new computer's trial version of Symantec AntiVirus would expire, I'd uninstall it and install AVG.

But when I accepted the upgrade to version 16, I lost the ability to control its update schedule.  It's no longer possible to disable automatic updates.  Now the only option is to accept automatic updates whenever they become available.  Users even lost the ability to force an update.

That's a big problem.  I once hosed a system when AVG updated during a Windows Update.  That was when I decided to disable automatic updates and run them manually with a simple right click of the taskbar icon.

I still have the install file for AVG 15.  Unfortunately, it downloads the full installer from the Internet and then installs the latest version.

I considered doing away with AntiVirus entirely.  But I'm not the only user of the computers -- the other users will need to have the safety net of an AntiVirus program.

So it's time to shop for a new AntiVirus program!

Wednesday, April 13, 2016

Must-Have Extensions For FireFox and Chrome

FireFox is my favorite browser.  It beats Chrome in terms of usability.  But I'm curious to see if I could live with Chrome for a while.  So I'm taking it for a test drive.

First for safe browsing, I like to have...
NoScript (FireFox) // ScriptNo/ScriptSafe (Chrome)
Blocks all scripts from running.  Allows the user to add exceptions for scripts on any given domain, either just for the current session (temporarily) or also for future sessions (permanently).  I think I like ScriptSafe on Chrome better than NoScript on FireFox.  Why?  Because NoScript will reload the page each time a single host is enabled, whereas ScriptSafe will let you enable multiple host before reloading the page.  And ScriptSafe features color-coded buttons while NoScript differentiates between temporary and permanent whitelist with italics.

WOT (FireFox) // WOT (Chrome)
WOT, or Web Of Trust, warns you in advance when a link leads to a dangerous website, before you even click on it.  The database of dangerous links is maintained by the community of WOT users.  But this sometimes can lead to sites getting blocked when a user disagrees with a site's ideology.  Still, you can get more detail on each website's rating and decide for yourself.


For usability, try these extensions...
FBPurity (FireFox, Chrome, Safari, Opera)
Facebook could be useful if only _______ (fill in the blank).  Well, FBPurity fills in the blanks by filtering out the elements that you don't want to see.  I use it to block "food pron" (plus other annoying and recurrent topics), to keep videos from auto-playing, to hide the reactions bar, to always sort posts in Most Recent order, to hide the newsfeed, etc.

LastTab (FireFox) // CLUT (Chrome)
N either FireFox nor Chrome cycle through tabs with Ctrl-Tab the way Windows cycles through active programs with Alt-Tab.  These extensions alter how these browsers behave when you press Ctrl-Tab.  So rather than cycling tabs from left to right, Ctrl-Tab cycles in Most Recently Used order.  There is one caveat, though.  Chrome extensions are not allowed to redefine default keystrokes (such as Ctrl-Tab), so none of the MRU-type tab managers on Chrome can fix Ctrl-Tab.  However, you can bind CLUT to Ctrl-q and Ctrl-Shift-Q, which is just to the right of Ctrl-Tab and Ctrl-Shift-Tab.

Password Management
Both Chrome and FireFox come out-of-the-box with the ability to remember the username and password needed to log in at each unique website.  However, FireFox can remember multiple usernames and passwords for any given site.  After looking for a Chrome extension to get Chrome to work this way (and failing), I thought I stumbled across an experimental option to enable the behavior.  But perhaps not, since the setting I thought I discovered doesn't affect this at all.  Rather, Chrome (at version 49) just started behaving the way I wanted it to!

View Selection Source
In FireFox, you can select content, right click on it and then choose a command to view the source code for that extension.  Chrome provides an "Inspect" command, but it reveals only the CSS details and not the complete HTML.  The View Selection Source extension for Chrome (or its equivalent) is necessary to see the snippet of HTML that's rendered by the browser for that selected content.  Yes, you can press Ctrl-U to view the source of the entire page in a new tab.  But then you have to search for the content you're interested in.  That's awkward, and it works only if the content can be pasted into the search bar.  The weird thing about the View Selection Source extension is that it doesn't come up if you search for it on Google Play.  I found the link in a post on the Help Center.

Save As... / Print To... PDF
Chrome has a built-in PDF printer that it calls "Save to PDF."  It works great, and there's no need to install a separate printer driver.  But you'll have to choose at least one of these three options to get FireFox to save a page as PDF, too.
  1. Install on your computer a PDF Printer Drive, such as PDFCreator or CutePDF.  (Both are free to download and use.)
  2. Install in FireFox a PDF printer extension.
  3. Use an online Web page to PDF service.
I like the first option, since the extensions I've come across either save the web page as a image or send the HTML over the internet to a server to perform the conversion.  I like the ability to select and copy text from the PDF, which is not possible with an image.  And when I generate PDF, it's usually to record a financial transaction, the details of which I'd rather keep on my local hard drive.

At one point I couldn't get the PDF printer drivers to work with FireFox.  Before giving up and switching to Chrome, I came across this Mozilla support page.  It turned out that resetting the print_printer setting fixed it.  As well, I've had to delete the prefs.js in order to solve a problem with the PDF coming out with all blank pages.

What are your favorite Extensions / Add-ons?


2016-07-09 LG Added the section "Save As... / Print To... PDF"
2016-06-13 LG Added "View Selection Source" paragraph.





Tuesday, April 12, 2016

Notes on Setting Up Windows 7

Recently I had to set up fresh installations of Windows 7 on two computers.  Here are some tips to make that process go a bit smoother...

1. Windows Update #1 -- Microsoft has released hundreds of recommended and important updates for Windows 7 since it was introduced.  All that data is a burden for Windows Update, and the update process can bog down on slower computers.  To remedy this, you'll want to download the update associated with KB3102810 first before you even check for updates.  Adjusting your computer's Power Options so it stays awake during the long update process may also help.

2. Windows Update #2 -- I wrote about this before.  Unless you want to upgrade to Windows 10, you'll want to hide the update KB3035583, or uninstall it if it already got onto your system.

3.  Gadgets -- Third party gadgets are no longer supported due to "serious vulnerabilities" in the Windows Sidebar.  You'll still be able to add the default Microsoft ones, such as "Clock," "Calendar," "Slide Show" and "CPU Usage" (my favorites).  But I also liked the third party "Network Meter," which I'd use often to verify download rates.  Since Network Meter is no longer available, I figured out that I can use ResMon to do something similar.  To have ResMon (almost) mimic Network Meter I minimize the various components in the left pane of ResMon and resize the window so that only the network graphs show up.  And I add a shortcut to ResMon.exe in my StartUp folder.

Do you have any tips for setting up Windows 7?  Please share them!

Wednesday, March 16, 2016

How About Never?

A coworker had just bought a refurbished computer with Windows 7 OS and was dutifully applying updates.  He noticed a new icon in the taskbar tray and clicked it.  The program presented him with the opportunity to upgrade to Windows 10.  It implicitly asked when would you like to download Windows 10?  The dialog box offered two buttons labeled "Upgrade now" and "Upgrade tonight."

How about Never?  That was not an option.

The Gwx.exe and GwxUX.exe programs make it easy for users to reserve their free copy of Windows 10.  They appear after the user applies the update associated with KB3035583.  And they disappear after the user uninstalls that update.

This "How To Geek" article describes it all in detail.

My previous post discusses why you might want to avoid upgrading.

Saturday, June 20, 2015

My Recent Repair of a Laptop AC Adpater

Yesterday, my laptop wouldn't charge when I plugged it in.  The battery had drained overnight, so the laptop was unusable.  I quickly figured out that the AC adapter has suddenly stopped working.

My nearby Staples had a universal adapter in stock at 20% off, so I picked it up and was soon back in business.

But then I wondered why the "old" adapter had failed. The technician at Staples said that most fail due to a broken wire near the connector that plugs in to the computer.  I know that if you flex any wire enough that it will break.  But this computer was kept in the kitchen at home, and the cable stayed in one place most of the time.  I decided to take it apart and fix it.

Most of the repair guides for Laptop AC Adapters resolve a break or short in the wire at one of the ends of the DC cable.  One even recommends that you cut off the connector, and splice a new connector on, which is silly given that no casual user has a spare connector lying around.  This same guide says that if there's no voltage after cutting off the connector, the adapter is dead and you have to buy a new one.  Turns out, that's not true at all.

My repair approach was different.  I decided that I would crack open the adapter housing and then verify continuity from the circuit board to the connector with a DMM.  But as soon as I removed the housing, I saw the problem: Cold Solder Joints.  Whoever soldered the wires to the circuit board failed to thoroughly heat up both the pad and the wire.  So the solder didn't flow down the via hole and fully coat the wire.  This never would have passed inspection at my company.

I fired up my soldering iron and reflowed the three connections in less than two minutes.  It took at least five times longer for me to break open the housing.  Message to manufacturers of consumer electronics: If you won't bother to assemble the electronics properly, at least design the housings so that they're easy to take apart and put back together!  I glued it back together with RTV, and it's curing as I write this.

I've fixed several items with this type of reflow repair, including a fairly expensive audio receiver.  A soldering iron and the ability to use it can keep you from throwing out perfectly good electronics.

Thursday, August 07, 2014

Trials with an Old Computer

About six years ago, I mused about what to do with an old computer, a 500MHz Pentium III.  My idea was to reformat the hard drive (20GB) and install one of these operating systems: Windows 2000 (already obsolete); Windows XP (facing obsolescence); and Linux (Ubuntu, although I don't recall why I decided on that flavor).

I tried all three plus Dyne:bolic, a Linux variant specialized for music and video production on under-powered computers.  Here's how I fared....

Dyne:bolic was easy to try out, and I didn't have to reformat the Window NT drive to do it.  So I tried it first.  After downloading version 2, I burned the ISO image to a CD.  It booted up just fine and I ran it from the CD.  It performed well, but it was set up for a single root-level user, and it wouldn't "play" Flash content.

Next was XP.  The first problem I had was that I couldn't activate the OS, even though I had a valid key.  But I played around with it anyway during the evaluation period.  Just twenty minutes was enough to know it would be way too slow.

Then I installed Windows 2000.  This involved a lot of tedious business with multiple CDs for the OS itself, then Service Pack 6 and then more CDs with security software and utilities.  Everything went well until I installed the antivirus program and updated it.  After that, the OS would not start.

Finally I decided to give Linux a try.  Rather than download images files, I decided to search the local public library system for Linux books that had accompanying CDs.  And I limited my search to old books, too, since I really needed the installer to be on CD-ROMs and not a DVD.  There were some Red Hat Linux books, so I got one and tried it.  It installed and ran really well except for the web browser, Mozilla, which had me pressing Ctrl-Alt-Del and longing for Task Manager to come up so I could kill it.

Of these four options, Dyne:bolic was clearly the best.  Unfortunately, by the time I got around to realizing it, Jaromil released version 3.0.0, whose 1.6GB image now must be burned onto DVD, not CD.  (I can't find the CD that had version 2 on it. And booting from USB is not an option in this computer's BIOS.)  This latest Dyne:bolic is totally awesome -- I tried the Live CD on my main home desktop (a P4), and I created a small virtual machine on my work computer, which boots the image file.

In order to run D:B3 on my PIII, I need a DVD drive.  Since I had two on my main desktop, I removed one and installed it on the PIII.  But, alas, it didn't work.  The computer detected the drive, but it won't boot from it, and Linux won't mount it.  So I think the laser is shot.  I've encountered a few non-functioning DVD drives in this manufacturer's computers, so I really do think the drive is defective.  In fact I wasn't able to boot from the drive recently when it was in the P4 that I took it out of.

So this is where I am now.  I need a working IDE DVD drive, which are expensive and/or refurbished.  There are adapters that can convert a SATA drive to IDE, but that's an extra expense I didn't want to pay.  Plus, I'm not sure this small form factor case will have any room for it, although I can put the new SATA drive with IDE adapter into the main desktop and move the working IDE DVD drive from the main desktop to the PIII if I really had to.

If / when I clear this hurdle I'll check in again.  Hopefully D:B3 will still be available!

Saturday, February 01, 2014

Disable Outlook's Junk Email Filters

After upgrading to Outlook 2010 over a year ago, it became apparent that its junk email filter continued to work even after we disabled it.

It took so long for me to notice because I use Popfile to categorize the email I download from my ISP's POP3 server.  Popfile would catch the most obvious spam before the Outlook junk email would process it.

But occasionally a message that Popfile marked as valid would end up in the Deleted Items folder.  Outlook's occasional false positive would make me wonder what was going on, but it happened so rarely that it was easier just to check for these false positives than to research the issue.  Besides, the corporate bulk mail filter running on the Exchange serve would stash things into the Junk Email folder, and I needed to check for false positives from that filter.

But then there was an incident that triggered an intra-departmental1 outcry about the issue.  It was the day that several messages from our Content Management System got flagged by Junk Email and then deleted, causing folks not to notice updates on a few project files.

We all dutifully set Outlook's Junk Email filter to Disabled.  But I continued to see valid messages from my ISP placed into Deleted Items.  Recently I obtained a few spare moments2 and quickly found a solution to the issue.  It was my favorite Outlook/Exchange website that I landed on.  Here's the link:

http://www.slipstick.com/outlook/how-to-disable-outlooks-junk-email-filter/

The text says to change the value in a registry key, but in my case, the key didn't exist, so I created it, first.

Only time will tell whether this works.  I will know for sure only if it doesn't.  I suppose I can find an old message that triggered a false positive and send it to myself, but the header of that message would be different from the original header.


1 The emphasis is on the part of the word that contains "mental".

2 A good way to obtain spare moments is to schedule a meeting right after another meeting, so that if the other meeting runs late, the participants will be milling around outside the meeting room.  After a while, you get a sense of which meetings will run the longest based on the topic and especially on whether certain coworkers will be in them.  Some meetings can run so late that the folks who mill around will disperse and take an additional five minutes to reassemble, assuming they haven't gone off to lunch or embarked on an early vacation or retirement.

Monday, August 05, 2013

Outlook 2010 Macros -- Adventures in Getting Them to Work

In a post that included Outlook VBA code, I mentioned that I stopped using the macro because of Outlook's tougher security.

Today, I decided to try to eliminate the main problem that I had, namely an inability to run the macro except from within the VBA Project IDE.

Here's the scenario:  I have code that worked on Outlook 2000.  I assigned a toolbar button to call it.  But the toolbar button doesn't work in Outlook 2010.  Nothing happens.  Pressing Alt-F8 and clicking Run opens the VBA macro in the IDE and displays an error "Subroutine or Function not found" (paraphrased).  But then I can run the macro by clicking the play button.

One aspect of my solution was to make sure macros were not being disabled.  I choose to self-sign the macro rather than enable all macros.  First I used SelfCert.exe, which I found in the Outlook program directory (C:\Program Files\Microsoft Office\Office14).  SelfCert.exe can be used to create personal certificate -- it would work for me on my local computer.  After I created the certificate, I signed the macro (Tools | Digital Signatures | Choose).  After clicking OK, I immediately pressed Ctrl-sto save the macro.  And then I closed Outlook.  But when I did, it asked me whether I wanted to save VbaProject.OTM.  Odd.  First I responded No.  But when I reopened the VBA editor and checked for digital signatures, it reported that the macro was unsigned.  But answering Yes to the prompt to save didn't help either.  The macro still wasn't signed.

I wondered if the Read Only attribute had been set on VbaProject.OTM.  But no, I had Full Control rights on the file.  Yet, the file's timestamp was old!  It wasn't getting saved!  Ahh, but the old timestamp was a trick, an undocumented "feature".  According to this support thread, it was normal for the timestamp and file size of VbaProject.OTM to remain unchanged after a save.  (This is why the phrase "WTF?" was invented.)  I verified that the save was taking place by adding a comment to my code, saving, closing Outlook and then re-opening the macro.

After that little detour, I found that it was necessary for me to install the certificate in the "Trusted Root Certification Authorities."  This can be done deep within the bowels of the VBA editor.  Tools | Digital Signatures | Choose.  Click the link that says "Click here to view the certificate prope..."  Click the button "Install Certificate..." then Next.  In the next dialog box, click the radio button for "Place all certificates in the following store" then Browse.  Select "Trusted Root Certification Authorities" and then OK / Next your way out.  Save and close Outlook again.

BTW, every time you close Outlook, you should use Task Manager to verify that the Outlook process is not running.

Still the macro would not run except from within the editor.  But I found the solution in another thread.  My code was in a module.  After I moved it to ThisOutlookSession, I was able to assign an actual functioning toolbar button to it.

Whew!

It is very nice that even though I have other macros working that access the From and To properties of a message, I no longer get the annoying message box that warns me that my address book is being accessed and asks whether I want to allow that.