22 Mar

ToDo

List of things off the top of my head that I want to do:

  • write a book. already had a non-fiction book published, but I’d love to have an interesting an compelling original fiction idea to write about. I’m working on a second non-fiction book at the moment.
  • master a martial art. I have a green belt in Bujinkan Taijutsu (ninja stuff, to the layman), but that’s from ten years ago – found a Genbukan teacher only a few days ago so I’ll be starting that up soon (again, ninja stuff).
  • learn maths. A lot of the stuff I do involves guessing numbers or measuring. it’d be nice to be able to come up with formulas to generate optimal solutions.
  • learn electronics. what /is/ electricity? what’s the difference between voltage and amperage? who knows… I’d like to.
  • create a robot gardener. not just a remote-control lawn-mower. one that knows what to cut, what to destroy, that can prune bushes, till the earth, basically everything that a real gardener does.
  • rejuvenate, or download to a computer, whichever is possible first. science fiction, eh? you wait and see…
  • create an instrument. I’m just finishing off a clavichord at the moment. when that’s done, I think I’ll build another one, based on all the things I learned from the first. followed by a spinet, a harpsichord, a dulcimer, and who knows what else.
  • learn to play an instrument. I’m going for grades 2 and 3 in September for piano. I can play guitar pretty well, but would love to find a classical teacher.
  • write a computer game. I have an idea, based on Dungeon Keeper, for a massively multiplayer game. maybe I’ll do it through facebook…
  • write programs to:
    • take a photo of a sudoku puzzle and solve it. already wrote the solver.
    • take a photo of some sheet music and play it.
    • show some sheet music on screen, compare to what you’re playing on a MIDI keyboard, and mark your effort.
    • input all the songs you can play on guitar/keyboard. based on the lists of thousands of people, rate all these songs by difficulty, to let you know what you should be able to learn next.
    • input a job and your location. have other people near you auction themselves to do the job for you. or vice versa: input your location, and find all jobs within walking distance to you where you can do an odd job for some extra cash (nearly there: http://oddjobs4locals.com).
    • takes a photo and recognises objects in it (partly done)
    • based on above, but can also be corrected and will learn from the corrections (also partly done)
  • stop being damned depressed all the time.

There’s probably a load of other stuff, but that’s all I’ve got at the moment!

20 Mar

clavichord progress: now with strings

I can understand now why these things go for so much money.

I’ve been working on this project for about two weeks and am just now getting a sound by pressing a key.

I’ve also learned a lot, which will be applied when I build the next one.

I originally planned to build a 49-key unfretted clavichord, but didn’t realise how difficult that was going to end up being.

One of the problems with this, is that because the strings are pulled diagonally across the board, hitting one string without hitting its neighbours is a very difficult thing.

This is easier to do if there are less strings.

So, after putting in all 49 hitchpins and drilling 49 holes for tuning pegs, I realised that there was no way I could do this unfretted without extreme precision, which my <€50 instrument was simply not capable of.

image showing 49 tuning pin holes, hitchpins, and the felted balance rail for the keyboard

So, I’ve strung the instrument with only 17 strings, each of which is used by 3 keys (yes, I know – one key will get a string all of its own).

17 strings crossing the bridge to 17 tuning pins

There’s another problem I’ve yet to overcome.

Because fretting involves hitting the same string at different points (the same as a guitar or violin), and I didn’t think far enough ahead, some of my tangents are going to have to hit their strings in positions above other keys…

Looking at other existing fretted keyboards, I now realise why the tangent positions are so staggered:

staggered tangents on a triple-fretted clavichord

I’ve just finished the sharp keys, and will be working on inserting all the tangents later today.

If I’m lucky, it may actually be playable by tonight.

19 Mar

CMS Design using jQuery and PHP: the core

I submitted chapter 1 of “cms design using jquery and php” yesterday.

I’ve been building and using CMSes for over ten years, and the more I do it, the more I realise that “less is more”.

In the beginning, I was writing CMSes that had absolutely every aspect of the requirements hard-coded. That made the system fast but inflexible.

Over the years, though, I started figuring ways of breaking the system up into more modular bits and pieces, that could be enabled/disabled depending on the job.

This is the essence of what “plugins” are about – you have a single core system which includes only the absolute essentials, and into that, you put whatever plugins you find necessary for the job you’re doing.

The trick, though, is in deciding what is a plugin and what is not. This is very important to figure out – if something should be a plugin, it should not be in the core, thus making he core more stable and manageable. Conversely, if you make something into a plugin which is necessary for normal use of the CMS, then it makes the system less stable.

An example of this dilemma is user logins. Obviously, you need to have user logins for the admin area to work, but you don’t need user logins on the front end of the site.

So, should user-logins be a plugin or core functionality? The solution is a mix of both – you need to create a hard-coded user login specifically for the admin area, and if you want users logging in to the front end, that is a plugin, even though they both use the same database. The difference is that the admin login area is at a defined point (when you access the admin area), while making the frontend login into a plugin allows you to place a login anywhere you want.

Anyway – over the years, I’ve whittled away at my own CMSes until I realised that the core functionality of a CMS consists of just three things:

  1. display and editing of “normal” pages
  2. user and role administration
  3. plugin management

It’s impossible to cover those three items in just one chapter, but once they are covered, that basically completes the CMS!

When you have the above three items completed in your CMS, you can then work completely on plugins, making the system stable and yet flexible.

Of course, there are some fine details (templates, UI, optimisation, DB structure, etc.) that go into completing those three items, but that’s basically it.

15 Mar

clavichord keyboard and soundbox

Over the weekend, I cut out the keyboard for the clavichord and built the soundbox.

How a clavichord works is that you have strings which are strung between hitch pins and tuning pegs, with a bridge in between. The strings are damped at both ends by cloth called “listing”.

When a key is pressed, a “tangent” is banged up against the string, creating a standing wave between the tangent and the bridge. When the key is released, the tangent loses contact with the string and the wave is then damped.

As I’m building all of this as cheaply as possible, I don’t have proper material, so I’m very interested to see how well it sounds when finished.

I couldn’t find any proper wood to act as a soundboard, so used the side of an old computer case, cut to size. I’ve never heard of a metal soundboard in a clavichord – but then, I’ve also never heard of a plywood clavichord.

My friend Sean dropped over yesterday and gave me a roll of high-tensile wire – the sort of stuff that’s usually used in industry when strength is needed. The wire is made of 15-20 individual wires, each twined to create a single whole.

I haven’t got the tuning pegs created yet, but was able to test the sound of the clavichord by unwrapping a single strand from the wire, and running it from a hitch pin to a screwdriver in one of the tuning peg holes, and tightening it as much as possible by hand, then levering a small piece of plywood under the wire to act as a bridge on the soundboard.

Plucking the string made a clear tone, but hammering and holding the hammer against the string it didn’t make much of a sound. That’s kind of to be expected, though. After all, it’s been said that the clavichord is “the one instrument that can be played by a person on one side of a double-bed without disturbing someone in the other side”.

It will probably sound much better when I’ve made a proper bridge and got proper tangents running.

10 Mar

plywood clavichord project

My piano is going out of tune.

The local tuner says it can’t be tuned. but, seeing as he’s also the owner of the local piano shop, I really don’t think I can trust his word on that – especially as another tuner (in Dublin) laughed immediately when that was said to him.

I’m certain that I can tune the piano, but I’ve been told not to, by both the tuner in Dublin, and also by Bronwyn’s mum, who owns it – apparently the slightest mistake can be costly.

And so, I’m going to build my own keyboard, which I can tune if I want to.

Here’s a picture of the end-goal – a well-made clavichord:

To buy a ready-built clavichord would cost 8000 euro or higher. To get a kit version which you put together yourself would cost 3500 or higher.

I feel that’s a little bit high, so I’m trying to make a simple clavichord, where the materials cost 50 euro or less. I’m not counting the cost of the tools.

So far, the materials have cost less than 25 euro – a sheet of 22mm plywood, and some wood glue.

Today’s progress is that I have the basic shell of the thing created. It’s 100cm x 30cm in size, with internal walls of 10cm.

The keyboard will be four-octaves in length. 49 keys, from C two octaves below middle.

I’ll start cutting the keyboard out tomorrow. Hopefully I’ll be able to finish off all the woodwork by then.

Then it’s time to start thinking about the strings.

09 Mar

CMS Design with jQuery and PHP: postage and packaging prices

This article is based on work which will be expanded more fully in the book, when I get to that chapter.

Every time we do an online store here in webworks, the postage/packaging is different. In one case, for example, postage is free over €50 euro, in another, it depends on where it’s going, and in the latest, it depends on a load of factors including where it’s going, what the weight of the products is, and what delivery option was chosen.

Up until now, hand-coded the postage rules. Everything else was handled by user-friendly parts of our CMS, but postage was such a random thing that we couldn’t find anything common enough that we could make a generic P&P handler.

The finished product is more complex than this example, but I’ll describe a cut-down version of what we’ve done, with countries and parcel-types removed.

admin demo – demo of UI for generating P&P rules

The first demo shows how the postage-and-packaging rule-set is created, using an “if-else” flow generator to build up the logic of the thing, and after each major action, convert the current state into a JSON string which can be saved.

The PHP is not really important in this one. The JavaScript handles everything. It translates a “seed” JSON string into a graphical representation of the rules, which can then be manipulated and finally translated back (automatically) into a JSON string to be saved in a DB (or session in this case). source for the PHP, source for the JS.

The frontend does its work in the background:

frontend demo – using those rules to evaluate P&P (visit admin first).

In this case, we enter values – total, weight – and run through the rule-set to find out what the P&P ends up as.

The source is suprisingly small, using a small recursive function to dig through the rules, no matter how deep and complex they go.

Here’s the recursive function (see source for rest of file):

function os_getPostageAndPackagingSubtotal($cstrs,$total,$weight){
  foreach($cstrs as $cstr){
    if($cstr->type=='total_weight_less_than_or_equal_to' && $weight<=$cstr->value)return os_getPostageAndPackagingSubtotal($cstr->constraints,$total,$weight);
    if($cstr->type=='total_weight_more_than_or_equal_to' && $weight>=$cstr->value)return os_getPostageAndPackagingSubtotal($cstr->constraints,$total,$weight);
    if($cstr->type=='total_less_than_or_equal_to' && $total<=$cstr->value)return os_getPostageAndPackagingSubtotal($cstr->constraints,$total,$weight);
    if($cstr->type=='total_more_than_or_equal_to' && $total>=$cstr->value)return os_getPostageAndPackagingSubtotal($cstr->constraints,$total,$weight);
  }
  $val=str_replace('weight',$weight,$cstr->value);
  $val=str_replace('total',$total,$val);
  $val=preg_replace('#[^0-9*/\-+.\(\)]#','',$val);
  if(preg_match('/[^0-9.]/',$val))eval('$val=('.$val.');');
  return (float)$val;
}

The switch block goes through the various “if” types that can exist in the flow model, handling each of them recursively and return their values to the caller.

If no “if”s are encountered, then the ruleset has found an answer, and we return that answer.

Before returning it, though, we parse the value of the answer. This is in case the answer is a math formula to do with the weight or total of the item.

For example, An Post have definite prices for packets to Europe up to 2kg (which is 10.75), and beyond that, it’s 3 euro extra for every extra kg.

That translates to a load of definite “if” statements, and an end value of “(weight-2)*3+10.75” for the final “else”.

So, we convert recognisable words such as “weight” or “total” to numbers, make sure that we’re only left with parseable characters (and not something that can be used to hack), and eval it to produce the result.

Obviously, the full product is more complete than this, with safeguards against faulty formulas, extras to handle countries and envelope types (parcel/packet/envelope), but this example should give you a few ideas if you’re building your own P&P handler.