Category “commentary”

Emergency Remedial Maths

Tuesday, 26 January, 2010

It looks like the entire United Kingdom… or at least the percentage involved in property… needs Emergency Remedial Mathematics lessons.

The UK economy leaps out of recession, like a grasshopper trying to jump on Jupiter, triggering a mass hallucinatory episode amongst real estate agents whom, I can only guess, come to the incorrect conclusion that “0.1%” is somehow a fraction representing “1 percent”, and consequently re-list all their properties using a multiple of that figure.

Optimism abounds. :-]

Lost touch with reality

Tuesday, 15 December, 2009

Here’s a judge who has completely lost touch with reality:

http://www.telegraph.co.uk/news/newstopics/politics/lawandorder/6811239/Businessman-jailed-for-attacking-intruder—who-goes-free.html

Quote:

It’s difficult to believe that this outcome reflects the thinking of the public, or the interests of justice.

I would say not difficult… more like impossible.

Cross it off the list…

Saturday, 12 December, 2009

So, cross the US back off the list of places I want to visit any time soon…

http://www.rifters.com/crawl/?p=932

Clarkson should have a blog…

Monday, 9 November, 2009

Don’t know if he actually wrote it, but under the assumption he did, this is brilliant:

http://bastardoldholborn.blogspot.com/2009/11/mandelson-censors-jeremy-clarkson.html

Miscalculations

Monday, 21 September, 2009

I was updating the SWFK project page with the total number of downloads (since I last updated it in March), and discovered that I’ve miscalculated the figure. I use awstats for my site, and usually just go through all the swfk-*.zip links for each month, using a calculator, to work out the sub-total, then add the downloads from the Google Code project page. However, this time I used a spreadsheet, and it appears as if I’ve previously missed a few thousand downloads. So while I thought the the grand total was around 16K, it looks like it’s actually in the region of 19K. Which is something like 18-20GB worth of data — a reasonably impressive figure, when I think about it.

Perhaps I’ll throw myself a party when I hit 20K… :-)

Warts and all

Sunday, 13 September, 2009

I’ve noticed what seems to be a predilection, by those who write reviews of WordPress shopping cart plugins and themes, to stick YAK at the bottom of the list. Probably because the number of downloads is below the others. But the final result is something along the lines of:

WP-Ecommerce: feature, feature, feature, feature…
Shopp: feature, feature, feature, feature…
Eshop: feature, feature, feature, feature…
YAK: [gawd I'm tired of listing features... let's not bother with it any more... what can come up with instead... oh I know] it’s a simple plugin!

It’s getting old. Frankly.

So, this is an attempt to come up with a reasonably objective comparison of the shopping cart plugins for WordPress, without excluding the one at the end because someone-got-bored-before-they-finished-writing. You might be wondering how I can be objective when I develop one of those very plugins — well, we’ll see how I do, I guess.

I’m going to take a look at the major e-commerce plugins (not themes, because this probably should be an apples-to-apples comparison). First up, let’s bundle all those features together into one nice big list and see who does what… this might end up being a work-in-progress, because in some cases, it’s not immediately obvious whether the features are included. If I’ve missed something, let me know.

Feature WP-Ecommerce Eshop Shopp YAK QuickShop
Pricing Free or $40/195 for Gold, plus other modules Free, open source $55 single site, $299 developer Free, open source, €20 for detailed handbook Free, open source
# of Downloads 277,527 57,415 ~3,000 19,575 (~7000 on sourceforge) 30,310
Memory Usage 6.15MB 0.90MB 2.5MB 1.13MB 0.10MB
Post-as-product * *
Multiple types of product (options/variations) * * * *, plus multi-select options *
Support for digital products * * * *
Confirmation email * * * *
Email templates * * Text & HTML Basic, text and html
Product search Gold version only Products are posts, so searchable via WP * Products are posts, so searchable via WP
Product templates * *
Product tags * * * *
Product catalog * *
Products groups/subgroups * Yes, through categorisation (I think) Hierarchical categories (probably the same) Yes, through categorisation
Product attributes or metadata * Yes, via normal post meta * Yes, via normal post meta Basic properties
Configurable out-of-stock message * * *
Order management/history * * *
Dashboard Widgets *
Themes * * (not free) Theme widgets, but not themes as far as I can tell
AJAX support (drag & drop, live update, etc) drag & drop with Gold version drag & drop shopping
Image upload Bulk upload Via WP Drag-and-drop Via WP
Drill-down (or filter) menus *
Promotions/Coupons * *, plus discounts by spending amount Rule Based (by amount, by percentage, free shipping and buy x get y free) Price or shipping discounts with promo codes, plus discounts by spending amount
Related products functionality * Possible with WP tags *
Subscription Module for Gold version
Membership support Module for Gold version
Flat rate shipping * * * * I think so
Weight based shipping * * *
Tiered and/or amount-based shipping *
USPS integration * Add-on
UPS integration * Add-on
Fedex integration Add-on
Shipwire integration *
CA Post integration Add-on
CSV (or other) export Products, Orders, Customer info Products, Orders Orders and Customers in Tab, CSV, (true) XLS and IIF for QuickBooks (orders only) Orders and Customer info
PayPal Std payments * (plus express checkout) * * (plus express checkout) * Redirects to PayPal
PayPal Pro payments * Add-on *
Authorize.net payments * Add-on *
Google Checkout payments * * Partial
2checkout payments *
Chronopay payments *
PayJunction payments Add-on (US-only)
FirstData payments Add-on
HSBC ePayments Add-on
eWay payments Add-on (AU-only)
Payson payments * Add-on
eProcessingNetwork payments *
iDeal (moille) payments (Nederlands only) Add-on Add-on
NetCash payments (South Africa only) Add-on
Webtopay payments *
Manual Credit card payments *
Simple payments (cash, cheque, deposit) * *
Accounts receivable payments *
Recurrent billing Members module
Google Base integration * * *
Google Analytics integration Free add-on *
Facebook Marketplace integration *
Email marketing *
Affiliate program Gold (beta at time of writing)
Reports Business reports dashboard Basic Dashboard Stats & Aggregate information in the order log (by filtering) Simple sales reports
Category/Product RSS Feeds Business reports dashboard Basic Dashboard Stats & Aggregate information in the order log (by filtering) Simple sales reports
3rd party integration * Utilise feeds provided by WP
Developer API * *
WPMU support? * * * (not officially supported) *
Internationalisation * * *
Support Model Free support via Forum, paid support available Free support via Forum Free support via Forum Free support via Google Group, plus paid Free support via Forum, paid support by request

Hard to draw any real conclusions from this matrix — WP E-commerce probably leads in terms of features, but those features come with a (resource) cost. Shopp looks like it might come second (in terms of featureset), and certainly covers the most payment gateways, but it’s also a reasonable investment (particularly purchase of a developer license). Given it’s commercial-only, it’s impossible to know what performance or memory usage is like.

Given that no single plugin covers all the possible features, I guess it’s very much a case of identifying the things that are important to you, then choose the plugin which best covers that featureset.

…At least, until YAK2 comes out, because that will do everything.

That’s a joke by the way.

More to come later, and do let me know if I’m made some glaringly obvious omissions.

Update #1: Added number of downloads, and project links.

Update #2: Changes to eShop features, kindly provided by Rich.

Update #3: Added info on WP E-commerce product search.

Update #4: Added info on Shopp, provided by Jonathon.

Update #5: Added iDeal to wp-ecommerce, i18n to eshop.

Update #6: Added 2 new YAK features

Arkham Asylum and GTA IV mashup

Sunday, 6 September, 2009

So, I’ve just finished Batman: Arkham Asylum (almost twice), and currently playing GTA IV. Does anyone else wish that someone would take the Batman gameplay mechanics (and voice acting) and merge with a world the size of GTA?

Gotham City instead of Liberty City.

Imagine glide flight from the top of a skyscraper, rather than just a few storeys up on a gargoyle. Tracking criminals from building to building. Remote driving the Batcar or Batwing for a pickup. Using the “real” Batcave facilities to investigate crimes.

The possibilities are endless…

…and I want that game!

Apple shows MS how it should be done…

Friday, 15 May, 2009

Apple shows Microsoft how to really do an “I’m a PC, I’m a Mac” advert:

http://movies.apple.com/media/us/mac/getamac/2009/apple-mvp-elimination-us-20090512_480×272.mov

Awesome.

Somewhat Less Than Complementary

Thursday, 26 March, 2009

Trackback pointed out a somewhat less than complementary review of YAK.

I think the reviewer probably has a valid point in regard to user-friendliness, but otherwise hasn’t appeared to put a huge amount of thought into his review. In fact, it was negative enough that I feel the need to post a rebuttal both here and in a comment on his post. I don’t mind constructive criticism (as I said, I tend to agree on the user-friendliness front), but I’m less than impressed with criticism that’s based on a fundamental lack of research.

Here’s my comment (hopefully it doesn’t come across as too defensive…):


A question for you: did you happen to scroll down the YAK project page (here: http://www.briggs.net.nz/log/projects/yak-for-wordpress/)?

I’m not trying to be snide, but your review mentions a lack of documentation, and there is basic installation documentation on the main project page.

A lot of open source projects make money by selling documentation. It’s pretty much a standard practice. Some users want to pay, some would rather figure it out themselves. That’s flexibility for you. But you don’t have to waste time figuring it out for yourself, because you can buy the handbook — so I find it rather trite for you to suggest that it’s somehow okay to pay for a plugin with documentation, yet it’s not okay to get a free plugin and then pay for the docs.

Yes, YAK is basic. That was one of the initial goals — along with tight integration within WordPress. So no, there isn’t a way to insert product images from YAK. Instead, you insert them in your post — your post is your product. That’s the foundation of YAK: post as product.
YAK originally had its own menu option, but before the new design of WP, I felt it took too much menu real estate and figured users would prefer if it was included within the standard WP menu structure — settings went into WP->Settings. Orders and Products and then Reports went into the Manage menu (which has now become Tools). I haven’t had any complaints or suggestions to change it, so far.
On the “lack of help” front, there is a forum on my site. A responsible reviewer might’ve taken a look there first — and found that, as with many open source projects, the forum is reasonably active, with support requests, and discussions on how to do things, and so on.

YAK might be lacking in user-friendliness (something I’m trying to address over time, but as a single-developer project, it’s slow going), but an accusation of lack of support is, quite frankly, groundless.

In the distant past, I was one of the editors of a (printed) technical journal in the US. Generally if we were reviewing a product, we’d contact the company in advance for review copies (giving them the opportunity to provide additional information if they wanted). In this case, and for any future reviews you decide to write, I believe you’d be better served contacting the developer (or developers) and give them that same opportunity. It is perhaps a better form of journalism not to rubbish a project or product without actually doing a little research in advance…

Units of Work

Friday, 20 March, 2009

In regard to cross-resource transactions, I’m a member of the camp that wonders whether distributed transactions are strictly necessary in the REST/HTTP world; indeed I wonder whether they represent a design failure in modeling the granularity of your resources.

That said, we don’t live in a perfect world — and even if I can’t envisage why a properly designed RESTful application might require access to a distributed transaction, I can certainly envisage the environment where such an application might evolve. I’ve worked in a few of them. Places where interdepartmental barriers are as solid as the Great Wall; bastions of archaic technology where “one might provide a pseudo-RESTful interface, but one certainly won’t be re-architecting one’s legacy system in the buzzword language of the day”.

But, I think there’s a certain amount of smoke and mirrors in the JBossTS article “Transactional support for JAX RS based applications“:

Certainly it is worth pointing out that if a system cannot be made reliable then it can be of only limited utility. That said it is a worthwhile exercise to show how a REST based system can be made reliable.

Lack of distributed transactions would hardly seem to make a REST based system “unreliable” and, as a consequence, of “only limited utility”. Imagine a hotel booking facility — perhaps a booking resource, which internally might be constructed from a number of components, all governed (again internally) by transaction demarcation. Does the fact that the booking resource is coarse-grained and does not require an external transaction make it less reliable than a number of fine-grained resources which do? On the contrary. The latter sounds more like a WS-* api than a RESTful architecture, nothing to do with reliability.

So… hopefully it’s obvious I think it’s a bad idea. But if I were to write such an API, I think the 8-year old spec mentioned in the article falls short of the mark. Here’s my first-cut attempt at an alternative (which I still think falls a bit short of the mark, but is possibly an improvement):

Resource: tc
Method URL Content Description Statuses
GET /tc Returns HTML containing a summary of all transactions (status), plus an href to the transaction detail 200 – ok
/tc/{txid} Returns HTML containing detail for the transaction with id {txid}, including the status and a list of hrefs to the each of the participants. For example:


<html>
<body>
	<dl>
		<dt>Transaction ID</dt>
			<dd id="transaction-id">12345a</dd>
		<dt>Status</dt>
			<dd id="transaction-status">ACTIVE</dd>
		<dt>Timeout</dt>
			<dd id="transaction-timeout">5000</dd>
	</dl>
	<ul id="participants">
		<li>
			<a href="/tc/12345a/participants/1">
				Participant 1
			</a>
		</li>
		<li>
			<a href="/tc/12345a/participants/2">
				Order
			</a>
		</li>
	<ul>
</body>
</html>
200 – ok

404 – if txid is not found
409 – if the transaction has been deleted
/tc?status={status-type} Return HTML containing a summary of transactions with a specific status, with href to the transaction detail
For example: /tc?status=recovering or /tc?status=active
200 – ok
/tc/{txid}/participants Return a list of participants in the transaction (list of hrefs) 200 – ok
404 – if the transaction does not exist
/tc/{txid}/partipants/{rec-coord-id} Return HTML containing the detail of a participant. For example:


<html>
<title>Participant #2</title>
<body>
<dl>
    <dt>ID</dt>
        <dd>2</dd>
    <dt>Name</dt>
        <dd>Order</dd>
    <dt>URL</dt>
        <dd>
            <a href="http://internal.mydomain.com/someresource/123">Order</a>
        </dd>
</dl>
</body>
</html>
200 – ok
404 – if the transaction or participant does not exist
POST /tc [timeout={timeout}] Start a transaction (with default timeout) returning the url /tc/{txid} — which is deleted after the timeout or after completion (any HTTP method relating to {txid} thereafter returns 404). Use timeout={timeout} to override the default timeout period. 201 – created
DELETE /tc/{txid} Rollback and stop a transaction 204 – ok
404 – if the transaction does not exist
/tc/{txid}?commit Commit and stop a transaction 204 – ok
404 – if the transaction does not exist
POST /tc/{txid}/participants url={url}&[name={name}] Enlist {url} in the transaction, returning a unique resource for that participant of the form /tc/{txid}/participants/{rec-coord-id}. If name exists, record against the participant detail 201 – created
404 – if the transaction does not exist
PUT /tc/{txid}/participants/{rec-coord-id} url={url} Replace the participant url 200 – ok
404 – if the transaction or participant does not exist

The resource identified by a participant URL will have the following semantics:

Method URL Content Description Statuses
PUT URL/tx/{rec-coord-id} action=prepare The participant prepares any work done in the context of the transaction. The Warning header will contain additional info about the state of the prepare (either readonly, or notok). 200 – ok
200 – ok (+ Warning: readonly)
200 – ok (+ Warning: notok)
404 – participant has rolled back
action=commit The participant commits any work done in the context of the transaction. 200 – ok
200 – ok (+ Warning: heuristic)
404 – participant has rolled back
action=rollback The participant commits any work done in the context of the transaction. 200 – ok
200 – ok (+ Warning: heuristic)
404 – participant has already rolled back

Basic usage might look something like the following:

1. Create a new transaction resource
POST /tc
Host: somedomain.com

timeout=5000
HTTP/1.1 201 Created
Connection: close
Date: Thu, 19 Mar 2009 21:01:56 GMT
Location: http://somedomain.com/tc/10a23v991
X-Powered-By: TransactionServer/0.1
2. Create a new resource of some kind (notify the resource that it will operate with a distributed transaction)
POST /res1?tx
Host: internaldept1.somedomain.com

<xml>some xml describing the resource</xml>
HTTP1.1 201 Created
Connection: close
Date: Thu, 19 Mar 2009 21:01:56 GMT
Location: http://internaldept1.somedomain.com/res1/100
3. Update another resource (again notify that it will be operating within a transaction)
PUT /res2/somename?tx
Host: internaldept2.somedomain.com

<xml>some xml describing the update,
perhaps including a reference to the previously
created resource</xml>
HTTP1.1 200 Ok
Connection: close
Date: Thu, 19 Mar 2009 21:01:56 GMT
Location: http://internaldept2.somedomain.com/res2/somename
4. Enlist the url for each resource in the transaction
POST /tc/10a23v991/participants
Host: somedomain.com

name=resource1&url=http://internaldept1.somedomain.com/res1/100
HTTP/1.1 201 Created
Connection: close
Date: Thu, 19 Mar 2009 21:01:56 GMT
Location: http://somedomain.com/tc/10a23v991/participants/a01abgv21
X-Powered-By: TransactionServer/0.1
POST /tc/10a23v991/participants
Host: somedomain.com

name=resource2&url=http://internaldept2.somedomain.com/res2/somename
HTTP/1.1 201 Created
Connection: close
Date: Thu, 19 Mar 2009 21:01:56 GMT
Location: http://somedomain.com/tc/10a23v991/participants/a01abgv22
X-Powered-By: TransactionServer/0.1
5. Commit the transaction
DELETE /tc/10a23v991?action=commit
Host: somedomain.com
HTTP/1.1 204 Committed and deleted
Connection: close
Date: Thu, 19 Mar 2009 21:01:56 GMT
X-Powered-By: TransactionServer/0.1
6. ‘Behind the scenes’, the commit results in the following (2-phase commit at this point)…
PUT /res1/100/tx/a01abgv21
Host: internaldept1.somedomain.com

action=prepare
PUT /res2/somename/tx/a01abgv22
Host: internaldept2.somedomain.com

action=prepare

and

PUT /res1/100/tx/a01abgv21
Host: internaldept1.somedomain.com

action=commit
PUT /res2/somename/tx/a01abgv22
Host: internaldept2.somedomain.com

action=commit