Some insight into women who voted for Trump.

“I think he’s a really good man, deep down. This guy has such potential, and I truly believe he cares about our country and wants to help everyone.”

Well, by everyone, you mean “those exactly like me.” Actually, how about “just me”.


“But I had an 8-year-old who was totally on the Trump train. He talked me into taking him to a Trump rally.”

It’s never too early to think about getting the youngsters into the Hitler Youth.


“Trump’s a successful businessman, and I feel like that’s what America needs to bring our economy back.”

Well, let’s just forget about the multiple bankruptcies and stiffing contractors.


“Benghazi. The emails. The I.R.S. She’s a liar.”

Thank goodness we elected a truth-teller. Right.


“Look at how much Trump hires women, how much he does rely on women, how much he relies on his own daughter. I’m sort of amazed by her. She may pull him more into the middle. She’ll be a good voice for women.”

A good voice for wealthy women of privilege.


“Driving to work yesterday, I saw three homeless people. They need our help.”

So taking away any hope of medical coverage is the best way to help people?

Trump distorted
“vicious neurotic,
blue blood coursing in black heart.
eyes piercing with lust.”
- Alan Duncan Trumpku #1

I’ve used Indigo home automation software for a few years. It’s a integrated home automation software environment for the Mac and its a solid stable and well-supported platform.

Within Indigo, it’s possible to script triggers and actions either AppleScript or Python. It’s funny - AppleScript often looks like the easier route to take. It looks more like plain English than Python. But as they say, looks are deceiving. Two bits of bad news put the nail in AppleScript’s coffin for me - as least with Indigo.

First, I kept encountering a nasty bug when trying to talk to the Indigo Server via AppleScript run outside of the Indigo environment. You can read all about it on the Indigo forums, but basically AppleScript complained that Indigo Server wasn’t running when it plainly was running. I’m not usually one for complex workarounds such as thus that were being discussed on the forums.[1] So, I began to give Python a consideration.

Then there’s the iffy status of AppleScript coming out of Cupertino. The recent departure of Apple’s head of Mac automation technologies and the fact that Apple dissolved the whole Mac automation team doesn’t bode well for AppleScript.

Setting up to talk to Indigo via the Indigo Plugin Host (IPH) and Python

To make it easier to address the indigohost which is buried ddep in the Application Support directory, you should just create an alias.

1
2
~|⇒ echo "alias indigohost='/Library/Application\ Support/Perceptive\ Automation/Indigo\ 7/IndigoPluginHost.app/Contents/MacOS/IndigoPluginHost'" >> ~/.zshrc
~|⇒ source ~/.zshrc

I happen to use zsh so your terminal environment may be different.

Now to try out the indigohost:

1
indigohost -e 'return indigo.devices.len()'

This should return the number of devices you have. Now you can script Indigo in Python both from within the Indigo client context and as an external application.

To run a Python application as a separate file, it’s just:

1
indigohost -x iphtest.py

Resources

Here are a few resources to get you started:

Good luck and have fun!


  1. For example, some users have reported that restarting the AppleEvents daemon with sudo killall -9 appleeventsd can somehow allow external AppleScript applications to address the Indigo Server. It didn't work for me.

namaste.jpg

In the wake of Donald Trump’s victory in the U.S. presidential election, Republicans are taking the opportunity to scold progressives about living in an echo chamber and failing to take a moment to sample thought patterns of the Right.

Well I did, but I came to the conclusion that most is still complete rubbish. In fact, according to Sturgeon’s Law, 90% of everything is crap. So don’t take it personally.

There are two problems with echo chambers. First they are chambers. Big walled-off areas that make it hard to hear the echoes from the adjacent chambers. To come to my own defence, I’ve peeked into the streams of my conservative friends. Sorry, you’re all great, but I don’t like what I see. One step beyond my immediate friends, I see rudeness, crudeness, profanity and little thoughtful analysis. Make a logical argument, bring evidence and I’ll listen. But “Lock that bitch up!”? What am I to do with that? Of course, the progressives have their own versions of the echo. But then there are the echoes themselves.

It’s the echoes that are bothering me mostly now.

The echoes have become a cacophony. Thoughts colliding against the walls, amplifying and distorting one another. It’s exhausting and anxiety provoking.

I’m trying something new. I’m dipping into the information stream on a need-to-know basis. Someone asks my opinion about the election of the U.S. president once every four years. And they ask about legislators on their own cycles. So I’ll check back on U.S. politics then. Seriously. Who is Trump going to pick for his Cabinet? Who will he nominate for the Supreme Court? I’m sure it’s all very fascinating. But I can’t do anything about it. And neither can you. Posting it on your FB feed. Liking this, liking that. It’s nothing. I’ll dip back into politics when I’m asked to vote. Otherwise what’s the point. Being informed? Being informed so that you can do what, exactly? So you participate in the Internet outrage du jour? FOMO?

Here’s my program:

  • I’m taking a week off all news and social media. Pushing the reset button.
  • I’ve deleted FB and Twitter from my phone. I’m not going anywhere. I haven’t resigned in protest. It’s just not helping me make better decisions.
  • I’ve deleted all bookmarks to news sites.
  • After a week, I’ll check back with FB. But my resolutions are:
    1. To spend no more that 10 minutes a day looking at FB.
    2. To log in to FB no more than once a day.
    3. To post something no more than once a week. Probably pictures of dogs, children, that sort of thing.
    4. To not post, like, or otherwise react to items of a political nature. Just to be clear, I still think Donald Trump is a neurotic pussy-grabbing clown, but now that you know that, we’re good.
  • For news sites, I’ll check back when I need to act on something and when I need more information in order to act. It’s all very interesting but I’m not sure what I’ll do with it.

I’m calling it goal-oriented news gathering.

Peace.

As I’ve mentioned before I use Anki extensively to memorize and practice Russian vocabulary. With language learning in particular, adding spoken pronunciations to the cards makes an enormous difference. Since I use Open Russian extensively to provide information to built my Anki cards, it’s a natural source of audio data, too. To optimize my learning time, I built two small scripts to grab and rename the audio files from the Open Russian site. First, I’ll describe my workflow.

My vocabulary workflow

Each morning, I pull 6 words from the a Russian word frequency list to add to my Anki deck. With each word, I use Open Russian to look up the complete definition, example sentences, syllabic stress, and other pieces of information that go on the flashcard. To facilitate OpenRussian.org opening in its own dedicate browser window, I built a Fluid application out of it. Having common workflow-related sites like this in their own dedication applications makes a lot of sense for task isolation.

Finally, for many words, I like to extract the audio from the site and add it to the card that I’m building. It turns out to be a cumbersome step because the audio doesn’t play in a QuickTime or other player that allows me to save the file. The source sound files can be downloaded from Shtooka but this is yet another step. This is where my enhanced workflow comes in.

What should the enhanced workflow do?

Optimally, I should be able to grab the URL that is displayed in the Open Russian Fluid application. Using the content of that page, I should be able to obtain the URL of the mp3 file for that word and save it to the desktop using the Russian word as the filename.

The solution

First is a Python application that grabs the URL from the Fluid app, extracts the audio file URL, and downloads it to the desktop.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/usr/bin/python
# -*- coding: utf-8 -*-

import re
import urllib2
import urlparse
from os.path import expanduser, normpath, basename, join

""" Obtain the URL from the OpenRussian application,
which is just a Fluid browser application.
If obtaining URL from Safari:
scpt = '''
tell application "Safari"
set theURL to URL of current tab of window 1
end tell'''
"""

def getOpenRussianURL():
from subprocess import Popen, PIPE


scpt = '''
tell application "OpenRussian"
set theURL to URL of browser window 1
end tell'''


p = p = Popen(['osascript'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate(scpt)
return stdout

""" Extract the audio file mp3 from
the content of the OpenRussian.org page.
"""

def audioURL(html):
m = re.search("<audio.+(http.+mp3)", html)
return m.group(1)

def saveMP3(url,path):
mp3file = urllib2.urlopen(url)
with open(path,'wb') as output:
output.write(mp3file.read())

""" Fetch mp3 to which aURL points and save
it to the Desktop using the word as the filename
"""

def fetchMP3(aURL):
response = urllib2.urlopen(aURL)
content = response.read()

url = audioURL(content)
path = join(expanduser("~"),'Desktop',basename(normpath(url)))
saveMP3(url, path)

url = getOpenRussianURL()
fetchMP3(url)

To make this even faster, I assigned the script to a Quicksilver keystroke trigger. It’s that simple. Once little twist that I discovered was that difficulty in launching a Python application from a Quicksilver trigger. Although there must be an easier way, I haven’t found it. Instead, I just wrote an AppleScript that runs the application in question and I used that as the triggered script in Quicksilver:

1
2
3
4
5
6
7
8
9
10
11
12
--
-- Created by: Alan Duncan
-- Created on: 2016-11-05
--
-- Copyright (c) 2016 Ojisan Seiuchi
-- All Rights Reserved
--

use AppleScript version "2.4" -- Yosemite (10.10) or later
use scripting additions

do shell script "/Users/alan/Documents/dev/scripts+tools/fetchOpenRussianMP3.py"

There may be a way to finish the process and add this to the Anki card in one step. I’ll have to work on that.


chameleon.jpg

You might be the subject of political pandering if:

  1. Fear, uncertainty, and doubt are the main tricks in the politician’s kit.

    A politician who never tires of scapegoating a feared group, or a feared outcome is undoubtedly pandering. Or a demagogue. Or both. Whether it’s Mexicans, or Jews, or Muslims, or gay people, they never seem to stop talking about why you should be afraid of someone or something.

    Or they intentionally raise doubts around the edges of established facts. Donald Trump, for example, continues to plant seeds of doubt about President Obama’s birthplace, years after proof has been established.

    The cure, of course, is to turn the doubt around 180° and ask for data and context. You aren’t likely to be mowed down by a Islamic extremist. You’re more likely to succumb to cardiovascular disease because you’re inactive, smoke, and don’t eat a proper diet. If a politician makes a claim without citing data, you should disregard what they say and look it up. Recently a jetliner crashed in the Mediterranean Sea enroute from Paris to Cairo. Within 24 hours, Trump was on record as saying the crash was an act of terror. Anyone with an ounce of sense knows that accident investigations are lengthy fact-gathering, hypothesis-testing, and data-analyzing procedures. Short-circuiting these fact-checking exercises is a timely and convenient tool of the panderer.

    The vaccine against pandering is readily available. It’s a vaccine of the mind. Read opposing points of view. Seek primary data. Understand how the branches of government work. Look for sources of bias. Be skeptical about everything. Every. Single. Thing.

  2. The politician appeals to commonality of religious belief

    Indisputably one of the foundational principles of the U.S. is religious liberty. The First Amendment explicitly protects free exercise of religious belief. But it also protects the integrity of government by ensuring that the government is not a tool of religion. The Establishment Clause is widely-understood to prevent the use of government through its authority to promote religious belief and practice.

    Religious belief is a private affair. Most religious groups gather in a communal practice but in an official sense, they are private, not public groups. Politicians who go out of their way to emphasize their religious affiliations are almost certainly pandering. Adherence to many different creeds brings people to do good things. We’re better off demanding to know exactly what a politician has done in the public sphere and what he or she intends to do in the future than about what church they attend.

    The panderer can also turn this sort of pandering around in the ugliest sort of way by scapegoating and denigrating particular religious groups. Sometimes, though, this isn’t pandering but honest hateful demagoguery.

    We should demand that politicians base their arguments in the broadest, most foundational terms. The proscription against baseless harm to others, for example, is common to practically all cultures. Let’s make sure that our appeals to goodness, fairness, and justice appeal to those ideals in human terms.

  3. There is an incoherence between stated positions and documented actions

    Honest people exhibit a coherence between what they say and what they do. They don’t go out of their way to create an image, let alone one that differs wildly from their easily observed actions. But panderers are crafty. With some, the gulf between their public works and their language is vast. Often there is even an incoherence between statements they make. Most of us in day-to-day conversation use language in such a way that our stated principles pervade our speech. Not so with the panderer where inconsistencies of all sorts abound.

  4. The politician claims to be misunderstood

    Occasionally the panderer is caught in an inconsistency. That’s the way deception works. The internet has a long memory. A common escape is to claim that he was misunderstood. It is more likely, however, that the message was simply shifting to suit the audience.

  5. If you really, really like a candidate

    There are some political candidates with whom we identify because of ideological similarities, or some other factor. Before committing to a candidate we should look again for opposing data-driven viewpoints, sources of bias, and other ways in which we might be influenced through personal appeal.

Pandering is a pervasive tool of the political trade. There’s also a fine line separating the genuine effort to put language into the right context for the audience from the purposeful manipulation of group through deception. By applying a few heuristics, panderers aren’t hard to uncover.

gun.jpg

The U.S. has become well-rehearsed in its response to mass shootings. An event. The pondering over terrorism vs. generalized craziness. The outpouring of prayers and support. Then the internet outrage. And more internet outrage. More meme pictures about guns and love. More color-your-profile picture trends. Empty scripted responses from pious politicians. A week or two, then back to our regularly scheduled programming.

News flash: this isn’t getting better. It’s not going to get better.

Why?

  1. We focus on single causal factors.

    It’s the guns. No, it’s evil people/crazy people/bad guys with guns. Stop with it. Just stop. Have you people never heard of the fallacy of the excluded middle? The false dilemma?

    Only a hair-splitting fool would claim that guns have nothing to do with a crime in which a gun was used to kill people. Likewise it takes a different kind of fool to claim that guns have everything to do with it. (Fortunately, there aren’t too many of the latter. But of the former…)

    We’re stand no chance of reducing these incidents if we don’t think systemically. (See, I didn’t say stopping these incidents.)

  2. As a species, our default programming seems to make us conflate mythology with truth.

    This is the part that everyone is too polite to do. The simpleton nationalists grab their giant brush and paint every Muslim a terrorist. The liberals claim make the equally ridiculous claim that Islam is the religion of peace. Remember that fallacy of the excluded middle? How about Islam is the religion of both peace and violence?

    The problem isn’t Islam. It’s the conflation of mythology with truth. Remember there was a time when people were dead serious about Zeus up there on Mt. Olympus hurling lightning bolts? It wasn’t a mythology back then. It was the real deal. Now it’s a new “real deal.” It’s a new improved monotheistic flavor of Zeus and his buddies toying with us.

    Most of us are too polite to say it. Here’s the questions we should be asking: “What do you claim?”, “How, exactly do you know that?”, “Do you have any corroborating evidence?”, “On what grounds do your claims create an exception to the general prohibition against harm to others?” We ought to be willing to say: “Gee, that sounds an awful lot like nonsense to me. Perhaps you’d be willing to explain that logically to me.” The Trumpsters go astray by attacking people. People are just instances of a bigger problem.

    Our recorded history is just too short to see a lot of evolution on this front. Maybe in another 10,000 years or so.

  3. Gun ownership is baked into the U.S. Constitution.

    This is a tough nut to crack because the weapons of choice for mass killers are a coddled, protected entity in the U.S. And for some reason, we can’t admit in large enough numbers that like the entire Constitution, the Second Amendment is purposely ambiguous.[1] It’s ambiguous because the authors of the Constitution imagined we would sit down and have reasonable debates and compromise over some foundational principle. But we can’t get beyond “Ban all guns.” and “There should be no restrictions on gun ownership.”

    We worship the Founders like secular heroes. But I’m calling the Second Amendment a bone-head move on their part. No, I’m not for banning guns in the U.S. There’s a giant middle ground here. And no, dear conspiracy theorists, High Priests of the NRA, and other lunatics, Obama’s not coming for your guns.

So let the grief turn to internet outrage. Let the impotent internet outrage turn to nothing. I’ve lost my idealism about any of this. I’m not changing my Facebook picture. I’m not posting any meme pictures of politicians saying stuff about guns or terrorists. It’s all empty.


  1. Perhaps you don't agree that it's ambiguous. Then what does the "a well-regulated militia" have to do with private gun ownership?

Environment Canada

Indigo is a well-known home automation controller software package for Mac OS X. I’ve written a plugin for Indigo 6 that allows you to create a virtual weather station from Environment Canada data. If you live in Canada, this will be a useful way of using weather data in your Indigo rules. For example, you could use wind and temperature data to adjust your irrigation schedule.

You can download the plugin from its git repo. After downloading the files, you’ll just need to configure them as a plugin. To do this, create a new folder and rename it EC.indigoPlugin. Copy the Contents folder that you just downloaded. Right-click on the EC.indigoPlugin bundle and Show Package Contents. Paste the Contents folder here. To install in Indigo, double-click the bundle file.

I manage a handful of websites, like this one. Having built a few on other platforms, such as Drupal, I’m familiar with the dreaded error “The website encountered an unexpected error. Please try again later.” On sites that I don’t check on frequently, it can be an embarrassment when people begin emailing you with questions about the site being down.

I wrote the following Python script to deal with the problem:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/python

import urllib
from subprocess import Popen, PIPE

RECIPIENT = "your.recipient@me.com"
URL_TO_CHECK = "http://www.example.com"
ERR_MSG = "Your website is down."

def sendMessage(message):
scpt = '''
tell application "Messages" to send "{0}" to buddy "{1}" of (service 1 whose service type is iMessage)
'''.format(message,RECIPIENT)

args = []
p = Popen(['osascript', '-'] + args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate(scpt)

try:
fh = urllib.urlopen(URL_TO_CHECK)
except IOError:
sendMessage(ERR_MSG)
else:
# handle database type errors from Drupal sites
site_content = fh.read()
target_str = "The website encountered an unexpected error. Please try again later."
if site_content.find(target_str) != -1:
sendMessage(ERR_MSG)
else:
print "No error"

I run this as a scheduled job using launchd and as long as I have a Messages-capable device with me, I’ll get notifications of issues with the site.