There are plenty of clock apps in the macOS app store, but most of the ones I’ve looked at are too feature rich and can display loads of information I’m not really interested in. What I’ve been looking for is a narrow (i.e. short) display of UTC time to complement the local time in my status bar.

Christoph Krey has just completed a small app which does exactly that:

screenshot of ISO8601 in the status bar

As you see from the screenshot, I’ve got the time displayed only, but the app can display an ISO 8601 date and time string.

He’s making it available free of charge. Give it a whirl, and give it a few stars if you like it as much as I do.

macos and utilities :: 03 Apr 2020 :: e-mail

In this month of March many more people are working from home and are in need of video conferencing software, and while I have been working from home quite a bit for twenty years, video conferencing is something I’ve seldom required.

I’ve tested a number of programs, but the software I like best and which works best for me so far is Zoom. It’s fast, has a decent UI, works where I need it, does screen/app sharing the way I think it should be done, and it comes in a free tier as well as several paid tiers.

But I keep hearing stories of how horrendous its privacy policy is, and in the course of a week there have been multiple people swearing off Zoom.

It started with this tweet thread subtweeted by someone who’s opinion I have valued. At the time of this writing this tweet has 40k likes and 15k retweets:

tweet from ouren

— “Whether you have Zoom account or not,” the company’s privacy page states, “we may collect Personal Data from or about you when you use or otherwise interact with our Products.”

All’s you gotta do is search for “Zoom attention monitoring” and read their privacy policy. (Their policy is that there is no privacy) Tech startups can neve be trusted. Ever.

Additional information from the EFF

and the last tweet in the series seems to be the money shot:

I don’t have a real soundcloud, but here are various links where you can buy our games, request keys, hire our services and more: listography…./poppyworks (we only work on games, not infosec, sorry!)

Then I get a Unix person telling me

it’s about uploading the process list of the system for the focus detection. it seems it’s not simply done client side, but instead they pull the list, meaning, all your ssh sessions with destinations

aw, come on, do we really believe that? Zoom would be slaughtered if that were true, right? Why should they do that? The app can simply check whether it has the active window.

Then there’s this piece which oozes FUD in my opinion:

Whenever you host a call, you have the option to activate Zoom’s attendee attention tracking feature

Yes, it’s hidden in the settings. So what? That means to me that the host can see whether the Zoom window is active. My Zoom window won’t be active because I’ll be taking notes in a separate (active) window. To me that’s not a privacy issue.

that piece goes on to say

This feature only works if someone on the call is sharing their screen.

Which takes care of a multitude of calls, dunnit. Next.

Of course, just because you are not viewing the Zoom screen does not mean you are not paying attention or doing work. Furthermore, this feature cannot always reliably gauge if you have clicked away from the call. It only works on version 4.0 or later of Zoom apps and is not as reliable if you attend a Zoom call through your web browser rather than an app.


You should also be aware that if a host decides to record the call so it can be played later, Zoom saves a TXT file of the chat messages from the meeting and shares it with your boss

So what? Those are public messages. Anybody who’s used IRC knows about that. Then:

According to its support page on the subject, “the saved chat will only include messages from the host and panelists to all participants.” However, it does not clarify what will happen to direct messages between attendees.

It does clarify that; the piece has just said so one sentence earlier: “the saved chat will only include messages from the host and panelists to all participants”.

According to the company’s privacy policy, Zoom collects reams of data on you, including your name, physical address, …

Oh really? The privacy policy clearly says may gather the following categories of Personal Data about you. The key word is “may”. And how they want to gather my physical address is beyond me; I didn’t specify one when signing up, and if you don’t sign up you can still participate in invited calls. How are they going to get your physical address then?

The piece closes with

Last year, ..

Yes, last year. Today is this year.

Convince me that this is not all FUD. I’ve yet to see any proof of the “spying” people are clamoring about.

Further reading:

the end.

conferencing :: 23 Mar 2020 :: e-mail

I’m really appreciating my new desk phone particularly now that I’m having to use a telephone much much more than I’ve done the past years. I got myself a Voyager Focus UC headset and have paired that to the phone and to the computer, and have been able to remove some of the cable clutter which occupied my desk. Dialing a number from the command line is one of the features I’m appreciating most on the phone.

I noticed a couple of days ago while searching for somebody in the address book that there are little blue “phone” icons, and my interest was piqued: could I have it so that if I clicked one of those, the Grandstream would dial a number?

screenshot of an address book entry on macOS

As is often the case, something which could be simple is complicated by the fact that Apple have changed things over the course of time. Be that as it may, this blog has the nitty-gritty, and I pasted the following small AppleScript together:

on open location this_URL

    set arg to text of this_URL
    set cmd to "/Users/jpm/take/bin/ " & quoted form of this_URL
    do shell script cmd

end open location

I saved that as and patched its Info.plist in a text editor:

---	2020-03-23 11:42:20.000000000 +0100
+++	2020-03-23 11:46:22.000000000 +0100
@@ -2,6 +2,17 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "">
 <plist version="1.0">
+	<key>CFBundleURLTypes</key>
+	<array>
+		<dict>
+			<key>CFBundleURLName</key>
+			<string>Telephone helper</string>
+			<key>CFBundleURLSchemes</key>
+			<array>
+				<string>web</string>
+			</array>
+		</dict>
+	</array>

Finally, I set the preferred dialing app to my new using SwiftDefaultApps, a preference pane which replaces RCDefaultApp which no longer works on newer macOS releases.

changing preferred app for a URI using SwiftDefaultApps

In case you are wondering, I tried using something like Platypus to “appify” my script directly but that didn’t work. Possibly becasue I didn’t know about the Plist trick above…

macos and phone :: 23 Mar 2020 :: e-mail

In a week from today, I was scheduled to give a short talk about the story of OwnTracks at Geomob. Geomob is a series of regular events for location based service creators and enthusiasts, which take place every few months in different European cities,

I believe Ed Freyfogl is the person who conceived these events originally, and I was very much looking forward to meeting Ed in person. He’s one of the people behind OpenCage, a company which provide reverse geocoding data and APIs, and we at OwnTracks like how OpenCage uses open data and have good privacy around their service. We use their data quite extensively with our vehicle tracking devices, and our Android app can use them as well.

What is reverse geocoding? Wikipedia explains it this way:

reverse geocoding is the process of back (reverse) coding of a point location (latitude, longitude) to a readable address or place name. This permits the identification of nearby street addresses, places, and/or areal subdivisions such as neighbourhoods, county, state, or country.

The Geomob event in Munich was cancelled due to the Coronavirus situation, and Ed suggested we chat and record for one of the @geomob podcasts, so we did. I had good fun and hope you’ll enjoy listening to our chat when it appears on an internet near you in a few weeks.

After the official recording was over, I was telling Ed how I love their OpenCageData service and how impressed I was recently when an update I submitted to OpenStreetMap was returned by an OpenCage reverse geo lookup just a couple days later.

Case in point I properly labelled a bakery at which one of my family members frequently stops. I realised the location had no name because I noticed our car stop there with an ignition off. I logged into OSM, located the position of the bakery, looked up its official name on the chain’s Web site, and added that to OSM.

the bakery

Just a few days later, I noticed on a Mattermost window in the background of my screen, that our car again stopped, and I was delighted to see the reverse geocoded data contained the description I’d edited. OpenCageData uses OpenStreetMap data, hence the connection.

car status

(Our cars produce OwnTracks JSON, and the reverse geocoding takes place server-side with a utility we created, called revgeod – a reverse Geo lookup service written in C, accessible via HTTP and backed by OpenCage and LMDB.)

How about you also sign up for the Geomob mailing list, and hopefully we’ll meet at one of their events as soon as the current situation has cleared itself up.

As I told Ed earlier: the slides for the OwnTracks presentation I was to give are ready. :-)

geo and owntracks :: 19 Mar 2020 :: e-mail

I learned a new word yesterday: chyron. I had use a search engine to find its definition, because dict(1) didn’t find it. (While writing this it occurs to me that maybe macOS’ has it; it does.)

chyron in

I try to use dict(1) because most of the dictionary sites I stumble across are riddled with ads and whatnot which make the experience quite suboptimal.

So can I run my own dictd(8) server and feed it my own definitions? I can, and do that here with a completely invented definition of a word in order to be able to see “my” word being used.

First I create a list of words. dictd supports many different types of lists, and the manual pages attempt to explain them. I begin with a format I easily understand and use the dictfmt utility to convert that to files which the server then reads.

$ cat mydict.txt
:usb:Unpossible Serial Business
:jane:You don't know Jane?!? Elle est très Jolie

$ cat Makefile
mydict.dict: mydict.txt
	dictfmt --utf8 --allchars -s "Mi diccionario" -j mydict < mydict.txt

After running make, I see two new files (mydict.{dict,index}). I then create a configuration file dictd.conf for the server, and launch it:

$ cat dictd.conf
database uno {
	data "/var/dict/mydict.dict"
	index "/var/dict/mydict.index"

$ /usr/local/sbin/dictd --config dictd.conf --verbose \
                        --logfile log.0  --pid-file /tmp/ \
                        -d nodetach 

My first test uses telnet(1) to connect to the server, but I could also use the protocol Swiss army knife: curl can query my dict server: curl dict://

$ telnet localhost 2628
Connected to localhost.
Escape character is '^]'.
220 dictd 1.12.1/rf on Darwin 19.3.0 <auth.mime> <>

show db
110 1 databases present
uno "Mi diccionario"
250 ok
221 bye [d/m/c = 0/0/0; 4.000r 0.000u 0.000s]
Connection closed by foreign host.

I then use the dict(1) client, and specify localhost as it likely defaults to using as a server:

$ dict -h localhost jane
1 definition found

From Mi diccionario [uno]:

  You don't know Jane?!? Elle est très Jolie

Now I configure dict(1) to use only my server. (As an aside, when installing from Homebrew I note there is a /usr/local/etc/dict.conf which contains localhost and which are queried in that order.)

$ echo 'server { port 2628 }' > ~/.dictrc

$ dict usb
1 definition found

From Mi diccionario [uno]:

  Unpossible Serial Business

In theory has a lot of background information and data on DICT (RFC 2229), but unfortunately the site doesn’t seem to get much love, and most of the links are dead; the FTP server at which they point has been unreachable for over a month, likely longer.

I thought I’d try installing WordNet®, which is made available by Princeton University, but I’ll admit that I got stuck at building the software because I didn’t feel like installing TCL/Tk so I took the easy route and extracted the required data files from the Debian dict-wn package:

$ mkdir t
$ dpkg-deb -R dict-wn_3.0-35_all.deb t
$ ls t/usr/share/dictd/

After changing my dictd.conf to add that dictionary, I query it, and dict(1) finds words I specify in all configured databases.

$ dict dinner chyron
2 definitions found

From Mi diccionario [uno]:

  I think we'll have sucuklu yumurta or Rindswürstchen, pink sauce, and
  potato salad with onions and capers

From WordNet (r) 3.0 (2006) [wn30]:

      n 1: the main meal of the day served in the evening or at
           midday; "dinner will be at 8"; "on Sundays they had a large
           dinner when they returned from church"
      2: a party of people assembled to have dinner together; "guests
         should never be late to a dinner party" [syn: {dinner},
         {dinner party}]
1 definition found

From Mi diccionario [uno]:

  a caption superimposed over usually the lower part of a video image (as
  during a news broadcast)

Speaking of Debian, they package a large number of dictionaries which are just an apt install away, and they’re also configured into dictd as soon as you install them. Well done.

If the dictd server which runs on is maintained as “well” as the Web site there, I see a bleak future for the Dict service; that would be a shame.

dict, words, and unix :: 08 Mar 2020 :: e-mail

Other recent entries