SSLError with Python 3.6.x on macOS Sierra


Have you ran into trouble with SSLErrors after upgrading to Python 3.6 on macOS Sierra?  For me, my first encounter was downloading the bokeh sample data (included here).

I finally got a chance to research exactly what was wrong.  Given that Python 3.5 was working on my machine and 3.6 was working on several linux machines, I thought that it could have been an issue with Python 3.6, unlikely as it may be.  After no bug fix version was released I realized that it must be my configuration.

Searching, I found one result related to this in the Python issue tracker: Issue 28150.  One answerer points out that Python on macOS no longer relies on Apple’s version of OpenSSL, instead it is shipped with a new one.  The gotcha: this new one does not have trust certificates installed.  All this is detailed in the Readme.

The Installer Readme

So, as the Python issue tracker mentioned, there is an entry in the installer readme.  Perhaps I should read these closer…

Certificate verification and OpenSSL

**NEW** This variant of Python 3.6 now includes its own private copy of OpenSSL 1.0.2.  Unlike previous releases, the deprecated Apple-supplied OpenSSL libraries are no longer used.  This also means that the trust certificates in system and user keychains managed by the Keychain Access application and the security command line utility are no longer used as defaults by the Python ssl module.  For 3.6.0, a sample command script is included in /Applications/Python 3.6 to install a curated bundle of default root certificates from the third-party certifi package (  If you choose to use certifi, you should consider subscribing to the project’s email update service to be notified when the certificate bundle is updated.

The bundled pip included with the Python 3.6 installer has its own default certificate store for verifying download connections.

Two Solutions

There are two solutions as mentioned:

  • Install the certifi package.
  • Run the download script provided with the installer – /Applications/Python 3.6/Install Certificates.command.

For myself, I ran the bundled script and everything seems to be functioning fine.  It seems more than a little odd that this was not done on installation.



Posted by Chad Dotson in Programming, Tips, 18 comments

Pip Installs From Github

Pip installs From github

Installing a package from github is fairly simple.  The following are examples of installing packages from github.


At some point, you will find yourself wanting to list a dependency in the requirements.txt file that resides on github.  This is fairly straight forward If you only plan to use it in requirements.txt (not processed for usage in  Note that I’ve specified the master branch of repo and given it a version id. and requirements.txt

Some people will process their requirements.txt files to generate the install_requires parameter for the setup function called in  This works fine until you have a repository on github.  Setup will fail to find your dependencies if your requirements.txt has a line like the one above.  To remedy this we must do two things.

  1. Parse the line to create a named python dependency for install requires. Given the file above, install_requires would equal ["repo==0.0.1"] .
  2. Specify the dependency_links argument to setup.  [""]  for this example.

An Example

This is an example of a that properly processes requirements.txt dependencies that are located on github.  It’s probably not complete, but it works for what I need.  Feel free to take and adapt.  See the repo here (python3).





Posted by Chad Dotson in Programming, Tips, 0 comments

July 8, 2016 Lightning

These are the first lightning photos in several months.  It was a good electrical storm but the lightning wasn’t so photogenic.

Posted by Chad Dotson in Misc, Photography, 0 comments

Raspberry Pi 3 Mini Cluster

I recently constructed a mini cluster consisting of 3 Raspberry Pi 3s.  I am planning on using these machines for various little projects.  I’ve installed some services on one of the nodes.  Currently that node hosts Redis and RabbitMQ instances.  I’m sure that I’ll have other services to install in the near future.  I may even use it to tinker with clustering those services.  Below are some pictures of the cluster as I was putting it together and a parts list.


Posted by Chad Dotson in Raspberry Pi, Technology, 0 comments

Odd Behavior in Python 2.7

I was tinkering around with replacing the print statement with the print function in a Python 2 script when I ran across this peculiar oddity.

Notice that sequence is just importing the future print function as different names in each iteration.  The oddity is that the first import fails but the third (which is exactly the same) succeeds after performing the second.

** Note: I don’t know if replacing print with the print from the futures module is a wise thing to do.  I was simply using it while trying out some code. **

Versions tested: Python 2.7.10 (OSX), Python 2.7.6 (Ubuntu 14.04).

Posted by Chad Dotson in Programming, 0 comments

Saving Console Messages in JavaScript

Have you ever encountered a situation where it would be beneficial to save whatever is written to the console across browser sessions?  If you have, you know there are not many solutions.  I recently decided that localStorage would be a good candidate to implement a solution to this problem with.


logsaver.js is a lightweight, simple log preservation script.  It utilizes the flexibility of JavaScript to replace the default console.log function with a new, customized one.  Along with writing messages to the original console.log, this custom console.log  also writes messages to the specified localStorage key.

  • To start saving console.log messages, call startSavingLog().
  • To stop saving console.log messages, call stopSavingLog().
  • To clear saved console.log messages, call clearSavedLog().
  • To completely remove the localStorage key used by logsaver, call removeSavedLog().

For more information on options and how to use them, checkout the readme.

While you can copy the source below, I strongly recommend grabbing the latest from github here: logsaver.js.


  • It doesn’t handle objects well.  Results in [Object object] appearing in the localStorage key value.  This is because localStorage is limited to strings.
  • It is possible to exceed the maximum space allocated to you in localStorage.  For desktop browsers, Chrome and Firefox have a 10 MB limit, while Safari and IE both have a 5 MB limit.  These number differs for mobile browsers.  More details.  In this event, logsaver.js will stop trying to save the log and display additional error messages in the console.

v0.1.0 Source

Posted by Chad Dotson in Doing Things Better, Misc, Programming, Software Engineering, Technology, Tips, 0 comments
Raspberry Pi 7″ Touchscreen Unboxing and Thoughts

Raspberry Pi 7″ Touchscreen Unboxing and Thoughts

This week I ordered and received the official Raspberry 7″ touchscreen ($60).  I’ve been tinkering with some ideas for it (some car based projects) and wanted it on hand to try out.

Opening the Box

The screen is packaged and presented really well.  It comes with all that you need to connect and power it from the Pi itself.  It comes with 4 screws to mount the Pi, the ribbon cable to connect it to the Pi’s DSI port, and 4 jumper wires, 2 of which are for powering the display on the Raspberry Pi 2 B+.  The other 2 are used when attaching the display to an older model A or B.

The Screen Itself

The screen itself seems really well made, I’m really impressed by it.  The LCD side seems pretty sturdy and the backside seems better than I would have expected.  Mine has a little give around the are the ribbons from the control board enter the LCD itself, but its nothing to complain about.

Connecting It All

In this case with the Raspberry Pi 2 B+, the screen connects easily via DSI ribbon and 2 jumpers to 5V and ground.  Once wired its an easy job to mount the Pi onto the screen.  In these pics you also see my cheap wifi and old keyboard dongle.  I think I will want to buy a good Bluetooth adapter and keyboard shortly.  I found a really need looking one here:

Up and Running

Once all connected, the Pi boots right up to the console.  At this point you need the external keyboard to actually login and run startx, unless you’ve already configured Raspbian to do so.  You will also need to install a virtual keyboard like Florence or Matchbox.

Using It

The biggest shortcoming is the need for a physical keyboard, like I mentioned in the preceding section, and it is probably the biggest drawback.  The out of the box touch features seems only to augment physical keyboard functionality.  That’s because unlike Android or iOS, the virtual keyboard isn’t dynamic, it is either always there or not.  I suppose that a custom interface would be more touch oriented.  The one oddity I have found is that counter to other touch screens, the hotspot for a touch seems off and to me it seems more exaggerated near the edges of the screen.  It’s not a show stopper, but takes some getting used to.

Overall Opinion

After getting it all hooked up, I found that it seems a bit clunky.  It left me wondering if a better solution isn’t just a raspberry pi running as a server and using a Android or iOS device as a head.  However, assuming you stick with the Raspberry driving its own display, a longer cable might be desirable, depending on your project.  In that case a regular HDMI touchscreen with usb connections might be the better fit.

The lack of good cases is also a problem.  Nothing I have found yet, fully encloses the pi and the display.  Coincidentally, I had an old project box laying around that seems to fit almost perfectly.  At 7.5″ x 4.3″, the Hammond 1591ESBK‘s dimensions are only a little shy of the actual dimensions of the displays bezel (less than 0.25″).  I’ll post new photos if / when I do that.

Other Resources:

Posted by Chad Dotson in Raspberry Pi, 0 comments