<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="text">diminishing.org</title>
  <generator uri="http://effectif.com/nesta">Nesta</generator>
  <id>tag:diminishing.org,2009:/</id>
  <link rel="self" href="http://diminishing.org/articles.xml"/>
  <link rel="alternate" href="http://diminishing.org"/>
  <subtitle type="text">fading out of existence</subtitle>
  <author>
    <name>Michael Guterl</name>
    <uri>http://michaelguterl.com</uri>
    <email>michael@diminishing.org</email>
  </author>
  <entry>
    <title>Extending Formtastic with a sprinkle of jQuery</title>
    <link type="text/html" rel="alternate" href="http://diminishing.org/extending-formtastic-with-a-sprinkle-of-jquery"/>
    <id>tag:diminishing.org,2010-02-19:/extending-formtastic-with-a-sprinkle-of-jquery</id>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;h2 id="introducing_formtastic"&gt;Introducing formtastic&lt;/h2&gt;

&lt;p&gt;If you&#8217;re not already using &lt;a href="http://github.com/justinfrench/formtastic"&gt;formtastic&lt;/a&gt;, you need to &lt;a href="http://github.com/justinfrench/formtastic"&gt;check it out.&lt;/a&gt; I&#8217;ll give you a short run down of formtastic, but I suggest checking the README as it is very comprehensive. Then I&#8217;ll go on to explain how we extended formtastic with jQuery allowing us to keep our form construction code nice and simple.&lt;/p&gt;

&lt;p&gt;When using formtastic the main method that you use for creating form elements is &#8220;input.&#8221; input takes an options hash that allows you to do all kinds of cool things. For instance you can set labels, add hints, and specify whether or not it is required.&lt;/p&gt;

&lt;h3 id="the_almighty_as"&gt;The almighty :as&lt;/h3&gt;

&lt;p&gt;Another great option that you can use is :as. By setting :as you can determine what type of control a specific input should be rendered as. It is particularly useful allowing you to render has_many and has_and_belongs_to_many relationships with either a group of check boxes or a multi-select box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;app/models&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
  &lt;span class="n"&gt;has_and_belongs_to_many&lt;/span&gt; &lt;span class="ss"&gt;:roles&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Role&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
  &lt;span class="n"&gt;has_and_belongs_to_many&lt;/span&gt; &lt;span class="ss"&gt;:users&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Given the two models above, from the users edit screen, we may want to allow them to select roles from a list of check boxes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;app/views/users/edit.html.erb&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;% semantic_form_for &lt;/span&gt;&lt;span class="vi"&gt;@user&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt;&lt;/span&gt;
&lt;span class="sx"&gt;  &amp;lt;% f.inputs do -%&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= f.input :name %&amp;gt;&lt;/span&gt;
&lt;span class="sx"&gt;    &amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="ss"&gt;:roles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:as&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:check_boxes&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt;&lt;/span&gt;
&lt;span class="sx"&gt;    &amp;lt;%= f.commit_button "Update" %&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;% end &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="sx"&gt;%&amp;gt;&lt;/span&gt;
&lt;span class="sx"&gt;&amp;lt;% end %&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src="/attachments/roles_check_boxes.png" alt="roles check boxes"&gt;&lt;/p&gt;

&lt;p&gt;Voila! Formtastic handles everything for you, rendering each of the roles as a check box.&lt;/p&gt;

&lt;p&gt;Now imagine you wanted a view that listed every user in a certain role, allowing you to quickly scan and prune users who may have been incorrectly placed in a certain role. Showing a list of 100 users as check boxes may not be the best looking solution, so you can easily specify a select box. Formtastic is smart enough to even make it a multi-select.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;app/views/roles/edit.html.erb&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;% semantic_form_for &lt;/span&gt;&lt;span class="vi"&gt;@role&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt;&lt;/span&gt;
&lt;span class="sx"&gt;  &amp;lt;% f.inputs do -%&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= f.input :title %&amp;gt;&lt;/span&gt;
&lt;span class="sx"&gt;    &amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="ss"&gt;:users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:as&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:select&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt;&lt;/span&gt;
&lt;span class="sx"&gt;    &amp;lt;%= f.commit_button "Submit" %&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;% end &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="sx"&gt;%&amp;gt;&lt;/span&gt;
&lt;span class="sx"&gt;&amp;lt;% end %&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src="/attachments/users_multiselect.png" alt="users multiselect"&gt;&lt;/p&gt;

&lt;p&gt;No one likes standard multi-select boxes except lazy developers. I&#8217;ve watched my parents try and operate them and they never know what key to press when selecting. They inevitably end up using shift and selecting everything or they stop holding control and deselect everything. It sucks, it happens to me too, just less often. Now I&#8217;m giving you no excuse to use this technique if you&#8217;re using formtastic and jquery.&lt;/p&gt;

&lt;p&gt;Extending the SemanticFormBuilder&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;config/initializers/formtastic.rb&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="no"&gt;Formtastic&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;SemanticFormHelper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Custom&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;SemanticFormBuilder&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;lib/custom/semantic_form_builder.rb&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Custom&lt;/span&gt;

  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SemanticFormBuilder&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Formtastic&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;SemanticFormBuilder&lt;/span&gt;

    &lt;span class="no"&gt;JS_FOR_COMBOSELECT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;script type=text/javascript&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;                            $(document).ready(function() {&lt;/span&gt;
&lt;span class="s2"&gt;                              $(#%s).comboselect();&lt;/span&gt;
&lt;span class="s2"&gt;                            });&lt;/span&gt;
&lt;span class="s2"&gt;                          &amp;lt;/script&amp;gt;"&lt;/span&gt;

    &lt;span class="kp"&gt;private&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;comboselect_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;JS_FOR_COMBOSELECT&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;sanitized_object_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;generate_association_input_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;select_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;jQuery comboselect plugin You&#8217;ll also need to grab the comboselect plugin for jQuery. The .zip includes the selso plugin as a dependency for handling sorting. Check out Jason Huck&#8217;s original blog post announcing combobox for a demo and more information.&lt;/p&gt;

&lt;p&gt;After this small amount of work you&#8217;ll be able to do:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;app/views/roles/edit.html.erb&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= f.input :users, :as =&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:comboselect&lt;/span&gt; &lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;and you get unobtrusive, gracefully degrading, easy to use multi-select controls.&lt;/p&gt;

&lt;p&gt;Here&#8217;s an example from RecruitMilitary that we use with some extra styling applied. You can really see how when you have a big list like the one below why something beyond standard html controls are necessary.&lt;/p&gt;

&lt;p&gt;&lt;img src="/attachments/combo_select.png" alt="combo select"&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <published>2010-02-19T20:45:00+00:00</published>
    <category term="formtastic"/>
    <category term="jquery"/>
    <category term="rails"/>
  </entry>
  <entry>
    <title>runit and delayed_job</title>
    <link type="text/html" rel="alternate" href="http://diminishing.org/runit-and-delayed-job"/>
    <id>tag:diminishing.org,2010-01-16:/runit-and-delayed-job</id>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;h2 id="back_story"&gt;Back story&lt;/h2&gt;

&lt;p&gt;We&#8217;ve been using &lt;a href="http://collectiveidea.com/"&gt;Collective Idea&#8217;s fork of Delayed Job&lt;/a&gt; at &lt;a href="http://recruitmilitary.com"&gt;RecruitMilitary&lt;/a&gt; for quite some time now. We&#8217;ve processed over 2 million jobs and we&#8217;re extremely reliant on it for the day-to-day operation of our site.&lt;/p&gt;

&lt;p&gt;For a long time the compelling reason behind us using Collective Idea&#8217;s fork of delayed_job was the built in support for daemonization. This functionality is added via the daemons gem, however, it is not without &lt;a href="http://github.com/collectiveidea/delayed_job/issues#issue/3"&gt;problems&lt;/a&gt;. We use monit to kill memory hungry workers and have frequently experienced issues with workers not stopping, deleting their pid file, and another duplicate worker ends up starting. Before you know it, your server is freaking out because there are 4 times the number of workers running than you want.&lt;/p&gt;

&lt;p&gt;Everyone has their own &lt;a href="http://github.com/collectiveidea/delayed_job/issues#issue/3"&gt;solutions&lt;/a&gt; too. &lt;a href="http://github.com/ghazel/daemons"&gt;One of which&lt;/a&gt; was working for us for a while, but suddenly started experiencing the same issues. At this point I&#8217;m completely irritated, I have to monitor the server and kill off stray workers a few times per day. We considered moving to &lt;a href="http://github.com/defunkt/resque"&gt;Resque&lt;/a&gt;, but we weren&#8217;t ready to change such a critical piece of our infrastructure.&lt;/p&gt;

&lt;p&gt;And then I came across &lt;a href="http://smarden.org/runit/"&gt;runit&lt;/a&gt;. A few weeks back I had asked &lt;a href="http://twitter.com/tobi"&gt;Tobias L&#252;tke&lt;/a&gt; about daemonizing clarity and he said they use runit. Tobi is also the original author of &lt;a href="http://github.com/tobi/delayed_job"&gt;Delayed Job&lt;/a&gt;, so when I started having all of these problems I &lt;a href="http://twitter.com/mguterl/status/7758427613"&gt;asked&lt;/a&gt; how he managed daemonizing workers. &lt;a href="http://twitter.com/tobi/status/7758674554"&gt;&#8220;we use runit for everything. It&#8217;s so much better.&#8221;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;runit is a cross-platform Unix init scheme with service supervision, a replacement for sysvinit, and other init schemes. It runs on GNU/Linux, BSD, MacOSX, Solaris, and can easily be adapted to other Unix operating systems.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This intrigued me, however, I was not interested in replacing my init scheme. Luckily ubuntu provides two separate packages runit (doesn&#8217;t replace init) and runit-run (replaces init)/ runit-services. We&#8217;ll be just using runit.&lt;/p&gt;

&lt;h2 id="configuring_runit_and_delayed_job"&gt;Configuring runit and delayed_job&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;sudo apt-get install runit
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With the help of some &lt;a href="https://gist.github.com/4e9ccc9f9b27d91d323b"&gt;runit configuration files from Rick Olson&lt;/a&gt; we moved our worker infrastructure to runit. Documentation for getting all of this setup is sparse, so I hope this can help someone else.&lt;/p&gt;

&lt;p&gt;Services are configured in /etc/sv so we create a directory for each worker that we want to run /etc/sv/rm-dj-1 .. rm-dj-n. Inside of each directory create a file named &#8220;run&#8221; that resembles this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; -e
&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
&lt;span class="nv"&gt;APP_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/deploy/public_html/rm/current
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$APP_ROOT&lt;/span&gt;

&lt;span class="nb"&gt;exec &lt;/span&gt;2&amp;gt;&amp;amp;1
&lt;span class="nb"&gt;exec &lt;/span&gt;chpst -u deploy:deploy -e /etc/service/rm-dj-1/env rake &lt;span class="nb"&gt;jobs&lt;/span&gt;:work
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Notice that we are just running a rake task, that does not go into the background. When you build services for runit, you have to make sure that it does not background itself, runit handles all of that for you. If the process dies for any reason runit will bring it back up almost instantly. It also handles all of the process id (pid) management for you too.&lt;/p&gt;

&lt;p&gt;chpst is a useful tool included with runit, in this case it changes the user from root to deploy and evaluates the files in /etc/service/rm-dj-1/env as environment variables. I just need to set MIN_PRIORITY and RAILS_ENV with some simple below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nb"&gt;echo &lt;/span&gt;0 &amp;gt;/etc/sv/rm-dj-1/env/MIN_PRIORITY
&lt;span class="nb"&gt;echo &lt;/span&gt;production &amp;gt; /etc/sv/rm-dj-1/RAILS_ENV
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Currently the workers are just logging to stdout, I need to configure them to log to RAILS_ROOT/log/delayed_job.log again, but it&#8217;s not extremely important at the moment. Anyways, runit provides &lt;a href="http://smarden.org/runit/svlogd.8.html"&gt;svlogd&lt;/a&gt; for handling streams of output. I really don&#8217;t know much about what is going on here, but I&#8217;ll figure it out some day.&lt;/p&gt;

&lt;p&gt;In /etc/sv/rm-dj-n/log create a file named &#8220;run&#8221; that resembles this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; -e
&lt;span class="nb"&gt;exec &lt;/span&gt;svlogd ./main
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Make sure you create the /etc/sv/rm-dj-n/main directory or it won&#8217;t be able to write the data there. Also, be sure to start runsvdir if it is not started already. At this point your first worker should be fully configured and you can make runit aware by symlinking it to the service directory.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;sudo ln -s /etc/sv/rm-dj-1 /etc/service/
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As soon as runsvdir picks up the new directory it will fire up your worker and its manager process &#8220;runsv rm-dj-1.&#8221;&lt;/p&gt;

&lt;h3 id="ps_logging"&gt;ps logging&lt;/h3&gt;

&lt;p&gt;runit has a really useful feature for debugging. you can simply run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ps -ef | grep runsvdir
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;and see any errors. If there are no errors you will just see a series of dots.&lt;/p&gt;

&lt;h2 id="runit_and_monit"&gt;runit and monit&lt;/h2&gt;

&lt;p&gt;We use monit to handle workers with out of control memory usage. Monit used to be in charge of restarting dead workers too, but runit is much faster at detecting this and typically restarts the process before monit even notices. Monit will notice and report that the pid for that entry changed.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;check process rm_dj_worker_1
  with pidfile /etc/sv/rm-dj-1/supervise/pid
  start program = "/usr/bin/sv up rm-dj-1" as uid root and gid root with timeout 3000 seconds
  stop program = "/usr/bin/sv down rm-dj-1" as uid root and gid root with timeout 3000 seconds
  group delayed_job
  if totalmem &amp;gt; 175 Mb then restart
  if changed pid then restart
  if 3 restarts within 5 cycles then timeout&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="the_future"&gt;The Future&lt;/h2&gt;

&lt;p&gt;There is &lt;a href="http://groups.google.com/group/delayed_job/browse_thread/thread/304b7940e0d68bec"&gt;talk on the mailing list&lt;/a&gt; about a &lt;a href="http://unicorn.bogomips.org/"&gt;Unicorn&lt;/a&gt; style pre-forking worker model. I will be extremely happy once this is merged in. We&#8217;ve been using Unicorn for the last couple months and it has been amazing!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://gist.github.com/279082"&gt;Full Configuration&lt;/a&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <published>2010-01-16T19:40:00+00:00</published>
    <category term="delayed_job"/>
    <category term="rails"/>
    <category term="runit"/>
  </entry>
  <entry>
    <title>require 'spec/spec_helper'</title>
    <link type="text/html" rel="alternate" href="http://diminishing.org/require-spec-helper"/>
    <id>tag:diminishing.org,2009-12-05:/require-spec-helper</id>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;p&gt;This has been ranted about by others many times and I never really understood the big deal. Now I do, especially after it shaved 5 seconds off our suite of specs.&lt;/p&gt;

&lt;p&gt;After some research I found out we were requiring our spec helpers in a &#8220;bad way.&#8221; Most of this is because of my own doing, but I thought I&#8217;d share with you guys.&lt;/p&gt;

&lt;p&gt;There were probably 4 or 5 variations of the syntax used to require spec_helper.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="sr"&gt; /../s&lt;/span&gt;&lt;span class="n"&gt;pec_helper&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spec_helper&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expand_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="sr"&gt; /../s&lt;/span&gt;&lt;span class="n"&gt;pec_helper&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expand_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spec_helper&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Each of these variations existed for the different possible depths below spec, for example, spec/models, spec/models/lead, etc.&lt;/p&gt;

&lt;p&gt;This causes ruby to attempt to load the file each time, which we really don&#8217;t want to do.&lt;/p&gt;

&lt;p&gt;The solution is simple.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="n"&gt;spec&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spec_helper&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This works with autospec and rake just fine and looks much better.&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <published>2009-12-05T12:59:00+00:00</published>
    <category term="ruby"/>
    <category term="testing"/>
  </entry>
  <entry>
    <title>Writing Good Factories</title>
    <link type="text/html" rel="alternate" href="http://diminishing.org/writing-good-factories"/>
    <id>tag:diminishing.org,2009-12-05:/writing-good-factories</id>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;p&gt;I really wanted to remember what Pratik had to say about writing good factories in his Rails Summit talk so I&#8217;m putting it up here as a reference.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Should be able to loop &lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;times&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li&gt;No associations in the base Factory &lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="no"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="no"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user_with_items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li&gt;Should pass validations&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am thinking that rule #2 can be broken in order to achieve #3. Sometimes an object has to have a parent. I think it may be more accurate to say &#8220;No has many associations in the base Factory&#8221;, but I&#8217;m still giving it some thought.&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <published>2009-12-05T12:37:00+00:00</published>
    <category term="ruby"/>
    <category term="testing"/>
  </entry>
  <entry>
    <title>Problems, difficulties, and frustrations</title>
    <link type="text/html" rel="alternate" href="http://diminishing.org/problems-difficulties-and-frustrations"/>
    <id>tag:diminishing.org,2009-06-08:/problems-difficulties-and-frustrations</id>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;p&gt;After reading &lt;a href="http://www.artima.com/intv/simplestP.html"&gt;The Simplest Thing that Could Possibly Work&lt;/a&gt; I couldn&#8217;t stop thinking about how Ward Cunningham describes the difference between problems and difficulties.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A friend of mine once said that there are problems and there are difficulties. A problem is something you savor. You say, &#8220;Well that&#8217;s an interesting problem. Let me think about that problem a while.&#8221; You enjoy thinking about it, because when you find the solution to the problem, it&#8217;s enlightening.&lt;/p&gt;

&lt;p&gt;And then there are difficulties. Computers are famous for difficulties. A difficulty is just a blockage from progress. You have to try a lot of things. When you finally find what works, it doesn&#8217;t tell you a thing. It won&#8217;t be the same tomorrow. Getting the computer to work is so often dealing with difficulties.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As a software developer I love to solve problems, yet I become frustrated when dealing with difficulties. The more I think about it, I feel like frustration is a better word than difficulty. In fact, one of the definitions for frustration from Apple&#8217;s Dictionary is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;frustration |fr&#601;&#712;str&#257; sh &#601;n|&lt;/p&gt;

&lt;p&gt;the prevention of the progress, success, or fulfillment of something&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don&#8217;t mind slowing down, but I hate stopping progress. As I work through practicing TDD/BDD, I find that being able to slow down and take baby steps allows me to reduce the number of frustrations in my day. I shudder any time I have to touch code without tests/specs because I am afraid I&#8217;m going to break something and not know it. I&#8217;m not sure how I lived without tests, I know I spent a lot of time clicking around doing testing in the browser.&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <published>2009-06-08T22:02:00-04:00</published>
    <category term="simplicity"/>
  </entry>
  <entry>
    <title>Saving time and sanity with applescript</title>
    <link type="text/html" rel="alternate" href="http://diminishing.org/saving-time-and-sanity-with-applescript"/>
    <id>tag:diminishing.org,2009-05-31:/saving-time-and-sanity-with-applescript</id>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;p&gt;Depending where I am at I have three possible monitor configurations for my MacBook.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;External display only&lt;/li&gt;

&lt;li&gt;Laptop display only&lt;/li&gt;

&lt;li&gt;External and laptop display&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Each time I change between these three workspaces I have to manually move the windows to the correct position for that particular configuration. This can become extremely annoying, especially when you&#8217;re as OCD as I am. I can&#8217;t even contemplate how much time I&#8217;ve wasted putting each window in its &#8220;perfect&#8221; position&#8230;&lt;/p&gt;

&lt;p&gt;After many searches I came across &lt;a href="http://www.jonathanlaliberte.com/2009/02/04/restore-previous-display-window-positions-applescript"&gt;exactly what I was looking for.&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="/attachments/home-layout.scpt"&gt;Download the script&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Open it with Script Editor&lt;/li&gt;

&lt;li&gt;Remove references to applications you aren&#8217;t using&lt;/li&gt;

&lt;li&gt;Save as an application with the name of the layout in the Applications fold&lt;/li&gt;

&lt;li&gt;Use Spotlight to run the app&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I use the same script for each layout, I just save it under a different name.&lt;/p&gt;

&lt;h2 id="problems"&gt;Problems&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Certain applications don&#8217;t seem to work (TweetDeck)&lt;/li&gt;

&lt;li&gt;Applications with child windows require slightly more work (see Firefox example code)&lt;/li&gt;

&lt;li&gt;The application has to be running or it errors&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="todo"&gt;TODO&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Start the application if it is not running&lt;/li&gt;

&lt;li&gt;Loop through all open applications eliminating manual configuration&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="source"&gt;Source&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;numFFWindows&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;FFPos&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;FFSize&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;numTermWindows&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;TermPos&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;TermSize&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;iTunesPos&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;iTunesSize&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;EmacsPos&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;EmacsSize&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;TweetDeckPos&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;TweetDeckSize&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;iCalPos&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;iCalSize&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;AdiumContactsPos&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;AdiumContactsSize&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;AdiumIMSize&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;AdiumIMPos&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;OFPos&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;property&lt;/span&gt; &lt;span class="nv"&gt;OFSize&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="nb"&gt;display dialog&lt;/span&gt; &lt;span class="s2"&gt;"Set Window Position or Save Window Position?"&lt;/span&gt; &lt;span class="nb"&gt;buttons&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"Restore"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Save"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nv"&gt;default&lt;/span&gt; &lt;span class="nb"&gt;button&lt;/span&gt; &lt;span class="s2"&gt;"Restore"&lt;/span&gt;
&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;theResult&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="no"&gt;result&lt;/span&gt;

&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nb"&gt;application&lt;/span&gt; &lt;span class="s2"&gt;"System Events"&lt;/span&gt;
	&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;button returned&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;theResult&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="s2"&gt;"Restore"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
		&lt;span class="c"&gt;-- Restore Settings&lt;/span&gt;
		&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;numFFWindows&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
			&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="s2"&gt;"Firefox"&lt;/span&gt;
				&lt;span class="k"&gt;repeat&lt;/span&gt; &lt;span class="nv"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;numFFWindows&lt;/span&gt;
					&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;item&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;FFPos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
					&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;item&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;FFSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
				&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;repeat&lt;/span&gt;
			&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
		&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;
		&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;numTermWindows&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
			&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="s2"&gt;"Terminal"&lt;/span&gt;
				&lt;span class="k"&gt;repeat&lt;/span&gt; &lt;span class="nv"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;numTermWindows&lt;/span&gt;
					&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;item&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;TermPos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
					&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;item&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;TermSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
				&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;repeat&lt;/span&gt;
			&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
		&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;
		&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;iTunesPos&lt;/span&gt; &lt;span class="ow"&gt;is not&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
			&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="s2"&gt;"iTunes"&lt;/span&gt;
				&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;iTunesPos&lt;/span&gt;
				&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;iTunesSize&lt;/span&gt;
			&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
		&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;
		&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;EmacsPos&lt;/span&gt; &lt;span class="ow"&gt;is not&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
			&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="s2"&gt;"Emacs"&lt;/span&gt;
				&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;EmacsPos&lt;/span&gt;
				&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;EmacsSize&lt;/span&gt;
			&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
		&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;
		&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;iCalPos&lt;/span&gt; &lt;span class="ow"&gt;is not&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
			&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="s2"&gt;"iCal"&lt;/span&gt;
				&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;iCalPos&lt;/span&gt;
				&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;iCalSize&lt;/span&gt;
			&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
		&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;
		&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;OFPos&lt;/span&gt; &lt;span class="ow"&gt;is not&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
			&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="s2"&gt;"OmniFocus"&lt;/span&gt;
				&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;OFPos&lt;/span&gt;
				&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;OFSize&lt;/span&gt;
			&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
		&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;
		&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;AdiumContactsPos&lt;/span&gt; &lt;span class="ow"&gt;is not&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
			&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="s2"&gt;"Adium"&lt;/span&gt;
				&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="s2"&gt;"Contacts"&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;AdiumContactsPos&lt;/span&gt;
				&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="s2"&gt;"Contacts"&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;AdiumContactsSize&lt;/span&gt;
				&lt;span class="k"&gt;repeat&lt;/span&gt; &lt;span class="nv"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;count&lt;/span&gt; &lt;span class="nb"&gt;windows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
					&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="s2"&gt;"Contacts"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
						&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;AdiumIMPos&lt;/span&gt;
						&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;AdiumIMSize&lt;/span&gt;
					&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;
				&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;repeat&lt;/span&gt;

			&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
		&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;

	&lt;span class="k"&gt;else&lt;/span&gt;
		&lt;span class="c"&gt;-- Save Settings&lt;/span&gt;
		&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="s2"&gt;"Firefox"&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;numFFWindows&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;count&lt;/span&gt; &lt;span class="nb"&gt;windows&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;FFPos&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;FFSize&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
			&lt;span class="k"&gt;repeat&lt;/span&gt; &lt;span class="nv"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;numFFWindows&lt;/span&gt;
				&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;FFPos&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
				&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;FFSize&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
			&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;repeat&lt;/span&gt;
		&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
		&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="s2"&gt;"Terminal"&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;numTermWindows&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;count&lt;/span&gt; &lt;span class="nb"&gt;windows&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;TermPos&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;TermSize&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
			&lt;span class="k"&gt;repeat&lt;/span&gt; &lt;span class="nv"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;numTermWindows&lt;/span&gt;
				&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;TermPos&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
				&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;TermSize&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
			&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;repeat&lt;/span&gt;
		&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
		&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="s2"&gt;"iTunes"&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;iTunesPos&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;iTunesSize&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
		&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
		&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="s2"&gt;"Emacs"&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;EmacsPos&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;EmacsSize&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
		&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
		&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="s2"&gt;"iCal"&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;iCalPos&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;iCalSize&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
		&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
		&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="s2"&gt;"OmniFocus"&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;OFPos&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;OFSize&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
		&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
		&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;process&lt;/span&gt; &lt;span class="s2"&gt;"Adium"&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;AdiumContactsPos&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="s2"&gt;"Contacts"&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;AdiumContactsSize&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="s2"&gt;"Contacts"&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;AdiumIMPos&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
			&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;AdiumIMSize&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
			&lt;span class="k"&gt;repeat&lt;/span&gt; &lt;span class="nv"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;count&lt;/span&gt; &lt;span class="nb"&gt;windows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
				&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="s2"&gt;"Contacts"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
					&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;AdiumIMPos&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;position&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
					&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;AdiumIMSize&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
				&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;
			&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;repeat&lt;/span&gt;
		&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
	&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <published>2009-05-31T12:15:00-04:00</published>
    <category term="applescript"/>
    <category term="mac"/>
    <category term="os-x"/>
  </entry>
</feed>

<!-- page cached: 2010-04-04 00:06:55 -->

