<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description></description><title>insignificant.org</title><generator>Tumblr (3.0; @mkflint)</generator><link>http://insignificant.org/</link><item><title>Progressive pricing strategy for iOS apps</title><description>&lt;p&gt;I&amp;#8217;m working on an iOS app which, while very immature, has caused me to think about app pricing. I have these constraints:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;I believe in the &amp;#8220;release early, release often&amp;#8221; maxim, and that software is never finished&lt;/li&gt;
&lt;li&gt;I believe that rewarding early-adopters, and settings realistic expectations from the start, would be a good strategy for getting early positive reviews&lt;/li&gt;
&lt;li&gt;I believe that an application has a natural price-point&lt;/li&gt;
&lt;li&gt;I believe that most applications in the app store are under-priced&lt;/li&gt;
&lt;li&gt;I believe that app development is an iterative process, and the deployment of the app should be iterative too&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;On the pricing front, I have these concerns:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;I may price to high initially, gain no users (or worse, gain users who complain about the price and rate the app poorly)&lt;/li&gt;
&lt;li&gt;If I price the app aggressively for a while, as an introductory offer, I&amp;#8217;ll get a lot of customers paying very little, sales would likely drop off when the price is increased&lt;/li&gt;
&lt;li&gt;I dislike ads and vowed to not use in-app advertising&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;So here&amp;#8217;s a proposal which may address these constraints:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;When the app has bare functionality, set realistic expectations about the limited functionality in the release notes. Release the app at no cost. That way, users are unlikely to complain about its lack of features&lt;/li&gt;
&lt;li&gt;Include this pricing policy in the release notes, so purchasers know what to expect in the future&lt;/li&gt;
&lt;li&gt;Add more features, release updates&lt;/li&gt;
&lt;li&gt;At some point, when I think that I would pay a minimal amount for the app, start charging for it. (£0.59 or $0.99)&lt;/li&gt;
&lt;li&gt;Gradually (carefully) increase the price as more features are added&lt;/li&gt;
&lt;li&gt;Updates are always free to existing users&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;I&amp;#8217;d be interested to hear any comments or thoughts!&lt;/p&gt;
&lt;ol&gt;&lt;/ol&gt;</description><link>http://insignificant.org/post/5577656182</link><guid>http://insignificant.org/post/5577656182</guid><pubDate>Tue, 17 May 2011 16:45:15 +0100</pubDate></item><item><title>Selectively running tests with IUSpec in iOS</title><description>&lt;p&gt;&lt;a href="http://code.google.com/p/uispec/"&gt;UISpec&lt;/a&gt; is a great tool for unit-testing the UI of your iOS app, but (unless you use something like &lt;a href="http://blog.thepete.net/2010/07/frank-automated-acceptance-tests-for.html"&gt;Frank&lt;/a&gt;) you&amp;#8217;ll be running all tests every time, and watching your console for failures.&lt;/p&gt;
&lt;p&gt;Frank allows you to selectively run tests, but it&amp;#8217;s driven from outside the app using &lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt;, and I needed something which runs from inside (so I can set expectations on mocks).&lt;/p&gt;
&lt;p&gt;Announcing &lt;a href="https://github.com/mflint/RVUITests"&gt;RVUITests&lt;/a&gt;, which runs UISpec tests from your device or simulator, in a UI similar to &lt;a href="http://gabriel.github.com/gh-unit/"&gt;GHUnit&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lizywxgYu81qefvuw.png"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mflint/RVUITests"&gt;RVUITests&lt;/a&gt; at GitHub.&lt;/p&gt;</description><link>http://insignificant.org/post/4269000688</link><guid>http://insignificant.org/post/4269000688</guid><pubDate>Sat, 02 Apr 2011 00:37:55 +0100</pubDate></item><item><title>Dynamic window titles for GNU Screen with Bash</title><description>&lt;p&gt;This is my method of enhancing the GNU Screen window titles&amp;#8230; it relies on my interactive shell being /bin/bash.&lt;/p&gt;
&lt;p&gt;These scripts will:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;show a plain $ or # when just the shell (or root shell) is running in that window&lt;/li&gt;
&lt;li&gt;show the name of a running command (so if you run &amp;#8220;nice top -d 10&amp;#8221; it will show &amp;#8220;top&amp;#8221;)&lt;/li&gt;
&lt;li&gt;prepend the title with # if the user is root, or the command is running with &amp;#8220;sudo&amp;#8221;&lt;/li&gt;
&lt;li&gt;show, for selected commands, a filename in braces instead of the command. So running &amp;#8220;sudo vi /etc/fstab&amp;#8221; would show a title &amp;#8220;#{fstab}&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I&amp;#8217;m sure there will be bugs, and I&amp;#8217;d be happy to receive patches ;-)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; &lt;a href="https://github.com/mflint/screen-preexec"&gt;this script is now hosted at GitHub&lt;/a&gt; :-)&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Start by downloading the &lt;a href="http://www.twistedmatrix.com/users/glyph/preexec.bash.txt"&gt;preexec tweak&lt;/a&gt; and stash it somewhere. (Written by Glyph Lefkowitz. See &lt;a href="http://glyf.livejournal.com/63106.html?thread=210818"&gt;Glyph&amp;#8217;s original post&lt;/a&gt;.) Now dump the following into another file - I called mine &amp;#8220;screen-preexec.sh&amp;#8221;. Neither file needs to be executable.&lt;/p&gt;
&lt;pre class="prettyprint"&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;# screen-preexec.sh   Matthew Flint (m@tthew.org)&lt;br/&gt;&lt;br/&gt;# this uses the "preexec" bash script by "Glyph" here:&lt;br/&gt;# &lt;a href="http://www.twistedmatrix.com/users/glyph/preexec.bash.txt"&gt;http://www.twistedmatrix.com/users/glyph/preexec.bash.txt&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;# it makes it more useful (for me) when using screen, by showing either&lt;br/&gt;# the currently-running command (such as "top") or a filename (when&lt;br/&gt;# editing or viewing a file)&lt;br/&gt;&lt;br/&gt;# when a command is running as superuser (either by root, or via sudo)&lt;br/&gt;# then it is prefixed with #&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;preexec() {&lt;br/&gt;    # commandstring starts as the whole string, but we&lt;br/&gt;    # chop it up...&lt;br/&gt;    local commandstring=$1;&lt;br/&gt;&lt;br/&gt;    # start by stripping all the switches which start with&lt;br/&gt;    # a hyphen&lt;br/&gt;    commandstring=`echo $commandstring | sed -e 's/\( -[^ ]*\)//g'` ;&lt;br/&gt;&lt;br/&gt;    # this is a superuser command if the user is&lt;br/&gt;    # root - so a # will be shown in the title&lt;br/&gt;    local root="";&lt;br/&gt;    if [[ $EUID -eq 0 ]]; then&lt;br/&gt;        root="#";&lt;br/&gt;    fi&lt;br/&gt;&lt;br/&gt;    # find the first word in the commandstring, which is the&lt;br/&gt;    # command being executed&lt;br/&gt;    local command=`echo $commandstring | cut -d ' ' -f1`;&lt;br/&gt;&lt;br/&gt;    # strip any other unwanted stuff from the start of the command.&lt;br/&gt;    # These generally modify the behaviour or environment of another&lt;br/&gt;    # command&lt;br/&gt;    local removedcommand="no";&lt;br/&gt;    until [[ $removedcommand = "" ]]; do&lt;br/&gt;        removedcommand="";&lt;br/&gt;        case "$command" in&lt;br/&gt;            watch|nice|nohup|time|trickle)&lt;br/&gt;                removedcommand="yes";&lt;br/&gt;                commandstring=`echo $commandstring | cut -d ' ' -f2-`;&lt;br/&gt;                command=`echo $commandstring | cut -d ' ' -f1`;&lt;br/&gt;            ;;&lt;br/&gt;            sudo)&lt;br/&gt;                root="#";&lt;br/&gt;&lt;br/&gt;                removedcommand="yes";&lt;br/&gt;                commandstring=`echo $commandstring | cut -d ' ' -f2-`;&lt;br/&gt;                command=`echo $commandstring | cut -d ' ' -f1`;&lt;br/&gt;            ;;&lt;br/&gt;        esac&lt;br/&gt;    done&lt;br/&gt;&lt;br/&gt;    # this is the result which will be shown&lt;br/&gt;    local result;&lt;br/&gt;&lt;br/&gt;    # now check for a set of predefined long-running&lt;br/&gt;    # commands which operate on a file. Instead of showing&lt;br/&gt;    # the command name, we'll show the filename surrounded&lt;br/&gt;    # by braces.&lt;br/&gt;&lt;br/&gt;    # I'd rather see&lt;br/&gt;    #   "{file 1}" "{file 2}" "{file 3}"&lt;br/&gt;    # than&lt;br/&gt;    #   "vi" "vi" "vi"&lt;br/&gt;    case "$command" in&lt;br/&gt;        vi|view|less|more|tail|head|man)&lt;br/&gt;            # remove the command name (vi, less, etc) from the string. This&lt;br/&gt;            # should just leave any filenames, plus pipes and redirects. We append&lt;br/&gt;            # " " to the commandstring to make sure that there's at least one&lt;br/&gt;            # field delimiter, othewise "cut" won't chop off the command&lt;br/&gt;            local filepathsandpipes=`echo $commandstring " " | cut -d ' ' -f2-`;&lt;br/&gt;&lt;br/&gt;            # now remove any pipes or redirects&lt;br/&gt;            local filepaths=`echo $filepathsandpipes | sed -e 's/[|&amp;gt;].*//g'` ;&lt;br/&gt;&lt;br/&gt;            # how many filepaths?&lt;br/&gt;            local filenamecount=`echo $filepaths | awk '{ print NF }'`;&lt;br/&gt;            if [[ $filenamecount -eq 0 ]]; then&lt;br/&gt;                # no filenames - just show the command&lt;br/&gt;                result=$root$command;&lt;br/&gt;            elif [[ $filenamecount -eq 1 ]]; then&lt;br/&gt;                # one filename - show it&lt;br/&gt;                local filename=`basename $filepaths`;&lt;br/&gt;                result=$root"{"$filename"}";&lt;br/&gt;            else&lt;br/&gt;                # more than one filename - show the command&lt;br/&gt;                # and a wildcard indicator to indicate multiple&lt;br/&gt;                # files&lt;br/&gt;                result=$root$command*;&lt;br/&gt;            fi&lt;br/&gt;            ;;&lt;br/&gt;        *) &lt;br/&gt;            # just show the basename of the command&lt;br/&gt;            command=`basename $command`;&lt;br/&gt;            result=$root$command;&lt;br/&gt;            ;;&lt;br/&gt;    esac&lt;br/&gt;&lt;br/&gt;    preexec_screen_title "$result";&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;precmd() {&lt;br/&gt;    if [[ $EUID -eq 0 ]]; then&lt;br/&gt;        preexec_screen_title "#";&lt;br/&gt;    else&lt;br/&gt;        preexec_screen_title "$";&lt;br/&gt;    fi&lt;br/&gt;}&lt;/pre&gt;
&lt;p&gt;Finally, edit your &amp;#8220;.bashrc&amp;#8221; and add this at the end:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;# setup preexec and precmd functions&lt;br/&gt;. /home/user/path/to/preexec.bash&lt;br/&gt;&lt;br/&gt;# load the screen preexec stuff&lt;br/&gt;. /home/user/path/to/screen-preexec.sh&lt;br/&gt;&lt;br/&gt;preexec_install&lt;br/&gt;&lt;br/&gt;&lt;/pre&gt;</description><link>http://insignificant.org/post/3207413542</link><guid>http://insignificant.org/post/3207413542</guid><pubDate>Thu, 10 Feb 2011 00:42:00 +0000</pubDate></item><item><title>Migrated from Wordpress to Tumblr</title><description>&lt;p&gt;Hope this is more reliable.&lt;/p&gt;</description><link>http://insignificant.org/post/3206098038</link><guid>http://insignificant.org/post/3206098038</guid><pubDate>Wed, 09 Feb 2011 23:31:06 +0000</pubDate></item><item><title>"Never trust a test you haven’t seen fail"</title><description>“Never trust a test you haven’t seen fail”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://twitter.com/martinfowler/status/2193749060878336"&gt;Martin Fowler&lt;/a&gt;, 10th November 2010&lt;/em&gt;</description><link>http://insignificant.org/post/3206156793</link><guid>http://insignificant.org/post/3206156793</guid><pubDate>Wed, 10 Nov 2010 00:00:00 +0000</pubDate></item><item><title>Useful bookmarklets for iPhone</title><description>&lt;p&gt;Over the past few weeks, I&amp;#8217;ve come across a few useful bookmarklets which work great in Mobile Safari on the iPhone.  I can&amp;#8217;t take any credit for writing these, but hope to be helpful by listing them in one place.&lt;/p&gt;
&lt;h3&gt;How to install&lt;/h3&gt;
&lt;p&gt;Open this page with mobile Safari and tap-and-hold on the bookmarklet hyperlinks below. Select &amp;#8220;Copy&amp;#8221; when the menu appears. Then bookmark a page (any page will do), giving it a name like &amp;#8220;Scroll to bottom&amp;#8221;. After storing the bookmark, edit it - the URL will now be editable where it wasn&amp;#8217;t previously. Delete the original URL and paste in the bookmarklet code. Finally, remove the &amp;#8220;http://&amp;#8221; from the front. Save!&lt;/p&gt;
&lt;h3&gt;Scroll to bottom&lt;/h3&gt;
&lt;p&gt;How many times have you been reading a long webpage and accidentally hit the top bar in mobile Safari? Yes, it takes you to the top, but there&amp;#8217;s no &amp;#8220;go to bottom&amp;#8221; shortcut. This will do just that. &lt;a href="http://javascript:scroll(0,document.getElementsByTagName(%22body%22)%5B0%5D.scrollHeight);"&gt;Copy me&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Find in page&lt;/h3&gt;
&lt;p&gt;This provides a &amp;#8220;find text in this webpage&amp;#8221; feature. &lt;a href="http://javascript:void%28s%3Dprompt%28%27Find%20text%3A%27%2C%27%27%29%29%3Bs%3D%27%28%27+s+%27%29%27%3Bx%3Dnew%20RegExp%28s%2C%27gi%27%29%3Brn%3DMath.floor%28Math.random%28%29*100%29%3Brid%3D%27z%27%20+%20rn%3Bb%20%3D%20document.body.innerHTML%3Bb%3Db.replace%28x%2C%27%3Cspan%20name%3D%27%20+%20rid%20+%20%27%20id%3D%27%20+%20rid%20+%20%27%20style%3D%5C%27color%3A%23000%3Bbackground-color%3Ayellow%3B%20font-weight%3Abold%3B%5C%27%3E%241%3C/span%3E%27%29%3Bvoid%28document.body.innerHTML%3Db%29%3Balert%28%27Found%20%27%20+%20document.getElementsByName%28rid%29.length%20+%20%27%20matches.%27%29%3Bwindow.scrollTo%280%2Cdocument.getElementsByName%28rid%29%5B0%5D.offsetTop%29%3B"&gt;Copy me&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;View source&lt;/h3&gt;
&lt;p&gt;Yeah baby! &lt;a href="http://javascript:var%20newWin=window.open();%20newWin.document.body.innerHTML=('%3Cb%20style=%22font-family:Verdana;%20font-size:9pt;%22%3ESource%20of%20'+location.href+'%3C/b%3E%3Cbr%3E%3Cbr%3E%3Cbr%3E%3Cxmp%20style=%22font-family:Verdana;%20font-size:8pt;%20color:%23000080;%22%3E%3Chtml%3E'+document.getElementsByTagName('html')%5B0%5D.innerHTML+'%3C/html%3E%3C/xmp%3E');%20newWin.select();%20newWin.focus();%20void(0);"&gt;Copy me&lt;/a&gt;&lt;/p&gt;</description><link>http://insignificant.org/post/3205389682</link><guid>http://insignificant.org/post/3205389682</guid><pubDate>Wed, 28 Oct 2009 04:00:00 +0000</pubDate></item><item><title>A simple UI for ‘vpnc’</title><description>&lt;p&gt;I’ve been using the Nortel branch of vpnc for a while with great success, but it’s a command-line tool, and a drag to use now that Ubuntu 9.04 is so swish.  So here’s a 30-minute Python/Tkinter UI hack which wraps the vpnc and vpnc-disconnect tools.  Notes:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;you’ll need to edit the CONNECT and DISCONNECT command paths at the top of the file&lt;/li&gt;
&lt;li&gt;this assumes that you, like me, use a private PIN and a SecurID password&lt;/li&gt;
&lt;li&gt;it also assumes that your /etc/vpnc/default.conf file is configured with everything except your password&lt;/li&gt;
&lt;li&gt;it’s probably best run with gksudo&lt;/li&gt;
&lt;li&gt;I’m no Python guru, so don’t take this code as being ‘best practice’ ;-)&lt;!-- more --&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;pre class="prettyprint"&gt;#!/usr/bin/env python&lt;br/&gt;# (c) 2009 m@tthew.org&lt;br/&gt;# &lt;a href="http://insignificant.org/"&gt;http://insignificant.org/&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;# Feel free to use and abuse this code, but please remember:&lt;br/&gt;# - it comes with no warranty&lt;br/&gt;# - if you make enhancements, please share them with me :)&lt;br/&gt;&lt;br/&gt;from Tkinter import *&lt;br/&gt;import threading&lt;br/&gt;import subprocess&lt;br/&gt;&lt;br/&gt;# Edit these paths!&lt;br/&gt;CONNECT="/path/to/vpnc"&lt;br/&gt;DISCONNECT="/path/to/vpnc-disconnect"&lt;br/&gt;&lt;br/&gt;STATE_DISCONNECTED=0;&lt;br/&gt;STATE_CONNECTED=1;&lt;br/&gt;STATE_DISCONNECTING=2;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;class ConnectThread(threading.Thread):&lt;br/&gt; def __init__(self, app):&lt;br/&gt; threading.Thread.__init__(self)&lt;br/&gt; self.app=app&lt;br/&gt;&lt;br/&gt; def run(self):&lt;br/&gt; app.setState(STATE_CONNECTED)&lt;br/&gt; proc = subprocess.Popen([CONNECT, "--no-detach"], stdin=subprocess.PIPE)&lt;br/&gt; proc.communicate(app.entryPIN.get() + app.entryPassword.get());&lt;br/&gt; proc.wait()&lt;br/&gt; app.setState(STATE_DISCONNECTED)&lt;br/&gt; app.entryPassword.delete(0, END)&lt;br/&gt; app.entryPassword.focus_set()&lt;br/&gt;&lt;br/&gt;class DisconnectThread(threading.Thread):&lt;br/&gt; def __init__(self, app):&lt;br/&gt; threading.Thread.__init__(self)&lt;br/&gt; self.app=app&lt;br/&gt;&lt;br/&gt; def run(self):&lt;br/&gt; app.setState(STATE_DISCONNECTING)&lt;br/&gt; subprocess.call([DISCONNECT])&lt;br/&gt;&lt;br/&gt;class VPNCApplication(Frame):&lt;br/&gt; def setState(self, state):&lt;br/&gt; self.state = state&lt;br/&gt;&lt;br/&gt; self.btnConnect['state']=NORMAL if self.state==STATE_DISCONNECTED else DISABLED&lt;br/&gt; self.btnDisconnect['state']=NORMAL if self.state==STATE_CONNECTED else DISABLED&lt;br/&gt; self.entryPIN['state']=NORMAL if self.state==STATE_DISCONNECTED else DISABLED&lt;br/&gt; self.entryPassword['state']=NORMAL if self.state==STATE_DISCONNECTED else DISABLED&lt;br/&gt;&lt;br/&gt; def connect(self):&lt;br/&gt; ConnectThread(self).start()&lt;br/&gt;&lt;br/&gt; def disconnect(self):&lt;br/&gt; DisconnectThread(self).start()&lt;br/&gt;&lt;br/&gt; def createWidgets(self):&lt;br/&gt; self.lblPIN = Label(self, text="PIN: ")&lt;br/&gt; self.lblPassword = Label(self, text="Password: ")&lt;br/&gt; self.entryPIN = Entry(self, show="*", width="4")&lt;br/&gt; self.entryPassword = Entry(self, width="6")&lt;br/&gt; self.btnConnect = Button(self,text="Connect",command=self.connect)&lt;br/&gt; self.btnDisconnect = Button(self,text="Disconnect",command=self.disconnect)&lt;br/&gt;&lt;br/&gt; self.lblPIN.grid(row=0, column=0, sticky=W)&lt;br/&gt; self.lblPassword.grid(row=1, column=0, sticky=W)&lt;br/&gt; self.entryPIN.grid(row=0, column=1, sticky=W)&lt;br/&gt; self.entryPassword.grid(row=1, column=1, sticky=W)&lt;br/&gt; self.btnConnect.grid(row=2, column=0)&lt;br/&gt; self.btnDisconnect.grid(row=2, column=1)&lt;br/&gt;&lt;br/&gt; self.setState(STATE_DISCONNECTED)&lt;br/&gt; self.entryPIN.focus_set()&lt;br/&gt;&lt;br/&gt; def __init__(self, master=None):&lt;br/&gt; Frame.__init__(self, master)&lt;br/&gt; master.title("VPNC")&lt;br/&gt; self.pack()&lt;br/&gt; self.createWidgets()&lt;br/&gt;&lt;br/&gt;root = Tk()&lt;br/&gt;app = VPNCApplication(master=root)&lt;br/&gt;app.mainloop()&lt;br/&gt;root.destroy&lt;br/&gt;&lt;br/&gt;&lt;/pre&gt;</description><link>http://insignificant.org/post/3205326478</link><guid>http://insignificant.org/post/3205326478</guid><pubDate>Wed, 20 May 2009 09:00:00 +0100</pubDate></item><item><title>Fortnightly cron jobs</title><description>&lt;p&gt;I’m doing regular nightly backups to &lt;a href="http://rsync.net/"&gt;rsync.net&lt;/a&gt;,  and recently made changes to the way that backups are done. I now keep  the last seven daily snapshots (labelled “d-1″ to “d-7″) and another  snapshot every fortnight.  But that fortnightly snapshot needed a  fortnightly cron job.&lt;/p&gt;
&lt;p&gt;Here’s the entry in my crontab:&lt;/p&gt;
&lt;pre&gt; #Mins   Hours   Days    Months  Day of the week&lt;/pre&gt;
&lt;pre&gt; 30      02      *       *       0       expr `date +\%W` \% 2 &amp;gt; /dev/null || /home/matthew/scripts/fortnightly.sh&lt;/pre&gt;
&lt;p&gt;This was inspired by &lt;a href="http://www.ixora.com.au/q+a/0104/27155547.htm"&gt;this post on the interweb&lt;/a&gt;,  with a slight necessary modification: the two percent signs need to be  escaped for the job to run properly with Vixie cron, Ubuntu Gutsy’s  default cron.&lt;/p&gt;
&lt;p&gt;The original Wordpress post had one comment:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://vinnn.blogspot.com/"&gt;Vin&lt;/a&gt; Says: 						&lt;br/&gt;&lt;small class="commentmetadata"&gt;December 22nd, 2009 at 5:57&amp;#160;pm &lt;/small&gt;&lt;/p&gt;
&lt;p&gt;This is OK until you need to say, run something every 1st &amp;amp; 3rd Monday of the month.&lt;br/&gt; However hows about this..&lt;br/&gt; You cron your script to run every day, then your script’s logic determins when stuff happens.&lt;br/&gt; Such as..&lt;/p&gt;
&lt;p&gt;echo $(echo $(cal|cut -c 4-5)|cut -dM -f2)|read first second third forth&lt;br/&gt; if (( $(echo $(date +%e)) == $first || $(echo $(date +%e)) == $third ))&lt;br/&gt; then&lt;br/&gt; do some stuff&lt;br/&gt; fi&lt;/p&gt;
&lt;p&gt;The first line gets the day of the month for all Mondays in the  current month from cal and assigns them to four variables $first $second  $third and $forth.&lt;br/&gt; Then the if statement only does stuff if today’s “day of the month” matches the values of $first or $third.&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://insignificant.org/post/3205221236</link><guid>http://insignificant.org/post/3205221236</guid><pubDate>Sun, 16 Mar 2008 05:00:00 +0000</pubDate></item></channel></rss>

