Clug Park

01 July 2009

Jonathan Groll (eyesonly)

Evaluate python from ruby

The newest version of my IRC bot, irbie is able to evaluate python code in channel and respond with the output.

It does this in only 33 lines of RUBY code.

#!/usr/bin/env ruby
require 'rubygems'
require 'mechanize'

class Sacrilege


  def initialize
    @code_stack = Array.new
    @agent = WWW::Mechanize.new
    @agent.user_agent_alias = 'Linux Mozilla'

    page = @agent.get('http://shell.appspot.com/')
    @form = page.forms[0]
  end

  def eval(msg)
    @code_stack.push(msg) if ( msg =~ /:$/ || !(@code_stack.empty?))
    if msg == nil && !(@code_stack.empty?)
      set(@code_stack.join("\n") + "\n")
      @code_stack.clear
      page = @agent.submit(@form)
    elsif @code_stack.empty?
      set(msg)
      page = @agent.submit(@form)
    end

    return page.body.split("\n").slice(0, 15) if page
    []
  end

  def set(val)
    @form.fields.find{|f| f.name == 'statement' }.value = val
  end


end

Of course, as with everything irbie does it’s smoke and mirrors. I just call it efficient use of webservices.

If you haven’t used mechanize before, it’s also a good advert for mechanize, which, by the way, has been ported to many other languages. Python included.

01 July 2009 01:02 PM

Charl van Niekerk (charlvn)

Nessus

Nessus on Ubuntu

I decided to give Nessus a shot. It is a security scanner than returns detailed reports about possible points of entry into any particular host. It has a plugin infrastructure that makes it quite powerful.

The nice thing is that it separates the server and client sides. In other words, you can have a machine standing remotely in a data centre doing your scans, while you can connect to the Nessus daemon on that server from your desktop client remotely. Obviously, the Ubuntu Universe has separate packages, one for the client (nessus) and one for the server (nessusd) so that you can install them separately.

I found the results of some scans to be very insightful. I never realised there are so many points of concern on a system. Many of them are safe to ignore for me (at the moment) but this is most certainly a valuable tool in my opinion.

by Charl van Niekerk (charlvn@charlvn.za.net) at 01 July 2009 03:48 AM

Expectation Management

When you look at this site, you would be tempted to expect quite a visually appealing application:

Blender.org

But don't get your hopes up too quickly:

Blender on Ubuntu

I have seen this various times with open source projects. Perhaps one should be careful not to make a great product look disappointing by creating unrealistic expectations from potential users.

by Charl van Niekerk (charlvn@charlvn.za.net) at 01 July 2009 03:40 AM

Yahoo Mail in Firefox 3 on Ubuntu

Yahoo Mail in Firefox 3 on Ubuntu

One thing I am having some trouble understanding is why some companies seem to think that web apps are dependent on the operating system more than on the browser. Sure, I can understand that there are certain factors like the typical fonts you would expect to be installed under Linux and Windows (for example) can be different, but as far as (X)HTML / CSS / JavaScript functionality is concerned, the browser is all you need to focus on, surely.

Why do many sites still issue you a warning if you are accessing from Firefox 3 on Linux, but not from Firefox 3 on Windows?

by Charl van Niekerk (charlvn@charlvn.za.net) at 01 July 2009 03:34 AM

30 June 2009

Michael Gorven (cocooncrash)

PGP Key Rotation

I am replacing my current PGP key, 6612FE85, with a new key, 1E016BE8, as of 1 July 2009. A signed version of this announcement can be found here.

5FE6 76B9 9696 DB6E 0B2B  B2A7 2956 B173 1E01 6BE8

by mgorven at 30 June 2009 12:23 PM

29 June 2009

Johann Botha (joe)

Quick Update

Twenty two bottles of wine on the wall.. or added to the house’s recycling system this week..

  • Monday, meeting with Tim about the NSBI (new scary big idea).. I suspect he thinks I’m a bit nuts, camera shopping, Audi meeting with Chris.. we saw the new v10 R8 which just arrived that day (makes a nice noise), a run from Bakoven to Glen Beach with Ingi, Ingi made a fire in the fireplace.. first one of the season, Chardonnay, hot chocolate.
  • Funny, people bug me to find out about my new project.. I seem to get two responses.. 1) uhm, ok, sure, nice and 2) wow, awesome. I’m thinking the type 1 people get it, but they don’t see the impact.
  • Tuesday, hot chocolate with Nikki at Vida in Camps Bay, Stellenbosch traffic dept to go renew my drivers license, visit to the Amobia Stellenbosch office, visited Mia.. tea at Andy’s parent’s house, dinner at Cath’s with Brandon and Ingi.
  • “Porn is like music, there is something for everybody.” — Brandon

  • Ingi got mugged, she’s OK, but her bag is gone.
  • “Ingi’s camera.. where good photos go to die.” — about Ingi taking lots of photos but not publishing them.

  • “Truth is free, but information costs.” — Anonymous, well.. me, about my NSBI

  • I’ve rediscovered podcasts on.. my mobile phone, using my bluetooth car kit. Mostly ZAtech show.
  • Wednesday, gym, swim, smoothie, email scrubbing, Kink with Cath.. to plan our birthday bash.. and she wanted to know how the Internet worked (*grin*), a Simply Asia supper.
  • I received a “media” invite to a Gartner event.
  • Thursday, Sandy Bay hike to the wreck, boerewors and mash for dinner, 2nd half of the banana banana game at Dizzy’s.. I don’t like watching soccer, but this was not too bad.
  • I installed Ubuntu 9.04 on an HP550 laptop for Debby and it worked perfectly, no snags.. I guess Linux really is for everybody now.
  • “It’s not that we don’t have success. We don’t even have failures. We have nothing.” — from Sarah Rice’s feed, about entrepreneurship in SA.. amusing.

  • I seem to have developed a bit of a nail balm obsession.
  • Friday, Camps Bay walk, dinner with Debby, Ingi, Marcia, Georg and Andy.. fillet, mash and 11 bottles of wine for the night, Fokofpolisiekar at Mercury with Georg.. awesome show.
  • Check out the movie.. quality entertainment in the hedonist calendar.
  • “Reminds me of my first Walkman” — Marcia, about MJ, RIP

  • “As jy regtig wil weet, vra die main bra.” — Georg, bumping into Franscois in the bathroom and asking him when the show starts.

  • “Kan iemand dalk ‘n god bel, en vir hom sê ons het hom nie meer nodig nie.” — Hemel Op Die Platteland, Fokofpolisiekar

  • Saturday, a mountain of dishes to wash, 2nd SA-Lions rugby test at Carlyles with Andy, Georg and Rachel.. awesome game, Fireman’s Arms with Rachel, 27Dinner.. nice Stormhoek Riesling.. nice chats with Elodie, Rafiq and Graham, I did a quick open mic talk to pimp the OSA project, Porn Star Martini at Asoka with Cath.
  • “Express the need” — Graham Knox, about making things useful for people.

  • Seems many of my friends are a bit skint at the moment. Interesting times.
  • “I think I’m about as attractive as a pile of dog poo at the moment, having no money and about to move back in with my parents” — Andrew, about being attractive relationship material.

  • Sunday, fetched Mia, lunch at Deer Park with Georg, Beta Beach walk and playground session.
  • Ever have the feeling that somehow you just want to hug somebody (in particular), but you cant? Two days in a row.

Have a fun week.

by joe at 29 June 2009 09:13 PM

28 June 2009

Graham Poulter (verdant)

One approach to booting Linux, XP and Windows 7

So this is my configuration. I like to keep around a toy Windows OS for iTunes (for iPhone jailbreak) and games.  These are all primary partitions:
  • Drive 1:
    • Partition 1 (35GB): Windows XP
    • Partition 2 (55GB): Windows 7 RC (shiny toy)
    • Partition 3 (rest): Linux data (/home - the serious stuff)
  • Drive 2:
    • Partition 1 (30GB): Ubuntu Linux 9.04
    • Partition 2 (15GB): (to test other distros on the hardware)
    • Partition 3 (2GB): Linux swap
    • Partition 4 (rest): Windows data (C:\User - games & media)
The things I figured out to make it work:
  1. Do all partitioning before installing Windows, and only use Linux to edit partitions (cfdisk or gparted).  
    • The Windows 7 partition manager confuses XP because Windows 7 changes from "cylinder aligned" to "megabyte aligned" partitions.  However, both can understand what Linux writes. 
  2. For Windows XP to complete installing, you have to install it before installing Windows 7. 
  3. Let Windows 7 have the MBR on Drive1, which gives options to boot Windows 7 or XP.  Install the GRUB MBR on Drive 2, and set the BIOS to boot Drive 2 first so that GRUB runs by default.  I figure keeping the bootloader could be handy.
    • Or: use GRUB only and overwrite the Windows 7 MBR with GRUB
    • Or: install NeoGRUB on Windows 7 and add a chainloader for the Linux partition
  4. Putting the data on the opposite drive from its host OS is to avoid user disk operations slowing the running OS.  However, the drives are not independent - you don't have "windows drive" and a "linux drive".
Hope someone finds it useful.

by Graham (graham.bbi@gishpuppy.com) at 28 June 2009 03:31 PM

27 June 2009

AJ Venter (silentcoder)

Fokofpolisiekar and the Kongoni logo tattoo

It’s been a helluva weekend, it started out on Friday night when I went to see fokofpolisiekar live at Mercury with Anita. It was an awesome show as it was a kind of remembrance concert for them in the venue where they had their first ever gig. They did a lot of their old stuff – the stuff that made them legendary in the first place, and some of the stuff from their new album Antibiotika.
I’ve seen them live several times, and this was by far the best show of all. To the band I must say, and I can only say this in Afrikaans: Julle is die stem van jong Suid Afrika, nou fok julle..
Pictures from the concert:
click here to view it in a new window instead)
Sorry. If you’re seeing this, your browser doesn’t support IFRAMEs. You should upgrade to a more current browser. : Click here to view the pictures instead

Saturday afternoon I went to a Urban Ink tattoo parlor to do something I have been planning for months, a new tattoo. This is my second piece of ink, much larger than the first, far more prominently placed (on my bicep) and here’s the clencher, what I got tattood on my arm is the kongoni logo. This logo, an iconic GNU (wildebeest) is a symbol of freedom, long after computing has moved on and the kongoni OS is just a memory and I’m an old man, that freedom will still be important to me- it’s a logo I am proud to wear for the rest of my life, and right now, it’s the logo of the GNU/Linux distribution I started… and that is just awesome :)
Here is a full set of pictures of the process. Of course it’s not exactly like the computer version, a few minor adaptations was needed to make it work on skin, and it won’t show exactly right for a few days yet until the bruising has gone down (the lighter colors are masked by the red skin) but even now in the evening it’s already looking great. Thanks to Anita for taking the pictures.
click here to view it in a new window instead)
Sorry. If you’re seeing this, your browser doesn’t support IFRAMEs. You should upgrade to a more current browser. : Click here to view the pictures instead

This evening was Natalie’s birthday party, we went to Primi Piatti in Cavendish for dinner, some of them went on to go clubbing, we skipped that… we were just too tired after the weekend so far. My neck is so stiff from Friday’s headbanging, guess we’re getting old. Tomorrow is Arno and Christel’s aniversary party, at least it promises to be a quiet and peaceful ending to a long busy weekend.

by silentcoder at 27 June 2009 11:36 PM

Jonathan Groll (eyesonly)

Targeted AIDS advertising

(Sign seen at the Bellville cemetery) No camping, no cars, no HIV

This is the most directly targeted HIV/AIDS campaign that I have seen thus far, but I’m afraid it may be a little too late.

27 June 2009 11:58 AM

Targeted AIDS advertising

(Sign seen at the Bellville cemetery) No camping, no cars, no HIV

This is the most directly targeted HIV/AIDS campaign that I have seen thus far, but I’m afraid it may be a little too late.

27 June 2009 11:58 AM

25 June 2009

Andy Rabagliati (wizzy)

AIMS Graduation 2009

AIMS The African Institute for Mathematical Sciences held the graduation dinner for the class of 2009 at the Muizenberg Pavilion on June 25, 2009. Present were Vice-Chancellors from three of Cape Town's Universities, and the Kenyan Ambassador Tom Amolo.

I was invited to attend this years graduation of the 2009 AIMS postgraduate diploma on what was forecast to be a stormy day, but it cleared up in time. I have blogged about AIMS before - on the opening of their Research Centre.

The welcoming address was given by Kenyan Ambassador to South Africa Tom Amolo, having been introduced by Professor Fritz Hahne of the Institute.

University of Stellenbosch

University of Stellenbosch AIMS has been existence for five years now, but degrees from its diploma course are conferred by three Western Cape Universities. The strongest ties are to Stellenbosch University, where the Vice Chancellor Russell Botman gave an address highlighting the many links that university has with other academic institutions over the continent. After that he waved his wand, and caused the pavilion to be a part of Stellenbosch University before conferring diplomas on one third of the AIMS graduates.

Which third is basically a lottery at the beginning of the academic year - there is no significance of which university any particular graduate is alloted to.

University of the Western Cape

University of the Western Cape Next up was Professor Brian O'Connell - Vice Chancellor of University of the Western Cape - who gave a stirring presentation, as he always does. This time it was on the dual message of Hope and Action. Hope is of no use without action, and to anchor Hope requires a mission. He spoke passionately on the role UWC played as a 'non-white' university during the Apartheid era, and the need for Action in countries of Sub-Saharan Africa. Well done. The UWC wand was waved, and the next third of the graduates got their diplomas.

University of Cape Town

University of Cape Town Lastly, Professor Thandabantu Nhlapo - a deputy Vice Chancellor of the University of Cape Town gave an address with with some humour addressed to this years graduates, and presented diplomas to the remaining graduates.

Scholarships

New this year were four scholarship awards - named after Stephen Hawking, Martin Rees, Paul Allen, and Victor Rothschild. These were presented to four of this years graduates who won 'cum laude' distinctions to their diplomas.

AIMS

AIMS, the brainchild of Neil Turok, TED winner and Chair of Mathematical Physics at Cambridge University. I think it provides, on these occasions of graduation, a place of mutual celebration between these three Universities that often find themselves as rivals in academia.

We had a very nice dinner afterwards, during which Dr Thandi Mgwebi of the National Research Foundation have a short talk on the relevance of the AIMS model in the South African education environment, and Dr Phillipe Mawoko of NEPAD gave a continent-wide perspective. I found myself at the table with the Kenyan Ambassador, and took the opportunity to introduce myself and explain the work that the Shuttleworth Foundation and Inkululeko is doing in South African schools as a part of the tuxlab project.

by Andy at 25 June 2009 03:31 PM

24 June 2009

AJ Venter (silentcoder)

When easier != better – a riposte.

A post in Free Software magazine today makes the claim that software installation in GNU/Linux is broken. The author lists a number of problems with package management as a way to install software then posits that system and application software should be treated as entirely separate entities – thus we can use the success of package managers (and in the end even a ports tree like Kongoni has is still a type of package manager) for system software, while gaining greater ease with the application software users install all the time.

His proposal is to look at the MacOSX approach but the fundamental point is same-old, lets make GNU/Linux more windows-like.
What he claims to want from software installation for applications is in fact, already there – very few programs will have difficulty being installed by a user, in his home directory. The catch is that binaries are almost never built that way, because it’s inefficient – so that’s usually limited to manual source compiles – and indeed, it’s a (tiny bit) more difficult.

Frankly though – what he sees as the features of a good desktop application installation system… would be an absolute disaster.
It’s ironic, just yesterday I was reading a blogpost about GNU/Linux’s continues resilience against malware which mostly rehashed the known facts of a better design with better separation of user and admin privileges – but in the comments somebody made a point that immediately struck a massive chord with me. I had never thought about it before, but as I read it, the logic hit me: this made perfect sense. It fitted all the observed data perfectly.

GNU/Linux users almost never download and run programs from the internet. We almost never trade programs on disks with people. We install from the repo’s, it’s just easier and faster on our system – and this means, before we install the program it’s been checked – it’s coming from a source we actually can and do trust.

A major aspect of malware spreading – social engineering is entirely removed because we use repositories to install software. Do we really want to turn GNU/Linux applications into the unreliable, untrustworthy mess that is Windows software ?
Even if you remove their unclean deinstalls and registry muck-ups – the reality is that the basic premise of “download from some site and install some little app all the time” is fundamentally broken, it creates a massive and easily exploitable gap for getting users to install malware.
One of the worst I’ve seen is a site that does a very good job of emulating a respectable looking provider of anti-malware software, out to get credit cards when you buy, and install their own spyware on your box…

GNU/Linux is entirely immune to that because all our software comes from a repository, where it gets added to by developers who are technically proficient and know the system really well, who know the software they add well – they have to because they build those packages from source and that means studying the build systems at least to an extent.

Sure junk could creep into a repo – but the odds are very small. Systems like klick has tried to create ease of single-place package installs and failed because it has no real way of resolving dependencies and it’s highly desktop dependent. Even if you ignore those problems… well you’re still dealing with a single repository source of click recipes, so it’s still safe and secure – but I don’t see most third-party vendors using click to ship anytime soon, they aren’t even playing nice with repository maintainers for big distros !

Rox-desktop has an app-folder approach that only works with rox, but does offer pretty much what the author seems to want… but nobody uses it. The reality is there are many different package managers out there and despite many claims this is a good thing, they all have strengths and weaknesses. They allow distributions to be good at some things they would otherwise not be good at, and other distributions to fill in those gaps.

It wouldn’t be too hard to combine a rox-style appfolder with a .desktop file to make a desktop-neutral app-folder tech… but it’s usefulness would in fact be very limited. Users don’t want their data-space (home folders) cluttered with applications – even Windows users know that. It’s hard enough to find your files now, what would adding all your application files among them add as a hundred or more extra directories do ?

Well besides obviously turning GNU/Linux into a quagmire of virii and other malware as ugly as windows and twice as rotten (because we don’t use antivirus software) ? Nothing. Nothing that’s actually good for us as a community anyway.

The only reason people seem to think that being able to quickly download and install software from anywhere is a good thing (as opposed to a disaster we have been wonderfully lucky enough to avoid) – is because they are used to this idea from the Windows world. They think it’s good as an easy way to get third-party software, but what they don’t say is… well that thirdparty software would already be in the repo’s- unless they license doesn’t allow it.

Let me spell it out: the only people who have difficulty or problems with GNU/Linux’s package management idea, or the proliferation of package managers out there: are the developers of non-free software.
They want to join our party, but refuse to play by our rules. Well – whose fault is it then if they keep losing the games ? More often than not, this is not even a reality, they are making excuses not to support free platforms, and taking a convenient one, forgetting that if they made free software – it wouldn’t exist.
They wouldn’t need to care how to package for distro’s X, Y, Z – why not ? Because that’s windows-thinking, where vendors package the software. Just put the software out there, it’s my job to package it for kongoni, and the MOTU’s jobs to package it for Ubuntu etc. etc. hey guess what, this means the people packaging the software are actually experts on the OS platform they are packaging it for – as opposed to merely knowing their own program.

You can get software installs that integrate cleanly, don’t break things, don’t get infected with malware by accident…

Basically, I think the advantages of a package manager approach to software greatly outweighs the advantages of any other approach I know off, and more crucially than that: most of those so called advantages are in fact disasters.
Ease-of-use is a good thing, but I don’t think quickly-download-and-install software is easier to use.

Expecting every user to be able to spot a real software company from a fraud, a good program from a bad one… and judge it entirely by themselves… that’s not a good way to make it easy to keep your system fast, secure and stable. Package managers have their downsides, (but the only practical point he raises that could be improved is difficulty with running multiple versions of an app, which is a pure power-user feature anyway) – but they are relatively small in fact… the alternatives take the responsibility of ensuring the integrity of software away from people who are trained to do it, and puts that burden on ordinary users.
This was Microsoft’s biggest single mistake – the main reason for the continued plague of spam, botnets and spyware on the internet. Please, let us not make the same mistake.

Update: It occurred to me after publishing that I should add this. If repository based installation is so bad, why is it being copied and emulated as an idea ? The iphone’s app-store is a prime example, although proprietory and pay-for-play, it’s a repository of safe software, for users to install from. In every other aspect, it’s identical to how GNU/Linux installs software on your computer.

by silentcoder at 24 June 2009 06:19 AM

22 June 2009

AJ Venter (silentcoder)

Kongoni updates newsletter – 2009-06-25

Busy, busy, busy. Such is the life of a distro developer when releases are being made. Kongoni-current has been quite lively of late with a lot of things happening last week – especially as it was a short work week.

My girlfriend luckily is very supportive of my endeavors because she hasn’t been seeing much of me lately – but the good news is that the progress has been amazing.

My week began with a minor setback when quite a lot of files on the 64-bit build got badly corrupted, don’t tell the girlfriend but it was her fault… hairdryer in the clean power. Luckily – I keep very good backups of the build systems so restoring it wasn’t too hard. The problem was compounded though because I initially mistook an unrelated issue for part of it – so long after it was fixed, I was still hunting file corruptions in what turned out to be a wild goose chase.

The real issue turned out to be an incompatibility between squashfs 4.0 and linux-live. Choice to be made there: patch linux-live, or roll-back the kernel to 2.6.29.4, ultimately I opted for the rollback, I hate patching upstream and I avoid it as far as possible (in this regard, I’m with Pat – the less patching I do – the more stable your systems will be).

So Nietszche will ship with kernel 2.6.29. More importantly was another major gain in the freedom-support of Kongoni. It won’t be shipping with source code from kernel.org but rather with the linux-libre project’s cleaned up code. No more non-free blobs, nor the ability to directly add them. I tested it roundly and the impact is fairly small, but for those who have a piece of crucial hardware that absolutely has-to-have a non-free blob and who cannot afford to replace it, Bret Murch has offered to host and build a set of identical packages based on the non-free kernel.org Linux, which users can install if they wish.

This was the last major hurdle we had to cross to be acceptable for being listed on gnu.org, and I am now comfortable to request that listing once Nietszche is released. It is interesting to note that the existence of distro’s like kongoni and gnewsense is rapidly reducing the level of non-free driver requirements all around anyway. The recent GPL’d release of drivers for the Atheros 9x wireless cards by Atheros themselves is a direct result of the work that the madwifi developers did in creating a completely free blob for the Atheros 5.x cards. The result is that now, all GNU/Linux users can run any Atheros card with only free software drivers and firmware.

On a completely different note, I think we are close enough to the end of the month for me to let you in on a big secret I’ve been holding for well over a month now since I was first informed of it.
The July issue of Linux User Magazine will have Kongoni Sophocles on it’s cover-DVD, as well as an article on the system, with a mention that Nietszche is on it’s way.

The editors of the magazine spoke to me while preparing for the article to clear up some small details and mentioned the following choice tidbit: “Usually we only include stable releases, no alpha’s or beta’s – we made an exception in Kongoni’s case because your alpha was a truly solid release.” (Slightly paraphrased for clarity – but the meaning was not altered in any way).

So those of you who can read German should look out for the magazine in the next couple of weeks – this is the first mainstream publication to ship Kongoni disks – and it’s a major piece of recognition for our work.

Another nice bit of news is that the Kongoni IRC channel is starting to become quite lively. This is an idea that came from, and were implemented by, our users themselves. Myself and Bret Murch are regulars in the channel, so please do drop by and come have a chat with us, the more the merrier. The channel is hosted on freenode’s IRC server (on kongoni, if you install xchat from PIG it’s on the list already) and it’s called (you guessed) it #kongoni.

I made a small change to our git helper scripts, specifically to gitmaster.sh and gitcurrent.sh so the commit messages they use get automatically sent to twitter and to floss.pro – so for a constant stream of messages about what the devs are currently doing considder following @kongonidev on floss.pro or on twitter.

by silentcoder at 22 June 2009 09:57 AM

21 June 2009

Johann Botha (joe)

Quick Update

Ola.

  • Monday, tea, rusks, Andy made porridge, puppet show, tea and cupcakes at A is for Apple.. we like the cute lady that works there, aquarium visit, gym, swim, dropped Mia off, Steers burger.. real bachelor food, to the office.. bit of a day in reverse in some ways, WordPress 2.8 upgrade.
  • Tuesday, gym, smoothie, wheat grass shot, to the office for some out of phase work.. managed to clear all my inboxes for the first time in months, sunset drinks with Ingi, Marcia and Andy at the cable car contour road spot, Julia Jacobsen at the Waiting Room.. good show.
  • Much more flow in working out of phase. Try it.
  • Cape Town live music event planning annoys me. People say.. we are playing “tonight”. No time. You get there and the person taking your money tells you the show starts at 21:00. The show starts at 21:45. Muppets. I get that people are late and they want you to buy more drinks, but just say 21:00 for 21:30 like the rest of the world.
  • “Do you want to go for an AIDS test” — Ingi, how she woke us up on Wednesday morning.

  • “I have ravers back” — Ingi, about being a bit stiff.

  • “When you go to bed 3 pages, when you go to the loo 2 pages” — Andy, about getting people to read more.

  • Good to see a few people in my friend/peer group having children. Congrats Henk. I’m also thinking of Lauren and Ramsey. Get on with it people, we need a few more geeks.
  • Amusing. If you email customercare@flysaa.com you get an “Acknowledgement of Receipt” email back.. but there is no tracking/ticket number so you can’t follow up.. I’m pretty sure this is by design.
  • Wednesday, walked from Bakoven to Clifton 1, watched The Beach again.
  • Thursday, Lions Head meeting with Dave, kicked a rugby ball on Llandudno beach with Andy.
  • Received two public speaking invites this week.. iWeek and Wireless Broadband World Africa 2009.
  • Friday, Lions Head walk with Debby, Ingi and Andy, very nice breakfast and fresh juice, fetched Mia, clothes shopping for Mia.. who passed out in the car on the way back.. early night.
  • We drove past a McDonnals and Mia said: “That’s a Mia”.. well, yes, M for Mia. M for Monolith Burger.
  • Saturday, fresh juice and pretzels, we met Guni.. Ingi’s sister, gym, swim, smoothie, company (rose) garden, mini full monty at Daily Deli, the Book Lounge, picked up some R28 Eikendal wooded Chardonnay.. good deal, watched the test rugby with Georg.. good game, burgers at Georg’s, bath, reading, sleep.
  • Sunday, tea, Kung Fu Panda, fathers day waffles with fruit salad, gym, swim, smoothie, planetarium, dropped Mia off, Steers burger, office.
  • It’s been a busy OSA week.
  • Po: Uh… level zero? How about that, level zero?
    Shifu: [chuckles] There is no such thing as level zero.
    Shifu: [after watching Po getting beat up by the obstacle course] There is now a level zero.

  • I think I’m feeling the next evolution… a new chapter, it’s my birthday soon, I need a new challenge.. last time I had this feeling was around 2004.

Later.

by joe at 21 June 2009 06:12 PM

How to start a business

Figure out what service you are currently buying from somebody where.. something pisses you off and you figure you can do it better, a niche, something you are passionate about, a new focus (value layer abstraction), a new category, where you can be a leader, maybe a bit geeky.. but ready for general adoption, something that allows you to take a bit of risk (ahead of the cure).

I’ve kinda done the above 3 times already.

It helps if people tell you it can’t be done. Good motivation.

Another way to read this: Your customers are your future competition.

by joe at 21 June 2009 05:28 PM

20 June 2009

Simeon Miteff (simeon)

Getting the new Linux wireless regulatory domain stuff to work

A few days ago I installed kernel 2.6.29 from backports.org on my new Debian Lenny machine in order to get Intel 5100 AGN wireless driver support.

While trying to convince the driver that I am not, in fact, an American, I discovered that Linux’s wireless support is moving toward a new framework for handling the regulatory domain information. Drivers use this to enable the correct (and legal) channels, RF power limits and other behavior for the country you’re in…

The first thing I tried was to create a file (/etc/modprobe.d/cfg80211) containing the string:

options cfg80211 ieee80211_regdom=ZA

This was a step in the right direction, but it turns out that only US, EU and JP regulatory information is hard-coded into the kernel. If one of those won’t work for you, you need the new Wireless Central Regulatory Domain Agent user-space utility. This little program is called by the cfg80211 module through udev and provides the missing regulatory info. So I grabbed and installed the wireless-crda package from Ubuntu, and put the following in /etc/udev/rules.d/regulatory.rules:

KERNEL=="regulatory*", ACTION=="change", SUBSYSTEM=="platform", RUN+="/sbin/crda"

Reloading all the wireless-related modules I observed CRDA doing it’s magic:

charlie kernel: [ 4801.596578] cfg80211: Using static regulatory domain info
charlie kernel: [ 4801.596581] cfg80211: Regulatory domain: US
charlie kernel: [ 4801.596583] (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
charlie kernel: [ 4801.596585] (2402000 KHz - 2472000 KHz @ 40000 KHz), (600 mBi, 2700 mBm)
charlie kernel: [ 4801.596587] (5170000 KHz - 5190000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
charlie kernel: [ 4801.596589] (5190000 KHz - 5210000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
charlie kernel: [ 4801.596591] (5210000 KHz - 5230000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
charlie kernel: [ 4801.596593] (5230000 KHz - 5330000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
charlie kernel: [ 4801.596595] (5735000 KHz - 5835000 KHz @ 40000 KHz), (600 mBi, 3000 mBm)
charlie kernel: [ 4801.596597] cfg80211: Calling CRDA for country: ZA
charlie kernel: [ 4801.617628] iwlagn: Intel(R) Wireless WiFi Link AGN driver for Linux, 1.3.27ks
charlie kernel: [ 4801.617631] iwlagn: Copyright(c) 2003-2008 Intel Corporation
charlie kernel: [ 4801.617706] iwlagn 0000:03:00.0: PCI INT A -> GSI 18 (level, low) -> IRQ 18
charlie kernel: [ 4801.617734] iwlagn 0000:03:00.0: setting latency timer to 64
charlie kernel: [ 4801.617908] iwlagn: Detected Intel Wireless WiFi Link 5100AGN REV=0×54
charlie kernel: [ 4801.639541] iwlagn: Tunable channels: 13 802.11bg, 24 802.11a channels
charlie kernel: [ 4801.640028] wmaster0 (iwlagn): not using net_device_ops yet
charlie kernel: [ 4801.640575] phy0: Selected rate control algorithm ‘iwl-agn-rs’
charlie kernel: [ 4801.640591] wlan0 (iwlagn): not using net_device_ops yet
charlie kernel: [ 4801.644881] cfg80211: Regulatory domain changed to country: ZA
charlie kernel: [ 4801.644883] (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
charlie kernel: [ 4801.644885] (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
charlie kernel: [ 4801.644888] (5170000 KHz - 5250000 KHz @ 20000 KHz), (300 mBi, 1700 mBm)
charlie kernel: [ 4801.644890] (5250000 KHz - 5330000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
charlie kernel: [ 4801.644892] (5490000 KHz - 5710000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
charlie kernel: [ 4801.644894] (5735000 KHz - 5835000 KHz @ 20000 KHz), (300 mBi, 3000 mBm)

Notice that cfg80211 loads with the US regulatiory domain, then calls CRDA, and while it’s waiting, iwlagn initializes the wireless device. Finally, cfg80211 switches to ZA, using the info obtained from user-space.

Unfortunately at this point iw dev wlan0 info showed the card was still using US channels. I discovered through experimentation that ZA channels were enabled if cfg80211 had enough time to switch from US to ZA before the iwlagn driver is loaded.

I filed a bug report and Luis Rodriguez promptly responded with a patch deleting 3 lines from net/wireless/reg.c, fixing the problem.

by Simeon Miteff at 20 June 2009 07:50 PM

18 June 2009

Michael Gorven (cocooncrash)

SuperGenPass for cellphones and the command line

SuperGenPass and Password Composer are password generators, which generate different passwords for each site you use based on a single master password. This gives you the convenience of only remembering one password as well as the security of using different (and strong) passwords for each site. This means that you won't have all your accounts compromised when1 one of them is compromised.

Most password generators are implemented as browser extensions or bookmarklets, since they are most frequently needed in a web browser. I've been wanting to start using a password generator, but I wanted to be sure that I could access my accounts even if I didn't have a web browser accessible. The two situations I could think of were a command line only system (e.g. SSH) and my cellphone2.

Surprisingly, I couldn't find a command line implementation of SuperGenPass, so I wrote one in Python. I also couldn't find any J2ME or Symbian implementations, and so wrote my own one in J2ME. They both support subdomain stripping and configurable password lengths. They don't support salted passwords.

I chose SuperGenPass over Password Composer because it uses a better scheme. Password Composer only uses hex characters, whereas SuperGenPass uses a base64 encoded hash. SuperGenPass also hashes the password multiple times (which would slow down a brute force attack to find the master password) and imposes complexity requirements on the generated password (which reduces the chances that the generated password can be brute forced).


  1. "When", not "if". 

  2. Although my phone's browser does support JavaScript, the JavaScript MD5 implementation commonly used by password generators doesn't work correctly on it. 

by mgorven at 18 June 2009 04:17 PM

17 June 2009

Graham Poulter (verdant)

A New Machine! Guiding principles for buying a computer

Advancing software has gradually brought my 2004 Dell D600 laptop to a standstill, and this year the laptop has been hindering me from learning and experimenting with new technology at home. And my circa 2000 Pentium III 733 under the desk is relegated to file storage, and way overdue for being donated to a rural school.

The Time Has Come for a new machine! But not an off the shelf rip-off: I have a specific philosophy about what goes into a good computer. My philosophy for a personal computer:
  • Buy for a 5 year lifespan. Less than 5 years makes a computer one expensive consumable. Even at my R10,000 price point, computing is a R2000 per year expense.
  • Skip generations. I am buying a Core 2 Duo, and my next PC will be the successor to the Core i7 (but only once its successor comes out - see "best of 18 months ago")
  • Buy wholesale parts. I thoroughly recommend DC3 Distributors - the powerful box below comes to the same R8000 that one would normally pay for underpowered entry level crud at Incredible Connection. Be prepared to spend hours reading hardware reviews, benchmarks and spec sheets to be sure you are getting reliable, performing, mutually-compatible parts.
  • Buy the best of 18 months ago. After the new generation arrives (give it 18 months), the previous generation becomes mid-range, and yields the best price/performance ratio.
  • It will always cost around R10,000. The "best of 18 months ago" desktop always comes to around R10,000 (including monitor). This principle, stated by my father, has held between 1987 (remember the 80386?) and 2009 (Core 2 Duo / Phenom II)
In summary this leads me to http://dc3.co.za/, where I put together a machine involving this stuff, including VAT. It should be ready in a week:
  • Processor (R1411): Intel Core 2 Duo 2.8GHz, 3MB L2 cache
  • Motherboard (R1165): ASUS-P5QL Pro Intel P43 chipset, 1066MHz FSB
  • RAM (2xR298): 2 x Apacer 2GB DDR2 PC6400 (400MHz, 800MT/s)
  • Graphics (R1233): Zotac Nvidia 9800GT 512MB GDDR3, at 660MHz
  • Disk (2xR679): 2 x Western Digital Caviar Green 500GB / 16MB cache
  • Optical (R350): Sonu DRU-830C (have it already)
  • Wifi (R254): DLink 54Mbps WiFi
  • Case (R439): CoolerMaster Elite 335 ATX
  • PSU (R450): Gigabyte ODIN 470W
  • Mouse (R225): Microsoft Comfort Optical 3000
  • Keyboard (R600): Logitech Wave
  • Monitor (R2300): Samsung 2494HS, 23.6 inch 16:9,1920x1080
  • Assembly (R114): Because frying the motherboard costs a lot more.
The total comes to R8,194 excluding the monitor, and R10,494 including. AFAIK the CPU, motherboard, graphics and RAM were all available 18 months ago (January 2008). The monitor, keyboard and mouse are higher end parts, you could save R500 on kb/mouse and R800 with a 19" monitor, to bring the total down to R9100.

You might ask, why not a new laptop, such as the new MacBook Pro? The answer is lifestyle. I almost never have to work 'on the go'. When I work, it is in my nerd cave, for hours at a time. If you have to work at clients, or wherever you may be, a laptop is the answer. I only work at the office and at home, so a desktop suits me fine, and I can get much more power for less by doing so.

Silent Computing Update

I've amended the order to get some more premium parts to make the computer silent:
  • PSU (R1234): CoolerMaster Silent Pro M500
  • Chassis (R819): CoolerMaster Sileo 500
  • Graphics (R1233): Zotac Geforce 9800GT Eco
The PSU is ~80+% efficiency instead of ~70%, so the fan can run at a lower speed for a given wattage. The Sileo 500 chassis has silent fans and insulation, and no side ventilation so it is warmer but internal fan noise is damped. The 9800GT Eco is an underclocked version of the 9800GT that uses 40% less power, so needs less cooling. The new system should draw under (76+50+12+30)/0.80 = 210W idle and 300W fully loaded, versus about (120+50+12+30)/0.70=300W idle and 440W fully loaded.

The total price is R9009 without the monitor, increasing cost by R1100 to get something quiet and efficient.

by Graham (graham.bbi@gishpuppy.com) at 17 June 2009 11:57 AM

Jonathan Hitchcock (Vhata)

On Tribes

I recently became a contributor to the 20fourlabs blog, and wrote this article as my introductory piece. You can read the original here.

In 2008, Seth Godin published a book called "Tribes". In it, he describes the way he thinks people will change the world from now on: by creating and leading Tribes. Finding and connecting a group of like-minded people, and showing them a path to where they want to go, will make them want to follow you. By building a Tribe like this, you'll be able to wield enough influence to make change that matters.

At its core, a Tribe is a group of people with a common interest or goal, who connect and form a community around that idea, or who enable each other to move towards that goal. There are uncountably large numbers of such Tribes on the Internet today, of all sizes, and since everybody can produce content (whether it's updating your Facebook status or writing a regular column on the Mail and Guardian website), everybody has the chance to build up a following of people who are interested in the ideas behind that content. Webcomics build up Tribes of people interested in their strips, maybe because these people identify with the banality of office life, or maybe just because they love the quirky, funny tone behind the strip. Cape Town Daily Photo also has a community, drawn together by the love of a city and the pleasure taken in viewing little slices of life from that city every day. Then there's Seth Godin himself, who has a huge Tribe of people who are fascinated by the way he views marketing and business; they are drawn together by a common interest in online communities and the way that ideas spread through these communities. This Tribe is slightly different in that, while they are definitely interested in what Seth has to say, many of them will be interested merely because of who is saying it. This is a Tribe of the Personality.

Most blogs and other mediums of online content distribution build up a following because people are interested in the theme, or the type of content being produced. Occasionally, however, as with Seth, Neil Gaiman, and Shaquille O'Neal, the common theme that ties the Tribe together is interest in the author, the Tribe leader, the person behind the content. This leader can say whatever he wants, and it will be avidly consumed, not because it is inherently interesting, but because it is what he has to say. There is nothing wrong with this sort of Tribe - it may be harder to be famous enough to warrant that sort of interest, but it's just another common interest that binds people together.

I have a personal blog, which I've run in its current form since 2004. The posts on this blog range from links that I've found interesting, to updates on my life, to thoughts I've had, to lyrics I've enjoyed, to things that have amused me. In fact, the only common theme that runs through all the posts is that they were written by me. I've written about ideas, quantum physics and the Large Hadron Collider and Democracy, amongst other things. Now, although there might be some interesting posts, nobody would actually subscribe to my blog because they enjoy the content - the feed as a whole is incredibly varied, and basically consists of whatever currently interests me. The small group of people who might be interested in that are my friends: they would subscribe precisely because they're my friends and not because the content interests them per se. In other words, without a specific content theme around which my readership could build a Tribe, the only sort of community that might arise is a Tribe of the Personality, and since I'm not a Hollywood movie star, it's not going to be very big.

As I hinted at when I mentioned Shaquille O'Neal, twitter streams are another way of building up a Tribe. In fact, twitter makes the process very, very easy: the moment you follow somebody, you're in their Tribe, reading what they have to say, already being influenced. Finding other members of their Tribe is as trivial as viewing their follower list, and user- and tweet-searches make refining the whole process a cinch. However, it may have become a little too easy, to the extent that a lot of people think that twitter is solely about what Tribes you're in. They worry more about the number of followers they have, and who is following whom, than about what people are actually saying. This is "follower ratio" - how many people follow you, in comparison to how many people you are following - and it is deemed to be a metric for how "good" you are at twitter. In a way, of course, it is - if you're very interesting or amusing, you will gain a large following. However, it seems that it has become something of a cargo cult: people mistake the symptom (having a good follower ratio) for the cause (being "good", or interesting). They start using disgusting tricks to spam people and try to win followers, instead of simply being creative, funny, or simply a great character, and letting the followers come because they want to be a part of the Tribe.

The weird thing about this attitude is that people get upset if they follow somebody, and that person does not follow them back, to the extent that they will often actually unfollow them again, even though they previously deemed their stream worth reading. I find this crazy - it's like refusing to read a blog or website if the author doesn't read yours. What these people are effectively doing is demanding that anybody whose Tribe they join, joins their Tribe. However, they don't actually provide any idea, goal or common interest to bind their Tribe together. Most of their tweets are (you will find) re-tweets of other people, idle banter, and reports on what they've had for breakfast. From "Short and Tweet" at the Washington Post:

The masses of people who "blurt-tweet" and unthinkingly brain-dump into their account, [...] will never achieve anything more meaningful than a public diary.
Like the Tribe around my personal blog, the only thing the members of this person's Tribe can have in common is an interest in the person himself; it is a Tribe of the Personality. To demand that another person join your Tribe when you follow them is pure arrogance: if you've never met them, and the only thing you're offering is your personality, then it's absurdly vain to expect them unconditionally to reciprocate your interest.

This is my first post on the new 20fourlabs blog. Being invited to contribute to this blog is basically being given a ready-made Tribe: you're presented to an audience as somebody who has something interesting to say, and entrusted with the task of holding their attention and growing the Tribe. Hopefully, I - and the other bloggers - will live up to these expectations by providing consistently good content, rather than arrogantly expecting people to remain members of the Tribe no matter what. I'm looking forward to seeing how it works out.

by Jonathan Hitchcock at 17 June 2009 11:01 AM

15 June 2009

Christel Breedt (Pirogoeth)

Will they never learn

I know I am making a mountain of a molehill here (at least in most people's opinion), but really, does vodacom actually think it is ok to send me spam and then make me be the one to have to figure out how to get off of their mailing list? Yes, its easy enough for me to sms the right word to the right number, but what about my technologically challenged grandmother?

There are people for whom having to opt out of unwanted marketing is too much effort. For their sake I called up Vodacom and made an unreasonable ass of myself. Probably won't matter, but if I win the lottery and some person with a brain actually elevates my complaint that would be optimal.

Can't win it if you ain't in it, so if you hate opt-out advertising as much as I do, play the lottery next time it happens to you and complain to the advertiser. If enough of us play, someone's gotta win.

by Christel (cbreedt@gmail.com) at 15 June 2009 10:02 AM

Graham Poulter (verdant)

Free software on library internet terminals?

I spoke with David Lebelo at the Cape Town Book Fair on Sunday 14 June 2009. David Lebelo is the Western Cape provincial coordinator of the National Library of South Africa, which is building many libraries for under-serviced municipalities.

The NLSA on their current path are likely to end up paying lots for Windows licenses for internet terminals in the libraries. I think we could do something there to encourage them to use free/libre open source software like Ubuntu and Firefox. David Lebelo suggested giving a presentation to the NLSA with some proposal for using free/open source software.

Please leave comments with how to contact organisations (Shuttleworth etc) that would be in a position to get involved, since I don't think a pile of Ubuntu CDs and saying "install this on the machines" is going to be enough. The NLSA IT team would need to know how to set it up just so for a library environment, and how to hand over to the municipalities. A presentation would be the first step... thereafter things get complicated.

by Graham (graham.bbi@gishpuppy.com) at 15 June 2009 09:40 AM

14 June 2009

Brendan Hide (Tricky)

Impromptu

You’re in an intimate relationship with someone. You know that person loves you. That person knows you love them. You’ve said it a thousand times before and today you say it again: “I Love You.”

  1. Do you always expect your other half to say “I Love You too” back?
  2. Can you interpret the above as a test of that person’s love?
  3. If your answer to 2 is “yes”, why do you need this affirmation?
  4. If your answer to 1 was “no”:
  • a. What do you expect?
  • b. Why is this?
Share/Save/Bookmark

by Tricky at 14 June 2009 12:55 PM

13 June 2009

Arno Breedt (Macavity)

Singularity and Tesseract

every man an island
we each sit on our rock
reaching out to others

all men are islands
you sit on your lonely rock
yet reach out to me

meson, gluon, quark
your own bits aren’t solely yours
flatlander, look up!

you’re the universe
fractal map for everything
holograph human

it’s all perspective
whether you’re me or I’m you
our bodies are one

something stays unique
invariant consciousness
I stay me throughout

fences, houses, clothes
and skin: material shells
hermit-crab monads

don’t become your shell
that which makes you be
is intangible

you’re just far away
because I have to look through
intervening space

we aggregate stuff
organise it in systems
cargo-cult sophonts

quantum teleport
examined differently
i graph out elsewhere

distilled panoptic
invariant solipsist
composed catharsis

inexplicably
I am singularity
I am tesseract

by Camera Obscura at 13 June 2009 08:04 PM

12 June 2009

Michael-John Turner (MrKen)

Cheaper international Linux Journal subscriptions

I just received this in a mail from the publishers of Linux Journal:

For a limited time all international subscriptions to the print edition of Linux Journal will be reduced to the low price of $49.50 for 1 year (a savings of over 30% off the regular price) AND upgraded to include a free digital subscription. As a special bonus you will also receive Linux Journal’s System Administration Special Issue free of charge.

I’ve been a Linux Journal subscriber since the late 90s and can recommend it as one of the better general-interest computer publications. To take advantage of the special offer, visit the Linux Journal site. It seems the promo code to take part in this offer is M96INTL.

Update: Fixed the link to the subscription page, courtesy of Mark at Linux Journal. Whoops!

by Michael-John Turner at 12 June 2009 10:28 PM

11 June 2009

Michael-John Turner (MrKen)

iPod Nano battery replacement

A few days ago my daughter’s 8GB third generation iPod Nano refused to power on. After a bit of investigation on my part it seemed as if the battery had given up the ghost – the iPod works perfectly when the sync cable is plugged in and connected to a computer, but the minute the cable is removed, it powers off.

Being out of warranty (it was purchased about 16 months ago – let me not start ranting about batteries that fail after such a short period of light to medium use), I looked around for repair options. Replacement batteries are fairly easy to come by, but the Nano isn’t the easiest piece of hardware to disassemble. Having learned the hard way, I’m really not a big fan of repairing mobile phones and similar devices myself – I always end up snapping a piece of plastic or bending something beyond repair. Taking that into consideration, I decided to look online for someone to do the battery replacement.

Apple themselves will replace the battery for the princely sum of £46.13 (including shipping), which seems just a tad pricey – a new fourth generation 8GB iPod Nano costs only £107. The well-known Juice Your iPod will perform the service for a much more reasonable $32 (excluding shipping), but it seems a little silly to ship an iPod half way around the world to have its battery replaced. I then came across UK iPod Repairs, who’ll do the replacement for a reasonable £30, excluding shipping. I’ve placed an order with them and will be sending them the iPod tomorrow. According to the site, I should get the repaired item back by the middle of next week – expect an update once that’s happened.

Update:Unfortunately the problem wasn’t the battery, it was the logic board. As a replacement would’ve cost in the region of £80, I ended up buying a replacement fourth generation Nano for her (£105).

by Michael-John Turner at 11 June 2009 08:19 PM

Andy Rabagliati (wizzy)

Computers in schools in Gabon

Libreville School I visited Gabon for the last two weeks of May 2009 by invitation of Yoan Anguilet, who has a business and NGO there promoting ICT and Science literacy in schools. We had met previously when setting up AUST, a new University on Nigeria. Yoan had invited me to set up a similar system at two schools in Gabon, as a precursor to a larger effort later in the year.

Flight

Our flight was delayed for 2 hours, circling over Libreville, as we had the misfortune of arriving at the same time as the body of the recently-deceased First Lady, Edith Lucie Bongo. Edith featured prominently in the next few days, as most of Libreville was closed and there was blanket TV coverage of the state funeral. In fact, we were asked to come to pay respects to the First Lady on the first evening at the presidential palace - my luggage had not arrived, so I was in my travelling clothes.. TV Coverage

Libreville

I stayed in a small hotel next door to Yoan's mother, who made me breakfast every morning - what a pleasure. Libreville is Gabon's capital city, with the presidential palace large and prominent and next to the equally large French army base in the centre of town. Gabon also has a very prominent military presence - and late at night cars are invariably stopped on the streets by a checkpoint manned by soldiers. They ask for papers, and then they ask for a small donation - soldiers do not belong on civilian streets.

The school we were working at was on the main boulevard - and we witnessed the funeral cortege passing along it. The school was closed, and the entire student body of 6000 odd lined the streets to watch it. Travelling first was the motorcycle outrider with the TV cameraman to capture it all for live TV. The TV coverage verged on brainwashing - how many things can you say on three channels over four days about a lady who has been in hospital abroad for the last year ?

Procession

Waiting for the Procession Procession passes at a jog

School

The setup at the school before I arrived was 35 individually-installed Ubuntu computers - so the software was familiar to the students - but the maintenance requirements were high, and students had individual accounts on each computer, and there files were only accessible from that computer. The system I installed uses Ubuntu Linux, in a thick client setup with central authentication and a central file server. Thus the client computers run the software, but all important information is stored at the server.

I used SystemImager, which allowed me to network boot the client computers in order to perform a client install, or re-install. It makes it very easy to add clients to the lab, or to fix client problems.

I tasked a couple of Rwandan students - refugees I believe - to set up a Golden Client as a reference desktop - with as much French customisation as they could manage, and I then modified it for the network boot install. We were finished in about a week - we needed to buy some extra equipment, and put RAID on the computer acting as the server.

Port Gentil

Port Gentil I then took a snapshot of that image, and we flew to Port Gentil - Gabon's second largest city. Port Gentil is the centre of the country's oil industry, and hosts Elf - the French Oil giant. It is essentially an island - the mainland at that point is virgin forest. Access to Port-Gentil is by plane or boat. There are many foreigners on contract to the oil industry there, and thus there are high-priced nightclubs and restaurants there too. We ate mainly middle-class - fish being the main menu item. But we were offered 'Singe' - Monkey - as well.. You will notice in the picture the ubiquitous satellite dish - for Internet and TV. The purple stalls all sell airtime for the Zain cellphone network.

School

School in Port-Gentil The school in Port Gentil was even larger than the school in Libreville - around 10,000 students. Whew. We set up the lab from scratch - there was furniture and the network cabling had been done, but we had to terminate everything in the server room and pull all the computers out of boxes.

The software setup was comparatively simple - I just copied over the Libreville server image and we were away. However, the school did not have an internet connection. We saw some of the nightlife of Libreville while we were there, and took a little tour around all the places where Yoan grew up, including his schools.

Outside Libreville

LIBJ School We took a trip about 30Km out of Libreville - the road deteriorates fast as you leave town. We visited another school - also huge - built on a place cut out of the virgin forest. This school was sponsored by the head of the Constitutional Court - Marie-Madeleine Mborantsuo. No expense had been spared - the buildings were beautiful. They had paid for electricity, but not Internet, to be brought to the school. We looked around the classrooms, but had no time to install anything. We met the principal - whom I was very impressed with. He had a house on the property backing up against the forest. It must be really hot there in the summer. They have cleared a large sports field, and they plan on having a small zoo! Students will mostly be private students from Libreville. LIBJ cafeteria

Recent developments

Less than three months after the death of his wife, the President of Gabon, Omar Bongo died after 41 years in power. Gabon practically stopped when Edith died - I imagine they will have a few weeks off for this one. Bongo was heavily entrenched in Gabon - to the extent that his wife and daughter could buy Maybach cars with cheques drawn on the state treasury. Millions of dollars have been salted away over the years in offshore bank accounts. I imaging there will be a scramble for the next president, though a son from his first wife Alain Bernard Bongo seems tipped as the favourite. Gabon prides itself on its history of peaceful existence - it certainly seemed safe to me. Most security arrangements - locks on gates, etc., would be entirely inadequate in South Africa. Let us hope the succession passes peacefully - and the new leader opens up the government to more transparency.

by Andy at 11 June 2009 11:18 AM

Raoul Snyman (superfly)

Profiling A PyQt4 Application

From time to time, I've talked about my open source lyrics projection application, openlp.org, which is written in Python and Qt4 using the PyQt4 bridge. One of the core features of openlp.org is to display lyrics on a second monitor using the current "theme," which is a collection of settings for displaying the lyrics (background, font, etc).

Recently, we've hit a bit of a snag to do with the lyrics display. Functions in the Renderer class, which performs the drawing, were taking incredibly long to execute, which meant that the application was almost hanging whenever you wanted to load a song (be it into the preview or live slide controllers). So we started doing some investigation.

Tim Bentley managed to figure out that the QPixmap.scaled() function was the main problem. When creating the small preview image, we resize the background image (using the scaled function) and then paint the words on there. Martin Thompson then e-mailed the developer mailing list with some really handy info - a Python profiler.

First, if you're on an Ubuntu or Debian based like me, you need to install the python-profiler package. Once that is done, run your application like so:

$ python -m cProfile -o openlp.prof openlp.pyw

Where "openlp.prof" is the profiler's output file, and "openlp.pyw" is your application's main file. 

Then create a small script (I called mine "profiler.py" ) with the following code in it:

  1. import pstats
  2. p = pstats.Stats('openlp.prof')
  3. p.sort_stats('total').print_stats(20)

Run this file after you have run your application, and it'll read the profiler file and create a summary with the top 20 results, ordered by the internal time each function took.

This helped a lot. I was able to time my functions as I played around with various Qt4 classes. 

While reading up on various rendering techniques and Qt4 classes, I came across the following sentence on the QImage page:

QImage is designed and optimized for I/O, and for direct pixel access and manipulation, while QPixmap is designed and optimized for showing images on screen.

When I replaced the QPixmap that we used to scale the background image down with to a QImage, the scaled() function dropped from 3 seconds to 0.635 seconds. A marked improvement!

However, the QPixmap.fromImage() function was taking a while, so I replaced ALL the QPixmaps with QImages, and suddenly my total rendering time went down to less than 1 second, instead of 3 - 4.

In the mean time, Tim Bentley had another look at the rendering functions himself, and through reducing the number of calls to a few functions, managed to significantly reduce the rendering time even further!

For both of us, the Python profiler was invaluable.

by raoul at 11 June 2009 06:02 AM

10 June 2009

Jonathan Hitchcock (Vhata)

Five thoughts from five people

Over the last year, I have encountered five people who have said (or written) things that really stuck in my head, and made me think, or think differently, or simply struck me as an excellent way of seeing things. I've tried to put them together into one narrative, and I presented it at the November GeekDinner.

Innovation

Robynn Burls Robynn Burls was one of the people asked to give an Elevator pitch for her business at a party hosted by Vinny Lingham (my boss, who reappears below). Robynn and her partner, Scott, run Encyclomedia, which provides "targeted and verified media contact lists to companies wanting to gain publicity". In other words, it lets people easily find journalists who actually want to know or hear news about their products, and who can actually write about them, based on the scope of their jobs. In addition, all the details are verified, so they're up-to-date and accurate.

Robynn began her elevator pitch by describing how one often encounters things that are being done in the same old way they've been done for decades, with little or no true innovation. Nobody has thought to update the methods, or re-think how things ought to be done, so they just carry on using the same ancient methods - this leaves a huge space for somebody to come in and create a totally new system based on new ideas and new ways of looking at the problems that are being solved.

This is what Robynn and Scott did with Encyclomedia. The "old way" was to subscribe, for a fee, to a provider, who would post you a book containing a list of journalists and media personnel. This list wasn't "targeted" in any way, it was just... media people. There was no way of knowing if anybody on that list was actually interested in your area or product, so you ran the risk of spamming half of the journalist population of your town. Robynn and Scott saw that there was an excellent opportunity to step into this gap, and created an online, searchable database, to which one can subscribe, which allows you to get exactly the information you need, verified and up-to-date.

This idea is not new, but people rarely seem to use it. To hear Robynn state it outright like that made me realise that it is a perspective that we need to have, but rarely do. Henry Ford famously said:

If I had asked people what they wanted, they would have said faster horses.

I'm not using this to imply that true innovation will be divorced from the customers, or that users don't know what they really want, but rather to point out that a really new way of doing things is not just "more of the same" (harder, better, faster, stronger!), but a complete re-think of the problem, a process which begins with re-asking the questions, not just trying to find new answers.

It's interesting to find examples of people that have applied this concept: PushPlay redefined what "renting a DVD" was, for example - you give them a list of what you want to watch, and they post a couple of your top choices to you at home every time you return the old ones.

So, for everything I've said before about ideas, this is how you can get them if you're stuck - if you can identify an area where people are trudging along an old path without realising it, cut them a shortcut through the undergrowth, and they'll come stampeding.


Thinking Globally

Vinny Lingham Vinny Lingham started SynthaSite - the company for which I now work - a year and a half ago (or more, depending on how you measure), with the mantra "Free Websites For Everyone". It was a small startup based in Cape Town, with only about three employees at first, but it raised $5million in venture capital funding last year, and has opened offices in San Francisco, and there are now over thirty employees.

In one of his many pep-talks to us as his employees, he talked about his strategy for the company, from the beginning, and one thing that really stuck with me was what he said about "going global". Basically, he said, whatever your product, whatever your idea, don't constrain yourself to a local market. You may start small, and you may only serve a small market at first, but keep your eyes on the horizon - there is a huge global market waiting to be tapped, and with internet access rapidly spreading, it is now possible to reach out to it.

Vinny was not saying that you should try and throw yourself into competition on an international scale, but you should bear in mind that you will get there eventually. It is, in fact, wise to start small(ish) and consolidate on your home ground before moving out, but don't allow yourself to get trapped in a local-only mindset. There are a number of ways that this might manifest: an unwillingness to branch out too far from your safe area, or even some assumptions underlying your project that you don't even realise are symptoms of a local-only mindset.

An example of this latter problem can be found in one of my favourite websites. I used it as an example of a good idea well executed previously, but there is a problem with DoStuffCT: there is nothing Cape Town-specific about the concept or the implementation of the site, but the idea that it is "for Cape Town" is embedded throughout the site. Apart from the obvious "CT" in the domain, the description of the site agrees:

Do Things in Cape Town is all about finding and sharing stuff to do in Cape Town [...] I realised that a site where users can easily contribute to a collection of activities in Cape Town would be perfect. A Wikipedia of things to do in Cape Town.

The site is well implemented, easy to use, and contains a bunch of great content, and there really isn't anything stopping somebody from Joburg (or Bahrain) from adding an activity to the site for their area - the interface is flexible enough to allow this - but there is always this core assumption showing up: "This site is for Cape Town". I spoke to Al, and he realises this, and actually did it intentionally: it suits his purposes, and was never meant to be a global phenomenon. However, it is a good example of how your original aims or premises may affect your implementation in ways which may not be desirable if you're planning to expand or diversify later.


Attracting Users

Seth Godin Seth Godin should not need any introduction - he is something of an icon among marketers, but his novel idea was that you should get permission from people before marketing your product to them. I wish more marketers actually used his idea. Anyway, he has an excellent blog, on which he writes about a post a day, each one making an interesting point, or discussing a different way of looking at things.

In one of these posts, Seth talks about Firefox's knee-jerk reaction to the idea that it might lose traction to Google Chrome: they quickly added new features to improve their users' browsing experience. While making your product better than any other one is a good way to attract and keep users, it's not the best one. Marketers talk about the Golden Grail of "going viral" - that state where your users start spreading your product for you, and usage rises exponentially, because each user brings in five of his friends. This phenomenon is virtually impossible to control, but Seth talks about how you can at least make it more likely to happen.

If you make your product better for a user, he might recommend it to his friends (if they ask). But if you make your product better for a user if lots of other people use it, they will do their damnedest to make sure that lots of other people use it, simply to improve their own experience. Consider Facebook as an obvious example: if none of your friends use it, you can sign up and look at your own pictures, and read your own status updates, but it's frankly useless. Facebook's usefulness increases every time one of your friends starts to use it, and so, naturally, you try and get all your friends to use it, so that you can communicate with them, and send them party invitations (and add apps that throw sheep at them). This is the most obvious form of "going viral": an application that is only useful if you get all your friends to use it.

Since that example only really works in the realm of social networks, consider another example. Google Reader has a "share" button unobtrusively placed at the bottom of each post you read. If you like something, or think it's interesting, you click the button and carry on reading. All of your Google contacts who use Google Reader will see the post you found interesting showing up under your name in the "Shared Items" folder. It's an excellent replacement for the usual "hey have you seen this cool article?" messages one often sends, and I have found it a very useful source of reading material (and a way to discover new feeds to read). Since I want to know about interesting stuff my friends find, I encourage them to use it. This encouragement may not be as strong as "going viral" requires, but it is stronger than it would be if I were suggesting Google Reader simply because it's a good product.

I've only used websites (and web software) in my examples, but the principle holds firm in other areas. You can see a vestigial attempt at this sort of thing when a service offers you a discount if you refer five other people to them, but I think that misunderstands the spirit of the concept. There is a lot more to be said about this Network Effect, but I think I've made my point:

The amount of money people spend on marketing and public-relations seems like such a waste when you realise that with a few slight tweaks, you can actually get your user-base to start marketing for you - just make it nicer for them if there is widespread adoption.


Testing your assumptions

Phil Barrett Phil Barrett is a director of Flow Interactive - a user-experience consultancy based in the UK, and he presented a talk at a 27Dinner last year that I thought was quite insightful. He was talking about the order in which people generally perform the steps involved in creating a new product. After having the idea for their product, they design and implement the features they need, then they fix any bugs they can find, and then they do some testing to see how the product fares in the wild. Phil's primary interest is, of course, user experience, so he was specifically referring to user experience testing: giving the product to a bunch of people and seeing how they interact with it, and where the weak points are.

The problem with this, he said, was that one often finds that the users can't handle a certain part of the interface, or that there are big problems with the way people are forced to interact with the product. What are you going to do when this happens? The product release is scheduled soon, and you need to fix this problem as quick as you can, so you patch over it and hack some sort of solution into the interface, which is just not ideal. Phil's point was that you need to move user testing back in the product cycle: start as soon as you can, and test constantly so that you will see when users start to struggle straight away, and you can work on the problem properly, during your development cycle.

To illustrate this, imagine an app that allows users to find entries in a directory of some sort. It's a brilliant idea, captures a niche, and the directory is populated with lots of good information, so the product should be a hit. The developers create a very detailed search interface that lets users specify pretty much exactly what they are looking for, with all sorts of details and choices available, which means that the results will always be relevant to the users, and the product will be useful.

So, this app gets designed, implemented, bug-tested, and everything, and then they give it to some users. And it turns out that users don't have the faintest idea how to handle this amazing search interface: there's just too much. It scares them, and they don't know what to do. So the developers quickly hack on a simple text-box which people can type a phrase into (a la Google), so that at least they can use the product. But now, of course, the search results are less relevant - you're coming up with nineteen results, only two of which are vaguely what you were looking for, because the app is trying to work out what you wanted from a few words in a textbox, instead of a nice fine-tuned search interface. The app is going to flop.

Phil obviously talks from a user-interface point of view: the search form should have been presented for user testing in the early stages, so that something could have been done about it. But the essential principle applies to any assumption you make when developing an app, designing a service, or even starting a company. In this case, the developers assumed that their users would be able to work out how to use the search form, but people make all sorts of other assumptions which often turn out to be false. An obvious one would be the assumption that people want your product (not everybody is as obsessed about Japanese Bear Cartoons as you - maybe there isn't a market?), or that your database schema is going to scale when your product goes mainstream.

It's such a simple idea, but one that I think people should constantly remind themselves about - take a good look at what you're about to do, work out what unquestioned assumptions you are making, and question them. It's difficult to do, because they are, by definition, the things you thought were obviously true, but it may turn out to be what saves your product.


Finding your niche

Chris Anderson Chris Anderson is editor-in-chief of Wired Magazine, and is probably most well-known for popularizing the idea of the Long Tail. I have been familiar with the idea for a long time, but it is only this year that I began to see how the idea can be used effectively to inform how one chooses a userbase to target.

The idea of the Long Tail, as summarised in Tim O'Reilly's seminal article "What is Web 2.0?", is as follows:

Small sites make up the bulk of the internet's content; narrow niches make up the bulk of internet's the possible applications. *Therefore: Leverage customer-self service and algorithmic data management to reach out to the entire web, to the edges and not just the center, to the long tail and not just the head.

The example I often use of how important the Long Tail is, number-wise, is that of facebook apps: you have a few excellent apps that everybody uses (photos, or maybe ScrabulousLexulous, because who doesn't like a good game of Scrabble?), and then you have an enormous amount of ridiculous apps ("You have been bitten by a werewolf/vampire/rabid sheep", "Your friend has thrown an apple at you") which get three or four saps to add them, and that's it. However, if 5000 people use Lexulous, and four people each use the 2000 other apps, that's still an exposure of 3000 more people for the small ones. This is not the best example to use as a business model, but it does give a good indication of how "niche markets" (in this case, small groups of people turned on by utterly inane apps) collectively outweigh the "mainstream market".

Amazon are the seminal example of a company who used the Long Tail to push themselves forward - they sell very small quantities of a very large number of things, thus easily making up large sales totals by appealing to diverse tastes. In the Olden Days, it was difficult to distribute your product, or to find the esoteric tastes on the edge of the market, so you had to make a product which would appeal immediately to the tastes of the easily-accessible masses, and sell lots to them. With the Internet, it is no longer hard to find a bunch of people who are interested in your unicorn-Star Trek-crossover-fiction, and this market is a lot easier to appeal to (you know what they want).

The Long Tail has a lot more to it, of course, but this core idea is important when you are a business or product that uses the internet to reach its consumers. I wrote about this before, in the context of Android apps appealing to a long tail of users that the centralised Apple appstore couldn't reach, and I think that anybody who is trying to sell anything, or appeal to a set of people, should investigate this and apply the principles.


Conclusion

None of these five ideas are that new, and I know that (for example) Vinny was not the first person to say "think global". As Stefano said, this is stuff that everybody should know. It is just surprising that a lot of people don't, and often waste their effort or money as a result. Having internalised these ideas has made me look at a lot of projects and services differently, and I think it's a useful exercise to rehash them every so often.

by Jonathan Hitchcock at 10 June 2009 02:02 PM

07 June 2009

Stefano Rivera (tumbleweed)

Fun with Squid and CDNs

One neat upgrade in Debian's recent 5.0.0 release1 was Squid 2.7. In this bandwidth-starved corner of the world, a caching proxy is a nice addition to a network, as it should shave at least 10% off your monthly bandwidth usage. However, the recent rise of CDNs has made many objects that should be highly cacheable, un-cacheable.

For example, a YouTube video has a static ID. The same piece of video will always have the same ID, it'll never be replaced by anything else (except a "sorry this is no longer available" notice). But it's served from one of many delivery servers. If I watch it once, it may come from

http://v3.cache.googlevideo.com/videoplayback?id=0123456789abcdef&itag=34&ip=1.2.3.4&region=0&signature=5B1BA40D8464F2303DDDD59B2586C10A0AEFAD19.169DA15A09AB88E824DE63DF138F0D835295463B&sver=2&expire=1234714137&key=yt1&ipbits=0

But the next time it may come from v15.cache.googlevideo.com. And that's not all, the signature parameter is unique (to protect against hot-linking) as well as other not-static parameters. Basically, any proxy will probably refuse to cache it (because of all the parameters) and if it did, it'd be a waste of space because the signature would ensure that no one would ever access that cached item again.

I came across a page on the squid wiki that addresses a solution to this. Squid 2.7 introduces the concept of a storeurl_rewrite_program which gets a chance to rewrite any URL before storing / accessing an item in the cache. Thus we could rewrite our example file to

http://cdn.googlevideo.com.SQUIDINTERNAL/videoplayback?id=0123456789abcdef&itag=34

We've normalised the URL and kept the only two parameters that matter, the video id and the itag which specifies the video quality level.

The squid wiki page I mentioned includes a sample perl script to perform this rewrite. They don't include the itag, and my perl isn't good enough to fix that without making a dog's breakfast of it, so I re-wrote it in Python. You can find it at the end of this post. Each line the rewrite program reads contains a concurrency ID, the URL to be rewritten, and some parameters. We output the concurrency ID and the URL to rewrite to.

The concurrency ID is a way to use a single script to process rewrites from different squid threads in parallel. The documentation is this is almost non-existant, but if you specify a non-zero storeurl_rewrite_concurrency each request and response will be prepended with a numeric ID. The perl script concatenated this directly before the re-written URL, but I separate them with a space. Both seem to work. (Bad documentation sucks)

All that's left is to tell Squid to use this, and to override the caching rules on these URLs.

storeurl_rewrite_program /usr/local/bin/storeurl-youtube.py
storeurl_rewrite_children 1
storeurl_rewrite_concurrency 10

#  The keyword for all youtube video files are "get_video?", "videodownload?" and "videoplaybeck?id"
#  The "\.(jp(e?g|e|2)|gif|png|tiff?|bmp|ico|flv)\?" is only for pictures and other videos
acl store_rewrite_list urlpath_regex \/(get_video\?|videodownload\?|videoplayback\?id) \.(jp(e?g|e|2)|gif|png|tiff?|bmp|ico|flv)\? \/ads\?
acl store_rewrite_list_web url_regex ^http:\/\/([A-Za-z-]+[0-9]+)*\.[A-Za-z]*\.[A-Za-z]*
acl store_rewrite_list_path urlpath_regex \.(jp(e?g|e|2)|gif|png|tiff?|bmp|ico|flv)$
acl store_rewrite_list_web_CDN url_regex ^http:\/\/[a-z]+[0-9]\.google\.com doubleclick\.net

# Rewrite youtube URLs
storeurl_access allow store_rewrite_list
# this is not related to youtube video its only for CDN pictures
storeurl_access allow store_rewrite_list_web_CDN
storeurl_access allow store_rewrite_list_web store_rewrite_list_path
storeurl_access deny all

# Default refresh_patterns
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0

# Updates (unrelated to this post, but useful settings to have):
refresh_pattern windowsupdate.com/.*\.(cab|exe)(\?|$) 518400 100% 518400 reload-into-ims
refresh_pattern update.microsoft.com/.*\.(cab|exe)(\?|$) 518400 100% 518400 reload-into-ims
refresh_pattern download.microsoft.com/.*\.(cab|exe)(\?|$) 518400 100% 518400 reload-into-ims
refresh_pattern (Release|Package(.gz)*)$        0       20%     2880
refresh_pattern \.deb$         518400   100%    518400 override-expire

# Youtube:
refresh_pattern -i (get_video\?|videodownload\?|videoplayback\?) 161280 50000% 525948 override-expire ignore-reload
# Other long-lived items
refresh_pattern -i \.(jp(e?g|e|2)|gif|png|tiff?|bmp|ico|flv)(\?|$) 161280 3000% 525948 override-expire reload-into-ims

refresh_pattern .               0       20%     4320

# All of the above can cause a redirect loop when the server
# doesn't send a "Cache-control: no-cache" header with a 302 redirect.
# This is a work-around.
minimum_object_size 512 bytes

Done. And it seems to be working relatively well. If only I'd set this up last year when I had pesky house-mates watching youtube all day ;-)

It should of course be noted that doing this instructs your Squid Proxy to break rules. Both override-expire and ignore-reload violate guarantees that the HTTP standards provide the browser and web-server about their communication with each other. They are relatively benign changes, but illegal nonetheless.

And it goes without saying that rewriting the URLs of stored objects could cause some major breakage by assuming that different objects (with different URLs) are the same. The provided regexes seem sane enough to not assume that this won't happen, but YMMV.

#!/usr/bin/env python
# vim:et:ts=4:sw=4:

import re
import sys
import urlparse

youtube_getvid_res = [
    re.compile(r"^http:\/\/([A-Za-z]*?)-(.*?)\.(.*)\.youtube\.com\/get_video\?video_id=(.*?)&(.*?)$"),
    re.compile(r"^http:\/\/(.*?)\/get_video\?video_id=(.*?)&(.*?)$"),
    re.compile(r"^http:\/\/(.*?)video_id=(.*?)&(.*?)$"),
]

youtube_playback_re = re.compile(r"^http:\/\/(.*?)\/videoplayback\?id=(.*?)&(.*?)$")

others = [
    (re.compile(r"^http:\/\/(.*?)\/(ads)\?(?:.*?)$"), "http://%s/%s"),
    (re.compile(r"^http:\/\/(?:.*?)\.yimg\.com\/(?:.*?)\.yimg\.com\/(.*?)\?(?:.*?)$"), "http://cdn.yimg.com/%s"),
    (re.compile(r"^http:\/\/(?:(?:[A-Za-z]+[0-9-.]+)*?)\.(.*?)\.(.*?)\/(.*?)\.(.*?)\?(?:.*?)$"), "http://cdn.%s.%s.SQUIDINTERNAL/%s.%s"),
    (re.compile(r"^http:\/\/(?:(?:[A-Za-z]+[0-9-.]+)*?)\.(.*?)\.(.*?)\/(.*?)\.(.{3,5})$"), "http://cdn.%s.%s.SQUIDINTERNAL/%s.%s"),
    (re.compile(r"^http:\/