Workaround for “No new people were added to the group One person is already a member of the group. The provided email address might be a primary, secondary, or alternate email address of this person.”

If you encounter the Google Groups error

No new people were added to the group
One person is already a member of the group. The provided email address might be a primary, secondary, or alternate email address of this person.

when trying to Direct Add or Invite a user to a Google Group, but there are no users in the Group which could possibly have alternate, primary or secondary email addresses that conflict with the address you’re trying to add, here’s a workaround to this apparent bug in Google Groups.

Change the permissions on the Google Group manifesting this problem to allow people to apply to join the group :

"Manage"... "Permissions"... "Basic Permissions"... "Join the group" : "Anyone can ask"

Then have the user who you couldn’t add or invite, go to the Google Group and click the “Apply for membership” link. Then approve their Join Request and they’re in.

Afterwards, set the “Join the group” permissions back to “Only invited users” if that’s what you had before. Here’s where I reported this bug

I experienced this problem with two different Google Groups and three different users and was able to get them all added by this method.

How to make your own furniture safety straps

You can buy furniture safety strap kits for about $10 a kit which will secure one bookshelf. If you need to secure many bookshelves buying one kit per bookshelf becomes expensive. Here’s how to make your own furniture safety straps and save money. With the process described below I spent about $50 and was able to secure 16 bookshelves with materials left over.


Buying Materials

  1. Nylon webbing : Search ebay for Black 10 Yards Nylon Heavy Webbing Strap 1 inch. This should return a number of sellers that will ship direct from China. I got mine from the seller lwf_1963 for $6.50 with free shipping. You can search that specific seller’s listing of nylon webbing with this advanced search. If you can’t find any from that specific seller just use the search terms and look for a cheap and trustworthy Chinese seller. The requirements are that the webbing be 1 inch wide or greater and that it’s a long enough roll to produce the number of straps that you need. Each strap is about 9″ long, each bookshelf takes 2 straps so 10 yards will make straps for 20 bookshelves.
  2. Grommets : Search ebay for #1 Grommets Solid Brass 5/16" 100 Pack. I got mine from a seller that doesn’t appear to carry these anymore for $10.99 with free shipping. Specifically I got Tandy Leather brand grommets product number 1285-11. The requirements are that the grommets are #1 5/16″ grommets, where 5/16″ is the inner diameter and that it be a pack of enough grommets to do the number of bookshelves that you need. Each strap uses 3 grommets, each bookshelf uses 2 straps for a total of 6 grommets per bookshelf. A pack of 100 grommets will do 16 bookshelves.
  3. Grommet setter with anvil : You’ll need a grommet setter to attach the grommets to the nylon webbing. I got a 5/16″ Tandy Leather brand grommet setter product number 8097-03. I got this setter on ebay for $11.99 plus $2.13 shipping from ebay gwaynecraft2009 and you can see his listing for this with this advanced search. The only requirement of this setter is that it be designed for 5/16″ #1 grommets.
  4. Lag bolts : You’ll need one lag bolt for each strap or 2 lag bolts for each bookshelf. The lag bolts you’ll need are 1/4″ x 2″ full thread lag bolts, ideally with a hex head, ideally 3/8″ hex head. I used Spax Powerlags 1/4 x 2″ which I bought at Home Depot. You might be able to get away with a non-full-thread lag bolt if needed and you could go with 2.5″ long if needed. Looking online I should have ordered a box of lag bolts instead of buying them quantity 1 at Home Depot. Go to ebay and search for 1/4" x 2" lag bolt 50 and it looks like you can get a box of 50 for $10. You can also get lag bolts with washers which I didn’t do but might be beneficial. 50 lag bolts will do 25 bookshelves.
  5. Modified Truss Screw : The modified truss screw is what attaches the strap to the bookshelf. It’s a truss screw so that the had is large enough to cover the grommet opening. I used #8 x 3/4" Zinc #2 Phillips Modified Truss Screw. The screw size is #8 with a thread count of 15 or 18 (#8-15 or #8-18). The length of the screw is 3/4″ but this should be based on the thickness of the tops of your bookshelves so that the screw doesn’t penetrate all the way through but comes as close as possible. For me 3/4″ was a good length. The “#2 Phillips” is the size of phillips head that fits with the screw. You need 2 screws per strap and 2 straps per bookshelf for 4 screws per bookshelf. You can get a 100 pack for about $10 on ebay. Search ebay for modified truss #8 x 3/4"

Creating Straps

  1. From the spool of nylon webbing cut enough straps for your bookshelves. Cut each strap to be about 9″ long. The straps that come in the commercial packages are 15″ long but I find you don’t need that much length. If your bookshelves sit far from the wall or there is thick molding keeping them away from the wall you might need longer than 9″. In all of my cases 9″ was perfect.
  2. Take one of the straps and identify 3 points on the 9″ strap. One about an inch away from one end, one an inch away from the other end and one in the middle. At each of these 3 points, take a razor blade and cut/puncture a small x in the strap. The x should be in the center of the 1″ strap width. The lines of the x should be about 5/16″.
  3. Take the male part of the grommet and push it through the first x you’ve cut. If it doesn’t fit, cut the x lines longer so it will fit. Once it’s pushed through use your razor blade to cut around the outside of the barrel of the male grommet piece to get rid of some of the nylon webbing material. It will come off as black fuzz. Once you’ve removed enough nylon webbing so you can see most of the barrel of the male grommet piece use the grommet setter and a female grommet piece and a hammer to set the grommet in the nylon webbing. If you’ve not cut away enough nylon webbing you’ll see some of it sticking out of the grommet (which isn’t the end of the world). If you’ve cut away too much nylon webbing the grommet won’t be secure in the nylon webbing and may come loose. Repeat this for all 3 x holes.
  4. Repeat steps 2 and 3 until you have enough straps

Installing The Straps

  1. With the bookshelf against the wall mark where the top of the bookshelf comes to on the wall
  2. Move the bookshelf away from the wall
  3. Using a studfinder find studs that line up somewhere behind the bookshelf, you’ll need to find 2
  4. Make two marks on the wall for each stud that you found and make them an inch or two below where the top of the bookshelf came to on the wall.
  5. Drill a pilot hole in the two marks with a 3/16″ drill bit of about 2″ in length
  6. Place one of the straps on the wall so that the grommet hole on one end of the strap is centered over the pilot hole. Using a 3/8″ hex bit in your drill or electric screwdriver, and one of the 1/4″ x 2″ lag bolts, attach the strap to the wall with the lag bolt. As you get near to sinking the lag bolt flush against the strap and wall, turn the strap so instead of hanging down below where you’re screwing the bolt in, it’s sticking straight up above the lag bolt. Finish securing the lag bolt to the wall. Do the same for the other pilot hole. You now have two straps attached to studs with lag bolts drooping down over your lag bolts.
  7. Move the bookshelf back into place. As you do this either with your hand or a ruler or something, flip the drooping strap up so that it rests on top of the bookshelf.
  8. Get up on a stool or chair so you can get to the top of the bookshelf. You should see the two straps laying on top of the bookshelf. Ensure the bookshelf is in the correct lateral (side to side) position against the wall and that it is the correct distance from the wall that you want. Take the first strap and with it taught against the top of the bookshelf, using a #2 phillips bit and a screwdriver or drill, drill a modified truss screw through one of the two grommets visible on the strap on top of the bookshelf. Do the same thing with the second grommet. Repeat this with the second strap’s two grommets.
  9. Test your work by pulling on the bookshelf to see how much play it has, if it twists side to side at all when you pull it and how much force it can stand.

How to run Pro Tools First under Linux for free

Pro Tools First is a version of Avid Pro Tools which can be used for free. It’s limited in what it can do but for many applications is just fine. Pro Tools First and all of Avid’s line of digital audio software is create exclusively for Microsoft Windows and Apple Mac OSX, not for Linux. Pro Tools apparently doesn’t work in Wine.

Here’s how to run Pro Tools First under Linux using all free (as in beer) software. In my case I did this under Ubuntu 14.04 LTS but since there is no Linux package specific steps this should work on any major distro (e.g. RPM based CentOS systems).

  1. Download and install Oracle VirtualBox
  2. Download the Microsoft Windows 10 free virtual machine
  3. Download the Vista/Win7 (32/64 bits) Realtek AC’97 Driver which you’ll need to enable the VirtualBox virtual audio device in the Windows 10 guest
  4. Download the ASIO4ALL driver which will create a virtual audio device in the Windows 10 guest which Pro Tools First will recognize
  5. Import the Microsoft Windows 10 ova appliance that you downloaded into VirtualBox, creating a VirtualBox VM.
  6. Edit the settings of the newly created VirtualBox VM
    • Change the number of CPUs dedicated to the VM from 1 to some greater number. This depends on how many CPU cores your host computer has. I dedicated 4 of my 8 cores to the VM. If you don’t set this high enough you’ll hear crackling and skipping in your audio (though the crackling/skipping won’t end up in the recording)
    • Enable Audio support and chose the “AC97” audio driver, which should be the default.
    • Create a shared folder so that you can make the downloaded AC97 and ASIO4ALL drivers available to the Windows 10 guest
    • Maybe increase the video memory as mine started out with a value that was too low and VirtualBox complained. I don’t know that this step is required.
  7. Create a snapshot of your VM at this point, before your first boot but after tweaking the settings. I called mine “Before First Boot”. This is the snapshot you’ll go back to every 90 days as the Windows 10 license only works for 90 days.
  8. Start/Boot the Windows 10 VirtualBox VM
  9. Once it’s booted, reboot the VM with driver signature enforcement disabled by following these steps
    1. Click the Start menu and select Settings.
    2. Click Update and Security.
    3. Click on Recovery.
    4. Click Restart now under Advanced Startup.
    5. Click Troubleshoot.
    6. Click Advanced options.
    7. Click Startup Settings.
    8. Click on Restart.
    9. On the Startup Settings screen press 7 or F7 to disable driver signature enforcement.
  10. Set the display resolution of Windows to whatever you prefer as it defaults to 800×600 which is small
  11. Copy the AC97 drivers and ASIO4ALL drivers that you downloaded earlier from the shared folder to somewhere on the Windows 10 guest, for example the Desktop. Unzip the AC97 drivers into a folder.
  12. Open the Device Manager by running devmgmt.msc or searching for it in the Start menu
  13. Find the Multimedia device with the exclamation mark over it in Device Manager, this is your virtual sound card
  14. Right click the device to update the drivers
  15. Select drivers from your local computer
  16. Navigate to the folder with the downloaded AC97 drivers
  17. When prompted if you’d like to load the drivers even though they’re not digitally signed, choose Yes.
  18. This should remove the exclamation mark in Device Manager and your virtual sound card should be working. You can test this by clicking the volume slider or playing an audio file and confirming you hear sound.
  19. Install ASIO4ALL
    • If you forget this step you’ll see this error when you try to use Pro Tools First.
    • Here’s a video showing how to work around this error and force Pro Tools First to reprompt you to select the ASIO4ALL device.
  20. Download and install Pro Tools First
  21. Launch Pro Tools First to confirm that it recognizes the ASIO4ALL virtual sound card.
  22. Take a VirtualBox Snapshot now that you have a working setup.

At this point you have a working Pro Tools Firs installation under Linux. Because you’re using a test VM of Microsoft Windows 10, you’ll need to redo these steps every 3 months (90 days) as the Windows 10 OS will stop working when the license runs out.

Mozilla GitHub repository naming convention

I wanted to create a new GitHub repo in the Mozilla GitHub org and went searching for a document defining a naming convention for repository names. I didn’t find anything so I thought I’d look at what names people used and deduce a convention.

  • 928 (100%) Mozilla GitHub Repositories
  • 878 (95%) have no uppercase characters
  • 909 (98%) have no underscore character
  • 517 (56%) have a dash character

Looks like the convention is :

  • Use all lower case
  • Separate words with a dash character if needed

I used PyGitHub to query the GitHub API.

How to increase the session expiration time in Subsonic

Here’s how you can increase the length of a session in Subsonic from the default of 30 minutes to something longer. In this example I’m increasing it to 2 weeks (20160 minutes).

mkdir workspace
cd workspace
sudo cp /usr/share/subsonic/subsonic-booter-jar-with-dependencies.jar /usr/share/subsonic/subsonic-booter-jar-with-dependencies.jar.orig
unzip /usr/share/subsonic/subsonic-booter-jar-with-dependencies.jar
cat > webdefault.patch <<End-of-message
--- org/mortbay/jetty/webapp/webdefault.xml.orig  2014-06-11 10:06:12.000000000 -0700
+++ org/mortbay/jetty/webapp/webdefault.xml 2014-06-11 10:06:39.000000000 -0700
@@ -323,7 +323,7 @@

   <!-- ==================================================================== -->
-    <session-timeout>30</session-timeout>
+    <session-timeout>20160</session-timeout>

   <!-- ==================================================================== -->
patch -p0 webdefault.patch && rm webdefault.patch
sudo service subsonic stop
sudo zip -r /usr/share/subsonic/subsonic-booter-jar-with-dependencies.jar ./
sudo service subsonic start