Tea and Cake

The adventures of a small spotted skunk.

Where have I been?

written by pomke, on Mar 5, 2012 5:45:00 PM.

Oh my goodness, it’s almost a year since my last post! I’ll keep it short, I’ve been working on a project for writers, PangurPad; if you’ve ever considered writing a novel, a story or anything really I’d love if if you came and had a look :)

So yes, PangurPad has been taking up most of my time and we’re working hard on getting it out of Beta in the coming months however that is not the only thing occupying my time; It occurred to me quite a while ago that while I was fairly sure of my career choice for the rest of my life I was less sure of what I wanted to achieve before I die of old age. I mean I’ve had a fairly well defined idea that I’d like to help people but just how do you help people?

This got me to thinking about how people help other people, and how I’ve needed help and been helped in the past. It all seems to come down to money in the end, that some people have money and others do not have any money at all, and thus no food, clothing, shelter, medical attention, education, life expectancy, community to depend on, freedom of expression.. How can I fix this problem of money distribution?

Robin Hood is a great example here, (or Robyn Hood as I like to imagine her) a person who literally decided to solve the social injustices of the time by taking form the rich and giving to the poor, what a fantastic idea! .. maybe not, ‘crime doesn’t pay Pom, thats bad mmkay’.

Then I had another thought: ‘Crime doesn’t pay.. like software startups!’. Its true you know, recently Apple passed Exon as the most lucrative company on the planet, and startup-economy is really what’s propping the US up right now. So I’ve got a new mission for myself, I’m going to ‘Take from the rich and give to the poor’, through the medium of awesome software.

What does that mean exactly? well I’m still working that out and its something I’m going to be relying on PangurPad being a raging success to bootstrap. One thing I’ve noticed while trying to get PangurPad off the ground is just how hard it is to get funding without taking on the evils of VC investment. No longer is a company developed to grow into a great organisation that will last for 20 years, they are built to be sold off after 4-5 years in the hope of turning a profit for their investors. Why would I want to give 50% of my company to people who are only interested in getting rich quick off my own innovation, simply to further fund their investment in other people’s ideas?

What I’d like to do is fund a not-for-profit incubator foundation. This foundation would assist startups with funding and mentoring, through the angel investment stage and through to market in exchange for just 15% of their company shares.
Now that 15% is broken down thus: 5% would go to the Foundation to help fund further startups, and 10% would go to a legitimate charity of the startup’s choosing. These shares would not come with voting rights, but would provide funding through dividends or later sale when the startup either floats or is bought out. This would see 10% of the value of the startup going directly to charities where the money can be used to benefit people in need, and 5% to growing the model.

Why would you give 50% of your company to a VC firm who want you to sell out in 4-5 years, when you can fund your startup for less than a third of that, and you know that the funds are going to people who could really use the help, rather than to the already rich?

Something for me to think about anyway..

PS:
I’ll also be looking at moving my blog over to a different platform (maybe a hosted wordpress site?) as this blog engine doesn’t handle spam comments very well and the amount of spam I’ve received (over 120k comments worth at last count) makes it basically impossible to moderate and approve comments so they are getting lost into a black hole of despair :(

almost-tweet-sized updates

written by pomke, on Apr 18, 2011 3:04:00 PM.

I have been a neglectful blogger recently, perhaps because life is a bit up in the air at the moment on so many fronts. I understand that is not a very good excuse so I’ll endeavor to catch you up here in short almost-tweet-sized bullet points ^_^;
  • My Hoodie of awesomeness arrived recently and it is now my favorite item of clothing, the folks at morphic were absolutely lovely, check out their adorable products and support creative indie businesses.
  • I had dinner with Danielle from the telepathy project at The Vegie Bar in Fitzroy, the meal was fantastic and so was the company ^_^
  • My good friend Elspeth threw me a link to a fantastic article about passive and active voice, which really was a most excellent explanation for someone as uneducated in the finer points of the language as I am.
  • I have been trying hard to work on my use of ableist language, especially the term ‘lame’ which it seems I use quite often :(
  • I am now officially on a two week holiday over easter! I will be spending the first week working hard on Pangurpad (my online story writing tool) in the hope that it will be ready for people to use for nanowrimo in November. The 2nd week I will be spending with my family, we’re going to my inlaws for easter and then taking day trips down along the great ocean road <3
  • I am brushing up my resume at the moment and hoping to find a new job ASAP, one that fits in to at least some of my expectations of a good workplace.
  • Elucidate is a hard dependency for all of my projects as I believe strongly in making my apps accessible to the widest audience possible, however I’m having to prioritize my work on it with everything else and I doubt I’ll have time to work on it again before May.
  • I’m working on ‘pangur’, the micro-framework I’ve been developing for use in pangurpad and skunkpad, I’ll be releasing it on github in the next week or so under the MIT license, I hope other people find it useful.
  • After seeing how much my girls enjoyed making our home made hot crossed buns last easter while we were holidaying at Bendigo, I’m really looking forward to doing it all over again this year ^_^
Right now I’m sitting on a friend’s sofa in St Kilda, I just had a vegie burger and yummy soy chai from a neat place on argyle street, I’m hacking away at some javascript and writing this update while trying to find session times so I can bring my girls to see Hop. The sun is shining and there is a lovely breeze coming up from the sea, and I think I might go and pop the kettle on.

Best wishes,

Pom

A different approach to internationalisation

written by pomke, on Mar 22, 2011 6:13:00 PM.

update: I have started a project to implement this over at github.
I’d like to prefix this entire post with two important facts: Firstly and regretfully, I only speak English. Language was not something that kept my attention in my early education and I live in a country which while being considered very multi-cultural, has only one common language which is spoken by almost the entire population (en-AU). Secondly, I do not consider myself an expert in internationalisation or localisation tools and this post is entirely based on my own experiences in developing FOSS-based web applications in a combination of commercial and community environments over the last decade.

A complaint about GNU Gettext

Internationalisation of FOSS-dependant web applications often relies on GNU Gettext. Gettext is a handy tool but seems to be based on the suggestion that there is always a default locale (usually en-US), embedded in the software which needs to be translated into other languages.

While it is often the case that an application will have been developed first in American English, many applications today are moving internationalisation right up to the forefront as a first class consideration for application development, and in many instances (especially within distributed FOSS projects) the development team can consist of members with diverse language backgrounds.

A failed ‘solution’

The reliance on a default translation which is intrinsic in the design of GNU gettext is something that has niggled at me for many years, and in past projects I have attempted to subvert this principle by replacing the usual string of default text with a token, albeit still in English (regretfully the only language I know).

_(“Thank you for completing this survey!”)

becomes:

_(“SURVEY_COMPLETION_MESSAGE”)

This has several major benefits right up front:

  • ALL translations now come from a .po file, the default locale is no longer an exception to the rule.
  • Msgid’s in the .po files are now tokens which are unlikely to change. An issue arises in the traditional model when the default locale, embedded in the source needs to be modified and the msgid’s no longer match the translation (this happens more often than you’d think).
  • Missing translations become blatantly obvious when your UI has SURVEY_COMPLETION_MESSAGE blazed across the screen.

It also has some major disadvantages:

  • It is not immediately obvious from the msgid what the intent behind the message should be.
  • Msgid’s can no longer contain placeholders, which results in text being split into strange fragments within the code:
    _(“Thank you %s for completing our survey”) % (user.firstname,)
     

    becomes:

    “%s %s %s” % (_(“SURVEY_COMPLETION_MESSAGE_1”), 
                  user.firstname, _
                  _(“SURVEY_COMPLETION_MESSAGE_2”))
     

In the long term the complexities of maintaining tokens with a standard gettext solution outweighed the benefits and added to confusion across the project I tried this in.

What next?

So where does this this leave my token (pun intended) attempts at fixing my niggles with gettext? I am currently working on two new projects of my own which are python/web applications and I have the flexibility to pick and choose the libraries I use. I have been considering abandoning gettext all together.

I would like to try out a method for combining tokens with example text and qualitative descriptions of available substitutions to assist in making a proper translation, by providing useful tools for translating an application in situ.

Firstly, I would like to be able to provide as much flexibility to the translator as possible. Some translations may require more or less formal information depending on context, it should be clear what substitutions are available to the translator:

_(“SURVEY_COMPLETION_MESSAGE”, “Thank you {{firstname}} for completing our survey.”,
{“firstname” : user.firstname, “lastname” : user.lastname, “title” : user.title})

Thank you Melanie for completing our survey.

Sometimes as a developer you do not have any placeholder text at all, this may be because the content is still being constructed by your content team. In such a case specifying a number of words to include from lorem ipsum might be appropriate, with all values substituted in place as an example gives you an immediate sense of page layout, whilst providing a feature complete bit of software just waiting for content:

_(“LOGIN_MESSAGE”, 45, {“username” : user.username, “firstname” : user.firstname }

Lorem ipsum dolor sit amet, consectetur Melanie elit. Donec fermentum 
rhoncus neque ut ornare. In ac sollicitudin est. Ut gravida urna quis neque 
Pomke sit amet luctus tortor molestie. Maecenas sem quam, porttitor vitae 
porttitor a, euismod a neque. Stebbing pharetra imperdiet augue in rutrum.

Initially this seems like a lot of extra work for little return, how exactly does this help the translator? Consider a few examples of alternate translations (please excuse my abuse of google translations):

“Go raibh maith agat as comhlánú ár suirbhé {{title}} {{lastname}}”

“Félicitations pour la fin de notre enquête {{firstname}}”

Already a translator can make use of a more flexible list of substitutions to translate in a language-appropriate manner.

Given that I am a web designer/developer/whatever you would like to call me, I would be implementing a javascript/html5/client-side storage?/buzzwords editor that could be enabled on a page to allow translating the content in the context it would be delivered in.

Essentially, integration with a templating engine/framework would provide an l10n-mode which could be turned on during development which would output html like:

<div class=”_i18n_text” id=”LOGIN_MESSAGE”>Lorem ipsum dolor sit amet, 
consectetur Melanie elit. Donec fermentum rhoncus neque ut ornare. In ac 
sollicitudin est. Ut gravida urna quis neque Pomke sit amet luctus tortor 
molestie. Maecenas sem quam, porttitor vitae porttitor a, euismod a neque. 
Stebbing pharetra imperdiet augue in rutrum.</div>

And would also embed a javascript client which would tag these strings with a floating [translate] button which would launch a translate tool. This tool would display any default explanatory text, possible substitutions and allow the translator to easily provide translations in various languages and see the results reflected immediately on the page. The translations could be written to the server via a simple API, or alternately stored on the client in client-side storage for uploading at a later date.

I thought that before I launched into writing this I’d throw the idea out to you, my friends and peers for comment. Am I missing some integral part of the GNU gettext api that provides these features already? are there projects out there using tools which already solve these problems? What experiences have you had in this area? Please leave comments and let me know what you think.

Best Wishes,

Pomke

Ada Census

written by pomke, on Mar 10, 2011 10:18:00 AM.

Take the Ada Initiative Census The Ada Initiative are running a census at the moment to gauge general feelings about women in FOSS and Open Communities, this is a fantastic opportunity to share your thoughts so let them know what you think. Here is an excerpt taken from their site:

The Ada Initiative (http://adainitiative.org/) is a newly-formed organisation which aims to support and promote women in open technology and culture. We’ve just launched our first annual census — a broad survey of open technology and culture participants — to find out more about what projects and communities people are involved in, and how they feel about women’s inclusion and representation in the field.

We use the term “open technology and culture” to refer to a wide range of activities and communities based around free/open licenses, and other forms of open, decentralised, and grassroots participation in technology and related fields. This includes:

  • Open source/free software
  • Open source hardware
  • Open geodata and maps
  • Open government
  • Open data
  • Open standards and formats
  • Open educational initiatives (open access journals, open source curricula, etc)
  • Open/decentralised social networking (including Diaspora, StatusNet, etc)
  • Creative Commons and free culture
  • Wikipedia and other wikis
  • Open crisis response and humanitarian projects
  • Barcamps and unconferences
  • Online/digital activism
  • Remix/mashup culture
  • Transformative works fandom, including fan fiction, fan art, and fan vidding
  • Maker/DIY community
  • Hacker spaces
  • Coworking

If you’re involved in any of the above areas, we’d like to get to know who you are, what you’re working on, and your thoughts on how women are doing in your community. We welcome participation by people of any gender, although we are particularly interested in women’s responses.

Click on the logo above to take the census ^_^

Best Wishes,

Pomke

I would like an employer who..

written by pomke, on Feb 17, 2011 11:07:00 AM.

I would like an employer who:
  • Respects Diversity, who does not make me feel inferior for being who I am.
  • Respects Creativity, who understands innovation and encourages good choices at every turn, rather than the cheapest most expedient solution and deferring debt.
  • Gives back as well as takes from the FOSS Community, who will let me contribute back to projects we extend and contribute non-core-IP software we develop (tools etc) under fair terms (MIT/BSD).
  • Lets me express myself with the clothes I wear and the colour of my hair.
  • Understands the needs of a parent, who sometimes needs the flexibility to pick up kids after school.
  • Respects their technical staff and their ability to accomplish the tasks they were hired as experts to achieve. Who doesn’t question every choice simply because it does not fit with their previous ‘corporate’ experiences.
  • Would consider donating for the charity-ware they benefit from.
  • Has a cause, or at least a conscience.
For such an employer I would:
  • Bring my experience, over a decade of large scale web application design and development in many industries using FOSS (with a focus on python).
  • Bring my perspective, a strong focus on scalability, ease of development through good programming practices and a great user experience, for -every- type of user.
  • Bring my commitment, to doing the best by my employer, to the best of my ability.
  • Bring cookies, because it’s hard to turn down good baking ^_^

Best Wishes, - Pomke

RIP Brian Jacques

written by pomke, on Feb 10, 2011 11:36:00 AM.

Who says that I am dead
Knows nought at all.
I - am that is,
Two mice within Redwall.
The Author sleeps
‘Twixt Hall and Cavern Hole.
I - am that is,
Take on my mighty role.
Look for the pen
In moonlight streaming forth,
At night, when day’s first hour
Reflects the North.
From o’er the threshold
Seek and you will see;
I - am that is,
My pen will wield for me.

Rest in peace, Brian Jacques.
Pomke

c25k

written by pomke, on Feb 9, 2011 11:09:00 PM.

Recently a wonderful friend of mine told me about c25k, also known as The Couch to 5k in 9 weeks running program. I had been lamenting the lack of a quality bicycle, and the lack of time in general between working and family to attend a gym.

This immediately got me to thinking; “Running? that sounds awfully much like a lot of hard work! Hmm, but this program seems so simple.. twenty minutes, three times a week? I could fit that in to my busy schedule, couldn’t I?”

Elspeth was super encouraging and gave me all the info I needed, sharing her own experiences and tips. Today I went down to a sports store and spent far too much money on a pair of shoes, about four times the amount I spent on the last pair I bought (I got the gorgeous purple ones btw.) The very helpful and very pregnant (id guess well into the third trimester) lady at the store found just the right pair for my paws and some ‘sweat wicking’ attire to go with them.

I was extra excited that the shoes could talk via bluetooth to my iphone, they had an engaging advertisement in the store showing online tracking of pace, distance, calories burnt, I signed up to the nikeplus website before I left work, ready to input data from my first attempt at serious running. When I got home however I discovered that my iphone was too old to have such a feature (albeit software only, yay of designed obsolition :/)

That small hiccough aside, I followed the c25k day one plan to the letter, using the timer on my phone to alternate sixty seconds of running then ninety seconds of walking, for twenty minutes with a five minute walk to warm-up and cool-down. I am sooooooo sore! but it is a good sore, I can tell that I’m going to enjoy this, it is just what my body has been craving, thanks Elspeth! *hugs*


Best Wishes,

Pomke

Merge Merge Revolution!

written by pomke, on Jan 26, 2011 11:01:00 PM.

At work we use Git for managing our source and Buildbot for tracking our tests, be they unit, functional, acceptance, or simply lint-like tests such as pyflakes. The development life-cycle I have implemented which is serving us well is modelled on the Ultimate Quality Development System, Basically;

  1. A ticket is raised in the ticket system (in our case rally).
  2. The ticket is accepted into a sprint.
  3. A branch is created, and the work is done
  4. The branch is peer-reviewed and feedback is given
  5. The branch is accepted by the business*
  6. The branch is merged back into master
..Fairly straight forward, *I grouped QA/AT/etc into ‘accepted by the business’, being a large organisation we have some extra hoops to jump through which I won’t bore you with.

As part of the peer review process we have our Definition of Done which includes items such as unit test coverage, functional test coverage, coding standard compliance, code lint and in the future scalability regression testing and other stuff.

Now the idea of the peer review is to communicate the change to another developer, to get some new eyes onto the change and be critically reviewed. Yet ensuring the DoD is met has become the focus of the exercise for us, detracting from what should really be going on in a peer review which is sad, especially given much of these tasks should really be automated anyway.

Ontop of this (and I won’t go into my opinions on off-shoring here) our management have seen fit to bring in some ‘programmers for hire’, who will be working from an entirely different location (and timezone), and doing their own peer review, so I decided it was time to both take away the mundane tasks from the peer review sessions and also ensure that our DoD would be met, irrespective of who was making the change.



Merge Merge Revolution! took about three days to glue together. The tools I used were Flask (Yes I know I have my own werkzeug/jina2/etc framework but I’m not sharing that with work at this moment as it is yet to be licenced c_c), Sqlite, My very own pomke.js, and jQuery.

MMR combines Git via the commandline and Buildbot via it’s json API to provide a (hopefully intuitive) interface which automatically populates buildbot with all –no-merged branches off master and a mechanism to merge those branches only when buildbot passes.

Combined these things provide a form of continuous integration, from the one location a developer can quickly identify if their branch is passing (you can click a build for a breakdown of steps, see above), force a build (the steps/eta/% done of which are updated in realtime on the screen), or attempt a merge, all the while with the assurance that nothing can be merged back into master unless the DoD is complete which means all forms of tests are passing; adequate coverage exists for the changed code, all forms of code checking have been run.

Further to this, we have a build-step which checks if the branch needs to be merged-forward, that is, another branch has been committed to master since the current branch was last pulled.

Here is a basic list of what I would like to see run before MMR allows a merge (we have about 80% of these steps already):
  • Unit tests
  • Functional tests
  • Code lint
  • Test coverage
  • i18n string coverage
  • Scalability regression tests
  • Branch tracking master


I still need to get approval to release this tool on GitHub under BSD license as I built it on work’s time, but once that minor bit of red-tape is out of the way I’d like to make MMR a bit more modular, providing a basic interface so it can be used with any SCM and release it into the wild.

Would this be useful to you at all? Please let me know.

Lots of Love, Pomke Nohkan.

Honey Bee

written by pomke, on Jan 26, 2011 10:40:00 PM.

Today is Australia Day and for the most part it is a day to kick back, invite a few friends over for a BBQ and enjoy not being at work. We had our parents around and various siblings and friends, I made some yummy lamb burgers and we had the usual array of salads and beverages, we even made little yellow cupcakes with green frosting, a little cliché but the kids loved them!

While I was sitting outside watching my father in-law construct a palatial extension to my daughters rabbit’s hutch, a little honey bee waddled toward me along our deck. I was a bit concerned because it looked poorly, so I picked a small white flower from our lawn and used it to pick up the little bee to see what the matter might be. On closer inspection it’s wings had droplets of water on them, which I imagine would make the entire process of flying rather difficult.

My mother in-law commented ‘It’s a shame you don’t have your camera handy!’, so placing the bee-flower into the safe hands of my mum I ran inside to grab it. Thankfully I already had my 28-90mm Quantaray lens with a macro feature on the camera, and I snapped a few close-up shots before we put the bee and the flower safely into a bush to dry off in the sun. I’ve scaled one down to 1920x1200ish and I am posting it here for your enjoyment.




PS: No Bees were harmed in the making of this image, in fact, I’d like to think one was saved ^_^

Making javascript classy, for better or worse

written by pomke, on Jan 5, 2011 5:10:00 PM.

A long time ago, ooh six years now I was working on a heavily Javascript based project with a team of pythonistas turned reluctant UI programmers. Before you say anything, yes I know Javascript is a prototype based language and that is one of its strengths, however in some situations having a class implementation helps fit the language into functionally fixed brains.

The Pomke Javascript Library was something that I created and adapted over time to fill this gap. The library implements two basic concepts, a class and a module construct. These behave in a way that will make python developers feel right at home, modules can depend on other modules which will be demand loaded, classes support multiple inheritance with a sane MRO, your methods are bound to your objects so they can be handed off as callbacks and maintain their reference to self^h^h^h^hthis and much more.

Anyway, I’ve dug it out recently of a project which is removing this style of programming and I’ve put up a bit of a page with a demo which you can find here. I hope this can be of some use to someone somewhere ^_^

Lots of Love,

Pomke