Archive for the ‘Work’ Category

Textastic

Textastic is a programmers editor for iOS.  It’s not perfect, but it’s very close to the app that I was waiting for ever since the first iPad was released.

Even before I had an iPad, I’d mostly stopped using my laptop.  The only time I did use it was when travelling overnight (I’d take it if I had to work while away, or in case there was an emergency and I had to work on something).  I don’t need a full computer for this – typing on a software keyboard on a 9.7 inch screen is perfectly adequate for emergency work, and when combined with a bluetooth keyboard (which is small enough to easily pack, and I already own) and a monitor (now a TV via AirPort mirroring) it’s quite useable as a work-while-travelling device.

The only missing component was the software: for a very long time there was nothing available.  There are oodles of word processing applications, note takes, and there are even a few HTML editors – but nothing designed for real programming work.  I’m not sure why this is, but I suspect that most professional programmers already have something along the lines of a small MacBook Pro or Air and find it convenient to travel with that, so wouldn’t use an iPad, even in these situations.  The best available was, unfortunately, using SSH (this was before Prompt, too) and doing the word in a command line on a server somewhere.

At $14, Textastic is expensive for an iOS app, but cheap for a programmers tool (it’s definitely worth the price).  This is a text editor, not an IDE, so you don’t get a debugger or interactive prompt or anything like that – it would be difficult to do that anyway given Apple’s restrictions, and I prefer a dedicated programmers text editor to an IDE anyway.  (You can easily switch to other apps that together provide most of what an IDE does).

It’s a good editor – it does syntax highlighting for many languages (including Python and everything else I’m interested in), shows line numbers, and you can switch the file’s encoding and line ending choice.  You can quickly jump to “symbols” (e.g. method), although I generally just scroll since I know where I’m going.  There’s a decent find (and replace), and you can choose from DejaVu Sans Mono, Courier New, Luxi Mono, Monofur or Inconsolata for the font.  There are a variety of colour themes, there’s control over tab settings (including soft tabs) and word-wrap.  Although you can set the font size, you can also just pinch & zoom to get the size that you’re after, which is far superior to manually picking a size.

Generally the app does what it should: it gets out of the way and lets you get on with writing/editing the code.  There’s an additional top row in the keyboard that offers symbols that you’re likely to need (this oddly scrolls horizontally to fit everything in) so that you don’t have to toggle between keyboards often (except for numbers) if you’re not using an external keyboard.

Where the app falls down for me is where iOS in general performs badly: moving data between applications.  You can share files to the app (e.g. from Dropbox), and there are actually many ways of getting files in and out (via WebDAV, iTunes, creating local files), but you’re left with the same issue that lots of iOS apps have: you end up with duplicates.  To its credit, the app tries to address this (e.g. it can know that a file you’re editing belongs in a particular Dropbox location and sync the changes back), but at the end of the day it’s clearly a hack.  The app is still useable, but this does mean that I more often read code in it than write it (it’s far better for reading code than the Dropbox app is).

It seems obvious to me how to fix this problem (I don’t understand why it isn’t already the case).  Surely nearly every programmer that would use this app has their code stored in some sort of repository (CVS, SVN, Git, Mercurial, Bazaar, etc).  The repository is the file system.  The app has a working copy checked out, and you can commit changes back to the repository.  The app doesn’t need to support every action that the VCS/DVCS offers – really just (in SVN terms) add/remove/update/checkout (and perhaps propset) – if you need to do something else, then you use a dedicated SVN/Git/etc app).  This completely solves the issue of multiple copies of files, because that’s exactly what these tools are designed to handle.

Unfortunately, the app would need to support at least SVN, Git, Mercurial, and Bazaar since there’s a lot of diversity at the moment.  However, it seems likely that there are libraries that can be used (even in iOS) that would handle a lot of the grunt work.  If the app let me check out a SVN working copy, make changes, and then commit them back, it would be absolutely perfect (I’d pay ten times the price if the app supported this).

If you need a programmers text editor on iOS, then I highly recommend Textastic.

Prompt

Panic’s Prompt is the SSH iOS application that I (and I’m sure many others) were waiting for from the release of the first iPad.  My only complaint is that it took over a year (a year of using considerably inferior alternatives) before the app was finally available.

SSH isn’t pretty, but somehow Prompt is.  Although there’s a lot of space required for the keyboard, connections, and settings, Prompt somehow makes the remote display quite large enough to be readable (and if you use an external keyboard, then it’s perfectly sized, and you get the control keys and arrow keys working as you’d expect).  Connection management is very simple, and all the settings you’d expect (initial command, prompt string, etc) are available.

The keyboard includes an additional top row that has the keys that you need to use most frequently in SSH (escape, control, tab, /, -, |, @, arrow keys) and are missing from the standard iOS keyboard.  It even autocompletes using the shell history, saving typing long paths and commands repeatedly.

There’s very little I can say about the app other than if you will ever need/want to SSH from your iPad, then this is, without any doubt, the application to have.  It’s $11, but worth easily five times that much; I’d grumble and probably try and convince work to contribute to it, but I’d pay $100 for it.  If you don’t know what SSH is, then this is not the app for you.

(Before Prompt, I used iSSH which also does VNC – I use VNC a lot less frequently, but still need it occasionally, so now I need to figure out which is the best VNC app, which are unfortunately all fairly pricey.  If you have suggestions, let me know!)

PyPad

PyPad is a Python interpreter for iOS.  This sounds incredibly exciting, right – finally I can do proper development and run Python programs on iOS!  Unfortunately, that’s not really the case (mostly due to Apple’s restrictions).

PyPad lets you create multiple modules and execute each of them.  However, only a subset of the standard library is available, and there’s nothing iOS-specific available (so you can’t access the camera, or touch information, and so on).  Getting code in and out of the app is done via copy and paste.  The standard keyboard is provided, with start/pause/stop buttons.

I keep the app installed so that I can (via AirPlay mirroring) demonstrate simple Python snippets.  However, if I have an Internet connection available, then I can do that in Prompt (ssh’d to a server that has Python installed) much more elegantly.

The app is clearly limited by Apple’s restrictions as to what’s acceptable for iOS.  However, it does seem like it could do much more (e.g. see Codea) if more of the standard library was available (this would mean rewriting chunks, I presume) and if there were special iOS-specific modules available for accessing things specific to the device (especially for accessing touch and graphical output).  It could accept .py and text files from other applications, making it easy to get code in (e.g. from Dropbox) and share files (as text) – although perhaps that crosses Apple’s boundary for what’s ok.  It would be nice to include the Python documentation, too (I have a separate app for this, but it makes sense to have it in once place).

The app is only $2, so if you’ve any interest in Python on iOS, then I’d recommend buying it to have a look and to encourage more development.  You probably won’t end up using it that much, however.

Possible gmail break-in

When I logged into gmail this morning, I saw the message that I dread the most – detection of an unusual access.  There was a connection (two days ago) from a server in Malaysia, although it’s actually an AWS server (Amazon web services).

There are two possibilities: the good one is that this is something that I’ve previously given access to my account, accessing it via an alternate method (e.g. Backupify can access my mail to back it up, and they use AWS) so that it showed up an unusual.  The bad one is that someone was using AWS to bulk-attack accounts and got in.

In favour of the good one, as far as I can tell, no email was sent – I can’t see anything amiss at all.  The email account is the central lockbox for everything, of course, so it’s possible that it was just used to break into other things, or the email content was retrieved.  My password (changed now, of course) was a random 8-character string of lower-case alphanumeric characters, so not particularly simple to break (although not difficult either, given sufficient resources).  I never give out the password to anything that I do not completely trust, and nor do I give out access via other methods (e.g. oauth, openid) unless I trust those services too.

I had intended to turn on two-factor identification, but hadn’t got to it yet.  I’ve done that now, for the main account at least.  My password is now over 30 characters long, including upper and lower case and punctuation – I probably should have changed this a while ago too.

For now, I’m leaning towards the good possibility, so I won’t be completely resetting everything that can send a password reminder to my gmail account.  I’ll be keeping an eye on things as closely as I can in the next week or so, though.  If you see anything suspicious come from me, please let me know.

Trac to iCal

One project I work on uses Trac and has a custom “due date” field (it doesn’t really have milestones – updates are more granular).  While this is useful, one problem is that I don’t check this Trac instance every day, and so sometimes I’ve missed deadlines because I haven’t noticed that they are due.  However, I do check my calendar every day (multiple times a day).  It seems like exporting this “due date” value into my calendar will help with this.

This little script creates a calendar that can be subscribed to.  I run it once a day (due dates don’t change very often), and have iCal set to update once a day, so it should work fine.  If it’s of use to you, use it (no restrictions).  Let me know if there are things that can be improved!  It requires the Python iCalendar module, which I already use for parsing public holiday data.

#! /usr/bin/env python

import sqlite3
import datetime

import icalendar

cal = icalendar.Calendar()
cal.add("prodid", "-//PROJECT NAME Trac Deadlines//trac.tonyandrewmeyer.com//")
cal.add("version", "2.0")
cal.add("method", "publish")
cal.add("x-wr-calname", "PROJECT NAME Ticket Due Dates")
cal.add("x-wr-caldesc", "Due dates for PROJECT NAME tickets")
db = sqlite3.connect("/trac_location/db/trac.db")
c = db.cursor()
c.execute("select t.id, t.owner, t.summary, c.value from ticket t, "
           "ticket_custom c where t.id=c.ticket and t.status!='closed'")
for ticket_id, owner, summary, due_date in c.fetchall():
    if not due_date:
        continue
    due_date = datetime.datetime.strptime(due_date, '%d/%m/%Y')
    due_date = datetime.date(due_date.year, due_date.month, due_date.day)
    event = icalendar.Event()
    event.add("summary", "PROJECT NAME #%s (%s): %s" % (ticket_id, owner, summary))
    event.add("dtstart", due_date)
    event.add("dtend", due_date)
    event.add("dtstamp", datetime.datetime.now())
    event.add("url", "https://trac.tonyandrewmeyer.com/ticket/%s" % ticket_id)
    event["sequence"] = datetime.datetime.now().strftime("%Y%m%d%H%M")
    event["uid"] = "ticket_due_%s@trac.tonyandrewmeyer.com" % ticket_id
    cal.add_component(event)
c.close()
db.close()
open("/var/www/subfolder/project-name-trac-due.ics", "wb").write(cal.as_string())

Displaying PDFs via the iPad

I used the iPad’s external screen output for the second time today (the first was trying out Chopper 2 with the TV as the screen and iPhone as controller) – this time not just as an experiment.

I have a set of revision worksheets (all PDFs that I inherited many years ago – I might have Word documents somewhere, but I’m not sure where).  Going over the questions in class, I can simply read the question out loud (but people don’t listen well enough and can’t ‘go back’ to it), or write it on the board (slow, handwriting code is problematic when you’ve got messy writing), but ideally it’s projected. Continue reading »

D520 Week Two – 2010

No radical changes from either last year’s week two or last week.  In a way, this is the real first week – in the previous week we learn about the course and about what IronPython is (and remember how to program in Python), but we don’t do much more than that.  In the second week, we really get into doing some actual IronPython programming.  I gave the students notes [PDF], and the first assessed lab exercise [PDF], and the recommended reading was two Joel Spolsky posts: one on (IT) customer service and one on how hardware improvements impact software design.  The notes are again in three sections: textbook chapters (this week is Chapter Three, a fairly essential introduction to .NET and IronPython), key points, and example code (from Chapter Three).  The lab is essentially the same as in previous years. Continue reading »

What happened to the 2009 IPy Notes?

Around this time last year, I started posting weekly reports on the IronPython classes I was teaching at Northtec, including copies of the material that I was giving the students.  These stopped abruptly around the middle of the course.  The course did complete (and was fairly successful – I think the change to IronPython was definitely for the better), and I did continue making notes as I taught.  However, I didn’t manage to get them online.

On the 10th of October 2009, my father passed away (very unexpectedly, of a heart attack the day before).  As a result, I didn’t have as much extra time as I had anticipated, and I didn’t really have the energy/motivation to post the notes.  (The classes continued, except the week of the funeral, where the hours were halved).

The course began again last week (21st July 2010), and I’m going to try this again.  As I go, I’ll complete the 2009 notes as well (some/all of the links in the 2009 ones are broken, which I’ll fix, and when I get to where the notes stopped, I’ll post the notes that I took last year, although these will be less exhaustive than if I had done them at the time).

No promises, but I expect that I’ll be able to post throughout the entire course this year, and I’ll again make the material that I use available (you may use it under a Creative Commons license if you wish, although much of the material is references to IronPython in Action).

I had planned to present a short summary of the experience of using IronPython in this way at PyCon NZ, but I’m again unable to make it this year (for happier reasons – a close friend is getting married that day); perhaps next year!  I’m still interested in hearing from anyone else that’s using IronPython in the classroom.

Dr? No.

I finally withdrew from my PhD today (probably many people thought that this had happened some time ago).

In the beginning…

The story really starts in 1999.  I started working consistently while studying, and also got rather bored with the study that I was doing.  I also got involved in the Students’ Association – first lightly, then pretty heavily.  As a result, at the end of 2000, I was about 1.5 papers short of finishing my BSc and BBS.  I needed to do half a semester of work, and so I decided to go those at the same time as a Postgraduate Diploma in Science (these went along with running for ASA President).  The ASA job didn’t work out, but I did finish the last undergrad stuff I needed to do, and rather unexpectedly found that I really enjoyed the postgrad study.

I was able to do all the papers for the postgrad diploma along with the undergrad work, except for the double-paper research project, in that year.  That meant that the next year started off with finishing off the research project – normally half of a semester’s load, but since I didn’t have anything else to be doing, I poured in a whole semester’s effort into it.  That left me at the middle of the year with everything complete.

To be Dr T…

At this point, I was offered a $20k scholarship to do a PhD at Massey.  A lot of thought went into this at the time – including a lot of talking with Olyvia (this was not that long before we got engaged).  It was clearly going to be financially terrible for three years, but money has never been my focus.  On the positive side, I was assured (and believed) that there was quite a lot of demand for lecturers, and I had found that I really enjoyed teaching, research, and administration, which are basically the three components of a (NZ) lecturing position.  It seemed at the time like it was a good career choice (especially the flexibility that it offered), and so I took up the choice.

I chose to continue on with the work that I’d done for my research project (what I ended up calling synthetic actors).  There were a lot of reasons that this was a good choice – it was AI, which I particularly enjoyed, it involved theatre, which I was spending a lot of time doing, and it was a very clear field (i.e. few other researchers in the area).

Early errors…

In retrospect, both of these were poor choices.  I should never have enrolled with Massey to do a PhD.  The Computer Science department at Albany is just a poor relation of the strong Maths/Statistics department, and so it’s not really a good choice, even though at the time (and possibly now) they had some really good staff.  I should have gone somewhere where Computer Science was a department with real funding and support, and where I could potentially have got some work once I was done.

Although synthetic actors were fascinating and I got the work done (other than a bit of writing) in the end, it was a bad choice.  For a start, a topic like this, which bridges disciplines, needs to be done somewhere where there is more history of cross-discipline study.  To do a topic like this I should also have been somewhere that had a strong theatrical department (i.e. I really needed to be in Wellington).  It’s really very important to pick a topic that matches the institution (or an institution that matches the topic).

The other problem with the topic, exacerbated by doing it at Massey, where there’s no history of this type of research, is that it is really hard to measure.  Computer science is really a lot like mathematics and statistics in that what you’re typically after is something that you can do and collect numbers and then have some sort of graph that shows that things are improved.  A semi-art topic like synthetic actors doesn’t suit that well at all.  I ended up finding things to measure, but that did mean that a lot of the effort that the project needed (e.g. putting on the two productions) wasn’t central to the real research.

Somewhat ironically, a much more suitable topic was at hand a little later.  I started working on SpamBayes, and a computer science/statistics project would have been a great fit with Massey and also very measurable.  It would also have been much more translatable into work (in fact, my work on the project, outside of the PhD work, has contributed much more).

Good times…

Despite these two things, everything went pretty well for the first 2.5 years.  Money, as expected, was pretty tight – $20k is not a lot, especially with a wedding and living a ‘grown up’ life (i.e. not poor student flatting or living at home with parents).  In fact, our rent was about $20k at this time.  This meant that I had to work a lot as well as study full time, but even though I had little spare time, I was enjoying both, so it seemed ok.  The English department at Massey was hugely helpful here, because they paid me decent wages to teach a paper each semester (whereas in Computer Science you got less than working at a service station).

Towards the end of the three-year period, everything was basically on track.  I had about a third to a half of my thesis complete (about half of this was later rewritten from scratch) with about 6 months to go.  My plan was that I would spend a reasonable amount of time time looking for (lecturing) work to move into as I finished up the thesis – I even gave up the lucrative English teaching in order to do this.

Stalling…

This is where everything stalled.  I vastly underestimated how difficult finding lecturing work would be (and how unhelpful and insulting Massey would be).  With a couple of months of stipend to go, I disparately needed to find work (Olyvia wasn’t working at this time either, so the need was particularly urgent).  Although there wasn’t any lecturing work to be found (or at least, anyone interested in me), there was a lot of other work.

In particular, SpamExperts approached me about doing a short project (nearly 5 years later, I’m still working for them!), Lifeway College approached me about teaching a module (in Business Modelling with Spreadsheets, of all things), and Northtec (indirectly) approached me about filling in for a few weeks (I’m still doing this – and another paper – too) for a programming paper.

All of this was enough to pay the bills, but combined with still looking for lecturing work, left me no time to actually finish off the thesis.  The two teaching jobs in particular (which I valued a lot because they seemed like good experience for lecturing work) required me to create the courses from scratch (and I had to learn Business Modelling, since I had no prior knowledge).  Several months passed without any thesis work getting done.

This was really my biggest error – underestimating how difficult it would be to get work afterwards.  I should have come up with some plan that wouldn’t have resulting in losing the last (essential) few months of full-time study that I had.  I’m not sure what that plan would have been, but it was what was missing.

Stuck…

The plan around this time was that we’d have our first child during the next year – we didn’t want to be old parents (and if we have two children want to have a break between them), and it seemed like a good time (with me going into the real work force and so on).  Samuel came along very quickly (planning’s fine, but there’s still some luck involved) – I rather naively assumed that finishing the PhD and working would fit into the pregnancy year without any problem (after all, it was Olyvia that was pregnant, not me, right?).

I probably could have managed to get work done during that time.  However, I was enjoying a break of just normal working life, I was working a lot of hours (I had many jobs, but all were – in theory – temporary, so I was scared that they’d end and I’d have nothing, so I needed savings).  Finally, supporting Olyvia during the pregnancy took a lot more time that I expected, with antenatal classes, midwife visits, scans, shopping, and so forth.  I could have skipped this, of course, but they took priority for me over the PhD.

Limbo #1

Once Samuel really arrived (28/8/6), there really was no time to spare.  The first year, in particular, was quite tricky, and I spent all my time parenting and working.  If I had put thesis work into the mix, I would have produced rubbish or would have burnt out.  A year or so later, things did start to quieten down a bit, but I was in an odd limbo where I had had such a long break that I wasn’t sure where I was.

Going back to the work after a long break was difficult, and since I’d used up the 4 years I was meant to have, I wasn’t sure whether the work would be accepted anyway.  Massey was extremely unhelpful here (not my supervisor – he was great), in that I was continually asking for time and never hearing about whether I was granted it or not – the only time I heard from them was the ridiculous requests for 6-monthly reports and queries about when it would be done.

(The reports infuriate me.  In theory, they’re meant to track how people are going.  However, I submitted years of reports saying “I failed to get anything done”, and nothing came of them.  So obviously they are ignored, and are pointless.  I could have spent the time actually getting work done instead).

I had about a year of this limbo.  This was the second big mistake, really.  I could have managed to get the work complete during this time – I was busy with work and parenting, sure, but there was also a bit of time here and there where I could have knuckled down and got the work done without going crazy.  The PhD seemed very distant and less and less important as time progressed and so motivation was very difficult.

Nearly unbelievably, progress again…

About 18 months ago, the limbo finally ended.  I finally got some clear answers (thanks to my supervisor I believe) from Massey about whether I was able to continue working on it or not.  The original plan was to finish the thesis (other than some editing) by the end of 2008.  I made a private plan with my supervisor to get a certain number of words done every week (emailing fresh copies weekly) and if I failed to get that done any week, I’d withdraw.  I worked very hard at this, and although it was tricky, I did manage to meet each deadline.

At the end of the year, I was a little short (about 1.5 chapters and a bit of tidying up), although I’d done more editing than originally planned.  Limbo came back.  Eventually (some time in early 2009) I did hear that I had an official (after years!) extension until 29/11/09.  This was clearly enough time, at least in theory.

Limbo #2

However, the last 12 months have been a disaster for me personally.  2009, without doubt, has been the worst year of my life so far (hopefully, ever).  I had no idea that things could go so badly.  The details don’t really belong here, but I honestly don’t believe that I had any chance to get the work done (to an acceptable standard) this year.  I really needed to get it done the previous year (when in honesty I should have been able to find time) – there was just no way I could work on it this year.

The end

Supposedly Massey have been trying to talk to me about the status recently (I don’t know for how long) and haven’t been able to get hold of me.  I find this difficult to believe considering how easily an email address for me (or even this blog!) can be found via Google.  Olyvia got a message on the phone today querying the status (predictable given that the deadline is 9 days away), and I sent the IIMS HoD a message indicating that I was withdrawing (in reality, there’s no choice – and if I’d known what the year would be like, I would have just done that a year ago).

Retrospective thoughts

This is obviously disappointing.  The PhD was the biggest project I’d worked on at the time, and I poured a lot of time, money, and effort into it.  It’s also nearly done – I have tens of thousands of words of a thesis complete.  It’s frustrating quitting something when it’s so close to completion.

I’ve also always been mindful of the support that others gave me, particularly in those first three (productive, active) years.  Olyvia, Mum and Dad, Jacs, Jo, Geoff and the other MADSODS, Chris, Jenny, and so forth.  It always seemed like I owed it to them to complete the damn thing as well.

However, it has been hanging on my neck like the proverbial millstone for years now.  Few days go by without at least one guilty stressful thought about how I haven’t done anything towards it that day.  It will be nice to leave that behind.

In reality, there’s no practical benefit to getting the PhD.  I long since lost any desire to work in academia (thanks, Massey!), and even if I got the PhD, I’ve spent too many years without getting anything published to be a strong candidate for any job (I was a stronger candidate, in many ways, back when I failed to find lecturing work years ago).  In NZ, which is where I want to continue working, there’s little career value to a PhD outside of academia.  I still have plenty of work (although the exchange rate is hurting a lot) and I’m certain that I could find more if I had to (although I’ve clearly been wrong about that before!).

On the other side of the equation, there are things that really are important to me.  In particular, family.  If given the choice between spending more time with Samuel and writing a thesis that’s only of sentimental worth, I’ll pick Samuel without any regrets.

Looking back, I can see where I made mistakes – the poor topic choice, failing to see how difficult finding work would be, not utilising time in 2007/8.  However, I don’t regret any of the decisions I made at the time.  Most of the time, I was choosing things that are still more important to me than the PhD.

To those reading this that did help – thanks.  I really do wholeheartedly appreciate all the support.  Also: my apologies – I’m sorry if I have let you down by not completing everything.  I hope you understand that there are just things that are more important to me (I know some people do, since they’ve said that to me in the past – Dad did this a while ago).

So that’s that.  I’ll probably put the thesis up at some point – maybe another eager kid will want to work with synthetic actors (despite Claudio giving it up and then me giving it up) and will find it useful.  I might have more thoughts then.  For now, I’m going to go back to things that I care more about.

p.s. Yes, I did partly choose the title of this post to counter the Google juice that the James Bond Tony Meyer seems to have.

More notes coming soon

I am still putting together the weekly D520 notes. However, the last couple of weeks have been a bit busy and so they’re waiting to be cleaned up and have links added. The intra-semester break starts next week so I’ll catch up then.

Follow

Get every new post delivered to your Inbox.