Real Freedom

Worship power, you will end up feeling weak and afraid, and you will need ever more power over others to numb you to your own fear. Worship your intellect, being seen as smart, you will end up feeling stupid, a fraud, always on the verge of being found out. But the insidious thing about these forms of worship is not that they’re evil or sinful, it’s that they’re unconscious. They are default settings.

They’re the kind of worship you just gradually slip into, day after day, getting more and more selective about what you see and how you measure value without ever being fully aware that that’s what you’re doing.

And the so-called real world will not discourage you from operating on your default settings, because the so-called real world of men and money and power hums merrily along in a pool of fear and anger and frustration and craving and worship of self. Our own present culture has harnessed these forces in ways that have yielded extraordinary wealth and comfort and personal freedom. The freedom all to be lords of our tiny skull-sized kingdoms, alone at the center of all creation. This kind of freedom has much to recommend it. But of course there are all different kinds of freedom, and the kind that is most precious you will not hear much talk about much in the great outside world of wanting and achieving and [unintelligible — sounds like “displayal”]. The really important kind of freedom involves attention and awareness and discipline, and being able truly to care about other people and to sacrifice for them over and over in myriad petty, unsexy ways every day.

That is real freedom. That is being educated, and understanding how to think. The alternative is unconsciousness, the default setting, the rat race, the constant gnawing sense of having had, and lost, some infinite thing.

David Foster Wallace, Kenyon College commencement speech, 2005.

Logic Pro X Scripter Editor and Controls

Update: I have made this a top-level documentation page on my site. Go there for any updates on this content.

I have been noodling around with the Scripter plug-in in Apple’s Logic Pro X. It is very powerful but also very wonky. Apple has good documentation for it, but inconsistent between the ePub versus the website, though the website looks more complete. Much more can be gleaned from the example scripts, but even then there are behaviors that are not documented anywhere, and the code can be challenging to read if you have little to no experience with Javascript. This post aims to clarify how the Scripter Editor works, and what is expected by both the compiler and the user to build controls for a script.

The Editor

I’ll leave to Apple’s documentation an overview of the Scripter Editor and just dive into the undocumented and undesirable behaviors.

The editor itself, as a Javascript editor is barebones and has none of the features a developer would expect. There is no autocomplete, and formatting is wonky where indentation is inconsistently applied between tabs as 2 and 4 character widths.

Also (and probably worst of all), there are times when the editor will stop compiling to the UI. I was able to jumpstart the editor with a major code change, completely shutting off and reloading of the Scripter plug-in and desired script, and even having to escalate restarting Logic Pro X. The escalation seemed to be necessary more often when I doing a lot of Run Script actions to parse the code, but this wasn’t consistent enough to be hard fact.

There are a few keyboard shortcuts that are specific to the editor. The usual Cut, Copy, and Paste are all supported, but you must be careful you have the correct focus or else you will mistakenly make changes in your project. Beyond that, all other keyboard shortcuts are reserved for the Project window, and the Editor has only these left specific to it:

  • Increase text size: Shift+Option+”+”
  • Decrease text size: Control+Option+”-“

To save a script update, you must go back to the Scripter plug-in menu for that script and select “Save” in the main pulldown menu. Pressing Cmd+S will only save the Project, and that save will not include the Script.

I have to rant a little bit here and state that in spite of the power provided by the Scripter plug-in, the editor is by far the single worst editing tool I have ever used, and very surprising to come across something this poor of quality from Apple. I understand Scripter is deep in the recesses of an already niche and complex app (it’s not even listed on their marketing pages as a feature), but I have to imagine if Apple wants more widespread use of Scripter, then they have a lot of work to do with the editor to get more developers to engage with it.

Controls

Controls aren’t necessary to use Scripter, but they make life a whole lot easier than trying to tweak events in code. This section is a detailed examination of their requirements and behaviors. For each control the following information is provided for each property where relevant:

  • Property name.
  • Property Datatype.
  • Is the Property required by Scripter? For the type property, the actual string expected by Scripter is given, as opposed to just a description.
  • Notes detailing expected values, quirks, and limitations.
  • The return value as captured in the ParameterChanged function.

For the purposes of this post, assume in all of the example controls are being pushed to the API’s PluginParameters array upon initialization.

var PluginParameters = [];
PluginParameters.push({name:"Excelsior!", type:"text"});

Also, assume that all controls must have the following properties specified upon initialization:

Property Datatype Required Notes
name String Yes The String used for a given control must be unique for the entire script. Having two controls with the same name will have unexpected behaviors.
type String Yes Partially determines the type of control. Values possible are “lin”, “log”, “menu”, “checkbox”, and “text”. This list is not exhaustive to the types of controls possible. If a particular string is expected by the Scripter compiler, it will be noted in the “required” field.

Different types of controls have different requirements, but all must have those two (which will be called out in each of the listings anyway).

Linear Slider

The Linear Slider is the most obvious use case for affecting MIDI events, and is straightforward to use within the typical number ranges of MIDI: 0–12 chromatic notes, 0%–100%, 0–127 pitches, etc. However, some experimentation is required when working with higher ranges like 0–1000 milliseconds or ranges requiring very fine precision.

Property Datatype Required Notes
name String Yes The String used for a given control must be unique for the entire script. Having two controls with the same name will have unexpected behaviors.
type String “lin”
minValue Integer or Float No The minimum value for the slider. The script will not crash if no value is given, but two things will happen. Scripter will assign a value of 0.00 to the property, and an error will be thrown saying a value is missing. The integer or float can be signed.
maxValue Integer or Float No The maximum value for the slider. The script will not crash if no value is given, but two things will happen. Scripter will assign a value of 1.00 to the property, and an error will be thrown saying a value is missing. The integer or float can be signed.
defaultValue Integer or Float No The maximum value for the slider. The script will not crash if no value is given, but two things will happen. Scripter will assign a value of 0.00 to the property, and an error will be thrown saying a value is missing. The integer or float can be signed.
numberOfSteps Integer No The number of increments between minValue and maxValue. The script will not crash if no value is given, but two things will happen. Scripter will assign a value of 100 to the property, and an error will be thrown saying a value is missing.
unit String No A label shown next to the number in the control to give a unit description if desired. The script will not crash if no value is given, no default will be assigned, and no error will be thrown. Nothing in the provided string will affect the slider’s calculations or settings.
Return value Integer or Float

In general, the linear slider is fairly forgiving when it comes to missing values, but the actual values derived can be unexpected. While the UI will show an appropriate level of precision—tenths, hundredths, thousandths at most—the console reveals far finer precision that may not be useful.

Notes on numberOfSteps

No minValue and maxValue

When no values are given for the minValue, maxValue, and defaultValue properties, Scripter will assign values of 0.00, 1.00, and 0.00 respectively, with the slider incrementing between 0.00–1.00 by the hundredths. So, 0.42 can be a setting for the slider.

numberOfSteps exceeds the difference between minValue and maxValue

If the numberOfSteps value exceeds the difference between minValue and maxValue, then Scripter will divide maxValue by numberOfSteps and use the result for the incremental values, rounding up at certain times. How the control divides the steps is not entirely predictable.

For example, if a slider is set to use 0.00 for minValue, 1.00 for maxValue, and 300 for numberOfSteps, then only values divisible by 0.003 are selectable. Starting at 0.00 and incrementing up the selectable values are 0.000, 0.003, 0.006, 0.010, 0.013, 0.016, 0.020, and so on.

Another example, if a slider is set to use 0 for minValue, 100 for maxValue, and 1000 for numberOfSteps, then only values with a tenths precision are selectable. Starting at 0.000 and incrementing up with the up arrow, the selectable values are 0.000, 0.100, 0.200, 0.300, 0.400, 0.500, 0.600, and so on. However, when the actual slider control is moved to the right, then sometimes values jump to 0.399, 0.599, and so on.

In both cases, the console will output values that are typical floating point values:

2
1.899999976158142
1.8200000524520874
1.7400000095367432
1.6600000858306885
1.5800000429153442
1.5199999809265137
1.440000057220459
1.3799999952316284
1.3200000524520874
1.2600001096725464
1.2000000476837158
1.1400001049041748
1.100000023841858
1.040000081062317
1

Notes on minValue and maxValue

maxValue is less than minValue

If the maxValue is less than the minValue, then the control will behave as expected, moving from the left to right decreasing in value. For example, if a slider is set to use 1.00 for minValue, 0.00 for maxValue, then the slider goes down by the expected increment.

Examples

To create a percent slider set to 50%:

{name:"Linear Slider", type:"lin", unit:"%", minValue:0, maxValue:100, numberOfSteps:100, defaultValue:50}

To create a slider that selects between a range of -12–12, set to 0:

{name:"Linear Slider", type:"lin", minValue:-12, maxValue:12, numberOfSteps:24, defaultValue:00}

Logarithmic Slider

The Linear Slider is another use case for affecting MIDI events, but requires special considerations for its uses when working with number ranges involving very fine precision or negative numbers.

Property Datatype Required Notes
name String Yes The String used for a given control must be unique for the entire script. Having two controls with the same name will have unexpected behaviors.
type String “log”
minValue Unsigned Integer or Float No The minimum value for the slider. This must be a number greater than or equal to 1. If the value is less than 1, then Scripter automatically assigns it to a value of 1.0. The script will not crash if no value is given, but two things will happen. Scripter will assign a value of 1.00 to the property, and an error will be thrown saying a value is missing.
maxValue Unsigned Integer or Float No The maximum value for the slider. This must be a number greater than or equal to 1. If the value is less than 1, then Scripter automatically assigns it to a value of 1.0. The script will not crash if no value is given, but two things will happen. Scripter will assign a value of 1.00 to the property, and an error will be thrown saying a value is missing. The integer or float can be signed.
defaultValue Unsigned Integer or Float No The maximum value for the slider. The script will not crash if no value is given, but two things will happen. Scripter will assign the value as 1.0, and an error will be thrown saying a value is missing. The integer or float cannot be signed.
numberOfSteps Integer No The number of increments between minValue and maxValue. The script will not crash if no value is given, but two things will happen. Scripter will assign a value of 100 to the property, and an error will be thrown saying a value is missing.
unit String No A label shown next to the number in the control to give a unit description if desired. The script will not crash if no value is given, no default will be assigned, and no error will be thrown.
Return value Integer or Float

In general, the logarithmic slider is less forgiving than the linear slider.

Notes on numberOfSteps

No minValue and maxValue

When no values are given for the minValue, maxValue, and defaultValue properties, Scripter will assign values of 1.00, 1.00, and 1.00 respectively, with a value of 1.0 being given regardless of the slider’s position.

numberOfSteps exceeds the difference between minValue and maxValue

If the numberOfSteps value exceeds the difference between minValue and maxValue, then Scripter will maintain only a precision of hundredths in the UI, but the console will show far more precise values (typical floating point values). How the control divides the steps is not entirely predictable.

In all cases, the console will output values that are typical floating point values:

2
1.899999976158142
1.8200000524520874
1.7400000095367432
1.6600000858306885
1.5800000429153442
1.5199999809265137
1.440000057220459
1.3799999952316284
1.3200000524520874
1.2600001096725464
1.2000000476837158
1.1400001049041748
1.100000023841858
1.040000081062317
1

Pulldown Menu

Property Datatype Required Notes
name String Yes The String used for a given control must be unique for the entire script. Having two controls with the same name will have unexpected behaviors.
type String “menu”
valueStrings Array of Strings Yes An array of strings for the user to select in the pulldown menu. There does not appear to be an unreasonable limit to the number of strings. (I was able to add 1024 strings without any issue.)
defaultValue Unsigned Integer No A 0-based index value referencing one of the strings in the valueStrings array. If no number is given, or the value is out of the array bounds, then the first menu item (item 0) is selected.
Return value Integer that is the 0-based index of the item selected.

Examples

A pulldown menu with 3 items, and the last item set as the default

{name:"Pulldown Menu", type:"menu", valueStrings:["Item 0", "Item 1", "Item 2"], defaultValue:2}

Radio Buttons

Radio Buttons are a type of menu, with only two strings in the valueStrings array. If more than two items are added to the valueStrings array, then the menu automatically converts into a pulldown menu. Because of the two-item limit, radio buttons are really just a variation of the Checkbox control.

Property Datatype Required Notes
name String Yes The String used for a given control must be unique for the entire script. Having two controls with the same name will have unexpected behaviors.
type String “menu”
valueStrings Array of Strings Yes An array of two (2) strings for the user to select in the pulldown menu.
defaultValue Unsigned Integer No A 0-based index value referencing one of the strings in the valueStrings array, so 0 or 1. If no number is given, or the value is out of the array bounds, then the first menu item (item 0) is selected.
Return value Integer that is the 0-based index of the item selected.

Examples

A pair of radio button with “On” and “Off” labels.

{name:"Radio Buttons", type:"menu", valueStrings:["On", "Off"]}

Checkbox

Property Datatype Required Notes
name String Yes The String used for a given control must be unique for the entire script. Having two controls with the same name will have unexpected behaviors.
type String “checkbox”
defaultValue Unsigned Integer No Use 0 for unchecked or 1 for checked. If no number is given, or the value is out of the array bounds, then the checkbox is left unchecked.
Return value 0 for unchecked or 1 for checked.

Examples

A checkbox with the box set to be checked.

{name:"Checkbox", type:"checkbox", defaultValue:1}

Text Control

The text control is a simple label that is used to help organize controls in the interface. But the length of the label is very limited, so if you need to include a “Readme” or instructions, best to add those as comments or a separate text file to travel with the script.

Property Datatype Required Notes
name String Yes The String used for a given control must be unique for the entire script. Having two controls with the same name will have unexpected behaviors. The String has a visible limit of approximately 45 characters. This limit not set by the compiler, but instead by the physical layout of the control.
type String “text”
Return value None.

Examples


{name:"My Text Label Control", type:"text"}

My Open/Closed-Door Policy

At a recent leadership conference sponsored by my company, I received the following anonymous feedback:

“Philip has done an excellent job creating a safe, supportive, and creative environment for his team. This has happened, in no small part, because of Philip’s ‘open door’ policy, which is a philosophy Philip truly stands by. He is always accommodating when it comes to questions, concerns, problems, or just to lend an ear. His willingness to stop what he’s working on, and put his direct reports first, has helped build trust among the team, makes them feel valued, and sets a good example for his direct reports. This is something that all managers can aspire to.”

I was really happy to see this because this confirms pretty much all the things I have been hoping to achieve in terms of leadership: feeling trusted and valued by a manager. So, the question then becomes how to create that atmosphere of trust and value. I do my best to meet with individual team members weekly, and I have a few simple rules that guides my meetings with my team.

  • Meeting time is their time. I have a general framework for an agenda to give the meeting some focus—roadblocks, questions, development, goals review, and administrative topics—but the contents of each section are entirely up to them. There are usually one or two things I have to update on during the meeting, but their weekly update meeting is their meeting to run. This means the meeting can run as short or as long as needed. If they only need 20 minutes and need to get back to a critical project, fine. If they need 2 hours to dive deep into a topic, fine. We can break up the meeting if need be, and they don’t have to wait until the following week’s meeting to pair up again. They can reschedule if they need.
  • Everyone is allowed to make mistakes. This is not a new concept, but I do my best to view a mistake as a learning moment.  One caveat to this is I prefer to hear about the mistake from the team member themselves as opposed to someone from outside the team. When discussing projects, I’m okay with hedging bets. Let me know where you think you need some wiggle room, so there are no surprises. This is because if the team member admits to a mistake up front, or highlighted an area where something could go wrong, and did, then they are being both attentive and learning. This also means I own up to my own mistakes, and team members can call me out on them. I don’t take it personally because everyone makes mistakes. Correct me when I say something incorrect, even in meetings (especially in meetings; I am rarely the smartest person in the room).
  • If you don’t understand something, ask. I’m happy to explain. I love to whiteboard. Just be prepared to return the favor when asked.
  • Decisions are mutually justifiable wherever possible. I like consensus. I like open conversations where everyone understands all the facts revealed to them, and we all kick around what things mean until we all meet somewhere in the middle. I have found when we have worked through not just how things work but also why things work the way they do consensus is far easier and the solution understandable. There are times when my hand is forced by some external influence, or things just go off the rails, and I have to make a top-down decision. But that’s rare when I do I do my best to explain why I am making the decision I am. By that point, there shouldn’t be any surprises in how I think.
  • All meetings are confidential by default. I feel this is the most crucial element to my meetings, and is what makes my Open-Door Policy actually a Closed-Door Policy. There are obviously things we need to discuss with others to move projects along. But the dirty work of working through problems, answering questions in excruciating detail, all stays behind my closed door. It’s that simple.

Pro Tip

1 package of Brown Sugar & Cinnamon Pop Tarts is the caloric equivalent to 4 cans of Miller Lite.

That is all.

Newton

I believe that the clue to his mind is to be found in his unusual powers of continuous concentrated introspection. A case can be made out, as it also can with Descartes, for regarding him as an accomplished experimentalist. Nothing can be more charming than the tales of his mechanical contrivances when he was a boy. There are his telescopes and his optical experiments, These were essential accomplishments, part of his unequalled all-round technique, but not, I am sure, his peculiar gift, especially amongst his contemporaries. His peculiar gift was the power of holding continuously in his mind a purely mental problem until he had seen straight through it. I fancy his pre-eminence is due to his muscles of intuition being the strongest and most enduring with which a man has ever been gifted. Anyone who has ever attempted pure scientific or philosophical thought knows how one can hold a problem momentarily in one’s mind and apply all one’s powers of concentration to piercing through it, and how it will dissolve and escape and you find that what you are surveying is a blank. I believe that Newton could hold a problem in his mind for hours and days and weeks until it surrendered to him its secret. Then being a supreme mathematical technician he could dress it up, how you will, for purposes of exposition, but it was his intuition which was pre-eminently extraordinary – ‘so happy in his conjectures’, said De Morgan, ‘as to seem to know more than he could possibly have any means of proving’. The proofs, for what they are worth, were, as I have said, dressed up afterwards – they were not the instrument of discovery.

― John Maynard Keynes

This reminds me of this quote from Douglas Adams:

He attacked everything in life with a mix of extraordinary genius and naive incompetence, and it was often difficult to tell which was which.

I aspire to be both, though I think I’m more in the latter rather than the former.

The Paradox of Tolerance

Less well known is the paradox of tolerance: Unlimited tolerance must lead to the disappearance of tolerance. If we extend unlimited tolerance even to those who are intolerant, if we are not prepared to defend a tolerant society against the onslaught of the intolerant, then the tolerant will be destroyed, and tolerance with them. — In this formulation, I do not imply, for instance, that we should always suppress the utterance of intolerant philosophies; as long as we can counter them by rational argument and keep them in check by public opinion, suppression would certainly be unwise. But we should claim the right to suppress them if necessary even by force; for it may easily turn out that they are not prepared to meet us on the level of rational argument, but begin by denouncing all argument; they may forbid their followers to listen to rational argument, because it is deceptive, and teach them to answer arguments by the use of their fists or pistols. We should therefore claim, in the name of tolerance, the right not to tolerate the intolerant.

The Open Society and Its Enemies, Karl Popper, 1945

“A Charmingly Preposterous Icon of American Masculinity”

A great article from the Hollywood Reporter article, Critic’s Notebook: Burt Reynolds Was a Charmingly Preposterous Icon of American Masculinity:

Reynolds probably made more terrible movies than almost any other star of comparable stature, full of juvenile humor and casual locker-room sexism. But even in his preposterously bewigged and bushy-mustached prime, he always seemed to embody an uncomplicated, undiluted, effortlessly likable strain of American masculinity that was driven much more by sunny mischief than angsty machismo. Not for him the tortured histrionics of Brando or Pacino. To his credit, Reynolds never seemed to take anything too seriously. Certainly not his career choices, and especially not himself. . . “I don’t take myself seriously, and I think the ones that do, there’s some sickness with people like that.”

I always like Burt Reynolds for this very reason. He knew exactly who he was, a similar quality I see in other male actors like William Shatner. I’ve seen all of Burt Reynolds’ movies, and there aren’t very many actors I follow like that.

Then, there is this quote which caught me by surprise:

“The audience will always forgive you for being wrong and exciting,” he once said, “but never for being right and dull.”

This is applicable in so many other situations, even at work. Speaking from experience here.

XML and Search

Back in 1999–2000, I was working for a small, local compositor and doing some freelance graphic design.[1] Working at the compositor was good, if a bit of a grind. I liked the work, but I was trying to figure out how to get onto the publisher side of the equation, because that had more of a long-term future and a variety of career paths.

My mother was working at Pearson (now retired), and one day said to me, “You need to go learn XML. If you learn XML, you will never be out of a job.” What’s interesting about this moment is that my mother disputes two key facts.  First, she doesn’t recall ever having that conversation with me.  Second, she said that if we did have that conversation, she would have said “SGML,” not “XML.”

I swear she said “XML” but she must be right because I promptly went out and bought Practical SGML by Eric van Herwijnen.[2] Besides, we definitely had the conversation because at that time, I never would have come up with SGML on my own. I had never even heard of SGML before then. I was still stuck in Quark and managing the company’s server backups.

Either way, I practically inhaled that book. Pretty much everything made sense, both in terms of how it explains SGML and my own innate grasping of the concepts. Soon after reading the book, I tried playing with some of the concepts in the book with demonstrable success.  In 2001, I landed a job at a publisher based on my familiarity with XML through SGML.

There, I was able to demonstrate XML’s power in InDesign through building the company’s international catalog, saving a ton of time and error.  That work led to more technical projects, which in turn led to others, needing to learn new skills, and so on. All of which I leveraged to eventually pivoting my career from graph design into computer science, and opportunities which I found to be a lot more interesting to me. [3] Parallel to those efforts, Indian composition firms exploded in size, and a lot of domestic firms ended up being acquired or simply going out of business, including the one I was working for previously. Which of course means my mother was right that if I learned XML I would never be out of a job.

After working with XML for as long as I have, I understand the derision towards XML by the developer community at large. It’s just not the most exciting technology. It’s verbose, hardly human-readable beyond a low threshold of complexity, the development tools are usually esoteric and at times outright cryptic. Then there is the whole issue of working with schemas and DTDs, which have their own variant syntaxes. It’s not hard to master, but the surrounding environments allow you to get into all sorts of poorly-documented trouble.

But through all of those technical thickets is immense power and value by having all of that content semantically identified. XML is an exceedingly small portion of what I do today, but it is still foundational to what I do. These days, I am focused on building robust content search and re-use capabilities to meet a wide variety of business needs. XML lies at the core of those efforts because so much of that content is stored in XML or soon will be. Those semantics are what is going to drive so much search going forward, knowing what kind of content exists where, which makes it well worth the effort and reinforces its utility to me today.

If I had to say to someone what I thought the next big career skill would be, I would say learn how to search. Really understand how search tools like Google’s advanced search and using modifiers like “AND”, “OR”, and “site:”. I’ve been thinking about a quote I read by Chris Bolin where he wrote [4]…

“Make time. I bet the thing that makes you valuable is not your ability to Google something, but your ability to synthesize information. Do your research online, but create offline.”

I like that quote because it’s definitely true of my career these days, but the ability to search in any system, even Google, has been an immensely beneficial skill to have. Searching Google is not as frustrating when  you know there is just as much of a chance the answer you are looking for is a few pages into the search results, and new search terms may be revealed with a bit of research.

But, in addition to Google, esoteric wikis and content management systems just open up troves of information once I know the search modifiers. It may not be a publicly demonstrable skill like putting together that killer presentation, but the ability to research most any system for what you need is vital to coming to that solution.

——

[1] For those uninitiated in publishing, a compositor is a company that essentially builds books, taking manuscript, applying a design to it, and combining components to build a cohesive product. Most of this work in Adobe InDesign, but there are many other applications that do something similar, like LaTeX.

[2] https://www.springer.com/us/book/9780792306351

[3] Not that I didn’t like graphic design, but rather I found I was a lot better at programming than I was at graphic design. 

[4] Sorry, can’t find the original link.

Gödel, Escher, Bach

When I was in high school, a bunch of the honors English students had copies of Gödel, Escher, Bach: An Eternal Golden Braid by Douglas Hofstadter. They swore it was an awesome book. I was not an honors English student (I did terrible in high school) but I still hung around them because I was on the Speech and Debate team (one of the things I was actually really good at doing, and the only part of high school I genuinely enjoyed). I bought a copy because I figured they were on to something if they had all read it. Personally, I think some of them bought it because it looked cool in a nerdy sort of way and only claimed to have read it.. But I can’t criticize them for that because I bought it for the very same reason. Just by thumbing through it has an appealing pretentiousness. I found a copy for cheap at a used book store, and cracked it open.

I must have tried reading this book several times over the years, but I clearly was not equipped to read something like that (which spurned and fueled my doubts about most of the honors English students’ claims). I knew nothing of computer science and high-level mathematics, much less any formal knowledge of philosophy. I was still very much held onto the incorrect notion that much of philosophy was so much navel gazing about the universe. The book read like a foreign language to me. These were English sentences, but the words had little to meaning to me. So, I put it away, and did not open it again for another 30 years. Still, I lugged that thing around with a ton of other books I had, from apartment to apartment and even across the country, because it still has that nerdy cache that can be used to impress friends the way it was used to impress me (albeit falsely but I think we all do that one way or another).

Just recently, I was looking for a book for a friend in my personal library, and came across my copy of Gödel, Escher, Bach. I soon realized I was equipped with at least the rudimentary tools to approach this book, because when I graduated Harvard Extension, I walked away with a Computer Science concentration and Government minor, the latter being grounded in political philosophy, with some moral philosophy and logic thrown in for good measure, and with honors. So, I if I could tackle all of that, I could tackle this book.

Last night, I cracked it open one more time, read the overview, and all of it made sense. I decided right then I’m going to read it finally. It is clearly as pretentious as it appears, but I will have a good time with it all the same, just as I did hanging out with the honors English students while on the Speech and Debate team.

The Wisdom of Insecurity

Music is a delight because of its rhythm and flow. Yet the moment you arrest the flow and prolong a note or chord beyond its time, the rhythm is destroyed. Because life is likewise a flowing process, change and death are its necessary parts. To work for their exclusion is to work against life.

The Wisdom of Insecurity, Alan Watts, 1951