Clearing the Adobe ExtendScript ToolKit Console Window

February 27, 2014

While creating a new JavaScript to automate some day-job Photoshop work, I gave Adobe's ExtendScript Toolkit a spin. It's designed specifically for building scripts for Adobe products and it's pretty nice. Especially the JavaScript Console window that makes it nice and easy to see debugging messages.

ExtendScript ToolKit windows.

By default, this window doesn't clear itself before each run which degrades a lot of its value. It can be cleared manually before the start of each test run, but that's a pain. The good news is there's a way to do it with code. If the script is run from ExtendScript Toolkit itself, this snippet of code will do it:

app.clc();

Unfortunately, that same code causes Photoshop to choke which defeats the purpose. The first solution I came up with to get around this is to check to make sure the script was being run in ExtendScript ToolKit before making the call.

if (app.name === "ExtendScript Toolkit") { 
  app.clc(); 
}

This clears the console when run in ExtendScript ToolKit but not Photoshop. Useful for early stage development but resulting in having to fall back to manually clearing after each Photoshop run. After some digging through the "Interapplication Communication with Scripts" chapter of the "JavaScript Tools Guide CS6" docs, I came up with this:

if (app.name === "ExtendScript Toolkit") { 
  app.clc(); 
}
else {
  var estApp= BridgeTalk.getSpecifier("estoolkit");
  if(estApp) {
    var bt = new BridgeTalk;
    bt.target = estApp;
    bt.body = "app.clc()";
    bt.send();
  }
}

This code checks to see if the script is being run from ExtendScript Toolkit. If so, it clears the console natively. If the script is being run in another app (e.g. Photoshop), it attempts to send the clear message to ExtendScript Toolkit.

An alternate way to clear the console would be to use the Cmd+Shift+C hot-key combo, but I'd much rather let the script do it for me.


As a matter of fact, I do own a laser gun

February 01, 2014

Laser + Trigger = Laser Gun

Though I've had it for a while, it only just occurred to me that I own a laser gun. Ten year old me would be so very impressed. At least, until I mentioned it doesn't vaporize targets. Just measures their surface temperature.

Still: I OWN A LASER GUN!


BCS Picks at Work

December 21, 2013

Folks are work are making picks for who will win the BCS Championship game. Guess which one is mine.


An Event Apart 2013 (San Francisco) Links

December 14, 2013

The San Francisco instance of the An Event Apart 2013 conference is in the books. An overwhelming amount of great, up-to-the-minute information on web design and development was shared. This post contains the links I compiled for future reference. Since an oft repeated theme of the conference is that we should all make an effort to share knowledge, I'm posting them here for posterities sake.

[Note to attendees: Yes. About 95% of the conference was focused on responsive design. No. This site is not responsive. Someday, I'll fix that. But if I waited until that happened, I'd never get anything posted.]

###Speakers

###The Links

This collection was built by running a script over the URLs I bookmarked. The source of the HTML returned was parsed. The text form the HTML <title> tag was used for the link. The content from the <meta name="description"> tag was used for the follow up description. Lots of sites didn't have the meta tag which is why several links don't have follow up descriptions. It's interesting to me to see how sites are treating those two tags.


Jekyll Date Formatting Examples

Posted: October 01, 2013 - Updated: November 29, 2013

###Summary (tl;dr)

These examples provide tested code snippets for displaying several date formats on a Jekyll site1. They should also work on GitHub Pages, Shopify or anything else that uses Liquid. An alternate title for this post should be:

Everything you wanted to know about Jekyll date formatting but were afraid to ask.


###Overview

Jekyll2 (the simple, blog aware, static website generator) uses Shopify's Liquid Template Engine3. Displaying dates is done using the "{{ page.date }}" supplied Liquid tag4. With no other alteration, the dates produced look something like:

2013-11-29 00:00:00 +0000

If there are designs that use that format, they are few and far between. Creating friendlier looking dates is done by applying Liquid's "date:" filter. For example, the tag/filter combination:

{{ page.date | date: '%B %d, %Y' }}

produces more reader friendly dates like:

November 29, 2013

Much better, but depending on the date, subtle design issues show up. For example, during the first nine days of each month "leading zeros" crop up (e.g. "August 03, 2013" instead of "August 3, 2013"). Other gotchas with the basic Liquid filters include:

  1. Adding a period behind the abbreviated month names has to be adjusted to handle May. For example, "Aug. 16, 2013" is fine. "May. 16, 2013" is not.
  2. September is generally abbreviated "Sept." instead of Liquid's default "Sep."
  3. To comply with the AP style guide the months April, May, June and July should not be abbreviated. Similar alterations are necessary to meet with the guidelines from the Chicago Manual of Style.

Most designs go with the available defaults. Either using a format that doesn't have these issues or, more frequently, letting the details slip. The information still gets across and every web site has a punch list of potential modifications that stretches to the horizon. So, I understand putting off finding a solution, but not having proper date formatting has always bugged me. While solving the issue for myself5, I decided to put together this post as a public reference as well. I don't yet have the Ruby chops to contribute directly to Jekyll, but I can provide this reference to give back a little at least.

This set of Liquid date filters solves the issues listed above and explores a few other formatting options. Each one provides a solution for a specific display format and is provided with four output examples for the following date: 1) May 3, 2013, 2) July 4, 2013, 3) September 23, 2013 and 4) November 26, 2013. These examples demonstrate if/how the various formatting issues are handled. After the examples, a few snippets of code for individual elements are provided. With these samples, just about any date format desired should be within easy reach.


###Built-in Jekyll Date Filters

  • Date to String

    {{ page.date | date_to_string }}
    

    Output Example 1: 03 May 2013
    Output Example 2: 04 Jul 2013
    Output Example 3: 23 Sep 2013
    Output Example 4: 26 Nov 2013

  • Date to Long String

    {{ page.date | date_to_long_string }}
    

    Output Example 1: 03 May 2013
    Output Example 2: 04 July 2013
    Output Example 3: 23 September 2013
    Output Example 4: 26 November 2013

  • Date to XML Schema

    {{ page.date | date_to_xmlschema }}
    

    Output Example 1: 2013-05-03T13:14:00+00:00
    Output Example 2: 2013-07-04T13:14:00+00:00
    Output Example 3: 2013-09-23T13:14:00+00:00
    Output Example 4: 2013-11-26T13:14:00+00:00

  • Date to RFC-822

    {{ page.date | date_to_rfc822 }}
    

    Output Example 1: Fri, 03 May 2013 13:14:00 +0000
    Output Example 2: Thu, 04 Jul 2013 13:14:00 +0000
    Output Example 3: Mon, 23 Sep 2013 13:14:00 +0000
    Output Example 4: Tue, 26 Nov 2013 13:14:00 +0000

###Liquid Jekyll Date Formatting Examples

  • ISO 8601 Date5

    {{ page.date | date: "%Y-%m-%d" }}
    

    Output Example 1: 2013-05-03
    Output Example 2: 2013-07-04
    Output Example 3: 2013-09-23
    Output Example 4: 2013-11-26

  • U.S. Numeric Style with Four Digit Years (With leading zeros.)

    {{ page.date | date: "%m/%d/%Y" }}
    

    Output Example 1: 05/03/2013
    Output Example 2: 07/04/2013
    Output Example 3: 09/23/2013
    Output Example 4: 11/26/2013

  • U.S. Numeric Style with Four Digit Years (Leading zeros removed.)

    {{ page.date | date: "%-m/%-d/%Y" }}
    

    Output Example 1: 5/3/2013
    Output Example 2: 7/4/2013
    Output Example 3: 9/23/2013
    Output Example 4: 11/26/2013

  • U.S. Numeric Style with Two Digit Year (Leading zeros removed.)

    {{ page.date | date: "%-m/%-d/%y"}}
    

    Output Example 1: 5/3/13
    Output Example 2: 7/4/13
    Output Example 3: 9/23/13
    Output Example 4: 11/26/13

  • Outside U.S. Style with Full Month Name (Leading zeros removed.)

    {{ page.date | date: "%-d %B %Y"}}
    

    Output Example 1: 3 May 2013
    Output Example 2: 4 July 2013
    Output Example 3: 23 September 2013
    Output Example 4: 26 November 2013

  • Outside U.S. Style with Non-English Full Month Name (Leading zeros removed.)

    This example uses the German names for months. Any other language can be used by simply substituting the proper names for each month.

    <!-- Whitespace added for readability -->
    {% assign m = page.date | date: "%-m" %}
    {{ page.date | date: "%-d" }}
    {% case m %}
      {% when '1' %}Januar
      {% when '2' %}Februar
      {% when '3' %}M&auml;rz
      {% when '4' %}April
      {% when '5' %}Mai
      {% when '6' %}Juni
      {% when '7' %}Juli
      {% when '8' %}August
      {% when '9' %}September
      {% when '10' %}Oktober
      {% when '11' %}November
      {% when '12' %}Dezember
    {% endcase %}
    {{ page.date | date: "%Y" }}
    

    Output Example 1: 3 Mai 2013
    Output Example 2: 4 Juli 2013
    Output Example 3: 23 September 2013
    Output Example 4: 26 November 2013

  • U.S. Style with Full Month Name (Leading zeros removed.)

    {{ page.date | date: "%B %-d, %Y" }}
    

    Output Example 1: May 3, 2013
    Output Example 2: July 4, 2013
    Output Example 3: September 23, 2013
    Output Example 4: November 26, 2013

  • U.S. Style with Full Month Names and Ordinalized Days (Leading zeros removed.)

    <!-- Whitespace added for readability -->
    {% assign d = page.date | date: "%-d"  %}
    {{ page.date | date: "%B" }} 
    {% case d %}
      {% when '1' or '21' or '31' %}{{ d }}st
      {% when '2' or '22' %}{{ d }}nd
      {% when '3' or '23' %}{{ d }}rd
      {% else %}{{ d }}th
      {% endcase %}, 
    {{ page.date | date: "%Y" }}
    

    Output Example 1: May 3rd, 2013
    Output Example 2: July 4th, 2013
    Output Example 3: September 23rd, 2013
    Output Example 4: November 26th, 2013

  • U.S. Style with AP Month Abbreviations and Ordinalized Days (Leading zeros removed.)

    <!-- Whitespace added for readability -->
    {% assign d = page.date | date: "%-d" %} 
    {% assign m = page.date | date: "%B" %} 
    
    {% case m %}
      {% when 'April' or 'May' or 'June' or 'July' %}{{ m }}
      {% when 'September' %}Sept.
      {% else %}{{ page.date | date: "%b" }}.
      {% endcase %}
    {% case d %}
      {% when '1' or '21' or '31' %}{{ d }}st
      {% when '2' or '22' %}{{ d }}nd
      {% when '3' or '23' %}{{ d }}rd
      {% else %}{{ d }}th
      {% endcase %}, 
    {{ page.date | date: "%Y" }}
    

    Output Example 1: May 3rd, 2013
    Output Example 2: July 4th, 2013
    Output Example 3: Sept. 23rd, 2013
    Output Example 4: Nov. 26th, 2013

  • U.S. Style Full Day and Full Month Names (Leading zeros removed.)

    {{ page.date | date: "%A, %B %-d, %Y" }}
    

    Output Example 1: Friday, May 3, 2013
    Output Example 2: Thursday, July 4, 2013
    Output Example 3: Monday, September 23, 2013
    Output Example 4: Tuesday, November 26, 2013

  • Chicago Manual of Style Day Abbreviations and U.S. Style Date (With "Thurs." and "Tues.")

    <!-- Whitespace added for readability -->
    {% assign dy = page.date | date: "%a" %}
    {% case dy %}
      {% when "Tue" %}Tues
      {% when "Thu" %}Thurs
      {% else %}{{ dy }}
      {% endcase %}. 
    ~
    {{ page.date | date: "%B" }} 
    {{ page.date | date: "%-d" }}, 
    {{ page.date | date: "%Y" }}
    

    Output Example 1: Fri. ~ May 3, 2013
    Output Example 2: Thurs. ~ July 4, 2013
    Output Example 3: Mon. ~ September 23, 2013
    Output Example 4: Tues. ~ November 26, 2013

###Individual Component Snippets for Liquid Date Formatting

These individual snippets are for a few of the tricker formatting filters. Some that weren't used in the examples above. For those interested in the approach, the hack I'm using to remove leading zeros is to add "0" to the string. This turns the string into an integer. When the integer is rendered back as a string the leading zero disappears. Hurray for dynamic typing.

  • Numeric Month with Leading Zeros Removed

    {{ page.date | date: "%-m" }}
    
  • Numeric Day with Leading Zeros Removed

    {{ page.date | date: "%-d" }}
    
  • Ordinalized Numeric Day with Leading Zeros Removed

    {% assign d = page.date | date: "%-d" %}
    {% case d %}
      {% when '1' or '21' or '31' %}{{ d }}st
      {% when '2' or '22' %}{{ d }}nd
      {% when '3' or '23' %}{{ d }}rd
      {% else %}{{ d }}th
      {% endcase %}
    
  • AP Style Month Abbreviations

    {% assign m = page.date | date: "%B" %}
    {% case m %}
      {% when 'April' or 'May' or 'June' or 'July' %}{{ m }}
      {% when 'September' %}Sept.
      {% else %}{{ page.date | date: "%b" }}.
      {% endcase %}
    

    (Produces: "Jan.", "Feb.", "Mar.", "April", "May", "June", "July", "Aug.", "Sept.", "Oct.", "Nov.", "Dec.")

  • Chicago Manual of Style Day Abbreviations

    {% assign dy = page.date | date: "%a" %}
    {% case dy %}
      {% when "Tue" %}Tues
      {% when "Thu" %}Thurs
      {% else %}{{ dy }}
      {% endcase %}.
    

    (Produces: "Sun.", "Mon.", "Tues.", "Wed.", "Thurs.", "Fri.", "Sat.")

  • Chicago Manual of Style Month Abbreviations

    {% assign m = page.date | date: "%B" %}
    {% case m %}
      {% when 'May' or June' or 'July' %}{{ m }}
      {% when 'September' %}Sept.
      {% else %}{{ page.date | date: "%b" }}.
      {% endcase %}
    

    (Produces: "Jan.", "Feb.", "Mar.", "Apr.", "May", "June", "July", "Aug.", "Sept.", "Oct.", "Nov.", "Dec.")

  • Non-English Month Names

    {% assign m = page.date | date: "%-m" %}
    {% case m %}
      {% when '1' %}Januar
      {% when '2' %}Februar
      {% when '3' %}M&auml;rz
      {% when '4' %}April
      {% when '5' %}Mai
      {% when '6' %}Juni
      {% when '7' %}Juli
      {% when '8' %}August
      {% when '9' %}September
      {% when '10' %}Oktober
      {% when '11' %}November
      {% when '12' %}Dezember
    {% endcase %}
    

    (Produces: "Januar", "Febuar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember")

With that, you should be in pretty good shape. If you can't directly create what you need from the above samples or snippets you should at least be able to use a similar approach to piece together what you need.


Notes on the Examples

  1. The hour, minute and second parts of the full date/time stamp aren't being used because Jekyll tends to zero them out.
  2. In some of the examples, the code is split to multiple lines to help readability. If it's a natural break point where white space already exists, this won't effect HTML rendering. In some cases, it will introduce unwanted white space. Simply move everything back to one line to create the desired presentation.
  3. Since the original version of this post went up, updates have been made to use the cleaner version of {{ page.date | date: "%-m" }} instead of {{ page.date | date: "%m" | plus:'0' }} and {{ page.date | date: "%-d" }} instead of {{ page.date | date: "%d" | plus:'0' }} to remove leading zeros.
  4. An additional update was made to add an example for non-English month names.

Footnotes

  1. These examples were create on a Mac running OS X 10.8.5 with: Ruby 2.0.0p247 - Jekyll 1.2.1 - liquid 2.5.2. Your mileage may vary.
  2. The main Jekyll website provides a great overview of the software. You can learn even more with a visit to the Jekyll's GitHub Repo.
  3. Shopify's Liquid template engine. "A small and fast template language which is quick to learn but very powerful for full customization."
  4. The Liquid Date Filter offers some basic formatting elements and is the basis of these code snippets. Note that in some cases "post.date" might be required instead of "page.date".
  5. Observant readers will notice that as of the time this post went live, my design still uses a date format with leading zeros. I have the solution, it just hasn't been implement yet. It'll go in with the next set of design changes.
  6. ISO 8601 - "Data elements and interchange formats - Information interchange - Representation of dates and times is an international standard covering the exchange of date and time-related data." A perfect example of how Time really is wibbly wobbly timey wimey… stuff.

A Contingency Speech for the First Moon Landing

November 09, 2013

Spoiler Alert: This post contains spoilers for seasons four and five of The West Wing. (Of course, those season are a decade old. So, you're probably safe to proceed at this point regardless.)


A favorite piece from the The West Wing1 is when Toby (a speech writer) is asked to draft two speeches regarding the kidnapping of the President's daughter. When asked, "Why two?" his response is, "One if they find her alive, one if they don't." President Bartlet likes the second one more and uses it (with a few modifications) when his daughter is rescued alive.

A real life example of a presidential contingency speech is found in a July 18, 1969 memo2 from speechwriter William Safire3. It was to be used by President Nixon if a problem with the Apollo 11 mission stranded the astronauts during the first moon landing. A potentially heart-wrenching circumstance where they would still be alive but doomed to die of suffocation as their air ran out.

The speech was written as follows:


IN EVENT OF MOON DISASTER:

Fate has ordained that the men who went to the moon to explore in peace will stay on the moon to rest in peace.

These brave men, Neil Armstrong and Edwin Aldrin, know that there is no hope for their recovery. But they also know that there is hope for mankind in their sacrifice.

These two men are laying down their lies in mankind's most noble goal: the search for truth and understanding.

They will be mourned by their families and friends; they will be mourned by their nation; they will be mourned by the people of the world; they will be mourned by a Mother Earth that dared send two of her sons into the unknown.

In their exploration, they stirred the people of the world to feel as one; in their sacrifice, they bind more tightly the brotherhood of man.

In ancient days, men looked at starts and saw their heroes in the constellations. In modern times, we do much the same, but our heroes are epic men of flesh and blood.

Others will follow, and surely find their way home. Man's search will not be denied. But these men were the first, and they will remain the foremost in our hearts.

For every human being who looks up at the moon in the nights to come will know that there is some corner of another world that is forever mankind.

A beautiful speech that was, thankfully, never heard.

In addition to the text of the speech, the memo also contains these notes:

PRIOR TO THE PRESIDENT'S STATEMENT:

The President should telephone each of the windows-to-be.

AFTER THE PRESIDENT'S STATEMENT, AT THE POINT WHEN NASA ENDS COMMUNICATIONS WITH THE MEN:

A clergyman should adopt the same procedure as a burial at sea, commending their souls to "the deepest of the deep," concluding with the Lord's Prayer.


I heard about this speech from episode 59 of Roderick On The Line4. The mention comes in a section where the hosts (Merlin Mann and John Roderick) are discussing just how amazing NASA's Human Space Flight program is. During the conversation, Merlin makes on of the best statements about humans launching into space that I've ever heard. He says:

You can attach dynamite to anything and send it somewhere, but for it to come back and be able to hug its kids is still, to this day, completely mind blowing.

I couldn't agree more. The fact that way more often then not contingency speeches are only found in archives of undelivered texts is another testament to the amazing things we can make and do.




Footnotes

  1. The West Wing - One of those great shows of the "if you happen to flip past an episode and it's a marathon you're automatically in for the long haul" variety. Also, if you want to get an idea of how important the acting and direction are for a show, check out the script for one of the episodes about having two drafts of the speech. Just reading the words on the page I would not have thought the episode would be as compelling as it is.
  2. The In Event of Moon Disaster page on the National Archives site has a link to the PDF of the scan of the actual memo. This reminds me that there was a time when writers were one of the few set of people who typed on keyboards for a living. It's worth it to take a look at the scan.
  3. William Lewis Safire - Born: December 17, 1929. Died: September 27, 2009. According to Wikipedia: he was an American author, columnist, journalist, and presidential speechwriter. I'll remember him as the first write I saw use the term "widows-to-be" that I hope never to have to hear again.
  4. I listen to a lot of podcasts. Most are either about coding, business or marketing. Roderick on the Line is one of the few outside those genres. It is also one of my overall favorites. It's basically two intelligent people talking about a variety of interesting things while avoiding news headlines. Highly recommended if you're into that type of thing.

Geek Desk Color Change

September 30, 2013

I have two Geek Desks1. One at the house. Another at the office. I'm a huge fan. Using them to get off my ass for at least a bit each day has been nice. The cumulative effect has been profound. I no longer feel like I'm slowly turning into a slug.

My only regret is going with "silver" (i.e. gray) instead of black for the house desk. That choice has bugged me ever since. I picked the better option when I bought the one for the office. Of course, that increased the annoyance with the gray one sitting at home.

While replacing the flooring at the house, I realized I had am opportunity to address this. With everything moved out of the room and not caring about the soon-to-be-removed carpet, a few cans of spray paint were all that was needed.

Initial Geek Desk look with gray legs.

Black is the new gray.

Much better.

It's not quite a "complete solution." The internal sections of the legs that move to do the actual raising and lowering are lubricated. Covering them in paint seemed a poor choice. So, they remain the same old gray.

They've mostly been painted. Mostly.

When the desk is raised, this can be seen from a distance, but it's not noticeable when actually at the desk. That works out just fine.

I highly recommend an automatic, adjustable, sitting/standing desk (a la Geek Desk) for anyone who spends the majority of their workday at a computer. It's a great way to help reverse the slow slide to slugdom. Just make sure to go with the black legs to save yourself some hassle.


Footnotes

  1. Geek Desk - The powered sitting/standing height adjustment desks with a name that speaks to me.

BSoD

September 26, 2013

Looking for some entertainment? Leave a BSoD visual joke up in a conference room.


Go To Index Page: 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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106


© Alan W. Smith
RSS Feed