<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>Rorohiko</title><description>Kris Coppieters' blog</description><managingEditor>noreply@blogger.com (Kris Coppieters)</managingEditor><pubDate>Sun, 4 Jan 2026 15:24:14 -0800</pubDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">35</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><link>http://rorohiko.blogspot.com/</link><language>en-us</language><itunes:explicit>no</itunes:explicit><copyright>(c) Rorohiko Ltd.</copyright><itunes:image href="http://www.rorohiko.com/logo.png"/><itunes:keywords>printing,prepress,automation,InDesign,Adobe,CS,CS2,CS3,Rorohiko,plug,in,plugin,software,consultancy,design,desktop,publishing,PDF,Acrobat,XPress,QuarkXPress,XTension</itunes:keywords><itunes:summary>Automation for printing and prepress. Opinions, musings and ideas.</itunes:summary><itunes:subtitle>Automation for Printing and Prepress</itunes:subtitle><itunes:category text="Technology"/><itunes:category text="Arts"><itunes:category text="Design"/></itunes:category><itunes:category text="Education"><itunes:category text="Training"/></itunes:category><itunes:category text="Technology"><itunes:category text="Software How-To"/></itunes:category><itunes:author>Kris Coppieters</itunes:author><itunes:owner><itunes:email>kris@rorohiko.com</itunes:email><itunes:name>Kris Coppieters</itunes:name></itunes:owner><item><title>What I did in my holidays...</title><link>http://rorohiko.blogspot.com/2014/01/what-i-did-in-my-holidays.html</link><pubDate>Sat, 11 Jan 2014 14:09:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-531670970756599625</guid><description>Bumped into this web site:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://codility.com/"&gt;http://codility.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
It's a web site where they test coders, and every so often, they offer a public challenge you can use to hone your algorithm-design and coding skills.&lt;br /&gt;
&lt;br /&gt;
These are great brain-teasers, and I had tremendous fun solving the challenges - I did the last one of 2013 and the new one of 2014 that was just released.
&lt;br /&gt;
&lt;br /&gt;
And I managed to get some badges!&lt;br /&gt;
&lt;br /&gt;
&lt;iframe height="75" src="http://www.codility.com//cert/badge/cert96WKWD-3XR7667DUG9H9BJ7/" width="125"&gt;
   &lt;a href="http://www.codility.com//cert/view/cert96WKWD-3XR7667DUG9H9BJ7/"&gt;Codility badge&lt;/a&gt;
   &lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe height="75" src="http://www.codility.com//cert/badge/certRE98R4-AXU2MPG85EFSCNF3/" width="125"&gt;
   &lt;a href="http://www.codility.com//cert/view/certRE98R4-AXU2MPG85EFSCNF3/"&gt;Codility badge&lt;/a&gt;
   &lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Warning: the challenges are not trivial, and it's one of those 'cannot let it go' things: once you click 'Challenge yourself', you'll find yourself hooked!</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>Adobe CC. From selling assets to selling consumables.</title><link>http://rorohiko.blogspot.com/2013/05/adobe-cc-from-selling-assets-to-selling.html</link><pubDate>Mon, 13 May 2013 13:20:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-7087609049844630579</guid><description>Adobe recently made a massive switch: they switched from being a tool vendor to becoming a reseller of consumables. The Adobe CC is treated like a consumable (like electricity, petrol, toilet paper, air travel,...), whereas the Adobe CS was treated like an asset (like a chisel, a car, a house...).&lt;br /&gt;
&lt;br /&gt;
The question on my mind is: if I look at companies selling consumables, how much innovation do I see? How much innovation is for the benefit of the consumer?&lt;br /&gt;
&lt;br /&gt;
If I look at companies&amp;nbsp;selling consumables from&amp;nbsp;a monopoly situation, how much innovation do I see?&lt;br /&gt;
&lt;br /&gt;
It'll be interesting to compare the amount of R&amp;amp;D in asset companies vs consumable companies.&lt;br /&gt;
&lt;br /&gt;
Interesting times ahead!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>ExtendScript Toolkit Unbearably Slow?</title><link>http://rorohiko.blogspot.com/2013/04/extendscript-toolkit-unbearably-slow.html</link><pubDate>Sun, 7 Apr 2013 13:07:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-7139510558672524668</guid><description>&lt;br /&gt;
ExtendScript Toolkit Slowness&lt;br /&gt;
&lt;br /&gt;
Note added 9-May-2017: in addition to the issues outlined below, another, now common, reason for slowness of ESTK on Macs is the 'app nap'. Background apps on Mac 'fall asleep' and become really slow (to save energy). If ESTK is talking to InDesign and InDesign falls asleep, things get really slow. Quickly switching back and forth to InDesign, then back to ESTK wakes them up. On CS6 you can disable App Nap as a 'Get Info' property on the ESTK and InDesign applications in the Finder. For CC and higher, no quick fixes. I have turned off App Nap on ESTK and InDesign CS6, and I use CS6 for script development when I need ESTK.&lt;br /&gt;
&lt;br /&gt;
Recently, I was working on a fairly large script-based solution for Adobe InDesign.&lt;br /&gt;
Things progressed well, and the script was growing at a rapid pace.&lt;br /&gt;
For small tasks, I tend to write scripts more in a procedural, ad-hoc manner. For more complex tasks, I will normally define some formal object model with object classes, methods, getters, setters, inheritance,...&lt;br /&gt;
In this particular case, the system was teetering between the two realms, and it was clear I'd need to go for a formal object-oriented approach some time later, as the complexity started to increase.&lt;br /&gt;
But as I was still testing the waters and getting my head around the many aspects of the solution, I had decided not to start on an object model and a class architecture until things had become better defined. Often, with these projects, I go through a ping-pong process with the users and other stakeholders, and valuable information only emerges after a few initial prototypes have been tried out 'in real life'.&lt;br /&gt;
Because the script had to serve as a go-between InDesign and an outside system with a wide API (Application Programming Interface), I had a growing collection of symbolic constants, each representing some kind of 'magical' value for the outside system's API.&lt;br /&gt;
All was well: the solution grew, and gradually more and more functionality became available; users were impressed.&lt;br /&gt;
Speed and responsiveness were great, even when massive amounts of data were being chewed on.&lt;br /&gt;
ExtendScript, despite being an interpreted language, is amazingly fast if you know how to treat it correctly.&lt;br /&gt;
Until suddenly some unexpected issue came out of the blue: for some reason, ExtendScript Toolkit became unbearably slow.&lt;br /&gt;
At first I thought it was one of those unexplicable things that come and go. So I restarted my Mac, reset the preferences, created a brand new user account and tried that way, switched to another Mac. All to no avail.&lt;br /&gt;
Simply trying to run the script in ExtendScript Toolkit almost immediately caused the colored pizza to appear and everything ran like molasses.&lt;br /&gt;
Running the script straight from the InDesign Scripts palette worked fine. It was only when the ExtendScript Toolkit got involved that things got really slow.&lt;br /&gt;
Initially, it was still somewhat bearable. Having to wait a few minutes just to inspect a variable is annoying, but you can grit your teeth and wait it out. But things got out of control very rapidly: a few hours later, the minute-long waits had become half-hour waits.&lt;br /&gt;
Run, breakpoint, colored pizza for 30 minutes. Run, breakpoint, colored pizza for 30 minutes...&lt;br /&gt;
Ok, this lobster had enough: the water in the pot was becoming too hot, and something had to be done. I started to investigate.&lt;br /&gt;
I used the Mac's Activity Monitor to sample the ExtendScript Toolkit process, and found that the ExtendScript toolkit was working very hard. Some poking and prodding revealed that nearly all that hard work was related to the Data Browser element in the ExtendScript Toolkit.&lt;br /&gt;
Eventually, I figured out it had to do with the quantity of constants and variables I had created in the global variable space. The Data Browser had trouble displaying all those elements. If I closed the Data Browser, ExtendScript Toolkit's speed became normal.&lt;br /&gt;
For what little info I was able to glean from my poking around, I suspect the Data Browser has an extremely inefficient lookup buried somewhere inside its code: it looks like it has many levels of nested linear lookups, and as more elements start populating the global variable space, things get exponentially (or worse than exponentially) slower.&lt;br /&gt;
So, I had to refactor my code earlier than expected - and that fixed the issue. The main change was that instead of something like:&lt;br /&gt;
&lt;br /&gt;
const kExternalSys_BoldAttribute &amp;nbsp; = 0x0001;&lt;br /&gt;
const kExternalSys_ItalicAttribute = 0x0002;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
and so on, thousands of those, I made it into:&lt;br /&gt;
&lt;br /&gt;
var kCST =&lt;br /&gt;
{&lt;br /&gt;
ExternalSys_BoldAttribute: &amp;nbsp; 0x0001,&lt;br /&gt;
ExternalSys_ItalicAttribute: 0x0002&lt;br /&gt;
...&lt;br /&gt;
};&lt;br /&gt;
And instead of referring to kWordSys_BoldAttribute, I now referred to kKCST.WordSys_BoldAttribute and so on.&lt;br /&gt;
I further reduced the footprint in the global space by making the script fully object oriented, with nearly all functions as methods attached to object classes, rather than having gobs of globally defined functions.&lt;br /&gt;
And now it's all fine again!&lt;br /&gt;
So, the morale: keep the global variable space as empty as possible, or ExtendScript Toolkit will get ya!&lt;br /&gt;
&lt;br /&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>GetURLs.jsx - access HTTP content from InDesign ExtendScript</title><link>http://rorohiko.blogspot.com/2013/01/geturlsjsx.html</link><pubDate>Wed, 2 Jan 2013 10:49:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-7273388523595121706</guid><description>Note added 9-May-2017: I've revisited GetURL and made a more modern version. More info here:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://coppieters.nz/?p=133"&gt;http://coppieters.nz/?p=133&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
In 2008, I created a sample InDesign ExtendScript called &lt;i&gt;GetURLs.jsx&lt;/i&gt;. &lt;i&gt;GetURLs.jsx&lt;/i&gt; is a limited http client; it allows you to fetch http URLs straight from an InDesign ExtendScript. &lt;br /&gt;
I used the script as sample material to demonstrate a programming technique (state machines).&lt;br /&gt;
It turned out the script was quite popular in its own right; I've been adding little tweaks to it over time.&lt;br /&gt;
The latest version has been enhanced to handle redirections (when the server returns a status code &lt;i&gt;HTTP 1.0/301 Moved Permanently&lt;/i&gt;). Hope it works for you!&lt;br /&gt;
&lt;br /&gt;
The original blog post is here:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://rorohiko.blogspot.co.nz/2008_07_01_archive.html"&gt;http://rorohiko.blogspot.co.nz/2008_07_01_archive.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
and the download link is here:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.rorohiko.com/podcast/geturl.zip"&gt;http://www.rorohiko.com/podcast/geturl.zip&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Cheers,&lt;br /&gt;
&lt;br /&gt;
Kris</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author><enclosure length="624229" type="application/zip" url="http://www.rorohiko.com/podcast/geturl.zip"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>Note added 9-May-2017: I've revisited GetURL and made a more modern version. More info here: http://coppieters.nz/?p=133 ---- In 2008, I created a sample InDesign ExtendScript called GetURLs.jsx. GetURLs.jsx is a limited http client; it allows you to fetch http URLs straight from an InDesign ExtendScript. I used the script as sample material to demonstrate a programming technique (state machines). It turned out the script was quite popular in its own right; I've been adding little tweaks to it over time. The latest version has been enhanced to handle redirections (when the server returns a status code HTTP 1.0/301 Moved Permanently). Hope it works for you! The original blog post is here: http://rorohiko.blogspot.co.nz/2008_07_01_archive.html and the download link is here: http://www.rorohiko.com/podcast/geturl.zip Cheers, Kris</itunes:subtitle><itunes:author>Kris Coppieters</itunes:author><itunes:summary>Note added 9-May-2017: I've revisited GetURL and made a more modern version. More info here: http://coppieters.nz/?p=133 ---- In 2008, I created a sample InDesign ExtendScript called GetURLs.jsx. GetURLs.jsx is a limited http client; it allows you to fetch http URLs straight from an InDesign ExtendScript. I used the script as sample material to demonstrate a programming technique (state machines). It turned out the script was quite popular in its own right; I've been adding little tweaks to it over time. The latest version has been enhanced to handle redirections (when the server returns a status code HTTP 1.0/301 Moved Permanently). Hope it works for you! The original blog post is here: http://rorohiko.blogspot.co.nz/2008_07_01_archive.html and the download link is here: http://www.rorohiko.com/podcast/geturl.zip Cheers, Kris</itunes:summary><itunes:keywords>printing,prepress,automation,InDesign,Adobe,CS,CS2,CS3,Rorohiko,plug,in,plugin,software,consultancy,design,desktop,publishing,PDF,Acrobat,XPress,QuarkXPress,XTension</itunes:keywords></item><item><title>Fun with Arduino - how to get into assembler programming.</title><link>http://rorohiko.blogspot.com/2012/12/fun-with-arduino.html</link><pubDate>Thu, 6 Dec 2012 01:44:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-8912547807136962184</guid><description>I am having fun with an Arduino Uno. I am old school; I started with a TRS-80 in the late 1970's, did a lot of Z80 assembly language. My computer had a massive memory (for the time) of 16KB, so in order to wring out a bit more, assembler was the way to go.&lt;br /&gt;
&lt;br /&gt;
Gotta say, this Arduino brings back a lot of memories.&lt;br /&gt;
&lt;br /&gt;
I bought a few tutorial kits (e.g. an Arduino Uno), and by the looks of it, the Arduino has a lot of similarities with my first computer, but it's a bit more powerful.&lt;br /&gt;
&lt;br /&gt;
Its clock is 16MHz (my TRS-80 was 1.7MHz).&lt;br /&gt;
Its memory is 32KB Flash + 2KB SRAM + 1KB EEPROM (my TRS-80 had 16KB SRAM + 12KB ROM. And cassette tapes for storage)&lt;br /&gt;
It uses an 8-bit CPU (so did my TRS-80, which used a Z80).&lt;br /&gt;
Turns out that the Arduino IDE uses C++ as its 'main language' (that was Level 2 Basic on my TRS-80).&lt;br /&gt;
&lt;br /&gt;
(And yes, these are KB - Kilobytes. Not Tera, not Giga, not Mega. Kilo. 1KB being 1024 Bytes. I still find it strange how, in 1978, I thought 16KB was unimaginably large, whereas nowadays 16KB in unimaginably small. My MacBook Pro has 8GB SRAM, more than 500,000 times what my TRS-80 had. Wow. That still flabbergasts me.)&lt;br /&gt;
&lt;br /&gt;
The Arduino IDE is cool and all that, but feels kind of wasteful, so I set out on a quest to do some assembler programming on the Arduino.&lt;br /&gt;
&lt;br /&gt;
Turns out that a lot of effort seems to have gone into discouraging doing this. There is a lot of 'magic' going on, and the Arduino IDE hides a lot of complexity from view. With good reason; there is often no need to look beyond the magic. One can opt to just accept it, and it works perfectly fine.&lt;br /&gt;
&lt;br /&gt;
But I like to understand how it all works; dig into the magic, take it apart, and figure out how it works. I've always found that if you understand the magic, you can make better use of it.&lt;br /&gt;
&lt;br /&gt;
I am pretty sure that most of my future Arduino (or Pinguino or Uno32; I bought one each of those too!) exploits will be using mostly, if not exclusively C/C++, but my first experiments are aimed at understanding how to do assembler programming.&lt;br /&gt;
&lt;br /&gt;
I had to do a lot of fishing around to get enough info: lots and lots of little tidbits here and there, but no real 'how to get started' cookbook. So I decided to put the tidbits together in a wee dokuwiki page, and make it as complete as possible, in the hopes that someone else finds it useful.&lt;br /&gt;
&lt;br /&gt;
While searching, often all I am looking for are a few good, complete examples, and that gets me going.&lt;br /&gt;
&lt;br /&gt;
The&amp;nbsp;dokuwiki&amp;nbsp;page below is an attempt to help other people get going, by offering complete, working examples.&lt;br /&gt;
&lt;br /&gt;
I tried to cover all the necessary steps, from patching up your IDE to accept assembly source code down to some increasingly advanced sample assembler programs.&lt;br /&gt;
&lt;br /&gt;
There are some things I've skimmed over (e.g. I assume you know how to set up a Java development environment on your computer).&lt;br /&gt;
&lt;br /&gt;
So, here goes. In case you're looking to get started with Arduino and assembler, here are my 'useful tidbits', for what they're worth:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://rwf.co/dokuwiki/doku.php?id=smallcpus"&gt;http://rwf.co/dokuwiki/doku.php?id=smallcpus&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If you want more detail for particular things, let me know. If I can find the time, I'll write additional instructions if needed.&lt;br /&gt;
&lt;br /&gt;
Cheers,&lt;br /&gt;
&lt;br /&gt;
Kris</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>How to Use DropBox More Efficiently</title><link>http://rorohiko.blogspot.com/2011/12/how-to-use-dropbox-more-efficiently.html</link><pubDate>Thu, 29 Dec 2011 00:42:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-8653439384823569377</guid><description>Lately, we've started to use DropBox more and more. Initially, we used it mainly as a tool to keep multiple workstations and laptops synchronized, as well as a means to quickly provide someone a downloadable link to a file without having to fumble about with FTP or WebDAV or other complicated things.&lt;br /&gt;
&lt;br /&gt;
Then we started using the shared folders more and more.&lt;br /&gt;
&lt;br /&gt;
As we nearly always work together with other people and companies scattered all over the globe, DropBox is a godsend: we set up a shared folder, and that's it. Through DropBox, a distributed workgroup can easily share a bunch of files.&lt;br /&gt;
&lt;br /&gt;
But sharing wildly with all kinds of partners created a small problem. How does one keep track of all these shared folders in DropBox. Which is shared with who? Of course, one can go find out via the DropBox web site, but that's not really a quick thing.&lt;br /&gt;
&lt;br /&gt;
So, now we've started to use specific names for the DropBox folders. If a DropBox folder is shared between two parties, we refer to it as a 'tunnel', and we append the name of the two sharing parties.&lt;br /&gt;
&lt;br /&gt;
If we were regularly working together with a company called, say, 'Ynapmoc', I'd use a folder called 'Tunnel_Ynapmoc_Rorohiko' or 'Tunnel_Rorohiko_Ynapmoc'.&amp;nbsp;Often we tend to work on multiple projects with our partners, and we use the tunnel for shuttling shared documents between us.&lt;br /&gt;
&lt;br /&gt;
If a DropBox folder is shared between more than two parties, we would instead create a new folder for each individual project, and simply use the word 'Shared' followed by the name of the project. So, if we were working with, say, three parties on a project called, say, 'Terces', the folder would be called 'Shared_Terces'.&lt;br /&gt;
&lt;br /&gt;
My DropBox folder now looks a lot better organized, and I can tell immediately what each shared folder is meant for.&lt;br /&gt;
&lt;br /&gt;
If you get a request to share a dropbox folder with a name that starts with 'Tunnel_...' you'll know what that means!&lt;br /&gt;
&lt;br /&gt;
Cheers,&lt;br /&gt;
&lt;br /&gt;
Kris</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>Mac OS X Lion - how to get Unicode back on your Character Viewer.</title><link>http://rorohiko.blogspot.com/2011/11/i-am-using-lion-where-is-my-trusted.html</link><pubDate>Tue, 15 Nov 2011 12:00:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-1367631446496457889</guid><description>One handy little tool I use all the time in Mac OS X is the Characters Palette which I can access via the menu bar.&lt;br /&gt;
&lt;br /&gt;
You enable it by going to the System Preferences - Keyboard, and ticking 'Show Keyboard &amp;amp; Character Viewers in menu bar'.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5NzNY88SrD5aTfHq6fdHFERSOCbcSROYOYJAAvcArL1ppV2G6MVayu3ij0_v12qc8Mg9QA5_t40VCcMdkJgK0BUfIVVxnbWYxRPl-blk0ufIYvyQfdDQ7laEfY-Iwj-4cgpvA3P-gvJY/s1600/Screen+Shot+2011-11-16+at+8.40.17+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="285" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5NzNY88SrD5aTfHq6fdHFERSOCbcSROYOYJAAvcArL1ppV2G6MVayu3ij0_v12qc8Mg9QA5_t40VCcMdkJgK0BUfIVVxnbWYxRPl-blk0ufIYvyQfdDQ7laEfY-Iwj-4cgpvA3P-gvJY/s320/Screen+Shot+2011-11-16+at+8.40.17+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I've upgraded to Lion a wee while back, and had not needed the characters palette - but recently I wanted to have a quick look at some Unicode character codes. I brought up the characters palette via the menu bar:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrQ_kDnM3J63GnpgMtO7KM1J022TGLSbEBhCggD6z-UTiTkQBLDETfM4JHOgehcGh6wd3PVpgN3PpTIEysaBZ88qFSQmB8SywmzDg0usWxl4uEW9csOway0kfxhy_3ez7JsfAqeZa0dAw/s1600/Screen+Shot+2011-11-16+at+8.44.34+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrQ_kDnM3J63GnpgMtO7KM1J022TGLSbEBhCggD6z-UTiTkQBLDETfM4JHOgehcGh6wd3PVpgN3PpTIEysaBZ88qFSQmB8SywmzDg0usWxl4uEW9csOway0kfxhy_3ez7JsfAqeZa0dAw/s1600/Screen+Shot+2011-11-16+at+8.44.34+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;But the resulting palette seemed to be quite spartan and bare and the familiar Unicode table just was not there.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU6R0VJ_wSJrWcArrRziDjhijQCkG0LnZayFKYkViQrR8Kq59R2qyOBaDeEIcWh0pg2woLucDhr4e7OJYYpTttAsZjP6PBNpOu3SDUoycnl0G-TVyIbQrZYYV408HcR-QilJ__vS-lorY/s1600/Screen+Shot+2011-11-16+at+8.49.18+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU6R0VJ_wSJrWcArrRziDjhijQCkG0LnZayFKYkViQrR8Kq59R2qyOBaDeEIcWh0pg2woLucDhr4e7OJYYpTttAsZjP6PBNpOu3SDUoycnl0G-TVyIbQrZYYV408HcR-QilJ__vS-lorY/s320/Screen+Shot+2011-11-16+at+8.49.18+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="" style="clear: both; text-align: left;"&gt;Turns out: the Unicode table is still there, but you need to turn it on first. Click on the settings button, and select 'Customize List...'.&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfGFAX7rSEHW888RGRi1UDZlPlQse-7VvTllht9E3rGVVH8MMzdFRIRj-_ZTutberIDAQvv0KHNpdI2JwgpkHnlYRlnZm6myeqM-mcmEpzXlFAZhhHHBm7ixytPiKw522HqJ24OP8AF_s/s1600/Screen+Shot+2011-11-16+at+8.49.36+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfGFAX7rSEHW888RGRi1UDZlPlQse-7VvTllht9E3rGVVH8MMzdFRIRj-_ZTutberIDAQvv0KHNpdI2JwgpkHnlYRlnZm6myeqM-mcmEpzXlFAZhhHHBm7ixytPiKw522HqJ24OP8AF_s/s320/Screen+Shot+2011-11-16+at+8.49.36+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&amp;nbsp;Then scroll all the way down until you see 'Code Tables'. Click the disclosure triangle and tick the checkbox for Unicode.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfGFAX7rSEHW888RGRi1UDZlPlQse-7VvTllht9E3rGVVH8MMzdFRIRj-_ZTutberIDAQvv0KHNpdI2JwgpkHnlYRlnZm6myeqM-mcmEpzXlFAZhhHHBm7ixytPiKw522HqJ24OP8AF_s/s1600/Screen+Shot+2011-11-16+at+8.49.36+AM.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdaj69V-aWg_yMYIwvucZAiVxmJZXxAJgYMiBRpHGpMawAGhNuEOdU-0wXLJWxRzw3XMhFYrF7fWrzrgyt5Sn07GfmYyaLgYgTK_D2ZbHpJJP890N1ecnZGWpm-FEtTZYbI0wW6hY1ZWc/s1600/Screen+Shot+2011-11-16+at+8.49.56+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdaj69V-aWg_yMYIwvucZAiVxmJZXxAJgYMiBRpHGpMawAGhNuEOdU-0wXLJWxRzw3XMhFYrF7fWrzrgyt5Sn07GfmYyaLgYgTK_D2ZbHpJJP890N1ecnZGWpm-FEtTZYbI0wW6hY1ZWc/s320/Screen+Shot+2011-11-16+at+8.49.56+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: left;"&gt;That adds the Unicode table back. Great for browsing around in Unicode!&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyZHvLpvKq6SVBiHREypneGdLzjMyH3uBNEu9tP5jFXRTjodiKYPA3dA3-EJIQnIuBu1ZvWAjZVUsj2WELy0AooySC8H31ZISRn0MymmhvbELB_mCsWPLWrWJA7_pGzA1FsTRjOUw9a50/s1600/Screen+Shot+2011-11-16+at+8.58.28+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyZHvLpvKq6SVBiHREypneGdLzjMyH3uBNEu9tP5jFXRTjodiKYPA3dA3-EJIQnIuBu1ZvWAjZVUsj2WELy0AooySC8H31ZISRn0MymmhvbELB_mCsWPLWrWJA7_pGzA1FsTRjOUw9a50/s320/Screen+Shot+2011-11-16+at+8.58.28+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Hope this saves someone some time and frustration!&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Cheers,&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Kris&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5NzNY88SrD5aTfHq6fdHFERSOCbcSROYOYJAAvcArL1ppV2G6MVayu3ij0_v12qc8Mg9QA5_t40VCcMdkJgK0BUfIVVxnbWYxRPl-blk0ufIYvyQfdDQ7laEfY-Iwj-4cgpvA3P-gvJY/s72-c/Screen+Shot+2011-11-16+at+8.40.17+AM.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>Software Distributors</title><link>http://rorohiko.blogspot.com/2011/07/software-distributors.html</link><pubDate>Mon, 11 Jul 2011 19:12:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-4315583117744044919</guid><description>I am puzzled - not sure how to deal with software distributors.&lt;br /&gt;
&lt;br /&gt;
Here at Rorohiko Workflow Resources, we've been hard at work for many years now, to build a whole range of tools, mainly for users of the Adobe Creative Suite. Our range of tools is slowly but steadily increasing.&lt;br /&gt;
&lt;br /&gt;
In order to sell and try to make our investment pay back for itself, we've built an automated software selling system, which works relatively well: we have a peculiar approach to how we sell our software, which allows us to sell our tools at very low cost despite aiming for a limited market. Part of the secret is automation.&lt;br /&gt;
&lt;br /&gt;
E.g. you can purchase an activation for TextExporter for all of US$19.00. This low cost means that purchasing an activation for one of our tools pays back for itself very quickly.&lt;br /&gt;
&lt;br /&gt;
We're gradually getting more and more traction in the market - which is cool.&lt;br /&gt;
&lt;br /&gt;
Now, lately we've been getting more and more requests from software distributors who want to distribute our products - but most of them have the same puzzling approach.&lt;br /&gt;
&lt;br /&gt;
They want to know what their dealer margin is, and where they can send a purchase order.&lt;br /&gt;
&lt;br /&gt;
A few times, we've tried to accommodate such requests, but invariably, we ended up holding the longest end of the stick: working with software distributors invariably costs us more than it's worth.&lt;br /&gt;
&lt;br /&gt;
- They cause a whole lot of additional administration (purchase orders, paper or PDF invoices,...). Such additional admin costs us money.&lt;br /&gt;
&lt;br /&gt;
- They want to send us a purchase order and in return get an invoice. Then they take their own sweet time to pay up.&lt;br /&gt;
&lt;br /&gt;
They often need one or more reminders. Their purchase department is typically insulated from the rest of the company, and once our invoice is in the slow paper mill, it can take six months or longer before we finally get paid, and there is nothing much we can do about it.&lt;br /&gt;
&lt;br /&gt;
- They want to pay us by cheque or credit card, and don't want to use PayPal. As Rorohiko is still small, and establishing credit card facilities would cost us both in time and money, we make do with PayPal.&lt;br /&gt;
&lt;br /&gt;
(We've looked around, and after that exercise, we think that despite a number of obvious shortcomings, PayPal is one of the better payment processors on the market. Through PayPal we can accept credit cards. People with corporate credit cards seem to have a few extra hoops to jump through - but once they set up an address-verified PayPal account, things seem to work fine.)&lt;br /&gt;
&lt;br /&gt;
- They don't seem to have time to read: we have a lot of info on our web site, and, granted, it's not that well organized, but these people clearly have not even visited our web site. They don't know what our products do, and are not interested in learning how our licensing system works (http://www.rorohiko.com/licensing).&lt;br /&gt;
&lt;br /&gt;
In the end, we sell a single $19 activation, and end up with costs that far surpass that amount - paperwork, having to wait to get paid... it all adds up.&lt;br /&gt;
&lt;br /&gt;
As such, we see any such requests from software distributors as a 'win/lose' scenario: they win, we lose.&lt;br /&gt;
&lt;br /&gt;
My question is: are there some software distributors out there who understand the idea of a 'value proposition'? If you're a software distributor, and you like our products: before e-mailing us, make sure you have something of that is of value to offer in return for the extra hassle. There's many ways you could make this work.&lt;br /&gt;
&lt;br /&gt;
Also, reading up on our products and our approach to licensing beforehand gains you brownie points!</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>Fitting of Images Into Frames in Automated and Semi-Automated Page Layout Workflows</title><link>http://rorohiko.blogspot.com/2011/04/fitting-of-images-into-frames-in.html</link><pubDate>Sat, 9 Apr 2011 18:06:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-7274747912990559827</guid><description>&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;When developing workflows around InDesign Server or similar automated page layout workflows, one of the recurring themes is the fitting of image material into frames on a page.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;In this blog post I'll demonstrate a method for efficiently storing re-usable image fitting data. The image fitting data is resistant to image replacement or layout changes in the page layout.&lt;br /&gt;
&lt;br /&gt;
This method can easily be implemented in ExtendScript/JavaScript or any other programming language.&lt;br /&gt;
&lt;br /&gt;
I'll also show a corresponding user interface.&lt;br /&gt;
&lt;br /&gt;
It all starts with an image and a frame. Most commonly, both are rectangular, but their shape is not necessarily related: the image might have a landscape orientation and the layout frame that the image needs to fit in might have a portrait orientation.&lt;br /&gt;
&lt;br /&gt;
What I'll present in this article is (as far as I know) a novel way of encoding image fitting data into four numbers, in such a way that the fitting data becomes totally decoupled from the actual frame and image shapes. The same fitting data can be re-applied to images and frames of wildly different shapes, and always gives sensible results.&lt;br /&gt;
&lt;br /&gt;
The fitting data is fairly straightforward to grasp intuitively - the four numbers I use are called (&lt;i&gt;xFactor&lt;/i&gt;,&amp;nbsp;&lt;i&gt;yFactor&lt;/i&gt;,&amp;nbsp;&lt;i&gt;scale&lt;/i&gt;,&amp;nbsp;&lt;i&gt;rotation&lt;/i&gt;).&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;xFactor&lt;/i&gt; and &lt;i&gt;yFactor&lt;/i&gt;&amp;nbsp;range between -1.0 and 1.0, &lt;i&gt;scale&lt;/i&gt; between 0.0 and 1.0, and &lt;i&gt;rotation&lt;/i&gt; = 0, 1, 2 or 3.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;xFactor&lt;/i&gt; = -1.0 means: frame at the extreme left side of image.&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;xFactor&lt;/i&gt; = 0.0 means: frame horizontally in the middle of the image&lt;/div&gt;&lt;i&gt;xFactor&lt;/i&gt; = +1.0 means: frame at the extreme right side of the image.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;yFactor&lt;/i&gt; = -1.0 means: frame at the extreme top side of image.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;yFactor&lt;/i&gt; = 0.0 means: frame vertically in the middle of the image&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;yFactor&lt;/i&gt; = +1.0 means: frame at the extreme bottom side of the image.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;i&gt;scale&lt;/i&gt; = 1.0 means: frame as large as possible without going 'outside' the image&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;scale&lt;/i&gt; = 0.0 means: frame infinitely small&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;i&gt;rotation&lt;/i&gt; = 0: image not rotated&lt;/div&gt;&lt;div&gt;&lt;i&gt;rotation&lt;/i&gt;&amp;nbsp;= 1: image rotated 90 degrees&lt;/div&gt;&lt;div&gt;&lt;i&gt;rotation&lt;/i&gt;&amp;nbsp;= 2: image rotated 180 degrees&lt;/div&gt;&lt;div&gt;&lt;i&gt;rotation&lt;/i&gt;&amp;nbsp;= 3: image rotated 270 degrees&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;Below are a few intuitive samples.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Keep in mind: in the samples below I'm continually using different images and/or frames - the main 'claim to fame' of the decoupled image fitting data is that no matter what image or frame shapes you throw at it, it always gives sensible results.&lt;/div&gt;&lt;br /&gt;
First two samples, both using the exact same fitting data -&amp;nbsp;&lt;i&gt;xFactor&lt;/i&gt; = 0.0, &lt;i&gt;yFactor&lt;/i&gt; = 0.0, &lt;i&gt;scale&lt;/i&gt; = 1.0, &lt;i&gt;rotation&lt;/i&gt; = 0.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicNsR_v1Yc3j2SNdnvm_NR1xoYDpnAQJO5_9Rojx4RcoN7a-4Rj4BWEBj60T1ZUrtGvrRjTioFh4hoPI0f7_g4kmzLWlEhZNKqdbqtQ4xUMeeTpd7C5hL_0kFhRq_Qk8fHQnLBD2ZkEdc/s1600/Screen-shot-2011-04-11-at-8.55.35-AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicNsR_v1Yc3j2SNdnvm_NR1xoYDpnAQJO5_9Rojx4RcoN7a-4Rj4BWEBj60T1ZUrtGvrRjTioFh4hoPI0f7_g4kmzLWlEhZNKqdbqtQ4xUMeeTpd7C5hL_0kFhRq_Qk8fHQnLBD2ZkEdc/s320/Screen-shot-2011-04-11-at-8.55.35-AM.png" width="302" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqF5Bk3qbRVxfyRcQ2u8AqqTqqp6y1RrfpnMRkogVDUEUDdGHQyMuq7jZFNhsLM9MKo1x3xBYQZv4z_6fxIG4ZWxWllBMt3_aqgS6hkcgjSG6fVMWFyScsMRK5QoaFdRnDC7B1C2tU6Gk/s1600/Screen-shot-2011-04-11-at-8.56.09-AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqF5Bk3qbRVxfyRcQ2u8AqqTqqp6y1RrfpnMRkogVDUEUDdGHQyMuq7jZFNhsLM9MKo1x3xBYQZv4z_6fxIG4ZWxWllBMt3_aqgS6hkcgjSG6fVMWFyScsMRK5QoaFdRnDC7B1C2tU6Gk/s320/Screen-shot-2011-04-11-at-8.56.09-AM.png" width="244" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;As you can see (0.0, 0.0, 1.0, 0) translates to:&amp;nbsp;&lt;i&gt;center the frame on the image, and make the frame as large as possible&lt;/i&gt;. It does not matter whether the image has portrait or landscape orientation, and it does not matter whether the frame has portrait or landscape orientation - the same fitting data always works.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;(0.0, 0.0, 1.0, 0) is the default fitting data I most commonly use for images and frames that have not been edited by a user.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: auto;"&gt;Now a sample image, and a differently shaped frame, this time using (0.0, 0.0, 0.5, 0) as the fitting data: the&amp;nbsp;&lt;i&gt;scale&lt;/i&gt;&amp;nbsp;is 0.5 instead of 1.0. The frame shrinks down to half the largest possible size both horizontally and vertically:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAHUIcxiORg2IeX2Nm-4ayduDuEwSAYncogNglI06VQcV4YWCrb6F6Wie1PnsSRSt6A_2Vcd1OIoTi8JEn-zgqE9mc4aYCwJQYC7lx935VoTl116rWAWfvET0JrXhIm9H8V4HDwMr9SCw/s1600/Screen+shot+2011-04-10+at+12.01.30+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAHUIcxiORg2IeX2Nm-4ayduDuEwSAYncogNglI06VQcV4YWCrb6F6Wie1PnsSRSt6A_2Vcd1OIoTi8JEn-zgqE9mc4aYCwJQYC7lx935VoTl116rWAWfvET0JrXhIm9H8V4HDwMr9SCw/s320/Screen+shot+2011-04-10+at+12.01.30+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Another sample image and frame, now using (-1.0, -1.0, 0.5, 0): the scale is the same as in the previous sample, but now the frame has moved to the top left corner.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg12i75mNqhf_tAVlhdFDzxhGbh1efkbkNsLS9CIUkcZYevqbmDMblkN_ahM9Da-D1KpWxc1zaeO0C7d5mPz0lPQudvR9O6m8Ncb2kNNrVNeW4GErJuHwgj87rYOEXdYGaQTdfjb0MVA24/s1600/Screen+shot+2011-04-10+at+12.00.54+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="205" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg12i75mNqhf_tAVlhdFDzxhGbh1efkbkNsLS9CIUkcZYevqbmDMblkN_ahM9Da-D1KpWxc1zaeO0C7d5mPz0lPQudvR9O6m8Ncb2kNNrVNeW4GErJuHwgj87rYOEXdYGaQTdfjb0MVA24/s320/Screen+shot+2011-04-10+at+12.00.54+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Any fitting data with &lt;i&gt;xFactor&lt;/i&gt; = -1.0 and &lt;i&gt;yFactor&lt;/i&gt; = -1.0 always means: move the frame to the top left corner.&lt;br /&gt;
&lt;br /&gt;
To help understand my image fitting method, think of the frame as a window through which we can see part of the image.&lt;br /&gt;
&lt;br /&gt;
Imagine I float a rectangle in the same shape as the frame on the page 'on top' of the image. I'll combine two actions:&lt;br /&gt;
&lt;br /&gt;
1) Shifting the frame around within the image&lt;br /&gt;
2) Resizing the frame so it covers more or less of the image&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvTwJrcWHfXSjQzdJPGyt3YhA3xsZ51VC4RSollp0VSuyz_5EoAQRjUmo5idwy39d822Y6RmClwI9NCLwJrnunwxx0KeC0KVP3I9h7P7pGWWIlo9pf-0z0ZsmBHQWZVIE6_3cEz300koU/s1600/Screen+shot+2011-04-10+at+11.14.19+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvTwJrcWHfXSjQzdJPGyt3YhA3xsZ51VC4RSollp0VSuyz_5EoAQRjUmo5idwy39d822Y6RmClwI9NCLwJrnunwxx0KeC0KVP3I9h7P7pGWWIlo9pf-0z0ZsmBHQWZVIE6_3cEz300koU/s320/Screen+shot+2011-04-10+at+11.14.19+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;l'll initially assume the floating frame rectangle is not allowed to go 'outside' the image. It is forced to stay within the confines of the image.&lt;br /&gt;
&lt;br /&gt;
With regards to the positioning of the floating frame: I will be encoding the position of the center of the frame with respect to the center of the image.&lt;br /&gt;
&lt;br /&gt;
For the sake of argument, I'll first only consider the vertical position of the floating frame.&lt;br /&gt;
&lt;br /&gt;
I observe that when the floating frame covers the full height of the image, it has no room to move vertically (otherwise it would escape the confines of the image).&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTObIjU6xFeaiyh8mousNKpnUzJolcD0kHfUtPF2n9v2ZEUzleU7aFtYWObDJUIR134IlwV_HK4yiYVkKql_t_RJ2pAvZBe_DyElQDOuAaHeehXYG7u_cyQs1S-nUexUhDWQaUBngI00g/s1600/Screen+shot+2011-04-10+at+11.27.24+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTObIjU6xFeaiyh8mousNKpnUzJolcD0kHfUtPF2n9v2ZEUzleU7aFtYWObDJUIR134IlwV_HK4yiYVkKql_t_RJ2pAvZBe_DyElQDOuAaHeehXYG7u_cyQs1S-nUexUhDWQaUBngI00g/s320/Screen+shot+2011-04-10+at+11.27.24+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(No vertical leeway: the frame cannot move up or down without leaving the confines of the image)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
In essence, the amount of 'vertical leeway' is determined by the difference in height between the floating frame and the image. If the image and floating frame have the same height, the vertical leeway is zero. At the other extreme, if the floating frame height were reduced to zero, the vertical leeway would be the full height of the image.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCtso6GCrJdVtg0M8vwpTUUi89n9PDfUWQfmlDPSF_6TFD6YEr7ULaLk4aE71lRkoJOs59zjfg-wpIH3mIwdLjzDbQ_m4pO0O4yICySoCoTnFwC6ItDbWvY1QzEZXn97QLfmuPofw-6fU/s1600/Screen+shot+2011-04-10+at+11.27.58+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCtso6GCrJdVtg0M8vwpTUUi89n9PDfUWQfmlDPSF_6TFD6YEr7ULaLk4aE71lRkoJOs59zjfg-wpIH3mIwdLjzDbQ_m4pO0O4yICySoCoTnFwC6ItDbWvY1QzEZXn97QLfmuPofw-6fU/s320/Screen+shot+2011-04-10+at+11.27.58+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(Vertical leeway is difference between image height and frame height)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
When the floating frame is positioned in the center of the image, I can move it half the vertical leeway towards the top, and half the vertical leeway towards the bottom.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSiJR1_GMlqaKYBXg_Z0RQYoHq31Gt9R9wTKmqr8vlvMc-Zxeayn7zalWxbbwIL1HddxFV8QXsmnt7YuNgy46Bujc3oLeW4nPDHvPZacyHXxao3WCxRPisE6lGkLfCbUb4_9Bb9db_-XI/s1600/Screen+shot+2011-04-10+at+11.28.27+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSiJR1_GMlqaKYBXg_Z0RQYoHq31Gt9R9wTKmqr8vlvMc-Zxeayn7zalWxbbwIL1HddxFV8QXsmnt7YuNgy46Bujc3oLeW4nPDHvPZacyHXxao3WCxRPisE6lGkLfCbUb4_9Bb9db_-XI/s320/Screen+shot+2011-04-10+at+11.28.27+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(When the frame is centered on the image we can move half the vertical leeway up, and half the vertical leeway down)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
That brings me to one of the key numerical values: given an image and a frame, I calculate half the vertical leeway (in other words: I subtract the frame height from the image height and divide by two).&lt;br /&gt;
&lt;br /&gt;
I then express the vertical position of the frame center with respect to the image center as a value between -1.0 and 1.0. When I multiply this value with half the vertical leeway, I get the frame's center offset along the y-axis in relation to the image center.&lt;br /&gt;
&lt;br /&gt;
I do the same for the horizontal axis: encode the horizontal offset of the frame center from the image center as a value between -1.0 and 1.0. Multiplying this value with half the horizontal leeway gives me the frame center's horizontal offset from the image center.&lt;br /&gt;
&lt;br /&gt;
To encode the frame size, I first rescale the frame so it 'fits' the image in one of the two dimensions. I make the frame as large as possible without 'spilling out' of the image. When I do that, either the horizontal or vertical sizes of image and floating frame will be equal, and in the other dimension the frame size will be less than, or equal to the image size.&lt;br /&gt;
&lt;br /&gt;
I call the 'equal' dimension 'the dominant dimension' - each time someone gives me an image and a frame, I can determine the dominant dimension for that particular (image, frame) pair - it's either horizontal or vertical (and occasionally both - in which case I pick either).&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzqC8C5_lZ9pOC12IGvbOV6363GcrNtmZvQPVhTH85z3yk5LBh9FfgbLR63xL2GQJHxzyNRikgCsbCh14eEqoi1MvcsfdD2eprvzkqCjRr6GTNHfIVxg4frdc8013Fsei5sPcZqQMYdfs/s1600/Screen+shot+2011-04-10+at+11.45.11+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzqC8C5_lZ9pOC12IGvbOV6363GcrNtmZvQPVhTH85z3yk5LBh9FfgbLR63xL2GQJHxzyNRikgCsbCh14eEqoi1MvcsfdD2eprvzkqCjRr6GTNHfIVxg4frdc8013Fsei5sPcZqQMYdfs/s320/Screen+shot+2011-04-10+at+11.45.11+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(The vertical dimension is dominant: the frame can be made to fit the image vertically while it remains narrower than the image horizontally)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
I now encode the frame scaling as a number between 0.0 and 1.0 along the dominant dimension. If the scale is 1.0 the frame and image have the exact same size along the dominant dimension. If the scale is 0.5, the frame is half the size of the image along the dominant dimension. The non-dominant dimension is resized proportionally.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsTyyEs2zjW6dhyphenhypheng6Mf0oe19S3VCD9q1-JGR5h5TdqYlPEjziaPEom7tLBo8lBpv8HKQ_cijb0QglV9f7GAerD7THfPjTTmMZdF3mPoIKPwbh7T0ryqCE_a2fWOIgBO2otOsSngJx5kac/s1600/Screen+shot+2011-04-10+at+11.48.04+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsTyyEs2zjW6dhyphenhypheng6Mf0oe19S3VCD9q1-JGR5h5TdqYlPEjziaPEom7tLBo8lBpv8HKQ_cijb0QglV9f7GAerD7THfPjTTmMZdF3mPoIKPwbh7T0ryqCE_a2fWOIgBO2otOsSngJx5kac/s320/Screen+shot+2011-04-10+at+11.48.04+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(&lt;i&gt;scale&lt;/i&gt; = 0.5 means that the frame is half of the image size along the dominant dimension)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
Finally, I need to encode image rotation: the image can be rotated underneath the frame. I encode that as an integer number from 0 to 3 (0 = not rotated, 1 = 90 degrees... ).&lt;br /&gt;
&lt;br /&gt;
So, to make an image fit into a frame, I have the fitting data encoded as four numbers:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;xFactor&lt;/i&gt; = -1.0 to 1.0 (floating point)&lt;br /&gt;
&lt;i&gt;yFactor&lt;/i&gt; = -1.0 to 1.0 (floating point)&lt;br /&gt;
&lt;i&gt;scale&lt;/i&gt; = 0.0 to 1.0 (floating point)&lt;br /&gt;
&lt;i&gt;rotation&lt;/i&gt; = 0 to 3 (integer)&lt;br /&gt;
&lt;br /&gt;
I'll now work through a step-by-step procedure of using this fitting data.&lt;br /&gt;
&lt;br /&gt;
Assume I'm given fitting information (a set of four numbers: (&lt;i&gt;xFactor&lt;/i&gt;, &lt;i&gt;yFactor&lt;/i&gt;, &lt;i&gt;scale&lt;/i&gt;, &lt;i&gt;rotation&lt;/i&gt;) as well as an image with dimensions (&lt;i&gt;widthImageUnrotated&lt;/i&gt;, &lt;i&gt;heightImageUnrotated&lt;/i&gt;) and a frame in a page layout with dimensions (&lt;i&gt;widthFrame&lt;/i&gt;, &lt;i&gt;heightFrame&lt;/i&gt;).&lt;br /&gt;
&lt;br /&gt;
If &lt;i&gt;scale&lt;/i&gt; is 0.0, I don't even start the process - it would lead to a division by zero.&lt;br /&gt;
&lt;br /&gt;
First I take into account the &lt;i&gt;rotation&lt;/i&gt;. If the &lt;i&gt;rotation&lt;/i&gt; is 1 or 3, I need to swap the image width and image height because the image is turned on its side through a quarter turn.&lt;br /&gt;
&lt;br /&gt;
Based on &lt;i&gt;rotation&lt;/i&gt; and&amp;nbsp;(&lt;i&gt;widthImageUnrotated&lt;/i&gt;,&amp;nbsp;&lt;i&gt;heightImageUnrotated&lt;/i&gt;)&amp;nbsp;I define a new pair of rotation-adjusted image dimensions (&lt;i&gt;widthImage&lt;/i&gt;, &lt;i&gt;heightImage&lt;/i&gt;).&lt;br /&gt;
&lt;br /&gt;
The next step is determining the dominant dimension. I calculate two ratios:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;horRatio&lt;/i&gt; = &lt;i&gt;widthFrame&amp;nbsp;&lt;/i&gt;/&amp;nbsp;&lt;i&gt;widthImage&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;verRatio&lt;/i&gt; = &lt;i&gt;heightFrame&amp;nbsp;&lt;/i&gt;/ &lt;i&gt;heightImage&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
The larger of these two ratios belongs to the dominant dimension.&lt;br /&gt;
&lt;br /&gt;
For the sake of argument, I'll first assume &lt;i&gt;horRatio&lt;/i&gt; ends up to be the larger of the two. That makes the horizontal dimension the dominant one. This means that I can make the frame 'fit' the image horizontally while leaving the vertical frame height less than or at most equal to the image height.&lt;br /&gt;
&lt;br /&gt;
In that case, the scale division factor that I apply to the image, &lt;i&gt;imageScaleDiv&lt;/i&gt;, is determined as&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;imageScaleDiv&lt;/i&gt; = &lt;i&gt;scale&lt;/i&gt; / &lt;i&gt;horRatio&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
In the other case, where the &lt;i&gt;verRatio&lt;/i&gt; turns out to be the larger of the two instead of &lt;i&gt;horRatio&lt;/i&gt;, I would use&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;imageScaleDiv&lt;/i&gt; = &lt;i&gt;scale&lt;/i&gt; / &lt;i&gt;verRatio&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
I rescale the image by dividing the image dimensions by &lt;i&gt;imageScaleDiv&lt;/i&gt;, so its new size becomes (&lt;i&gt;widthImageScaled&lt;/i&gt;, &lt;i&gt;heightImageScaled&lt;/i&gt;):&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;widthImageScaled&lt;/i&gt; = &lt;i&gt;widthImage&amp;nbsp;&lt;/i&gt;/ &lt;i&gt;imageScaleDiv&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;heightImageScaled&lt;/i&gt; = &lt;i&gt;heightImage&amp;nbsp;&lt;/i&gt;/ &lt;i&gt;imageScaleDiv&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Normally, &lt;i&gt;imageScaleDiv&lt;/i&gt; should not be zero at this point of the procedure - we don't allow for zero &lt;i&gt;scale&lt;/i&gt; values.&lt;br /&gt;
&lt;br /&gt;
I now calculate horizontal and vertical leeways:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;horHalfLeeway&lt;/i&gt; = (&lt;i&gt;frameWidth&lt;/i&gt; - &lt;i&gt;imageScaledWith&lt;/i&gt;) / 2.0&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;verHalfLeeway&lt;/i&gt; = (&lt;i&gt;frameHeight&lt;/i&gt; - &lt;i&gt;imageScaledHeight&lt;/i&gt;) / 2.0&lt;br /&gt;
&lt;br /&gt;
Now I multiply these 'half leeways' with the &lt;i&gt;xFactor&lt;/i&gt; and &lt;i&gt;yFactor&lt;/i&gt; to find the offset of the image center compared to the frame center:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;xOffset&lt;/i&gt; = &lt;i&gt;xFactor&lt;/i&gt; * &lt;i&gt;horHalfLeeway&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;yOffset&lt;/i&gt; = &lt;i&gt;yFactor&lt;/i&gt; * &lt;i&gt;verHalfLeeway&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
This concludes the procedure: I've taken a set of four numbers (&lt;i&gt;xFactor&lt;/i&gt;, &lt;i&gt;yFactor&lt;/i&gt;, &lt;i&gt;scale&lt;/i&gt;, &lt;i&gt;rotation&lt;/i&gt;), applied them to an image and a frame, and ended up with sufficient scaling information and positioning information to allow me to put the image into the frame.&lt;br /&gt;
&lt;br /&gt;
The power of this encoding becomes apparent when I retain &lt;i&gt;only&lt;/i&gt; the fitting information, and apply the same set of four numbers to a completely different image and/or frame: it still works, and in most cases, the 'fit' is 'natural'.&lt;br /&gt;
&lt;br /&gt;
So, if I have a person's portrait in a frame, and swap it for a different portrait, the fit will most probably still be correct - most headshots share the same basic proportions. Here's an example where the two images are very different, yet re-using the same fitting data works well:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ3o-S_JCZXOdlKk7UFSZbqln7uKg7ZoBRyLxV9u8niE35WK4daKXcrDUBiJzaGC4oBsqiD93uT-z-EVBGa3kjK5bx4fpr7oNYYv-2mXPzO32heFcgfyHL4NvQLjkWyJVin-80p2_f_Sg/s1600/Screen+shot+2011-04-10+at+12.01.45+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ3o-S_JCZXOdlKk7UFSZbqln7uKg7ZoBRyLxV9u8niE35WK4daKXcrDUBiJzaGC4oBsqiD93uT-z-EVBGa3kjK5bx4fpr7oNYYv-2mXPzO32heFcgfyHL4NvQLjkWyJVin-80p2_f_Sg/s320/Screen+shot+2011-04-10+at+12.01.45+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(fitting info: (0.0, 0.0, 0.75, 0) )&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrirS83JzmI3HrT75zpdxeXIpx1ivE-SeCXndNPT-uwZcJf-cgYmVAvM_D9DW3uh1JyRIn73h8n_qsgF5IrwkXEwX7zq7RhaJ0ukyAdwl_27j9GmT7eHeWQlVq0VZzKlY_mCRmIIJy5bw/s1600/Screen+shot+2011-04-10+at+12.02.36+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrirS83JzmI3HrT75zpdxeXIpx1ivE-SeCXndNPT-uwZcJf-cgYmVAvM_D9DW3uh1JyRIn73h8n_qsgF5IrwkXEwX7zq7RhaJ0ukyAdwl_27j9GmT7eHeWQlVq0VZzKlY_mCRmIIJy5bw/s320/Screen+shot+2011-04-10+at+12.02.36+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(fitting info: (0.0, 0.0, 0.75, 0). The same fitting info as the previous image. Even though the image shape is quite different, the same fitting info still works well)&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;Another advantage is that I can tie the image fitting info to the user interface, and get something that acts rather 'naturally'.&lt;br /&gt;
&lt;br /&gt;
If I position the cropping frame, say, in the top left corner and change the scale, the cropping frame will remain in the top left corner and extend down and to the right.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg12i75mNqhf_tAVlhdFDzxhGbh1efkbkNsLS9CIUkcZYevqbmDMblkN_ahM9Da-D1KpWxc1zaeO0C7d5mPz0lPQudvR9O6m8Ncb2kNNrVNeW4GErJuHwgj87rYOEXdYGaQTdfjb0MVA24/s1600/Screen+shot+2011-04-10+at+12.00.54+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="205" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg12i75mNqhf_tAVlhdFDzxhGbh1efkbkNsLS9CIUkcZYevqbmDMblkN_ahM9Da-D1KpWxc1zaeO0C7d5mPz0lPQudvR9O6m8Ncb2kNNrVNeW4GErJuHwgj87rYOEXdYGaQTdfjb0MVA24/s320/Screen+shot+2011-04-10+at+12.00.54+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(fitting info: (-1.0, -1.0, 0.5, 0) )&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFGFNc2oHMVIbbjWbnzYUbXo3j68B1z-M3sIfkP4WYapWNafTCe9aXi7NmpIiE-WlzciBq6Rpv4DnRZAL5-Ow2hv_hg-QZMVCn0mRpFswVnLuVV62xCbO1_U7KJIIc5t3Xb_76hOPMeo/s1600/Screen+shot+2011-04-10+at+12.01.08+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFGFNc2oHMVIbbjWbnzYUbXo3j68B1z-M3sIfkP4WYapWNafTCe9aXi7NmpIiE-WlzciBq6Rpv4DnRZAL5-Ow2hv_hg-QZMVCn0mRpFswVnLuVV62xCbO1_U7KJIIc5t3Xb_76hOPMeo/s320/Screen+shot+2011-04-10+at+12.01.08+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(fitting info: (-1.0, -1.0, 0.75, 0). Changing the &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;scale&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt; from 0.5 to 0.75 keeps the frame 'stuck' in the corner)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
If I position the cropping frame dead center and change the scale: it will grow and shrink while remaining centered.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAHUIcxiORg2IeX2Nm-4ayduDuEwSAYncogNglI06VQcV4YWCrb6F6Wie1PnsSRSt6A_2Vcd1OIoTi8JEn-zgqE9mc4aYCwJQYC7lx935VoTl116rWAWfvET0JrXhIm9H8V4HDwMr9SCw/s1600/Screen+shot+2011-04-10+at+12.01.30+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAHUIcxiORg2IeX2Nm-4ayduDuEwSAYncogNglI06VQcV4YWCrb6F6Wie1PnsSRSt6A_2Vcd1OIoTi8JEn-zgqE9mc4aYCwJQYC7lx935VoTl116rWAWfvET0JrXhIm9H8V4HDwMr9SCw/s320/Screen+shot+2011-04-10+at+12.01.30+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(fitting info: (0.0, 0.0, 0.5, 0) )&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4uaI1VK48aXNdq6AaUohjxq0Vxfs63mO8Qf5acOzBw85wEw9RvV6ybRNIw5YsOBJwZm-yKa1i3Tivpq22RxHTtvwSOsdoL01tJ68RR6BHOql7vPWzEduoIJSCaCoLXXjfpzXNeJfT6Qs/s1600/Screen+shot+2011-04-10+at+12.01.45+PM+copy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4uaI1VK48aXNdq6AaUohjxq0Vxfs63mO8Qf5acOzBw85wEw9RvV6ybRNIw5YsOBJwZm-yKa1i3Tivpq22RxHTtvwSOsdoL01tJ68RR6BHOql7vPWzEduoIJSCaCoLXXjfpzXNeJfT6Qs/s320/Screen+shot+2011-04-10+at+12.01.45+PM+copy.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(fitting info: (0.0, 0.0, 0.75, 0). Changing the &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;scale&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt; from 0.5 to 0.75 keeps the frame 'stuck' in the center)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
When an automated or semi-automatic workflow has some image fitting operation in it, storing the image fitting data as a set of four numbers, and applying them as described here increases the chances that the fitting data will continue to give sensible results even when the image is replaced with another, or the frame is resized later on (e.g. when a template is adjusted). The fitting data is fully decoupled from image and frame dimensions.&lt;br /&gt;
&lt;br /&gt;
The method described here also remains usable outside the limitations I originally set out.&lt;br /&gt;
&lt;br /&gt;
By allowing &lt;i&gt;xFactor&lt;/i&gt; and &lt;i&gt;yFactor&lt;/i&gt; to go outside of the interval [-1.0, 1.0] I can allow for frames that only partially overlap the image.&lt;br /&gt;
&lt;br /&gt;
Similarly,&amp;nbsp;&lt;i&gt;scale&lt;/i&gt; factors outside of the interval ] 0.0, 1.0 ] can be used too - I could allow negative &lt;i&gt;scale&lt;/i&gt; factors or scale factors larger than 1.0. However, a zero &lt;i&gt;scale&lt;/i&gt; factor will never give sensible results - it results in a division by zero.&lt;br /&gt;
&lt;br /&gt;
Finally, the &lt;i&gt;rotation&lt;/i&gt; can be allowed to be a floating point number in the interval [0.0, 4.0[ instead of an integer 0 - 3. That way, I can rotate over arbitrary angles - e.g. a &lt;i&gt;rotation&lt;/i&gt; of 0.5 would translate into a rotation of the image of 45 degrees.&lt;br /&gt;
&lt;br /&gt;
The screen shots that accompany this blog post demonstrate the related user interface - the screen shots are from an AJAX implementation I made for a real-life project, using Google Web Toolkit (GWT) running in an ordinary web browser.&lt;br /&gt;
&lt;br /&gt;
I found it helpful if I made the scale slider to show the effective image resolutions (instead of the underlying &lt;i&gt;scale&lt;/i&gt; factor).&lt;br /&gt;
&lt;br /&gt;
In general it works like this: initially, in an automated setup, I always start with a default fitting of (&lt;i&gt;xFactor&lt;/i&gt;,&amp;nbsp;&lt;i&gt;yFactor&lt;/i&gt;,&amp;nbsp;&lt;i&gt;scale&lt;/i&gt;,&amp;nbsp;&lt;i&gt;rotation&lt;/i&gt;) =&amp;nbsp;(0.0, 0.0, 1.0, 0). That centers the frame onto the image, and makes the frame as large as possible, cropping away part of the image if necessary.&lt;br /&gt;
&lt;br /&gt;
When the user edits the image fitting through my user-interface, I store the resulting fitting parameters&amp;nbsp;(&lt;i&gt;xFactor&lt;/i&gt;,&amp;nbsp;&lt;i&gt;yFactor&lt;/i&gt;,&amp;nbsp;&lt;i&gt;scale&lt;/i&gt;,&amp;nbsp;&lt;i&gt;rotation&lt;/i&gt;) alongside the layout (e.g. the script labels are a great spot to put this).&lt;br /&gt;
&lt;br /&gt;
When the layout or image changes, I retrieve the fitting data and re-apply the fitting data to the new image or the modified frame.&lt;br /&gt;
&lt;br /&gt;
It works really well for me - hope it does for you too!&lt;br /&gt;
&lt;br /&gt;
(c) 2011 Kris Coppieters - Rorohiko Ltd.</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicNsR_v1Yc3j2SNdnvm_NR1xoYDpnAQJO5_9Rojx4RcoN7a-4Rj4BWEBj60T1ZUrtGvrRjTioFh4hoPI0f7_g4kmzLWlEhZNKqdbqtQ4xUMeeTpd7C5hL_0kFhRq_Qk8fHQnLBD2ZkEdc/s72-c/Screen-shot-2011-04-11-at-8.55.35-AM.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>Are Mac users quicker to upgrade to InDesign CS5 than Windows users?</title><link>http://rorohiko.blogspot.com/2011/03/what-version-of-indesign-do-you-use.html</link><pubDate>Thu, 31 Mar 2011 15:23:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-6680084883222881136</guid><description>I recently saw some Facebook 'polls' that looked like an attempt to probe who is using what version of InDesign. Oftentimes, these polls fall flat because the sample size is too small.&lt;br /&gt;
&lt;br /&gt;
But if you want to know how the InDesign user base divvies up, at Rorohiko we have fairly significant, up to date information - further down, I'll share with you some usable percentages and graphs for the month of March 2011.&lt;br /&gt;
&lt;br /&gt;
The clue is in our web server logs. We watch downloads of our APID ToolAssistant for InDesign plug-in, and that tells us a lot (&lt;a href="http://www.rorohiko.com/apidtoolassistant"&gt;http://www.rorohiko.com/apidtoolassistant&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Here's how it works. APID ToolAssistant in itself does not do anything obvious for the end-user, but in order to use one or more of our extensive range of plug-ins, users need to install APID ToolAssistant on their computer. Each user needs to install APID ToolAssistant only once per installed version of InDesign. Every month we get a few hundreds of downloads of APID ToolAssistant.&lt;br /&gt;
&lt;br /&gt;
What makes APID ToolAssistant unique as a market probing mechanism is that we still support versions of InDesign as far back as InDesign CS - we cover the whole range of CS, CS2, CS3, CS4 and CS5.&lt;br /&gt;
&lt;br /&gt;
On top of that, our downloads are separated - instead of one single download, we provide separate downloads for each platform and each version - 10 downloads in total - so we can monitor each platform/version combination separately.&lt;br /&gt;
&lt;br /&gt;
In March 2011, we had 1548 downloads - and these were separated up as shown below.&lt;br /&gt;
&lt;br /&gt;
To paraphrase the graphs below in words: Mac and Windows are about even, about&amp;nbsp;10% of all users are still using CS and CS2 and about 30% of all users is still on CS3 or below. Finally, CS5 is slightly ahead of CS4.&lt;br /&gt;
&lt;br /&gt;
P.S. If this info is interesting to you, contact &lt;a href="mailto:consulting@rorohiko.com"&gt;consulting@rorohiko.com&lt;/a&gt; - there's more where that came from!&lt;br /&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; table-layout: fixed; width: 385px;"&gt;&lt;tbody&gt;
&lt;tr height="13"&gt;&lt;/tr&gt;
&lt;tr class="xl25" height="13" style="font-weight: 700;"&gt;&lt;td class="xl25" colspan="4" height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;" width="310"&gt;Downloads of APID ToolAssistant in March 2011&lt;/td&gt;&lt;td class="xl26" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;" width="75"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Mac, CS&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;41&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;3%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Mac, CS2&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;46&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;3%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Mac, CS3&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;130&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;8%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Mac, CS4&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;236&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;15%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Mac, CS5&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;363&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;23%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Win, CS&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;42&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;3%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Win, CS2&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;51&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;3%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Win, CS3&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;135&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;9%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Win, CS4&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;257&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;17%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Win, CS5&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;247&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;16%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class="xl25" height="13" style="font-weight: 700;"&gt;&lt;td class="xl25" height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Total&lt;/td&gt;&lt;td align="right" class="xl25" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;1548&lt;/td&gt;&lt;td class="xl25" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td class="xl26" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td class="xl26" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJFKV9nkfpIeC3pCsQgAf9b3rQ7EyR8zkanvEBv3zJAuNQ8SBELJ_z5r7rX1Mwodqt52bVvdAuFubzF3AYYomn_ZXcxBBrQ4QLxEdwz6ul_jZkDQY0_Q2-OamT1RIMvKcvlmXf1rOfKzs/s1600/image001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJFKV9nkfpIeC3pCsQgAf9b3rQ7EyR8zkanvEBv3zJAuNQ8SBELJ_z5r7rX1Mwodqt52bVvdAuFubzF3AYYomn_ZXcxBBrQ4QLxEdwz6ul_jZkDQY0_Q2-OamT1RIMvKcvlmXf1rOfKzs/s320/image001.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; table-layout: fixed; width: 380px;"&gt;&lt;tbody&gt;
&lt;tr class="xl25" height="13" style="font-weight: 700;"&gt;&lt;/tr&gt;
&lt;tr class="xl25" height="13" style="font-weight: 700;"&gt;&lt;td class="xl25" colspan="4" height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;" width="305"&gt;Downloads of Mac APID ToolAssistant in March 2011&lt;/td&gt;&lt;td class="xl25" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;" width="75"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;CS&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;41&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;5%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;CS2&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;46&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;6%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;CS3&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;130&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;16%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;CS4&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;236&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;29%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;CS5&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;363&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;44%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class="xl25" height="13" style="font-weight: 700;"&gt;&lt;td class="xl25" height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Total&lt;/td&gt;&lt;td align="right" class="xl25" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;816&lt;/td&gt;&lt;td class="xl26" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB7PxwNENi1xPSv2wd58p35A6ahlGdiZ4392azxzYpbnd_6jnujMV1M7jMxRx8OeF_PleOflIW98-IxpuI4guA5iZW64UDlkqwFvBGuNmrFyN8enzV3xX77u7DUkCem7Z3OROph7UKZWw/s1600/image002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB7PxwNENi1xPSv2wd58p35A6ahlGdiZ4392azxzYpbnd_6jnujMV1M7jMxRx8OeF_PleOflIW98-IxpuI4guA5iZW64UDlkqwFvBGuNmrFyN8enzV3xX77u7DUkCem7Z3OROph7UKZWw/s320/image002.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; table-layout: fixed; width: 375px;"&gt;&lt;tbody&gt;
&lt;tr class="xl25" height="13" style="font-weight: 700;"&gt;&lt;/tr&gt;
&lt;tr class="xl25" height="13" style="font-weight: 700;"&gt;&lt;td class="xl25" colspan="5" height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;" width="375"&gt;Downloads of Windows APID ToolAssistant in March 2011&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;CS&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;42&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;6%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;CS2&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;51&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;7%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;CS3&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;135&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;18%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;CS4&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;257&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;35%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;CS5&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;247&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;34%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class="xl25" height="13" style="font-weight: 700;"&gt;&lt;td class="xl25" height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Total&lt;/td&gt;&lt;td align="right" class="xl25" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;732&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuotpQwCIQALt5PgaT8xshSPXKRsnL3WKdLXrBVJGzIyXdl4oN7ZSK6IMvUNswUtfWM1VvSbgF-wktoDa9DmS7LrpznXhDRnDgj1SmaWwznNTDJTWo4I-0V3_vYqxHyCN9ljjaV9pizr8/s1600/image003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuotpQwCIQALt5PgaT8xshSPXKRsnL3WKdLXrBVJGzIyXdl4oN7ZSK6IMvUNswUtfWM1VvSbgF-wktoDa9DmS7LrpznXhDRnDgj1SmaWwznNTDJTWo4I-0V3_vYqxHyCN9ljjaV9pizr8/s320/image003.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; table-layout: fixed; width: 450px;"&gt;&lt;tbody&gt;
&lt;tr class="xl25" height="13" style="font-weight: 700;"&gt;&lt;/tr&gt;
&lt;tr class="xl25" height="13" style="font-weight: 700;"&gt;&lt;td class="xl25" colspan="4" height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;" width="300"&gt;Downloads of APID ToolAssistant in March 2011&lt;/td&gt;&lt;td class="xl25" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;" width="75"&gt;&lt;/td&gt;&lt;td class="xl25" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;" width="75"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Mac&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;816&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;53%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr height="13"&gt;&lt;td height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Windows&lt;/td&gt;&lt;td align="right" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;732&lt;/td&gt;&lt;td align="right" class="xl24" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;47%&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;td style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 400; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class="xl25" height="13" style="font-weight: 700;"&gt;&lt;td class="xl25" height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;Total&lt;/td&gt;&lt;td align="right" class="xl25" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;"&gt;1548&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh62syBjQB5qY8qKCsivWqysBpBTSjdHiwB1So6-Q1QBFHsAjrf-qXOrPumkr474si1MZjorLFnRkPF-KU98Y9Zw504-2pmtEiDLY5isHigEE2XZ6xXMgVMKyhp3hL9xYSMbj_RatD_rWw/s1600/image004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh62syBjQB5qY8qKCsivWqysBpBTSjdHiwB1So6-Q1QBFHsAjrf-qXOrPumkr474si1MZjorLFnRkPF-KU98Y9Zw504-2pmtEiDLY5isHigEE2XZ6xXMgVMKyhp3hL9xYSMbj_RatD_rWw/s320/image004.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; table-layout: fixed; width: 385px;"&gt;&lt;col width="85"&gt;&lt;/col&gt;&lt;col span="2" width="75"&gt;&lt;/col&gt;&lt;col class="xl24" span="2" width="75"&gt;&lt;/col&gt;&lt;tbody&gt;
&lt;tr class="xl25" height="13" style="font-weight: 700;"&gt;&lt;td class="xl25" colspan="4" height="13" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;" width="310"&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td class="xl26" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: windowtext; font-family: Verdana; font-size: 10pt; font-style: normal; font-weight: 700; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: bottom; white-space: nowrap;" width="75"&gt;&lt;span class="Apple-style-span" style="font-family: Times;"&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; font-size: small; font-weight: normal; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; white-space: nowrap;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJFKV9nkfpIeC3pCsQgAf9b3rQ7EyR8zkanvEBv3zJAuNQ8SBELJ_z5r7rX1Mwodqt52bVvdAuFubzF3AYYomn_ZXcxBBrQ4QLxEdwz6ul_jZkDQY0_Q2-OamT1RIMvKcvlmXf1rOfKzs/s72-c/image001.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>More Efficient Storage of Virtual Machine Backups</title><link>http://rorohiko.blogspot.com/2011/02/more-efficient-storage-of-virtual.html</link><pubDate>Fri, 11 Feb 2011 18:21:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-8251962020938411877</guid><description>Here's a little trick I use to save substantial amounts of disk space.&amp;nbsp;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;For testing our software, we heavily rely on virtual machines, mostly running various versions of Windows - we use &lt;a href="http://www.vmware.com/"&gt;VMware&lt;/a&gt;&amp;nbsp;(both VMware Workstation on PC and VMware Fusion on Mac), &lt;a href="http://www.parallels.com/"&gt;Parallels&lt;/a&gt;, and &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; extensively.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;VirtualBox is my current favorite - it's come a long way since the earlier versions, and to me it's now on a par with VMware and Parallels. Furthermore, it has a number of very handy features that the other two lack, and above all, it's free!&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;
&lt;div&gt;The nice thing with virtual machines that we can easily 'roll back' to a known state before starting a test session. All three of the tools mentioned above have a 'snapshotting' feature that makes 'rolling back' easy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;However, snapshots of virtual machines come at a cost: the more snapshots you pile up onto a single virtual machine, the slower that virtual machine becomes.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;To avoid the performance penalty, we instead often opt for a more primitive backup strategy: we regularly make compressed copies of a 'known good' virtual machine, and restore them as needed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Here's the trick I devised to make the compressed copies substantially smaller without loss of data:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;1) Get rid of all snapshots before backing up (so the virtual hard disk becomes a single, large file).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;2) Optionally, clear any temp files and so on.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6MM4gCRsVEeRr0WYk328ydaRwiIQJZiKkWhoTS83HDVNQGFyL8tVDjdUWtvzKd9hIVBhrzRRowKmHc85_sGGOvHgxDcpC46g2wDYNr5bG-ycLiVemCc0fFkPh3DbyXePx0vrmnAxfSAo/s1600/Screen+shot+2011-02-12+at+3.09.35+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6MM4gCRsVEeRr0WYk328ydaRwiIQJZiKkWhoTS83HDVNQGFyL8tVDjdUWtvzKd9hIVBhrzRRowKmHc85_sGGOvHgxDcpC46g2wDYNr5bG-ycLiVemCc0fFkPh3DbyXePx0vrmnAxfSAo/s320/Screen+shot+2011-02-12+at+3.09.35+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;3) Use a 'wiper' tool to erase any unused disk space in the virtual machine before compressing.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;If you don't do this, any unused disk space on the virtual hard disks will contain more or less random bit patterns, which don't compress very well.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Yet, if you zero out any unused disk space, the unused disk space on the virtual drive compresses extremely well.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;For example, I just have made a compressed backup of a heavily used virtual machine twice - first without erasing the unused space and then again after erasing unused space. The compressed file size fell from close to 80GB in size to 50GB in size. How's that for savings?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;I mostly use a Windows-based tool called Eraser - it's free and open source.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;The main caveat is that you have to make it erase any unused space with zeroes.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Eraser's main purpose is to make erased data irretrievable for security-purposes, and by default it will fill up any unused disk space with random bit patterns, but that is not what we're after here.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;To make Eraser work for me I had to add a 'custom' bit pattern first (which is simply a zero).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;There are a few variants of Eraser available - don't use the most recent 6.x version that apparently won't allow you to fill unused space with zeroes, but instead insist on using random bit patterns. That is useless for our purpose.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Instead, you have to download the older version (I used 5.8.8) which allows you to define your own erasure patterns:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href="http://sourceforge.net/projects/eraser/files/Eraser%205/"&gt;http://sourceforge.net/projects/eraser/files/Eraser%205/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;After installing, you need to select the Edit - Preferences - Erasing... menu. Then add a new method, call it 'Zero' and set it to use a zero as the bit pattern.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNmUqn0qTQK4VzdD98CifN9AdQHHBXL1_GYgkUe-wdJ0GzFH5cnNJTd3yf8aKhw3SoH4MU3dcj5r0vnBB6pNcYuBzcCqT5-ZlGXNiOU9mhXdx8i7Tgx8q17WxuM5-ZTXGJu3KWc25WzWU/s1600/Screen+shot+2011-02-12+at+3.10.45+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNmUqn0qTQK4VzdD98CifN9AdQHHBXL1_GYgkUe-wdJ0GzFH5cnNJTd3yf8aKhw3SoH4MU3dcj5r0vnBB6pNcYuBzcCqT5-ZlGXNiOU9mhXdx8i7Tgx8q17WxuM5-ZTXGJu3KWc25WzWU/s320/Screen+shot+2011-02-12+at+3.10.45+PM.png" width="318" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Then erase the unused space with this pattern. Then, after shutting down, you can compress the virtual machine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6MM4gCRsVEeRr0WYk328ydaRwiIQJZiKkWhoTS83HDVNQGFyL8tVDjdUWtvzKd9hIVBhrzRRowKmHc85_sGGOvHgxDcpC46g2wDYNr5bG-ycLiVemCc0fFkPh3DbyXePx0vrmnAxfSAo/s72-c/Screen+shot+2011-02-12+at+3.09.35+PM.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>InDesign Scripting: Putting TextFrames in Perspective - for Visually Oriented Scripters</title><link>http://rorohiko.blogspot.com/2011/02/put-extendscript-textframes-in.html</link><pubDate>Fri, 4 Feb 2011 15:20:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-5945522109176226417</guid><description>I admit it: I don't know the InDesign Scripting DOM by heart, so I spend a lot of time browsing around in the ExtendScript Toolkit Object Model Viewer.&lt;br /&gt;
&lt;br /&gt;
I frequently work on very diverse projects - sometimes it's GWT/Java, sometimes it's ActionScript, sometimes it's PHP/WordPress, sometimes it's C++ or REALbasic, and so on... - and invariably, when I come back to a particular project, I need to spend some time refreshing basic knowledge.&lt;br /&gt;
&lt;br /&gt;
It's like my brain 'switches' programming environment, and when I am deeply immersed in Java, I almost forget how to spell 'EkstentScript'.&lt;br /&gt;
&lt;br /&gt;
The ExtendScript Toolkit Object Model Viewer (you find it under the 'Help' menu) is great for browsing the object model - but when it's been a while, it still feels like I am wading through molasses. One of the reasons for that is that I am a visually-oriented person. A picture is worth a few thousand mouse-clicks to me!&lt;br /&gt;
&lt;br /&gt;
Lately, I've been revisiting BarredText - one of our latest scripted plug-ins, and to do that, I need to get back up to speed on TextFrames, Columns, Characters, Stories, and so on.&lt;br /&gt;
I decided I'd put in a little bit more effort, and put everything into a diagram - I've made a 2-page PDF file as a refresher I'll use next time I need to figure out how those buggers relate.&lt;br /&gt;
&lt;br /&gt;
Because this might be useful to other people, I decided to release the PDF file under the 'Attribution-Share Alike' Creative Commons license:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.rorohiko.com/downloads/rorohiko.blogspot.com-extendscript-textframe.pdf"&gt;http://www.rorohiko.com/downloads/rorohiko.blogspot.com-extendscript-textframe.pdf&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I am not claiming this is error-free - if you find any errors, or can see ways to improve this, please let me know.&lt;br /&gt;
&lt;br /&gt;
And if you like this - let me know too! Soon, I need to revisit tables and cells in ExtendScript - who knows, if I get enough positive feedback I might do another visual representation.</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author><enclosure length="98283" type="application/pdf" url="http://www.rorohiko.com/downloads/rorohiko.blogspot.com-extendscript-textframe.pdf"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>I admit it: I don't know the InDesign Scripting DOM by heart, so I spend a lot of time browsing around in the ExtendScript Toolkit Object Model Viewer. I frequently work on very diverse projects - sometimes it's GWT/Java, sometimes it's ActionScript, sometimes it's PHP/WordPress, sometimes it's C++ or REALbasic, and so on... - and invariably, when I come back to a particular project, I need to spend some time refreshing basic knowledge. It's like my brain 'switches' programming environment, and when I am deeply immersed in Java, I almost forget how to spell 'EkstentScript'. The ExtendScript Toolkit Object Model Viewer (you find it under the 'Help' menu) is great for browsing the object model - but when it's been a while, it still feels like I am wading through molasses. One of the reasons for that is that I am a visually-oriented person. A picture is worth a few thousand mouse-clicks to me! Lately, I've been revisiting BarredText - one of our latest scripted plug-ins, and to do that, I need to get back up to speed on TextFrames, Columns, Characters, Stories, and so on. I decided I'd put in a little bit more effort, and put everything into a diagram - I've made a 2-page PDF file as a refresher I'll use next time I need to figure out how those buggers relate. Because this might be useful to other people, I decided to release the PDF file under the 'Attribution-Share Alike' Creative Commons license: http://www.rorohiko.com/downloads/rorohiko.blogspot.com-extendscript-textframe.pdf I am not claiming this is error-free - if you find any errors, or can see ways to improve this, please let me know. And if you like this - let me know too! Soon, I need to revisit tables and cells in ExtendScript - who knows, if I get enough positive feedback I might do another visual representation.</itunes:subtitle><itunes:author>Kris Coppieters</itunes:author><itunes:summary>I admit it: I don't know the InDesign Scripting DOM by heart, so I spend a lot of time browsing around in the ExtendScript Toolkit Object Model Viewer. I frequently work on very diverse projects - sometimes it's GWT/Java, sometimes it's ActionScript, sometimes it's PHP/WordPress, sometimes it's C++ or REALbasic, and so on... - and invariably, when I come back to a particular project, I need to spend some time refreshing basic knowledge. It's like my brain 'switches' programming environment, and when I am deeply immersed in Java, I almost forget how to spell 'EkstentScript'. The ExtendScript Toolkit Object Model Viewer (you find it under the 'Help' menu) is great for browsing the object model - but when it's been a while, it still feels like I am wading through molasses. One of the reasons for that is that I am a visually-oriented person. A picture is worth a few thousand mouse-clicks to me! Lately, I've been revisiting BarredText - one of our latest scripted plug-ins, and to do that, I need to get back up to speed on TextFrames, Columns, Characters, Stories, and so on. I decided I'd put in a little bit more effort, and put everything into a diagram - I've made a 2-page PDF file as a refresher I'll use next time I need to figure out how those buggers relate. Because this might be useful to other people, I decided to release the PDF file under the 'Attribution-Share Alike' Creative Commons license: http://www.rorohiko.com/downloads/rorohiko.blogspot.com-extendscript-textframe.pdf I am not claiming this is error-free - if you find any errors, or can see ways to improve this, please let me know. And if you like this - let me know too! Soon, I need to revisit tables and cells in ExtendScript - who knows, if I get enough positive feedback I might do another visual representation.</itunes:summary><itunes:keywords>printing,prepress,automation,InDesign,Adobe,CS,CS2,CS3,Rorohiko,plug,in,plugin,software,consultancy,design,desktop,publishing,PDF,Acrobat,XPress,QuarkXPress,XTension</itunes:keywords></item><item><title>Easy Access to System Folders on Mac and Windows</title><link>http://rorohiko.blogspot.com/2011/02/easy-access-to-system-folders-on-mac.html</link><pubDate>Wed, 2 Feb 2011 15:44:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-8691592549060385093</guid><description>Time for a few tidbits! On my list of 'good intentions' for 2011 is an entry 'write more blog posts'.&lt;br /&gt;
&lt;br /&gt;
My idea is that I want to jot down a quick blog post each time I find myself using a trick or technique that might be useful to others, and that can be explained in a relatively short blog post.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;(The qualifier 'relatively' in the previous sentence is necessary - I tend to have trouble keeping the number of words in a post down to a reasonable number. I'll try to keep it short and to the point!)&lt;/div&gt;&lt;br /&gt;
It dawned on me that a lot of tricks I have personally come to find mundane and obvious can be life-changing news to some people. I had forgotten how it was for me,&amp;nbsp;how nothing was obvious,&amp;nbsp;when I started out doing this job long, long time ago.&lt;br /&gt;
&lt;br /&gt;
If you're a hardened, experienced software developer or computer tinkerer - my blog posts are not &lt;i&gt;really&lt;/i&gt; for you. You might find the odd gem, but most of the stuff you'll go 'duh - knew that'. But if you're starting out on a new challenge, the wee tricks I'll be describing are things that made my life easier - and I hope they'll make yours easier too.&lt;br /&gt;
&lt;br /&gt;
Ok, to make a living, I am writing software, in various environments, using C++, JavaScript, ExtendScript, REALbasic, PHP, you name it... on Mac, Windows and Linux. As a project grows, invariably I 'll need a spot to put down some 'rubbish' files - temporary files created by my program that are only needed for a little while, and then can get trashed.&lt;br /&gt;
&lt;br /&gt;
Sometimes, while debugging, I want to access those rubbish files with my text editor to inspect their contents - for example, to verify all is well at a certain stage of the program execution.&lt;br /&gt;
&lt;br /&gt;
Mac OS X and Linux (both close relatives of Unix) have a number of spots for storing temporary files - but as on most forms of Unix, you can access that location using the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/tmp &lt;/span&gt;path. Sometimes &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/tmp&lt;/span&gt;&amp;nbsp;is not a real directory but rather an alias or link to some other place - but that does not matter too much.&lt;br /&gt;
&lt;br /&gt;
If you start a command line session (go to &lt;i&gt;/Applications/Utilities&lt;/i&gt;, and start &lt;i&gt;Terminal&lt;/i&gt;), you can type&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cd /tmp&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ls&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
to see what's in it.&lt;br /&gt;
&lt;br /&gt;
On Windows, you go to the &lt;i&gt;Start&lt;/i&gt; button, select the &lt;i&gt;Run...&lt;/i&gt;&amp;nbsp;option, and type &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cmd&lt;/span&gt; into the &lt;i&gt;Open&lt;/i&gt; field.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtuYWPGdTtpD5HDX4-pdgUFs7GL7euDa_8u4i1Wdl-DM9OTLctNKhrHg09tpBdEMXJMN_AU1tNe7HPaAi-8yfLlG0VlQxf5PYXvxu9eu6A2Xp0UPIq6bD-iL6XAjeE9AX3u4j1fOMyoj4/s1600/runcmd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="106" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtuYWPGdTtpD5HDX4-pdgUFs7GL7euDa_8u4i1Wdl-DM9OTLctNKhrHg09tpBdEMXJMN_AU1tNe7HPaAi-8yfLlG0VlQxf5PYXvxu9eu6A2Xp0UPIq6bD-iL6XAjeE9AX3u4j1fOMyoj4/s320/runcmd.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Click Ok. That brings up a command line window.&lt;br /&gt;
&lt;br /&gt;
In the command line window, type&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cd %TEMP%&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;dir&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
to see what's in it.&lt;br /&gt;
&lt;br /&gt;
As it goes, I tend to hop all over the place in my command line sessions - using the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cd&lt;/span&gt; command to hop from directory to directory.&lt;br /&gt;
&lt;br /&gt;
Occasionally, I find myself in a command line session in a deeply nested directory, and I wish I had a &lt;i&gt;Finder&lt;/i&gt; or &lt;i&gt;Explorer&lt;/i&gt; window to get a better overview of the directory (aka folder) contents.&lt;br /&gt;
&lt;br /&gt;
That's easy: on Mac, you simply type&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;open .&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
And on Windows, you type&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;explorer .&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
in the command line (i.e. &lt;i&gt;open&amp;lt;Space&amp;gt;&amp;lt;Period&amp;gt;&amp;lt;Enter&amp;gt;&lt;/i&gt;, or&amp;nbsp;&lt;i&gt;explorer&amp;lt;Space&amp;gt;&amp;lt;Period&amp;gt;&amp;lt;Enter&amp;gt;&lt;/i&gt;), and a &lt;i&gt;Finder&lt;/i&gt; or &lt;i&gt;Explorer&lt;/i&gt; window will pop up showing the contents of the directory you're in. Then you can start dragging icons of the files you see onto various apps to inspect them. For example, I often use&amp;nbsp;&lt;a href="http://barebones.com/products/bbedit/"&gt;&lt;i&gt;BBEdit&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://barebones.com/products/textwrangler/"&gt;&lt;i&gt;TextWrangler&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.suavetech.com/0xed/0xed.html"&gt;&lt;i&gt;0xED&lt;/i&gt;&lt;/a&gt; on Mac, and &lt;a href="http://www.ultraedit.com/products/ultraedit.html"&gt;&lt;i&gt;UltraEdit&lt;/i&gt;&lt;/a&gt; or&amp;nbsp;&lt;a href="http://www.ultraedit.com/products/uestudio.html"&gt;&lt;i&gt;UEStudio&lt;/i&gt;&lt;/a&gt;&amp;nbsp;on Windows.&lt;br /&gt;
&lt;br /&gt;
If you're on the command line, and you want to inspect a text file in the current directory, that's easy enough too. I am personally well-aquainted with &lt;i&gt;vi&lt;/i&gt;, a crusty old Unix text editor, and I use it a lot, but &lt;i&gt;vi&lt;/i&gt; is not exactly user-friendly.&lt;br /&gt;
&lt;br /&gt;
No worries - on Mac, if you have &lt;i&gt;TextWrangler&lt;/i&gt; installed (which is a free download from &lt;i&gt;BareBones&lt;/i&gt;), it should have asked you whether you wanted to install the command line tools. If you're not sure whether you allowed it or not - go to the &lt;i&gt;TextWrangler&lt;/i&gt; menu, and select &lt;i&gt;Install Command Line Tools...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
From now on, when you're in a command line session in &lt;i&gt;Terminal&lt;/i&gt;, you can simply type something like:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;edit whateverfilename.log&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
to inspect the contents of the file &lt;i&gt;whateverfilename.log&lt;/i&gt; in &lt;i&gt;TextWrangler&lt;/i&gt;, assuming you'd have a file called &lt;i&gt;whateverfilename.log&lt;/i&gt; in your current directory.&lt;br /&gt;
&lt;br /&gt;
If you have &lt;i&gt;BBEdit&lt;/i&gt; (&lt;i&gt;TextWrangler's&lt;/i&gt; big brother) installed, simply substitute &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;bbedit&lt;/span&gt;&amp;nbsp;for &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;edit&lt;/span&gt; on the command line.&lt;br /&gt;
&lt;br /&gt;
On Windows, it depends on the text editor you have - everyone has &lt;i&gt;Notepad&lt;/i&gt; or &lt;i&gt;Wordpad&lt;/i&gt;&amp;nbsp;(called &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;write&lt;/span&gt; on the command line). If you have &lt;i&gt;UEStudio&lt;/i&gt; installed, you can use that too - you could type a command similar to any of the following:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;notepad whateverfilename.txt&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;write anotherfilename.log&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;uestudio yetanother.out&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Now, suppose I wanted to quickly open a &lt;i&gt;Finder&lt;/i&gt; window on the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/tmp&lt;/span&gt; directory without needing to start up the &lt;i&gt;Terminal&lt;/i&gt; program. If you go and look on your startup drive, you won't see it - it's there, but the &lt;i&gt;Finder&lt;/i&gt; hides system folders like &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/tmp&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
To get there using the &lt;i&gt;Finder&lt;/i&gt;, select the &lt;i&gt;Go - Go To Folder...&lt;/i&gt;&amp;nbsp;menu item, and type &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/tmp&lt;/span&gt; in the dialog. Click the &lt;i&gt;Go&lt;/i&gt;&amp;nbsp;button - and you should get a &lt;i&gt;Finder&lt;/i&gt; window on the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/tmp&lt;/span&gt; folder.&lt;br /&gt;
&lt;br /&gt;
On Windows, to quickly access a hidden folder, you go to the &lt;i&gt;Run...&lt;/i&gt; function in the &lt;i&gt;Start&lt;/i&gt; menu, and type in the path name. Type &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;%TEMP%&lt;/span&gt; to open a window onto the temporary folder. Or type &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;%APPDATA%&lt;/span&gt; to get an &lt;i&gt;Explorer&lt;/i&gt; window straight onto the current user's hidden application data folder.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLZnSVq_HrR6OF85A1ckYNRU2ZqcS67FMh-VJ-WPynmcYWUtR1JZzjPcSDtv214h4WA-igQ2Bga6iaD0VCQP1lv88_VtqdxbcxCQy6aqMYItIFMoYfUYzp-bDCLLo_71Svw5sBifzZOsw/s1600/appdata.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLZnSVq_HrR6OF85A1ckYNRU2ZqcS67FMh-VJ-WPynmcYWUtR1JZzjPcSDtv214h4WA-igQ2Bga6iaD0VCQP1lv88_VtqdxbcxCQy6aqMYItIFMoYfUYzp-bDCLLo_71Svw5sBifzZOsw/s320/appdata.png" width="175" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
On Mac, if you need to be in the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/tmp&lt;/span&gt; folder a lot (or any other system folder like that - &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/var/log&lt;/span&gt; for example), simply drag the little folder icon of the window for &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/tmp&lt;/span&gt; to the side bar of the &lt;i&gt;Finder&lt;/i&gt; window - from now on you can click an icon to have instant &lt;i&gt;Finder&lt;/i&gt; access to &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/tmp&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9M4k3rR2c9DUw9bYIH0PPKGR37W123m-Rxi7lo_KBMyXW0M1ApuMC15Rg1fnK_VlHgsKs9UmRQ4HySJpoKYAr9PJx23XckH_5_HUjZRfuDCR1xtYjI3gMfQ2QCptBlWfJB4AIePcMSMc/s1600/tmpsidebar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9M4k3rR2c9DUw9bYIH0PPKGR37W123m-Rxi7lo_KBMyXW0M1ApuMC15Rg1fnK_VlHgsKs9UmRQ4HySJpoKYAr9PJx23XckH_5_HUjZRfuDCR1xtYjI3gMfQ2QCptBlWfJB4AIePcMSMc/s320/tmpsidebar.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Another cool one to have in the sidebar is the&amp;nbsp;&lt;i&gt;Originals&lt;/i&gt;&amp;nbsp;or&amp;nbsp;&lt;i&gt;Masters&lt;/i&gt;&amp;nbsp;folder inside your&amp;nbsp;&lt;i&gt;Pictures/iPhoto Library&lt;/i&gt;&amp;nbsp;folder - you can get at the original files without having to go through the whole right-click,&amp;nbsp;&lt;i&gt;Show Package Contents&lt;/i&gt;&amp;nbsp;routine on the&amp;nbsp;&lt;i&gt;iPhoto Library&lt;/i&gt;&amp;nbsp;every time. Be careful though: you should only look at, and not touch the contents of those folders.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Windows 7 has a very similar functionality - you can drag folder icons into the &lt;i&gt;Favorites&lt;/i&gt; on the sidebar.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Going from &lt;i&gt;Finder&lt;/i&gt; or &lt;i&gt;Explorer&lt;/i&gt; to &lt;i&gt;Terminal&lt;/i&gt; or the Windows command line is also easy. Suppose you have a &lt;i&gt;Finder&lt;/i&gt; window open, and you want to get a &lt;i&gt;Terminal&lt;/i&gt; window positioned in the same folder.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Go to the &lt;i&gt;Terminal&lt;/i&gt;, and type &lt;i&gt;cd&amp;lt;Space&amp;gt;&lt;space&gt;&lt;/space&gt;&lt;/i&gt;. Then drag the little folder icon from the &lt;i&gt;Finder&lt;/i&gt; window title bar into the &lt;i&gt;Terminal&lt;/i&gt; window. It will automatically spell out the correct path name - hit the &amp;lt;Enter&amp;gt;&amp;nbsp;&lt;i&gt;&lt;enter&gt;&lt;/enter&gt;&lt;/i&gt;key in the terminal window and you're there.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8Z4Xp04wybNPKroSOlp2U4lq5hNe_RfsFXcjiJLnuc95qQxsgmR3M-TnkULFjZQFsVANI80Wrb4FueHpCNAt0-lvEWWISI81Ey9S94i9hSHYsjKDGYjp6kmCe0g3NN0rvejK6Mt6bY6M/s1600/findertoterminal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8Z4Xp04wybNPKroSOlp2U4lq5hNe_RfsFXcjiJLnuc95qQxsgmR3M-TnkULFjZQFsVANI80Wrb4FueHpCNAt0-lvEWWISI81Ey9S94i9hSHYsjKDGYjp6kmCe0g3NN0rvejK6Mt6bY6M/s320/findertoterminal.png" width="203" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;Windows knows the same trick: in the command line window, type&amp;nbsp;&lt;i&gt;cd&amp;lt;Space&amp;gt;&lt;/i&gt;&lt;i&gt;&lt;space&gt;&amp;nbsp;&lt;/space&gt;&lt;/i&gt;and drag the icon from the &lt;i&gt;Explorer&lt;/i&gt; address bar into the command line window.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN2amcBEpzly8EsIy8ieY564T7SGJ5SXnCLEqmIUmAJHoFw-HwYn1dwta9vIPMPswPo1CyZpghZRh6gWTshkWmS-mkhpvCnL6teJw7vX2EmEUL3IgwoGvpbZRUNzFJ2UBM6zm6iikTdCM/s1600/explorerdrag.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN2amcBEpzly8EsIy8ieY564T7SGJ5SXnCLEqmIUmAJHoFw-HwYn1dwta9vIPMPswPo1CyZpghZRh6gWTshkWmS-mkhpvCnL6teJw7vX2EmEUL3IgwoGvpbZRUNzFJ2UBM6zm6iikTdCM/s320/explorerdrag.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I hope that was useful! There's more stuff like this I could blog about - let me know whether anyone is interested!&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Cheers,&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Kris&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtuYWPGdTtpD5HDX4-pdgUFs7GL7euDa_8u4i1Wdl-DM9OTLctNKhrHg09tpBdEMXJMN_AU1tNe7HPaAi-8yfLlG0VlQxf5PYXvxu9eu6A2Xp0UPIq6bD-iL6XAjeE9AX3u4j1fOMyoj4/s72-c/runcmd.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>Self-diagnosing code</title><link>http://rorohiko.blogspot.com/2011/01/self-diagnosing-code.html</link><pubDate>Wed, 12 Jan 2011 18:28:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-3920779169179179980</guid><description>&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Been a long time since I wrote a blog post - so here's a short one, about how you can make your ExtendScript code help you diagnose issues, and how to do it without killing the execution speed.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;First of all, a fairly long intro about how I make my code self-diagnosing. I'll be skimping on the details - it's all part of my intro, and I'll get to the real point I want to make later.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;When writing code, I nearly always routinely add all kinds of logging to the code. For example, every single function I make gets a little 'intro' and a little, er... 'extro' ;-) ?&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;function blah(var param)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;... body ...&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;return retVal;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;becomes&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;function blah(var param)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;if (kTracing)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; LogEntry("blah, param = " + param);&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;... body ...&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;if (kTracing)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; LogExit("blah);&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;return retVal;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;kTracing&lt;/span&gt; &lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;is a constant that I define somewhere near the top of the script - e.g.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;const kTracing = false;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;LogEntry&lt;/span&gt; &lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;and&lt;/span&gt; &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;LogExit&lt;/span&gt; &lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;are two functions I wrote that append their string parameter to a log file.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;I won't elaborate on those - they're very simple. In my case they're part of a larger set of 'standard' routines I use in all my scripts - I also have&lt;/span&gt; &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;LogError&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;LogWarning&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;LogNote...&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;and these all append their information to the same log file, and can be suppressed by modifying a constant &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;kLogLevel.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Writing those for yourself is left as an exercise.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Secondly, I religiously test pre-conditions: things that &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;should&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt; be true are verified and re-verified. I like using the&lt;/span&gt; &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;do-while (false)&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt; 'non-loop' construct for bailing out quickly when preconditions are incorrect.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;function DoSomethingWithCharacter(c)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;do // This is not a loop!&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (c == null)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; LogError("DoSomethingWithCharacter: c == null");&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; break;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (! (c instanceof Character))&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; LogError("DoSomethingWithCharacter: c is not a Character");&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; break;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;... body of the function ...&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;while (false); // This is not a loop!&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Not sure whether this is actually any faster than&lt;/span&gt; &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;try/catch/throw&lt;/span&gt; &lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;constructs in ExtendScript, but I do know that in a number of environments like C and C++, &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;try/catch &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;comes with a performance penalty, and might not be available for various complex reasons - whereas I expect&lt;/span&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;do-while(false)&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&amp;nbsp;to be relatively cheap.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;I do use both constructs - I tend to use&lt;/span&gt; &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;try/catch/throw&lt;/span&gt; &lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;more for really catastrophic issues, or as a workaround for InDesign issues (e.g. testing for 'dead' object references) whereas &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;do-while(false)&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt; is used for 'controlled failure'.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;The code above is self-diagnosing: it spits out error messages into my log file every time something is not quite right, and in my experience, the error messages are more 'pin-point' precise than what you'd get with try/catch; with try/catch I often find myself struggling a bit to find the actual location of the error.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Release versions of my scripts will typically have their log level set to zero (which means calls to &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;LogError&lt;/span&gt; &lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;and friends amount to almost 'do-nothing', apart from a little overhead). When things go wrong, I modify a few constants (&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;kLogLevel&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;kTracing&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;) at the top of the script, let it do its thing, and often know what the issue is very soon thereafter.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Writing this kind of code takes a bit of extra effort - but it always pays back for itself the first time I get the first hairy bug to diagnose. It's not always possible to use the ExtendScript Toolkit for a debugging session for various reasons, and having the proper testing and logging code ready-to-go is often a life saver.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Now, that's the intro - now onto the real issue I wanted to discuss.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Adding logging code to all my functions comes at a performance penalty: especially 'deep' routines that are called from within loops are often called thousands or millions of times, and even when&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;kTracing&lt;/span&gt; &lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;is set to&lt;/span&gt; &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;false&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&amp;nbsp;this could still incur some overhead.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Now, here's a trick I often use: I use my trusty text editor (BBEdit) to make my logging code disappear and reappear as needed. Here's how it goes: I dress up &lt;i&gt;all&lt;/i&gt; my intro and 'extro' code as follows:&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;...&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;/*TRACEIN*/if (kTrace)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;LogEntry("AdjustStory");&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}/*TRACEOUT*/&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;When the code is ready for a production environment, I do a global search-and-replace and replace&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/*TRACEIN*/&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;with&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/*TRACEIN*-/&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;and also (even though it is not necessary, but I am obsessive compulsive about this, so I need to do it to keep things 'even')&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/*TRACEOUT*/&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;is replaced with&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/-*TRACEOUT*/&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;As a result, my tracing code now becomes:&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;...&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;/*TRACEIN*-/if (kTrace)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;LogEntry("AdjustStory");&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}/-*TRACEOUT*/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;...&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;If you look closely, you'll see the whole construct is now a 3-line comment, which will almost certainly be less costly in performance. I can only guess how the ExtendScript engine works, but I suspect that the only cost will be a tiny bit of time when the script is parsed, and there would be no additional cost during repeated execution of the function.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Furthermore, my scripts often are packaged up as .spln files (using &lt;/span&gt;&lt;a href="http://www.rorohiko.com/activepageitemdeveloper"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Active Page Item Developer&lt;/span&gt;&lt;/i&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;), and this automatically strips out all comments when creating a release version of an .spln - so when using this for .spln development, the entry/exit logging code is guaranteed to be completely gone.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;When an issue arises, I simply perform the reverse search-and-replace, and re-enable my disabled logging code.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;There's lot of additional things you can do with logging - I've only scratched the surface here. For example, sometimes I use an XML format for output of the logging - and the extra effort to do that is rewarded by the fact that I can use an XML editor or XML browser to selectively hide and show whole sections of the log. Anyway, depending on feedback, I might do another post some time later on a few more of these techniques.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>Don't Be a Tech Support Nightmare</title><link>http://rorohiko.blogspot.com/2010/06/tech-support-nightmares.html</link><pubDate>Sun, 6 Jun 2010 15:17:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-3623592502912749518</guid><description>Synopsis: even if you're under stress, try to communicate clearly with the people in tech support. There's a little checklist at the end of this post.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;In this blog post,&amp;nbsp;I want to share some issues people in tech support are facing, and raise some awareness of the difficulties anyone in tech support has to contend with.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;It all comes down to communication, or a breakdown thereof.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I am sure a lot of other small software companies are facing the same issues - so please, takes this plea to heart next time you're dealing with software created by a small company.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;It might come as a surprise, but in small companies like Rorohiko, tech support is being run by real, live people. We don't have a complex automated response system - if you e-mail support@rorohiko.com, you'll be answered by a real person.&amp;nbsp;We go to great efforts to run a tidy, responsive tech support department. We provide world-class support on our software - whether it is free or not. We respond quickly to e-mails, most of the time within hours.&lt;br /&gt;
&lt;br /&gt;
Yet we still run into the occasional tech support nightmare.&lt;br /&gt;
&lt;br /&gt;
The problems we're facing are manyfold.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;1) Not Enough Info&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
First of all, people often don't give tech support people any information at all, or way too little. You'd be surprised how many times we get an email that simply states:&lt;br /&gt;
&lt;br /&gt;
"Dear support,&lt;br /&gt;
It does not work. Please fix ASAP!&lt;br /&gt;
Bye,&lt;br /&gt;
John"&lt;br /&gt;
&lt;br /&gt;
This is sometimes prefaced with some upset diatribe about things being urgent.&lt;br /&gt;
&lt;br /&gt;
We then need to guess what 'it' is? More than once the 'it' that did not work turned out to be a software from a different company all together.&lt;br /&gt;
&lt;br /&gt;
(So - no, we don't do electronic PCB design. Nor knitting patterns. And no, we're not Adobe. We make task tools to help do things faster with InDesign - plug-ins, extensions, little applications. We don't make InDesign).&lt;br /&gt;
&lt;br /&gt;
As we're servicing both people on Macintosh and Windows, we also need to figure out whether this person is using a Mac or Windows, and what the version is of their OS - XP, Vista, OS X 10.5, OS X 10.6? Then we also often need to know what version of InDesign they are using.&lt;br /&gt;
&lt;br /&gt;
We sometimes use little tricks like looking at the raw e-mail headers of their e-mail - that might give us a clue whether they're Mac or Windows users, and sometimes even what version of the OS they're using. So if their hidden e-mail header says their e-mail program is Outlook, that's a give-away that they're on Windows.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;2) We Cannot Reach The Person In Need&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Our e-mails get thrashed by their spam-killer.&lt;br /&gt;
&lt;br /&gt;
Or their e-mail server rejects our e-mails because it deems them suspicious - so we get our e-mails back after a few days with 'Undelivered e-mail returned to sender'.&lt;br /&gt;
&lt;br /&gt;
Or our e-mails don't get through because their e-mail inbox is full.&lt;br /&gt;
&lt;br /&gt;
So the scenario is like this: we get a question, and we reply, typically within a few hours. Our reply does not reach its destination.&lt;br /&gt;
&lt;br /&gt;
We get an upset follow-up. We try to use a different 'sending' e-mail address, most of the time to no avail. We get an even more upset follow up,... and so on.&lt;br /&gt;
&lt;br /&gt;
Sometimes people also post messages on forums saying things like 'Rorohiko does not answer e-mails'.&lt;br /&gt;
&lt;br /&gt;
Luckily, most people have an e-mail signature, and such e-mail signature is a really Good Thing as it often contains a phone number. If we notice e-mails being bounced and we have a phone number, we give them a call - problem fixed.&lt;br /&gt;
&lt;br /&gt;
But all too often there is no phone number - all we have is a first name and some email address @gmail.com or @hotmail.com. What's a tech support person to do?&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;3) Not Enough Answers&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The third problem is that people often are unable to answer the questions we ask - they're often under stress, and have trouble concentrating on what we ask them. A dialog could go like this:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;It does not work. Please fix ASAP!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Hi,... So sorry to hear that.&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Could you let us know the name of the software you're having trouble with?&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Also, we need to know whether you are on a Mac or on Windows.&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;i&gt;&lt;br /&gt;
&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Furthermore, let us know what version of the OS you're using: is it XP, Vista, Windows 7? Or OS X 10.4, 10.5 or 10.6?&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;And if InDesign is involved, please give us the version number - CS, CS2,... CS5?&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Thanks so much!&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Rorohiko Support&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I am on CS4. I need to get this out by tomorrow. Please FIX ASAP! IT IS URGENT&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Thanks so much for that information! That helps a bit - but we need more. What is the name of the software you're having trouble with? We have many products available, so it could be any one of them.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Rorohiko Support&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The product is called Adobe InDesign. And MS Word. HELP ME!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
(ok - here we can kind of guess the issue might be with our TextExporter - that's the tool we most commonly see being used together with InDesign and MS Word).&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;and the e-mail ping-pong drags on...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;4) Don't Contact support@rorohiko.com - Post It On a Forum Instead&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
This is one of the biggest issue we're facing. Instead of asking us for help, some people simply assume they are on their own, and look for help with our software on public forums.&lt;br /&gt;
&lt;br /&gt;
That's OK - the people on those forums are often very knowledgeable, and very helpful, and you might get a solution, or they will point you to support@rorohiko.com.&lt;br /&gt;
&lt;br /&gt;
The problem is that we're kept out of the loop - i.e. if there's a problem with any of our software, we'd love to hear about it.&lt;br /&gt;
&lt;br /&gt;
So, our plea: if you have any issues with our software, let us know!&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;5) Web Sites Do Go Down&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
We are using an ISP located in the USA, and we're pretty happy with them (http://www.arvixe.com if you need to know).&lt;br /&gt;
&lt;br /&gt;
But every so often, just like everyone else's, our web site goes down for 10, 20, 50... minutes. It might be DNS failure, a hardware replacement,... Sometimes there's some other internet issue.&lt;br /&gt;
&lt;br /&gt;
If you try to reach http://www.rorohiko.com and you cannot reach the web site here's what you should do:&lt;br /&gt;
&lt;br /&gt;
1) E-mail support@rorohiko.com to let us know that our web site is down - we're not continuously monitoring it, so we're always happy if someone helps us out by letting us know.&lt;br /&gt;
2) Sit tight, and try again in a few hours.&lt;br /&gt;
&lt;br /&gt;
Here's what you should not do:&lt;br /&gt;
&lt;br /&gt;
1) Assume that because our web site is down, something must be horribly wrong&lt;br /&gt;
2) Put posts on public forums asking whether Rorohiko has gone out of business because their web site is down&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;6) We're In a Different Time Zone&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Rorohiko is based in New Zealand. That means we're in a different time zone - so you might not always get an immediate response to your e-mail. We're almost a day ahead of the USA - so what is Friday in the USA is already Saturday here in New Zealand. If you e-mail us on Friday, we might already be out fishin'.&lt;br /&gt;
&lt;br /&gt;
Most of the time we do keep our support department active over the weekend, but occasionally, e-mails won't be answered until after the weekend.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;7) Be Impolite And Demanding On Forums&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
This is not an issue that affects us in tech support, but we do see it happen a lot, and I wanted to address it here, because it is also a communication issue.&lt;br /&gt;
&lt;br /&gt;
Various forums like http://forums.adobe.com are run by volunteers - people willing to sacrifice their own time and knowledge for the greater good.&lt;br /&gt;
&lt;br /&gt;
All too often, someone under stress busts in on these forums, and starts demanding a solution for a problem, preferably in ALL CAPS, and they NEED IT NOW.&lt;br /&gt;
&lt;br /&gt;
Please, don't do that - keep in mind that software forums are like tech support run by volunteers. If a forum post does not get answered: that's how it goes. You cannot force volunteers to help you fix your problem.&lt;br /&gt;
&lt;br /&gt;
Being polite helps. Being complete and concise helps too.&amp;nbsp;Building goodwill by helping others in need helps too - so if you can help someone else, do it. By doing that, you increase your chances of being helped when the time comes you need it.&lt;br /&gt;
&lt;br /&gt;
But don't expect help if you go bustin' in yelling you need help NOW.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Conclusion&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
So - if you are ever in the position of needing tech support - please think of the recipient at the other end, and help them help you.&lt;br /&gt;
&lt;br /&gt;
Provide ample information from the first e-mail or post you send:&lt;br /&gt;
&lt;br /&gt;
- Who are you? Make sure to leave enough info so you can be contacted. Provide an alternate e-mail address. Provide a phone number.&lt;br /&gt;
- What is it about? Make sure you explain what the name of the software or tool is you're having trouble with.&lt;br /&gt;
- What is the problem? Describe in detail what steps you are taking and where it goes wrong (e.g. something like "I then try to select the File - Open... menu but it is greyed out")&lt;br /&gt;
- Which platform are you on: Mac/Windows? What version of the OS? XP, Server 2008, Vista, Vista 64, Win7, Win7 64, OS X 10.4.x, OS X 10.5.x,...&lt;br /&gt;
- What version of the creative suite are you using: CS, CS2, CS3, CS4, CS5?&lt;br /&gt;
- Do you know how to create a system profile on Mac? (Go to the 'Apple - About this Mac' menu then click 'More Info...' and use 'File - Save As...' to save a system profile. Attach it to your e-mail).&lt;br /&gt;
- What version of InDesign are you using? CS4 has a whole range: 6.0, 6.0.1,... 6.0.5?&lt;br /&gt;
- Can you make one or more screenshots of the problem? If so, please do&lt;br /&gt;
- Can you provide a sample document? If you can, please do (but don't send a 1GB sample - try to make it as small as possible)&lt;br /&gt;
- Did something crash? If so, can you get the crash logs and e-mail them? If you don't know what those are, can you find someone to help you with that?&lt;br /&gt;
&lt;br /&gt;
Finally, answer all questions you get in return to the best of your capacity.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Just sayin'&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Cheers,&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Kris&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>Kill The Caps Lock!</title><link>http://rorohiko.blogspot.com/2009/12/kill-caps-lock.html</link><pubDate>Sun, 27 Dec 2009 14:20:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-2118437443189073904</guid><description>Here's a little tidbit that has made my life a little bit easier: kill the Caps Lock on your Mac.&lt;br /&gt;
&lt;br /&gt;
I don't think I've ever used the Caps Lock key - all it's ever done for me is cause pain and grief and wrong passwords or inadvertent 'shouting' in e-mails. It's a fossil from days gone by.&lt;br /&gt;
&lt;br /&gt;
Go into System Preferences, select the 'Keyboard and Mouse' or 'Keyboard' panel, click 'Modified keys...'&lt;br /&gt;
and set the Caps Lock key to 'No Action'.&lt;br /&gt;
&lt;br /&gt;
Takes all of 10 seconds!&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSg_xEvt55654l65vluItqRCmgqJlXky_i6sDuY16xBkn2NhKcmBek4T2MSOSSbcghaFBl8geZCwsoeWRzFYL4K9qABKmbzRyoouT5aEzhLzh_NK7Cg0Os4Np0r0olrhKca7ycnYzEAYs/s1600-h/Screen+shot+2009-12-28+at+11.12.31+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSg_xEvt55654l65vluItqRCmgqJlXky_i6sDuY16xBkn2NhKcmBek4T2MSOSSbcghaFBl8geZCwsoeWRzFYL4K9qABKmbzRyoouT5aEzhLzh_NK7Cg0Os4Np0r0olrhKca7ycnYzEAYs/s320/Screen+shot+2009-12-28+at+11.12.31+AM.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;I don't know about you, but I love it.&lt;br /&gt;
&lt;br /&gt;
Cheers,&lt;br /&gt;
&lt;br /&gt;
Kris</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSg_xEvt55654l65vluItqRCmgqJlXky_i6sDuY16xBkn2NhKcmBek4T2MSOSSbcghaFBl8geZCwsoeWRzFYL4K9qABKmbzRyoouT5aEzhLzh_NK7Cg0Os4Np0r0olrhKca7ycnYzEAYs/s72-c/Screen+shot+2009-12-28+at+11.12.31+AM.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>BBEdit and ExtendScript</title><link>http://rorohiko.blogspot.com/2009/11/bbedit-and-extendscript.html</link><pubDate>Thu, 26 Nov 2009 13:42:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-7029265071137691268</guid><description>Quick tidbit for my fellow ExtendScripters. I am using BBEdit as my main text editor on Mac OS X, and I've set it so .jsx files are seen as JavaScript files. That adds lot of nice features that are also handy when working on an ExtendScript.&lt;br /&gt;
&lt;br /&gt;
But when I am working on an ExtendScript, there is this little annoying thing: each time I started typing&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;try&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
followed by a return,&amp;nbsp;BBEdit's auto-completion would kick in and convert it to something like&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;Try.these(&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;function() { ... },&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;foo.bar.bind(),&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;this.bat.bind()&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Gaah! I didn't want that!&lt;br /&gt;
&lt;br /&gt;
One of these minor annoyances - not enough to spend time on, got code to write, right?&lt;br /&gt;
&lt;br /&gt;
But eventually, I got annoyed enough so I did the Right Thing and looked into it.&lt;br /&gt;
&lt;br /&gt;
It's simple enough to clear up:&lt;br /&gt;
&lt;br /&gt;
In the Finder, go to your home folder&lt;br /&gt;
&lt;br /&gt;
Go into &lt;i&gt;Library&lt;/i&gt;, then &lt;i&gt;Application Support&lt;/i&gt;, then &lt;i&gt;BBEdit&lt;/i&gt;, then &lt;i&gt;Clippings&lt;/i&gt;, then &lt;i&gt;JavaScript.js&lt;/i&gt;, then &lt;i&gt;Prototype&lt;/i&gt;, then get rid of the file called &lt;i&gt;Try.these&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
Oh bliss! It's like removing a pesky pebble from your shoe!&lt;br /&gt;
&lt;br /&gt;
Some time later, I'll look into creating a proper 'try - catch' autocompletion that matches my ExtendScript behavior, but for now, just getting rid of this is just great!</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>InDesign Scripters and Plug-In Developers: How To Avoid Confusing File Duplications</title><link>http://rorohiko.blogspot.com/2009/10/indesign-scripters-and-plug-in.html</link><pubDate>Fri, 23 Oct 2009 22:52:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-6852532564100897277</guid><description>In short: how to avoid copying or shuffling scripts and plug-ins during development on Mac or Windows.&lt;br /&gt;&lt;br /&gt;When it comes to scripts or plug-ins, Mac alias files can be used as if they are 'the real thing' - InDesign will treat an alias file as if it &lt;span style="font-style: italic;"&gt;is&lt;/span&gt; the script or plug-in it is referring to. I'll explain how you can use that feature to your advantage.&lt;br /&gt;&lt;br /&gt;Sadly enough, a Windows shortcut file is not treated with the same respect by InDesign - a Windows shortcut file is simply ignored, so shortcuts are out.&lt;br /&gt;&lt;br /&gt;Luckily, Windows has a 'hard-linking' feature that can be used in the same way as Mac alias files - I'll explain that too.&lt;br /&gt;&lt;br /&gt;The basic idea is to avoid 'scattering' copies of your script or plug-in around your hard disk. As soon as you start copying stuff around, it becomes easy to lose track of which is which, and in the heat of the moment, you might get older and newer versions mixed up.&lt;br /&gt;&lt;br /&gt;A typical scenario would be: you're creating a script that needs to work both on InDesign CS3 and InDesign CS4. You're testing and debugging - and each time you want to swap between CS3 and CS4, you need to copy the script in progress from one Scripts folder to the other.&lt;br /&gt;&lt;br /&gt;And then the phone rings, and you're caught in mid-swap. After the phone call, you forgot: did you complete the copy or not? So, where is the most recent version - in the CS3 folder or in the CS4 folder? Frustrating, isn't it?&lt;br /&gt;&lt;br /&gt;To avoid doing 'the shuffle',  you can instead store a single 'master copy' of your plug-in or script somewhere on your hard disk.&lt;br /&gt;&lt;br /&gt;If you are using a source code control system like SVN or CVS, the master copy would probably reside somewhere in a folder structure managed with the source code control system.&lt;br /&gt;&lt;br /&gt;Then, instead of copying the script or plug-in to it's 'active location' (e.g. one of the InDesign plug-ins folder, or one of the InDesign scripts folders), you instead create a 'stand-in' which always refers back to the master copy of the file.&lt;br /&gt;&lt;br /&gt;On Mac, you can use an alias file for that - pretty easy. Create an alias of the script or plug-in and plunk the alias into the proper InDesign subfolder - and everything will work as if the 'real thing' was there.&lt;br /&gt;&lt;br /&gt;On Windows, you might be tempted to try shortcut files - but that does not work. Instead, you need to use a hard link, which you can create from a command-line window with the following command:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fsutil hardlink create &lt;/span&gt;&lt;/span&gt;&lt;destination&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;original&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;[destination] [original]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;where [destination] is the path of the hard link to be created and [original] is the path of the original file. Depending on your setup and Windows OS version, you might need to launch the command-line window as user 'Administrator', so you have enough privileges.&lt;br /&gt;&lt;br /&gt;You can use this command to create hard links to &lt;span style="font-style: italic;"&gt;folders &lt;/span&gt;as well as &lt;span style="font-style: italic;"&gt;files &lt;/span&gt;- but I recommend you &lt;span style="font-style: italic;"&gt;only &lt;/span&gt;use it for hard links to &lt;span style="font-style: italic;"&gt;files&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Also keep in mind that this command only works on NTFS volumes (so FAT volumes are out), and both original and destination need to be on the same volume - but in most cases that's all you need.&lt;br /&gt;&lt;br /&gt;Hard links are a low-level NTFS feature, and hard links to &lt;span style="font-style: italic;"&gt;folders &lt;/span&gt;are not well supported in Explorer - and as a result, they're very &lt;span style="font-style: italic;"&gt;dangerous &lt;/span&gt;things - they don't behave like Windows shortcuts, and that is where the danger lies.&lt;br /&gt;&lt;br /&gt;Suppose you had created a hard link from a folder, and then you attempt to delete the hard link later on. Doing that in Explorer would actually also delete all the items that reside in the original folder - not what you'd expect. Explorer treats the hard link as the real thing, and when you delete a folder, it simple-mindedly will empty the folder first - blissfully unaware that the folder is still being used via the original directory entry.&lt;br /&gt;&lt;br /&gt;Once a hard link to a folder is created, it's not easy to get rid of without also losing the contents of the folder.&lt;br /&gt;&lt;br /&gt;In short: avoid issues - only create hard links to files on Windows; that's much safer.&lt;br /&gt;&lt;br /&gt;There's another caveat with regards to hard links on Windows. If you use a hard link to a script file, you must make sure that the text editor program you use does &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; create backup files because that tends to mess up the hard link - typically, the text editor will simply rename the original file 'test.jsx' to 'test.jsx.bak' or so - taking the hard link along, so it now refers to the .bak file instead of the modified .jsx file.&lt;br /&gt;&lt;br /&gt;Turn the backup feature off, and all will be well. I've tried it with Notepad and ExtendScript toolkit, and things seem to work well: if I edit the script via its hard link, the original script is updated as well. I also use UEStudio as a text editor - and at first I ran into problems because this editor makes .bak files by default. Once I switched that off, things worked well.&lt;br /&gt;&lt;br /&gt;With regards to maintaining hard links to plug-ins generated from Visual Studio: make sure to use &lt;span style="font-style: italic;"&gt;Build&lt;/span&gt;, not &lt;span style="font-style: italic;"&gt;Rebuild &lt;/span&gt;- &lt;span style="font-style: italic;"&gt;Rebuild &lt;/span&gt;will destroy the original and break the link.&lt;br /&gt;&lt;br /&gt;So, that's it for now - hope this makes your life a bit easier!&lt;/original&gt;&lt;/destination&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>Display Workflow-Related Meta-Info  For Your Users From An InDesign Script</title><link>http://rorohiko.blogspot.com/2009/10/showing-user-some-workflow-related-info.html</link><category>APID ToolAssistant</category><category>AppleScript</category><category>ExtendScript</category><category>InDesign</category><category>metadata</category><category>script</category><category>scripting</category><category>VBScript</category><pubDate>Fri, 9 Oct 2009 17:58:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-1494669579222709565</guid><description>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPQ0VD6un0JQoAkAsvxHur2fv_Gj0cK3vr9qL6Aa3HCeZpafUzcYER0gnhbfIWp70aZ-FOEUzH36JlqTDRhiu4VOFPm8cDnF77-kryBpxku15RB8k8LYLcDKo34bi-vxBjT5b6wRWyjoU/s1600-h/Screen+shot+2009-10-05+at+6.11.36+PM.png"&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiICdd9yvbU2rOsCIVulkY_VAr-l6lNG6bRJYb7HEGuhghkAdLIZ9Uiz7E6nGohYmNoD27JbpEFNRq8kkS-6cUnbqsgw7t-4LgT1vUuZwvS132s0tvUZ3Yu5dQF_ptuw6mvkAGzirClby0/s1600-h/Screen+shot+2009-10-10+at+3.34.06+PM.png" style="text-decoration: none;"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 289px; height: 217px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiICdd9yvbU2rOsCIVulkY_VAr-l6lNG6bRJYb7HEGuhghkAdLIZ9Uiz7E6nGohYmNoD27JbpEFNRq8kkS-6cUnbqsgw7t-4LgT1vUuZwvS132s0tvUZ3Yu5dQF_ptuw6mvkAGzirClby0/s320/Screen+shot+2009-10-10+at+3.34.06+PM.png" alt="" id="BLOGGER_PHOTO_ID_5390794279918097522" border="0" /&gt;&lt;/a&gt;&lt;div&gt;When developing workflow software around Adobe® InDesign® or Adobe® InDesign Server®, as a scripter, you often find yourself attaching 'meta-info' or metadata in some form or shape to various page elements in an InDesign document.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In this blog post, the samples should work with InDesign CS and above on Mac as well as on PC, and I'll use ExtendScript for InDesign for the scripts. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But the information presented here can be applied just as well in AppleScript or VBScript. The syntax is slightly different, but it works equally well.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Meta-info would be any info that is not directly related to the page layout per se, but that needs to be associated with elements of the page layout. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Examples of meta-info you might like to attach to a page item would be things like invoice data, prices, product codes, file names, script labels, XML tags, user names, document history information, destinations, job ticket data...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In many cases, this meta-info can remain hidden from the end-user and not be displayed on the page layout at all - the data is typically picked up by various automated components of your workflow (scripts, applications, plug-ins...) and used to control processes and routing of info and documents.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the most popular methods to attach meta-info to InDesign page items is to use the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;extractLabel&lt;/span&gt; and &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;insertLabel&lt;/span&gt; methods. These two essentially allow you to 'attach' any number of arbitrary strings to any page item, where you identify each of the strings you want to stash away with a key string.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example, try the following script.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Open or create a document, select a page item and run the following script. (Be careful: the script has no error checking whatsoever, so it is not user-friendly. You need to select exactly one page item, and with the item selected, you need to run the script via the Scripts Palette).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;// Script1.js&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;var theItem = app.selection[0];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;theItem.insertLabel("com.rorohiko.statusquo","Whatever you want tada tada whatever you need tada tada");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nothing apparent will seem to happen - that's OK. Now run the second script, while keeping the same page item selected:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;// Script2.js&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;var theItem = app.selection[0];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;var theData = theItem.extractLabel("com.rorohiko.statusquo");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;alert(theData);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This shows how you can attach a string to a page item. I do recommend that you use a globally unique string for the keys, for example, like I did, based on my reversed domain name. That helps ascertain that you don't accidentally use the same key as another scripter.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example, if your domain name is &lt;i&gt;yourcompany.be&lt;/i&gt;, and you want to store, say, a user name, you should write something like:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;theItem.insertLabel("be.yourcompany.username","John");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;instead of&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;theItem.insertLabel("username","John");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The latter will also work, of course, but you always run the risk that your end user might try to run two scripts from two different developers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Imagine she tries to use a script created by &lt;i&gt;yourcompany.be&lt;/i&gt; and also another script created by &lt;i&gt;rorohiko.com&lt;/i&gt;, and both scripts would use the same key &lt;i&gt;username&lt;/i&gt; for slightly different purposes. Lots of weirdness would result.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Better be safe than sorry - so if you use &lt;i&gt;be.yourcompany.username&lt;/i&gt;, and I use &lt;i&gt;com.rorohiko.username&lt;/i&gt; as the key to &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;insertLabel&lt;/span&gt; / &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;extractLabel&lt;/span&gt;, there will never be a conflict - are we cool on that?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The string you store in the keyed location can be pretty much anything - I often store a very looong string, for example, with carriage returns separating individual records, and tabs separating individual columns, and then use .split to convert the string in to a table.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;const kMyDataKey = "com.rorohiko.keyforimportantdata";&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new',serif;"&gt;//... more code ...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new',serif;"&gt;// Little table of data with columns separated by tabs&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new',serif;"&gt;// and lines separated by carriage returns&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new',serif;"&gt;// 12 13 Kris&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new',serif;"&gt;// 15 17 John&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;var myImportantData = "12\t13\tKris\r15\t17\tJohn\r";&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;theItem.insertLabel(kMyDataKey,myImportantData);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;//... more code ...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;var theData = theItem.extractLabel(kMyDataKey);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;theData = theData.split("\r");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;for (var recordIdx = 0; recordIdx &lt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  theData[recordIdx] = theData[recordIdx].split("\t");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;//... more code ...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Or you could encode the data you want to stash into a big XML formatted string - that works really well too - something like:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;const kMyDataKey = "com.rorohiko.thecoolKeyForXMLData";&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;//... more code ...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;var myImportantData = "";&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;myImportantData += "&amp;lt;data&amp;gt;&lt;data&gt;"&lt;/data&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;myImportantData += "&amp;lt;record&amp;gt;"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;myImportantData += "&amp;lt;x&amp;gt;&lt;x&gt;12&amp;lt;/x&amp;gt;&amp;lt;y&amp;gt;&lt;y&gt;13&amp;lt;/y&amp;gt;&amp;lt;name&amp;gt;&lt;name&gt;Kris&amp;lt;/name&amp;gt;";&lt;/name&gt;&lt;/y&gt;&lt;/x&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;myImportantData += "&amp;lt;/record&amp;gt;"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;myImportantData += "&amp;lt;record&amp;gt;"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;myImportantData += "&amp;lt;x&amp;gt;&lt;x&gt;15&amp;lt;/x&amp;gt;&amp;lt;y&amp;gt;&lt;y&gt;17&amp;lt;/y&amp;gt;&amp;lt;name&amp;gt;&lt;name&gt;John&amp;lt;/name&amp;gt;";&lt;/name&gt;&lt;/y&gt;&lt;/x&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new',serif;"&gt;myImportantData += "&amp;lt;/record&amp;gt;"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new',serif;"&gt;myImportantData += "&amp;lt;/data&amp;gt;&lt;data&gt;"&lt;/data&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new',serif;"&gt;theItem.insertLabel(kMyDataKey,myImportantData);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;//... more code ...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;var theData = theItem.extractLabel(kMyDataKey);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;// Use the built-in XML parser to parse the XML data back into its components&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;//... more code ...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Or any other scheme you can come up with to convert the data you want to store into a string- you can do things like ASCIIEncode or ASCII85 the data if you want to store binary info in a pure ASCII string - your imagination is the limit.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, what if you wanted some of this data to be visible to the end-user? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example, the end-user could use one of your scripts to tag individual page items, maybe to let your automated workflow 'see' where it needs to insert a header and where it needs to put an image, and so on.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Wouldn't it be great if you could give the user some visual feedback in this regard?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's where our APID ToolAssistant comes in. APID ToolAssistant was conceived as a 'scripters toolkit' and it offers a whole range of functionality that could help the serious scripter.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You might have heard about APID ToolAssistant, because it offers a very 'fine grained' event model that allows scripts to be triggered by user interaction with the document - but APID ToolAssistant has a lot more to offer than just some event-driven facilities.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the coolest features in the APID ToolAssistant toolkit is that it offers the scripter a way to display any 'meta-info' next to a page item. To display this meta-info, APID ToolAssistant can add little, non-printing 'labels' (also known as &lt;i&gt;adornments&lt;/i&gt;) to any page item, and in those labels, you can display anything you like: some text, or a PNG image like a logo or an icon, all under the control of your script.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These adornments are not page items - they are instead very similar in nature to the selection handles and the overset text indicator on page item frames. They are nothing more than visual cues for the user, and they are not visible in the printed end-result.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The way APID ToolAssistant works its magic is by adding some new methods and attributes to the InDesign object model. There is a pair of methods called &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;setDataStore&lt;/span&gt; / &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;getDataStore&lt;/span&gt; which behave very similar in many respects to how the built-in &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;insertLabel&lt;/span&gt; / &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;extractLabel&lt;/span&gt; work - i.e. you store data identified by a unique key.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But there's a twist - some of the unique keys have a special meaning - they are 'magical'. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If a key starts with &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;$ADORNMENT_&lt;/span&gt; and ends with &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;$&lt;/span&gt;, it tells APID ToolAssistant the stored data is something that has to be interpreted as content for a little info-label.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Install APID ToolAssistant 1.0.47 or higher (you can download it from &lt;a href="http://www.rorohiko.com/apidtoolassistant"&gt;http://www.rorohiko.com/apidtoolassistant&lt;/a&gt; ), and enter the following script:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;// Script3.js&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;var theItem = app.selection[0];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;theItem.setDataStore("$ADORNMENT_com.rorohiko.sample$","Hello World");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just like with the first sample scripts you need to select a single page item, and then run the script.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Is that cool or what? (If your APID ToolAssistant has been installed for a while, it might have reverted to unlicensed mode, in which case you'd see 'DEMO: Hello World' in the little info-label).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, this is only a simple example - instead of a simple string "Hello World" you can actually provide an array with data to &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;setDataStore&lt;/span&gt;, and through various parameter values ask APID ToolAssistant to display the label on the left, right or bottom sides of the frame.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Or you can ask it to change the background color. Or for really fancy stuff, you can display a PNG image instead of text. The possibilities are endless.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To get some ideas about what you could do with this functionality, have a look at what I've done with our FrameReporter tool at &lt;a href="http://www.rorohiko.com/framereporter"&gt;http://www.rorohiko.com/framereporter&lt;/a&gt; . FrameReporter is really not much more than a very thin layer of code on top of APID ToolAssistant.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238);"&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPQ0VD6un0JQoAkAsvxHur2fv_Gj0cK3vr9qL6Aa3HCeZpafUzcYER0gnhbfIWp70aZ-FOEUzH36JlqTDRhiu4VOFPm8cDnF77-kryBpxku15RB8k8LYLcDKo34bi-vxBjT5b6wRWyjoU/s320/Screen+shot+2009-10-05+at+6.11.36+PM.png" alt="" id="BLOGGER_PHOTO_ID_5391059766110246274" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 244px;" border="0" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;For more detailed info, you need to look at the information provided in the Active Page Items Developer toolkit - &lt;a href="http://www.rorohiko.com/activepageitemsdeveloper"&gt;http://www.rorohiko.com/activepageitemsdeveloper&lt;/a&gt; .&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The necessary documentation is included in the free demo download - you don't need to purchase the toolkit if all you want to do is use this 'meta-info-label' feature. Check the reference manual to find out about all the variations of the adornment features.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, keep in mind - if you want to show meta-info to an end-user, all you need is a US$25 license for APID ToolAssistant (to get rid of those 'DEMO:' prefixes added by the unlicensed version), and you can script away!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;More info can also be found here:&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.rorohiko.com/wordpress/2008/10/15/how-to-add-indesign-page-item-adornments-using-scripting/"&gt;http://www.rorohiko.com/wordpress/2008/10/15/how-to-add-indesign-page-item-adornments-using-scripting/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiICdd9yvbU2rOsCIVulkY_VAr-l6lNG6bRJYb7HEGuhghkAdLIZ9Uiz7E6nGohYmNoD27JbpEFNRq8kkS-6cUnbqsgw7t-4LgT1vUuZwvS132s0tvUZ3Yu5dQF_ptuw6mvkAGzirClby0/s72-c/Screen+shot+2009-10-10+at+3.34.06+PM.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>Apple Mail and the Drafts folder</title><link>http://rorohiko.blogspot.com/2009/08/apple-mail-and-drafts-folder.html</link><pubDate>Tue, 11 Aug 2009 23:04:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-4084201307090529618</guid><description>I use Apple Mail, and generally, it does work well. However, there's one thing that annoys me: if you don't have any 'pending' draft e-mails, the Drafts mail folder is invisible and cannot be seen in the mail window. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That seems like a non-issue, but I like to use the Drafts folder for 'repetitive' e-mail. I sometimes send out a similar e-mail to two or three people, and I like to option-drag previously sent e-mail from the Sent mail folder back to the Drafts folder to make a modifiable copy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What I used to do in previous versions of Apple Mail was the following:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) Type in an e-mail. Hit 'Send'.&lt;/div&gt;&lt;div&gt;2) Open the 'Sent' folder in Apple Mail and Option-Drag the e-mail I just sent to the Drafts folder. That makes a copy of the e-mail, and makes it available as a draft.&lt;/div&gt;&lt;div&gt;3) Double-click the draft in the Drafts folder, and adjust it to suit the next addressee; hit 'Send'.&lt;/div&gt;&lt;div&gt;4) Go back to step 2 as needed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Because in more recent versions of Apple Mail, the Drafts folder becomes invisible if it is empty, I used the following clumsy workaround:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;0) Create an empty, dummy e-mail and hit 'Save as Draft'. That puts something in the Drafts folder, and I can start using my previous trick (option-drag sent e-mail into Drafts to make a modifiable copy). Go to step 1) above.&lt;/div&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That works OK, but the dummy e-mail is blank, and you end up with a blank e-mail in the Drafts folder - I don't really like that.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, finally my current workaround is to create a single, non-blank e-mail in the Drafts folder, and leave it there for eternity. It's not perfect, but I can live with that.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPMe6igSRwU01OkK1KCPclN80UiM8pJoCIBdaeFOdCn2Jn39sL7FBubCm5hJqr0c-AiH-OtxEP7xhyphenhyphen4IMGsSGyO7jbMs-8DrrCq7pp185F9GmDzxX2kSITI-o30DCVV8UC7FjhfYROy_4/s1600-h/Picture+5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPMe6igSRwU01OkK1KCPclN80UiM8pJoCIBdaeFOdCn2Jn39sL7FBubCm5hJqr0c-AiH-OtxEP7xhyphenhyphen4IMGsSGyO7jbMs-8DrrCq7pp185F9GmDzxX2kSITI-o30DCVV8UC7FjhfYROy_4/s320/Picture+5.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5368957797926171714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;The Drafts folder now has a permanent mail in it.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5e3tE8BTr4w5L-NB_0r_2MNI_hHRUiCRcIFXwQ-7QoP_NSnhQauYTv7Sszal-aHkLceLme_4E0lwEuKMuqFxacnebhePEK_IjymWxBb3pk3XlXy-FVNmSaZukvodF5pqoz9R1tj2XlYM/s1600-h/Picture+6.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 78px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5e3tE8BTr4w5L-NB_0r_2MNI_hHRUiCRcIFXwQ-7QoP_NSnhQauYTv7Sszal-aHkLceLme_4E0lwEuKMuqFxacnebhePEK_IjymWxBb3pk3XlXy-FVNmSaZukvodF5pqoz9R1tj2XlYM/s320/Picture+6.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5368957942546197826" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Not the greatest trick in the world, but it made my life a little bit easier, so I thought I'd share it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cheers,&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Kris&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPMe6igSRwU01OkK1KCPclN80UiM8pJoCIBdaeFOdCn2Jn39sL7FBubCm5hJqr0c-AiH-OtxEP7xhyphenhyphen4IMGsSGyO7jbMs-8DrrCq7pp185F9GmDzxX2kSITI-o30DCVV8UC7FjhfYROy_4/s72-c/Picture+5.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>Little Known Facts About InDesign Plug-Ins - There is More To It Than Meets The Eye</title><link>http://rorohiko.blogspot.com/2009/07/little-known-facts-about-indesign-plug.html</link><pubDate>Tue, 28 Jul 2009 00:59:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-4194175346316567293</guid><description>&lt;span style="font-style: italic;"&gt;Installing&lt;/span&gt; a plug-in for Adobe InDesign is normally fairly straightforward.&lt;br /&gt;&lt;br /&gt;• Quit or exit out of InDesign.&lt;br /&gt;• Navigate to the folder that contains the InDesign application file.&lt;br /&gt;• Find the folder called 'Plug-Ins'.&lt;br /&gt;• For neatness, create a subfolder inside 'Plug-Ins' - e.g. 'Third Party Plug-Ins'. Drag the plug-in icons (and possibly any associated files) into that subfolder.&lt;br /&gt;• Relaunch InDesign&lt;br /&gt;&lt;br /&gt;That's fairly easy.&lt;br /&gt;&lt;br /&gt;But when it comes to &lt;span style="font-style: italic;"&gt;upgrading&lt;/span&gt; things might become a bit more complex.&lt;br /&gt;&lt;br /&gt;In short, you might want to first remove the previous version of the plug-in, then start and immediately exit InDesign, and only then install the updated version.&lt;br /&gt;&lt;br /&gt;In other words - perform an 'empty' start/stop of InDesign before installing the updated plug-in.&lt;br /&gt;&lt;br /&gt;Whether this is really necessary depends on the plug-in - most plug-ins won't need this. But if you're battling a mysterious problem, this is worth a try.&lt;br /&gt;&lt;br /&gt;Here's what might happen.&lt;br /&gt;&lt;br /&gt;Each time you launch InDesign it will scan the Plug-Ins folder and its subfolders, looking for any new plug-ins. If it cannot find any new plug-ins, nothing special happens - we have a bog-standard, normal InDesign launch.&lt;br /&gt;&lt;br /&gt;But when InDesign &lt;span style="font-style: italic;"&gt;does&lt;/span&gt; find a new plug-in - a plug-in it has not 'seen' before, things are different, and the launch takes longer than normal.&lt;br /&gt;&lt;br /&gt;Most people won't notice it - the difference in launch time is not very large. If you're really observant, you'll also see some extra messages flash by in the InDesign splash screen.&lt;br /&gt;&lt;br /&gt;Behind the curtain, InDesign is analyzing the new plug-in and extracting information from it.&lt;br /&gt;&lt;br /&gt;For example, information on how the new plug-in can be scripted, and information about the wording on the dialogs and palettes the plug-in can display.&lt;br /&gt;&lt;br /&gt;A lot of this extracted information is then stashed away by InDesign for 'later reference' - this to avoid having to re-analyze the same plug-in on each re-start.&lt;br /&gt;&lt;br /&gt;So, the next time InDesign launches, it again checks for new plug-ins. If no new stuff can be found, it relies on its information stash (also known as 'cache'), and it can launch faster, because it does not have to spend time analyzing any plug-ins.&lt;br /&gt;&lt;br /&gt;This 'trick' is called 'caching' - caches are used in many situations, to avoid needless effort to re-obtain data that has been obtained before.&lt;br /&gt;&lt;br /&gt;For example, your web browser does it too - the first time ever you access a particular web page, it will be a tad sluggish, especially when there are a lot of graphics. Navigate to that same page a little bit later, and in most cases it will come up a lot faster.&lt;br /&gt;&lt;br /&gt;The browser has &lt;span style="font-style: italic;"&gt;cached&lt;/span&gt; the page content and instead of accessing the web site far, far away, it is showing you a copy of the page it had cached in its local web file cache. The web page comes straight off your hard disk, which is a lot faster than pulling it through the internet.&lt;br /&gt;&lt;br /&gt;So, keep in mind: to improve launch times,  InDesign &lt;span style="font-style: italic;"&gt;caches&lt;/span&gt; a lot of information that is normally stored inside of the plug-in files.&lt;br /&gt;&lt;br /&gt;Now suppose you have a plug-in installed. It's working fairly well, but there are some issues.&lt;br /&gt;&lt;br /&gt;Some time later the software developer releases an updated version of the plug-in, which should fix the issues. You download the new version, and overwrite the old version with it.&lt;br /&gt;&lt;br /&gt;Done? Is it that easy? Not always!&lt;br /&gt;&lt;br /&gt;The problem is that InDesign might not scan the updated plug-in: for all it knows, it 'saw' file 'xyz.pln' before, and it still sees 'xyz.pln' - InDesign might feel no urge to re-scan 'xyz.pln'.&lt;br /&gt;&lt;br /&gt;As a result, InDesign might be relying on the outdated info from the previous version of the plug-in that it has in its information stash.&lt;br /&gt;&lt;br /&gt;And weird things might start to happen - things mysteriously don't work well on some computers, but work fine on others, that kind of stuff.&lt;br /&gt;&lt;br /&gt;Morale: it might be a good idea to force InDesign to re-scan the new plug-in. To achieve that, you can use the following procedure:&lt;br /&gt;&lt;br /&gt;0) Exit out of InDesign&lt;br /&gt;1) Completely remove the plug-in you're about to upgrade&lt;br /&gt;2) Launch InDesign (without the plug-in installed). It will notice the plug-in is missing, and it will erase any cached data it had extracted from it.&lt;br /&gt;3) Exit out of InDesign&lt;br /&gt;4) Install the updated version of the plug-in&lt;br /&gt;5) Launch InDesign (with the updated plug-in installed). It will see the 'new' plug-in and re-scan it - so the cached data is now up-to-date.&lt;br /&gt;&lt;br /&gt;Keep in mind: this info is quite general, and might not apply to your situation. But if all else fails - give it a go!&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;&lt;br /&gt;Kris</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>Some baffling behavior in InDesign CS3 scripts explained - beware of relative object references</title><link>http://rorohiko.blogspot.com/2009/07/some-baffling-behavior-in-indesign-cs3.html</link><pubDate>Tue, 21 Jul 2009 13:58:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-8353677952511523075</guid><description>Lesson learned: be careful with references to page items in InDesign ExtendScript CS3 - you might be referring to the wrong object!&lt;br /&gt;&lt;br /&gt;The issue described below seems fixed in InDesign ExtendScript CS4 - but if you need to support CS3, you should be aware of it.&lt;br /&gt;&lt;br /&gt;Look at this code snippet:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;var itemB = app.activeDocument.pageItems.item(1);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;alert(itemB.id);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;... do some stuff that does not affect itemB ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;alert(itemB.id);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;What would you expect to happen? You'd expect to see the same id value displayed in two alerts, right?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;itemB&lt;/span&gt; refers to a particular page item, and should continue to do so. Turns out that is not the case in InDesign CS3.&lt;br /&gt;&lt;br /&gt;Try this:&lt;br /&gt;&lt;br /&gt;Create a new document, and create three rectangular frames on the first page.&lt;br /&gt;&lt;br /&gt;Create the following script:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;var itemA = app.activeDocument.pageItems.item(0);&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;var itemB = app.activeDocument.pageItems.item(1);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;var itemC = app.activeDocument.pageItems.item(2);&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;alert(itemB.id);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;itemA.remove();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;alert(itemB.id);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You would expect &lt;span style="font-family:courier new;"&gt;itemB&lt;/span&gt; not to be affected by removing &lt;span style="font-family:courier new;"&gt;itemA&lt;/span&gt; - but it is! Run the script and you'll get two different &lt;span style="font-family:courier new;"&gt;id&lt;/span&gt; values displayed in the dialog.&lt;br /&gt;&lt;br /&gt;I don't &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; know for sure what is going on but I have a theory - it looks like &lt;span style="font-family:courier new;"&gt;itemB&lt;/span&gt; has 'become' &lt;span style="font-family:courier new;"&gt;itemC&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I suspect that InDesign CS3 does not really keep a 'hard' reference to any particular item in the &lt;span style="font-family:courier new;"&gt;itemB&lt;/span&gt; variable - instead it has what I'd call a 'relative reference'.&lt;br /&gt;&lt;br /&gt;In other words, &lt;span style="font-family:courier new;"&gt;itemB&lt;/span&gt; is &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; fixed - it always remains equivalent to '&lt;span style="font-family:courier new;"&gt;app.activeDocument.pageItems.item(1)' &lt;/span&gt;- and if the page item list changes 'underneath', then &lt;span style="font-family:courier new;"&gt;itemB&lt;/span&gt; suddenly will refer to another item.&lt;br /&gt;&lt;br /&gt;After the &lt;span style="font-family:courier new;"&gt;remove()&lt;/span&gt;, the page item list of the document has changed - the item at index 1 is now a different item. So the variable &lt;span style="font-family:courier new;"&gt;itemB&lt;/span&gt; suddenly refers to a different item.&lt;br /&gt;&lt;br /&gt;Can we create hard references that don't suffer from this issue? Turns out we can - so there is a solution.&lt;br /&gt;&lt;br /&gt;Change the script to read:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;var itemA = app.activeDocument.pageItems.item(0);&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;var itemB = app.activeDocument.pageItems.item(1);&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;var itemC = app.activeDocument.pageItems.item(2);&lt;br /&gt;itemB = app.activeDocument.pageItems.itemByID(itemB.id);&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;alert(itemB.id);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;itemA.remove();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;alert(itemB.id);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That looks like a do-nothing: replace the reference to &lt;span style="font-family:courier new;"&gt;itemB&lt;/span&gt; with another reference to &lt;span style="font-family:courier new;"&gt;itemB&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But internally, InDesign will now refer to 'the item with id=1234' (assuming &lt;span style="font-family:courier new;"&gt;itemB&lt;/span&gt; had an id equal to 1234). &lt;span style="font-family:courier new;"&gt;itemB.id&lt;/span&gt; uniquely identifies &lt;span style="font-family:courier new;"&gt;itemB&lt;/span&gt;, and it is not affected by items being added or removed from the page item list.&lt;br /&gt;&lt;br /&gt;So this updated script works as expected - we see the same id displayed before and after the remove.&lt;br /&gt;&lt;br /&gt;We can write a small helper function for this:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;function FreezeReference(theItem)&lt;br /&gt;{&lt;br /&gt; // Harbs improved my original attempt by&lt;br /&gt; // appending .getElements()[0] - thanks&lt;br /&gt; // Harbs!&lt;br /&gt; return theItem.parent.pageItems.itemByID(theItem.id).getElements()[0];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;var itemA = app.activeDocument.pageItems.item(0);&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;var itemB = &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;FreezeReference(&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;app.activeDocument.pageItems.item(1));&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:courier new;"&gt;var itemC = app.activeDocument.pageItems.item(2);&lt;br /&gt;itemB = app.activeDocument.pageItems.itemByID(itemB.id);&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;alert(itemB.id);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;itemA.remove();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;alert(itemB.id);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This also works as expected.&lt;br /&gt;&lt;br /&gt;Uncovering this issue was not as straightforward as it might seem - at first, it looked like I was struggling with a bug in our &lt;a href="http://www.rorohiko.com/activepageitemsdeveloper"&gt;APIDToolAssistant&lt;/a&gt; plug-in: Harbs (&lt;a href="http://www.in-tools.com/"&gt;www.in-tools.com&lt;/a&gt;) who is an advanced user of APIDToolAssistant reported some issues with the 'move into' function provided by APIDToolAssistant.&lt;br /&gt;&lt;br /&gt;This particular ExtendScript enhancement allows you to move one page item into another very quickly; much faster than could be achieved with pure scripting - you'd do something like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;// Some 'magic' numbers - C++ meets ExtendScript&lt;br /&gt;const IID_IACTIVEPAGEITEMSCRIPTUTILITIESEXTENSION = 0x90B6C;&lt;br /&gt;const kOpCode_MoveInto = 10016;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;function MoveItemIntoItem(newParent,newChild)&lt;br /&gt;{&lt;br /&gt; app.callExtension(&lt;br /&gt;   IID_IACTIVEPAGEITEMSCRIPTUTILITIESEXTENSION,&lt;br /&gt;   kOpCode_MoveInto,&lt;br /&gt;   newParent,&lt;br /&gt;   newChild);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var itemA = app.activeDocument.pageItems.item(0);&lt;br /&gt;var itemB = app.activeDocument.pageItems.item(1);&lt;br /&gt;var itemC = app.activeDocument.pageItems.item(2);&lt;br /&gt;alert(itemB.id);&lt;br /&gt;MoveItemIntoItem(itemA,itemB);&lt;br /&gt;alert(itemB.id);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;app.callExension()&lt;/span&gt; 'calls into' the APIDToolAssistant plug-in to perform the move.&lt;br /&gt;&lt;br /&gt;He noticed that he got invalid object references after calling this function in CS3.&lt;br /&gt;&lt;br /&gt;Turned out &lt;a href="http://www.rorohiko.com/activepageitemsdeveloper"&gt;APIDToolAssistant&lt;/a&gt; was not the culprit - after some digging I finally figured out what was going on.&lt;br /&gt;&lt;br /&gt;Hope this is useful!&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;&lt;br /&gt;Kris</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>VMware Fusion and TimeMachine</title><link>http://rorohiko.blogspot.com/2009/07/vmware-fusion-and-timemachine.html</link><pubDate>Thu, 16 Jul 2009 17:21:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-5809501506886444504</guid><description>Been a while since I blogged; swamped in work. &lt;br /&gt;&lt;br /&gt;This quick post to share a solution I found on Mac OS X to make VMware Fusion (or Parallels) and Apple's Time Machine backup work better together.&lt;br /&gt;&lt;br /&gt;I use a fair amount of virtual Windows and Linux machines, and these tend to be primarily stored in large virtual hard disk files - 40GB, 60GB,... pretty massive. &lt;br /&gt;&lt;br /&gt;Because Time Machine finds and copies any modified file, and the mere act of running the virtual Windows machines caused these large files to be marked as 'modified', I was faced with endless copies of massive virtual hard disk files to my Time Machine hard drive. &lt;br /&gt;&lt;br /&gt;Figuratively speaking, a one-byte change in one of those massive Windows virtual hard disk files would cause a 60GB copy operation - which also indirectly forced older backup files to be erased from the Time Machine drive to make room for these behemoths.&lt;br /&gt;&lt;br /&gt;Initially, I put all my virtual machines in a single folder, and explicitly excluded that folder from the Time Machine backup - not a good solution, but at least, my backup drive was not swamped with those big files.&lt;br /&gt;&lt;br /&gt;But then, a few days ago it dawned on me - I could have my cake and eat it too! &lt;br /&gt;&lt;br /&gt;The solution is to use the 'snapshot' feature of VMware (Parallels also has it) - you can make a snapshot of a virtual machine, so you can always 'undo' whatever happened to that virtual machine since the last snapshot.&lt;br /&gt;&lt;br /&gt;The way VMware handles this is by 'freezing' the underlying virtual hard disk, and storing any changes made since the snapshot to the frozen hard disk in separate files.&lt;br /&gt;&lt;br /&gt;And that's the solution: I first make sure my virtual machine is in a useful, stable state, and then I make a snapshot (I call it 'Base'). &lt;br /&gt;&lt;br /&gt;That effectively 'locks' the massive many-GB virtual drive - so running VMware does not cause it to be modified any more, and any changes from then on are kept in a bunch of much smaller snapshot files.&lt;br /&gt;&lt;br /&gt;Time Machine now makes a copy of my 'frozen' many-GB virtual drive once, and from then on only backs up the changes that are kept in the snapshot files - which results in a much smaller backup set.&lt;br /&gt;&lt;br /&gt;After a while, when the snapshot file size grows to many GB in size, I make a new snapshot, and delete the old snapshot. That 'merges' all changes that occurred 'between' the two snapshots into the main virtual drive, and starts with a fresh slate. &lt;br /&gt;&lt;br /&gt;After I do that, Time Machine backs up the behemoth once again, and from then again only backs up the changes in the new set of snapshot files.&lt;br /&gt;&lt;br /&gt;I now have a good backup of my virtual machines again without having to jump through hoops! &lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;&lt;br /&gt;Kris</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>May 11-15 InDesign Developer Training Sessions</title><link>http://rorohiko.blogspot.com/2009/03/may-11-15-indesign-developer-training.html</link><pubDate>Sun, 22 Mar 2009 13:58:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-4961139259725198288</guid><description>&lt;div class="entry"&gt;       &lt;p&gt;If you’re involved in automation around the Adobe Creative Suite, you need to mark the week of May 11 - 15, 2009 on your calendar - there’s another Creative Suite Developer Summit coming up in Seattle, on the Adobe Fremont Campus&lt;/p&gt; &lt;p&gt;We’re running two training sessions this year - click the lines below for more info:&lt;/p&gt; &lt;p&gt;On May 11:&lt;a href="http://www.rorohiko.com/wordpress/indesign-sdk-training-may-11th-seattle-adobe-fremont-campus/" target="_blank"&gt; InDesign Plugin Development Workshop - Getting Started With The InDesign SDK&lt;/a&gt;&lt;/p&gt; &lt;p&gt;On May 15:&lt;a href="http://www.rorohiko.com/wordpress/feature-development-for-indesign-using-extendscript-may-15th-seattle-adobe-fremont-campus/" target="_blank"&gt; Feature Development for InDesign Using ExtendScript&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Both workshops are limited to 12 seats, which will be allocated on a first come, first served basis - so don’t delay booking.&lt;/p&gt; &lt;p&gt;More about the Adobe Creative Suite Developer Conference can be found here:&lt;/p&gt;&lt;p&gt;&lt;a href="http://niemannross.host.adobe.com/2009csbuDeveloperSummit/" target="_blank"&gt; &lt;br /&gt;http://niemannross.host.adobe.com/2009csbuDeveloperSummit/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;As space is limited to 12 attendees per course, you should make sure you enroll early. There's also a 10% price reduction for people who enroll in both courses before April, 15.&lt;/p&gt;&lt;p&gt;Cheers,&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Kris&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item><item><title>New Cookbook Blog</title><link>http://rorohiko.blogspot.com/2008/10/new-cookbook-blog.html</link><pubDate>Thu, 16 Oct 2008 12:41:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-1401434775260820755.post-8426113658622443468</guid><description>I've started a new blog which will be mainly like a 'cookbook' for Adobe Creative Suite scripters - how-to articles that show how to write much more powerful scripts.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rorohiko.com/wordpress"&gt;http://www.rorohiko.com/wordpress&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The first entry in the blog is up - it's about how you can 'attach' little icons or labels to the four sides of page items as a means of feedback to the user of your scripts. The sample script adds a little floating label with the word count to each text frame - so the user can see the amount of words in each text frame in the blink of an eye.&lt;br /&gt;&lt;br /&gt;Check it out!&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;&lt;br /&gt;Kris</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>kris@rorohiko.com (Kris Coppieters)</author></item></channel></rss>