Tuesday, September 07, 2021

Our Favourite Shop/Internationalists (1985)

All of the things I liked about the Style Council in Cafe Bleu - synthy basslines, soulful singing from Paul Weller and Dee C Lee, and the occassional strange interlude from Mick, or polemical rapping - it's all here again. And I realize how confused I have been through the years because of the way the record label wanted to rename TSC albums for US release. The optimism levels here are very high. "Luck" is a great pick me up, reminiscent of "My Ever Changing Moods".

You caught me feeling all was useless
And left me feeling ten feet high

Our Favourite Shop was my favourite album when I listened to the Style Council years ago. Not sure if it still is. "A Stone's Throw Away" is a song that has stuck with me through the years... it ties early Jam songs like "In The City" with "Eton Rifles" and "Smithers-Jones". Trust the workers, don't trust the bastards in power, and so forth. Paul does sound incredibly sincere when he talks about what's happening a stone's throw away "in Chile, in Poland, in Johannesburg, South Yorkshire. A reminder, looking back, that this was the same period of apparent self- and global-awareness and class consciousness that brought us Live Aid.

Walls Come Tumbling Down at Live Aid - Paul sounds great here.

Songs like the "Stand Up Comics Instructions" are great. In a way, this reminds me of the spoken word stuff Mark Kozelek has been doing in the last few years. There's a polemic basis, and it's catchy, but the real star of the show in this case are Steve White's drums, which are fantastic. It's too bad this track was pulled from some releases under the belief that the blatant anti-racism might be misinterpretted because some people are unable to understand

Not a lot of videos from this period, but "Shout to the Top" is very good. Not sure I love Mick playing the piano standing up, but I love Steve White's grip"
satire. It's too bad. There are some legitimately poor choices made, such as Paul scatting along with the guitars on "The Boy Who Cried Wolf", and his french in "Down in the Seine" is problematic, but overall, I still love this album. I did not appreciate the drums enough.

Friday, September 03, 2021

Cafe Bleu/My Ever Changing Moods (1984)

Whereas several of the Jam's albums were clever plays on words, the Style Council's are more often than not just different in the US market, for some strange reason. My Ever Changing Moods is a great album. The title track and "Headstart for Happiness", "You're The Best Thing", bangers every one of them. I realize listening to these songs, however, that I liked Paul's old voice, and the way he chopped his words and bit down on his anger in the Jam. Dee C Lee is a great addition to the mix, and Ben Watt and Tracey Thorn from Everything But The Girl also show up on one track, "The Paris Match". The comparison I am tempted to make here is that Paul and Mick are trying at times to do a Simon and Garfunkel, and sometimes, they're just kind of trying. The video for "My Ever Changing Moods" tries very hard. It is bad.

I still find myself gravitating towards the singles I recognize, but the songs I really appreciate here are the slightly Satie-tinged jazz pieces like "The Whole Point of No Return", which as far as I can tell is a solo effort; and the odd politico-rap of "A Gospel", which made an indelible impression on me the first time I heard it. It's like the bastard child of Big Audio Dynamite and the Sugarhill Gang, and I'm still not sure what to make of it decades later. I guess that's my takeaway here... I may not be eating propaganda shit-spoon fed, whatever that means, but I'd probably rather just take the time to listen to Everything But The Girl or Big Audio Dynamite.

Thursday, September 02, 2021

Introducing The Style Council (1983)

And here we are, on to the TSC period, and if I'm being honest, I have a hard time separating the songs I really like from this period from Jam songs like Beat Surrender, Bitterest Pill (I Had To Swallow), but in part this is because The Jam and TSC both recorded Solid Bond In Your Heart, a song which really epitomizes a romantic notion of determination and the bonds that connect us that runs through a lot of Paul Weller's songs. Anyway, the other members of the Jam went on to different projects, and Paul and Mick Talbot, ex-Merton Parka and Midnight Runner, connected over a mutual love of soul music.

Long Hot Summer is either a really bad song that I cannot help but like, or a really good song that I cannot help but dislike. Probably both. Whereas the Jam's videos were all essentially them playing live, the Style Council's videos are all essentially Mick and Paul acting out silly adventures. No one knows why. This one is truly awful.

Speak Like a Child and Solid Bond in Your Heart are great songs, both featuring drums by Zeke Manyika, who was also playing with Orange Juice at the time, and who would later join The The. After these first couple tracks, the Style Council lineup would settle on Steve White playing drums and DC Lee (formerly of Wham!) providing backup vocals.

I'm fuelled by the idea
That this world was made to share
But it never seems to work out
And all we seem to share
Is doubt and misery
I just want to build up
A solid bond in your heart

I like the sentiment. The parts of the Style Council I really like are the themes that often dominate Paul Weller's songwriting - loneliness, misery and doubt, married with a persistent optimism and an absence of despair. The world may be awful, but we can make it a better place. To push the earlier comparison, the Cure went deeper down the well of doubt and angst, and so did The The, and from a lyrical perspective, I miss the slice of life aspects of the Jam, which were replaced by a more philosophical outlook in the Style Council. And whereas by 1983, The The had recorded Giant, and the Cure had recorded Faith, two perfect 7 minute songs, TSC had recorded Long Hot Summer, and, like I say, I have rather "mick's feelings" about that song.

It does feel right to compare Paul Weller's output to Matt Johnson's, or Robert Smith's, or perhaps Edwyn Collins from the Orange Juice or Elvis Costello. They're all part of the 80s british invasion, but not quite new wave or new romantic. They all had an impact on the C-86 and BritPop sound.

Monday, August 30, 2021

Life From a Window

So that's August, and September is about to start, and I'm going to pace myself a bit with The Style Council. My favourite unexpected moment so far has been "Life From a Window" from This is the Modern World. As much as I love the later singles, this one catches my attention every time now. I love the sentiment that the world doesn't have to look any particular way... if you can raise yourself above it, that's the important thing, to see the whole picture, and turn the grey skies blue with teenage optimism.

For me, The Jam never quite fell into the trap of cynicism and satire the way TSC did, becoming more overtly political, which took away from the purity of their music. Their lyrics are often caustic, but stop short of becoming judgmental. In my head, I like to attribute this to the other two band members calling out Paul when he starts going off: "Oi! Oi!"

There are a few songs I feel like I've missed, too.

Speaking of songs called "Start" with a high saturation of "Oi! Oi!", I love the band Mega City Four so much. They put out a string of top albums before their lead vocalist Wiz left to join the Doughboys for a while and then form Ipanema. He later died from a brain clot in 2006, way too young. Great band.

"Liza Radley" was a b-side that tells a sad story of mental health, lost love, and not fitting into small town life. It's one of their most bittersweet songs, but it also reimagines the "Taxman" bassline - it was the "Start!" b-side.

It's quite perfect.

Wednesday, August 25, 2021

The Gift (1982)

To their credit, Bruce Foxton's basslines are as smooth and melodic as they've ever been on The Gift, and Rick Buckler's drumming is ferocious throughout this album, and on the non-album tracks like "Beat Surrender" and "Bitterest Pill I Had To Swallow". Listening to all six of these albums together, I expected to come away with Sound Affects as my clear favourite, but as it turns out, I have two takeaways (curries, perhaps). I love the ambition of both Setting Sons and The Gift, and I found Sound Affects less cohesive; and, my favourite Jam album is their greatest hits collection, especially if it includes b-sides.
Also, I have a strange obsession with songs which appear to be rooted in the Dr. Who theme, and "Just Who Is The 5 O'clock Hero" fits that bill. "Trans-Global Express" is just too weird, and again, Buckler beats the hell out of it. "Town Called Malice" is just a subtle reminder that this album is, unfortunately, just named after the songs, rather than a play on words, and I'm disappointed that the album wasn't called "A Town Called Malice". Oh well. Overall, though, this one just leaves me wondering why I don't listen to it more. Absolute belter.
It is possible though, that when this album loses me, it's because it is such a belter. A song like "That's Entertainment" hits you hard where it hurts because it feels desperate, in a way "Town Called Malice" doesn't, because it sounds so good. I miss the ballads of the earlier albums. Paul's lyrics work well with sparse instrumentation. This is great though:
A whole street's belief in Sunday's roast beef
Gets dashed against the Co-op
To either cut down on beer or the kids new gear
It's a big decision in a town called Malice
Professionally, I am working with TEI Publisher, and, well, it's quite impressive. In the past, I have worked with DITA and DocBook, which are less useful since the extra semantic tags in HTML5. TEI has a layer of precision that I find quite exciting. Hopefully this will be useful on my current project.
But that's it. These songs definitely are a gift, and I will be going back and adding more about the singles I missed, like "Going Underground". If Paul Weller had stopped after The Jam, that would be an impressive legacy. Obviously, that was not the case. Much of the overt politicization which I tend to attribute to The Jam is possibly better attributed to Setting Sons and a number of singles like "Going Underground", and many early songs that I have enjoyed are much more personal in nature, although songs like "In The City" or "This is Modern World" definitely contributed to the "youth explosion" vibe.

Monday, August 23, 2021

Sounds Affects (1980)

Just learned of the passing of Charlie Watts. I never really listened to the Stones, but wow, what a great drummer. Miss You
Okay, I was completely wrong about "That's Entertainment". The lyrics definitely demonstrate what Paul Weller is capable, but the glue here is the bass, which sits so up front. In a way, this song reminds me of R.E.M.'s "What's The Frequency Kenneth?" - a guitar song with cool lyrics in which the bass carries a ton of emotional weight, and a possibly backwards solo at the end.
The guitar solo in "Start!" may just be the guitar solo from "Taxman", but it's still so good, and I love the way Weller clips his 't' in "What you give is what you GET". Also, "knowing that someone in this life loves with a passion called hate" is very dark, but what a great line. I have always thought that "Start!" starts with "It's not important for you to know my name, but I do know yours", and it's actually "nor I to know yours", so there's that.
This should probably be my favourite Jam album, but I still love Setting Sons so much. Probably my biggest takeaway here is that the elements that I respond to so strongly in "That's Entertainment" - slice of life, working class consciousness, irony without satire - were all present in Setting Sons and songs like "Eton Rifles" and "Smithers-Jones", and there is so much more here than just Paul Weller's songs. He may say he wrote "That's Entertainment"
Maybe he just wanted to wish Keith Moon, who would have been 75 yesterday, happy birthday.
on his way home from the pub, but without the bass track, it would not be the song that it is.
Around this same time, Paul Weller played the main guitar riff on Peter Gabriel's "And Through The Wire" (alternate version), another great song, with an incredible chunky riff. Paul doesn't have the same vocal range Peter does, but they both draw on a lower register that packs a solid punch.

Friday, August 20, 2021

Setting Sons (1979)

Going Underground. What a great single. Overtly political, full of fey fighting posture and clever lyrics, not missing a single punch.
Almost the b-side. Hmm.

Perfect album. All I can say about Setting Sons is it's a more obscure play on words than All Mod Cons or Sound Affects. "Smithers Jones", "Wasteland", "Thick As Thieves", "Eton Rifles", "Saturday's Kids", "Burning Sky"... the musicianship is matched by the songwriting and the production, without losing any of the toothiness of the earlier recordings.

Wikipedia tells me that The Cure's Three Imaginary Boys was recorded using Rick Buckler's drumkit, because they were sneaking into the studio The Jam were using for Setting Sons. And there are some parallels. Three Imaginary Boys would have been a fitting title for the original concept of Settings Sons, about three friends from school diverging in thought politically as they make their way in the world. And both albums get kind of pulled apart for release domestically in Canada and the U.S.

Thursday, August 19, 2021

All Mod Cons (1978)

 Two punk albums in, The Jam leave a lot of those trappings and accept the fact that the "Taxman" bassline has no place in punk, bringing us songs like the one-two punch of the 82 second "All Mod Cons" followed by "To Be Someone". Because the "Taxman" bass line is just that good. Listening to this album after the previous two, though... Rick Buckler's drums just sound so much better. In every song, the drums stand out. My favourite track is still probably "David Watts", with Bruce Foxton taking lead vocals, but again, because of the frenetic drumming. The paired vocals of the two guitar players is also very good. Their voices complement each other well.

"You're the same as him, you're like tinned sardines, get out of the pack before they peel you back..." Foxton could write a song lyric.

The stark honesty of "English Rose" stands out for me as well. It's not the strongest track on the album, but it highlights Paul Weller as a solo performer, and foreshadows "That's Entertainment". It also introduces a recurring Weller theme of the bonds that connect us and bring us back together. Following this with "In The Crowd" is pure genius, and so is "Fly", along with "David Watts", a personal favourite.


Also pure genius - this is when The Jam start using more dad jokes in their album titles and the classic font.

I often feel like the emotional centre of a great rock song is the bassline. When it goes up, we feel up. When it goes down, we feel down. Like those arrows on Paul's sweater on the cover of This is the Modern World, The Jam is a fine balance between the destructive emotional force of punk and the optimism of youth, and the tipping point more often than not is nostalgia - it may not get better until we tear it all down, but don't you remember how we used to meet down the shops, or whatever.

"Down In A Tube Station At Midnight" is just such a good song. Hard to imagine picking this up at a record shop and listening to it for the first time. It was very nearly an album track, but got pulled because Paul didn't think it was quite ready when All Mod Cons was released.

And I feel like Bruce Foxton brings this same balance between rich heavy bass riffs that descend more than they ascend and more melodic basslines that end in the neighbourhood of an octave up... not quite disco, not quite Entwhistle or McCartney, but extremely close. By the end of this album, I'm less likely to want to tear the system down, more likely to go meet people down the shops, and honestly, it's mostly because of Foxton's background vocals and foreground bass.

Tuesday, August 17, 2021

This is the Modern World (1977)

Long story short, This is the Modern World is the Jam's sophomore record, and it's tighter and more polished than In The City, but continues to overlay a punk sound with a very professional modern rickenbacker sound. In the time that it took the Sex Pistols to record Never Mind The Bollocks, The Jam recorded two albums, and honestly... taken together, they would be a great double album.

Again, the standout for me here is Bruce Foxton's bass playing, which brings a mature and aggressive edge to all of these songs. Weller's lyrics are really staggering at times in both their simplicity and complexity, for a lad of 18:

I've learnt to live by hate and pain
It's my inspiration drive I've learnt more than you'll ever know
Even at school I felt quite sure
That one day I would be on top

I love the way this lyric picks up the notion of the arrows on his sweater on the album cover. Every force is opposed by an equal and opposite force, whether it's youth vs. the older generation, right vs. wrong, the urban cityscape and the underground. The things that fill us with hate and pain in our youths will one day fuel our rise to the top.

Life From a Window, one of the slower songs, is one of my favourites here. It also sounds a hell of a lot like the Lemonheads "It's A Shame About Ray", and I think Evan Dando owes Paul Weller a debt of gratitude. The bass playing in the breakdown is extremely tasty, and the guitar playing provides another evolution of Paul's rhythm + lead style. Seriously though, I keep going back and replaying that bass guitar in the middle eight. It's softens the entire feel of the song, actually painting the grey skies into blue, a moment of optimism in a song that goes from lighthouses and post office towers to the depths of pessimism.

Some people that you see around you
Tell you how devoted they are
They tell you something new on Sunday, but come Monday
They've changed their minds

I Need You (For Someone) also shows off what a great drummer Rick Buckler is, but nobody is slacking off in any of these songs.

Monday, August 16, 2021

In The City (1977)

 

Okay, right off the bat, it's been a while since I've used blogger, and this may take some getting used to...

The Jam starts off with a banger. Songs like "I Changed My Address" and the title track really highlight what a smart move it was when Bruce Foxton and Paul Weller switched their bass and guitar responsibilities. I mean, it was 1977, so the drums sound kind of crashy... but the bass sound here is just perfect. At 18, Weller already sounds very intentional. The sound here is punk, but intentionally cleaned up and rethought. The lyrics are smart, about being young, but this belies a maturity that will continue throughout his career, a sense of nostalgia full of "fellows I used to know" and "women I used to see".

"Away From The Numbers" and "Sounds of the Street" are epic Who-pieces, slowing things down to consider heftier subject matter like... well, youth, freedom and nostalgia. "The Batman Theme" is a throwaway perhaps, but it's also a staple, a rite of passage, and a pure bass number. The centrepiece of the album has to be the title track, a social commentary piece about police violence that holds up well, and you can again hear the same intentionality in the way Weller enunciates the word "right-uh" - he has always had a great theatrical sense. My favourite part of this song, and this album, has to be this bit, following a scorching breakdown:

And I know what you're thinking
You still think I am crap
But you'd better listen man
Because the kids know where it's at

I love the way this encapsulates the false modesty and bravado of youth, followed up by a warning that it's dangerous out there, but keep listening, because the band will help you through it. There's a thousand things they have to say to you.

And if it don't work, at least we'll say we tried

Sunday, August 15, 2021

Days of Speed and Slow-time Mondays

 When I first started this blog, for at least a couple weeks, it bore the name "Downing a Tubesteak at Midnight", which I thought was quite amusing... this is a mishearing of a lyric from The Jam tune "Down in a Tube Station at Midnight", a harrowing tale of getting roughed up in the London Underground. Anyway, it's been a while, and I'm trying to get back to my roots, so I'm going back to listening to Paul Weller. The way I see it, The Jam had six studio albums, The Style Council had five plus an ep, and Paul has 16 solo albums, so if I listened to and blogged on about one a day, that's about a month. I can find most of them as streams on YouTube, and I have several of the CDs. I mean, that's a lot of music. It's an impressive back catalog. And it's a plan I may give up on, but it's worth a go.

A few fun facts about Paul Weller to get started:

  • Played guitar on a song on Peter Gabriel's third album.
  • Played Come Together with Sir Paul on the Help! War Child compilation.
  • Referred to Sting as a "F'ing twat".
  • Originally played bass guitar in an early incarnation of The Jam.

Sunday, July 31, 2016

Why is Pokemon Go! so Freakin' Cosmopolitan?

While appreciate the way that games like Ingress and Pokemon Go! encourage people to get out of their homes, away from their game consoles, into the streets... I also find it profoundly disturbing how cosmopolitan this phenomenon is. Of course, I understand - Pokemon Go is based on Ingress, which relies on this concept of XM which is based on population density and high foot traffic areas, so while Google Maps provides a uniform service to all parts of the globe, based on satellite orbit patterns, games based on the Google Maps API provide much better service in cities. Period. You want to catch them all? Go to Santa Monica. I love these games, but I find them disturbing for two reasons:

  1. It goes against canon. The Pokemon storyline goes something like this: Pokemon Trainer Ash explores the continent, making friends and having adventures, learning to triumph over various gym leaders; he succeeds in finding the rarest pokemons in the most obscure places. In the augmented reality game, you need to breed to succeed, and battling gyms is a secondary concern. To get the rarest pokemons, you need to incubate and hatch 10 km eggs, and go to the densest nests. These are high traffic areas. Like Ingress, I'm sure there will be events that will provide access to extremely rare pokemons, and I am entirely sure these will happen in dense, high population, high technology areas.
  2. This is not how ubiquitous access works, at least not for everyone. Imagine you discover you have an odd rash - perhaps you suspect you have Lyme disease, and you have done some preliminary investigation on various public health websites. This is a huge concern. Treatment for Lyme disease should happen ASAP. If you live in a cosmopolitan area, your first concern may be finding a clinic or emergency department that has short wait lines; whereas, if you are in the country, telehealth may be a better option. You may email a doctor a photo of the rash. If you are in an LMIC country or remote region, you may not have easy access to healthcare. Ubiquitous access and a mobile phone may be your only way to get an effective, fast diagnosis and treatment. 
I live in a large cosmopolitan area, surrounded by water, and still, I only have to travel 10 kilometers out of range for the poke-details to dry up. That doesn't seem right. While I understand that this is an augmented reality, it also strikes me that this is a highly one-sided and cosmopolitan view of my reality. This is another Music for Airports, a distraction which encourages city-dwellers to develop good exercise habits and occupy their own event horizons; easy to enjoy, easy to tune out; profound with breadth but not with depth. I suspect that this will, however, result in longer battery life, cheaper secondary batteries. This will drive the industry forward.

Thursday, December 31, 2015

Health and Human Services HL7 FHIR Code-a-thon

This upcoming code-a-thon was news to me, and in a way it’s quite exciting because of the context. HL7 International has run FHIR connectathons at each of its working group meetings since 2011, and these have brought a lot of maturity to the standard, and moved ownership of the draft standard away from the modelling community to the implementer community where it really belongs; Project Argonaut has brought more urgency, using Meaningful Use as a vehicle, and people like Dr. John Halamka and Josh Mandel have been very vocal about its importance.

But this is HHS, which has put a lot of support behind the NIEM Health Domain. To be fair, there could be massive crossover potential between NIEM and HL7, since both are more or less resource-based, using what NIEM calls Exchange Packages, and FHIR calls Bundles. In the long view, it’s not much of a stretch for a health information package (message or document) to contain information formatted as both kinds of resources, bundled as JSON, backed by XSD or CAM.

For anyone interested in Integrated Case Management and crossover potential between Justice and Health, this is definitely exciting. What's probably most important here, though, is the message about SMART on FHIR apps operating with an Argonaut API. This is complete blue sky at this point, but when you look at the number of EHR vendors involved with Argonaut (MEDITECH, Cerner, McKesson, and Epic, to name a few), this could become a reality very quickly.

http://www.healthdatamanagement.com/news/Feds-Plan-FHIR-Code-A-Thon-to-Advance-API-Development-51791-1.html

Friday, June 05, 2015

My jsFiddle Bag of Tricks

I'm just going to say it, I love jsFiddle.net. Like others pastebins such as Gist or CodePen.io, jsFiddle allows you to rapidly prototype HTML/JavaScript/CSS and test the result in real time. There is extensive library support, and you can do tricky things like embed your results as an iframe on a GitHub page, or use GitHub to back up a demo. But the basics of jsFiddle are that you can create a small to medium application, share it easily so others can fork it, and tweak it to your heart's content, with easy to use restful routing and version control. What's not to love?

In order to make the most of jsFiddle, however, I had to sort out a few things. Please feel free to share your own bag of tricks, and here are some of mine.
  1. Use the Ionic bundle as an External Resource. You can select AngularJS 1.2 from Frameworks and Extensions, but if you add the following links to External Resource, you will get a bundle containing both AngularJS and the Ionic Framework, which allows you to do some clean mobile UI.

    http://code.ionicframework.com/1.0.0-beta.6/js/ionic.bundle.js
    http://code.ionicframework.com/1.0.0-beta.6/css/ionic.css


    You may strip out the Ionic stuff before you release your work, but I have found it to be a great framework for rapid prototyping with a Mobile First mindset. Cards are great. Also, ngCordova is an extension for Ionic which allows you to embed your work into iOS or Android using PhoneGap.
    Ionic may not be perfect (it's still in beta), but it is very Mobile First, useful for rapid development, and has a lot of similarities with Bootstrap. Try it out.
  2. Embedded results pages are great, but they often fail to load until you change "https" to "http". Same goes for the External Resources. Get used to quietly deleting the "s" during demos, and hoping that nobody notices.
    GitHub and jsFiddle can work very well together. I suspect you could get similar results with Gist or Codepen, but I personally prefer jsFiddle. Learn to use social repositories to create individual code samples and project pages.
  3. JSONP can work, this is very handy. I often set up JSONP files, JSON wrapped in a function call, on a GH Page on GitHub, so that I can access them later as though they were an actual API. In order to do so, rather than echoing the call from the jsFiddle itself, I have a useful Angular directive I use:

    rhizomeBase.factory('jsonpService', function ($http) {
        var svc = {}, jsonp_data   
        jsonp = function(data) {
            jsonp_data = data
        }
    
        svc.getData = function(callback, url) {
            $http({
                method: "JSONP",
                params: {
                    input: "GM",
                    callback: "jsonp"
                },
                url: url,
                isArray: true
            }).success(function(data, status) {
                callback(jsonp_data)
            }).error(function(data, status) {
                callback(jsonp_data)
            });
        };
        
        return svc
    });

    All this service does is set up an http: request as a promise, and then apply a callback whether the request succeeds or fails. It turns out that when the request succeeds, jsFiddle treats this as a failure, but all of this gets hidden in the service. In practice, once you have an Angular application set up in jsFiddle, you can call inject the service into your controller or directive and invoke it with a very direct call like this:
    jsonpService.getData(function(data) {
        alert(JSON.stringify(data))
    }, url)
    One of the things a pastebin allows you to do is prototype a client application without having to worry about building a server-side API first. Hosting a handful of sample messages on GitHub is a good way to accomplish this.
  4. Use appropriate standards. This is really the flip side of  building a client-side application first. If you have access to a JSON-based standard like NIEM, or you can use a snippet gleaned from Schema.org, this will save you some design time and get you moving in a forward trajectory. In my case, the JSON flavour of HL7 FHIR, the component-based nature of Angular, and the ease of use and built in UX touches of Ionic are a perfect storm for the kind of work I like to do, and jsFiddle is the glue that holds these together.
    If you can, learn and use appropriate standards.

Sunday, January 04, 2015

Using AngularJS with HL7 FHIR Questionnaire

This  is a very simple example using Angular templating (no directives) with an HL7 FHIR Questionnaire resource, which I am using directly from one of the public FHIR servers (Grahame's to be precise). In addition to the machine-readable content for question groups and answers, I am creating a rudimentary service to manage coded concepts (ie value sets), and I am displaying the human-readable portion of the resource (the HTML text div) as well. This is really just a beginning, and one thing I would like to build into this demonstration is the ability to use embedded SVG for the human-readable portion, as it seems to me that existing PDF questionnaires could be converted to SVG and thus embedded. Makes for a large resource file, but this would be a great way to retain the look and feel of existing documents, once an easing library is used to zoom in on the appropriate area of the SVG. I'm calling this demonstration "QuestionCare" because I think it would also be useful to be able to use Careplan within this context.

We begin with a root HTML that sets up my Single Page Application, and a reference to my Rhizome library, which contains a number of useful client-side services:
<body id="content" style="display: none;" ng-app="questioncare">
      <h3 ng-controller="ErrorController" ng-bind="errorText" ng-show="showError"></h3>
      <div id="request" ng-controller="RequestController">
        <button id="view-questionnaire" ng-click= "viewQuestionnaire()">View Questionnaire</button>
      </div>
      <ng-include src="res/templates/Questionnaire.html"> </ng-include>

This corresponds to a single line in the javascript initialization:
var questioncare = angular.module('questioncare', ['rhizome', 'ngSanitize']);
 We'll see how the ngSanitize module is required in order to handle rendering the human-readable HTML div from the Questionnaire resource as HTML, instead of text, using ng-bind-html. In any case, we are setting up a controller to handle a request, and then we are including a template to handle the response. The rest, as we shall see is handled through controller code and client-side services, but let's take a quick look at the included template for Questionnaire:
<div id="questionnaireResponse" ng-controller="QuestionnaireController" ng-show="showQuestionnaire">
  <div ng-bind-html="humanReadable"></div>     <hr/>
  <div ng-bind="questionnaire.name.text"></div>
  <div ng-bind="group.header"></div>
  <hr/>
  <ol id="questions">
    <li ng-repeat="question in group.question">
      <div ng-bind="question.text"></div>
      <ol id="options">
        <li ng-repeat="option in getOptions(question.options.reference)">                    [<span ng-bind="option.code"></span>]:
      <span ng-bind="option.display"></span>
        </li>
      </ol>
    </li>
  </ol>
</div>
 That takes care of the HTML. The request controller invokes an adapter (this is running on IBM Worklight), and then sends the response to the questionnaire controller using $rootScope.broadcast, but first it calls a client-side service which I have made responsible for managing codes; in this case, the value sets for the different options you can pick when you answer the questionnaire.
questioncare.controller( 'RequestController',
  function($scope, $http, $rootScope, errorService, codeService) {

    $scope.viewQuestionnaire = function() {
           
      var invocationData = {
        adapter: 'FHIR',
        procedure: 'getQuestionnaire',
        parameters: []
      };
           
      WL.Client.invokeProcedure(invocationData, {
        onSuccess : function(result) {
          if (200 == result.status) {
            var ir = result.invocationResult;
            if (true == ir.isSuccessful) {
              $scope.$apply(function () {
                var questRes = ir.content;
      codeService.loadCodedConcepts(questRes.contained);          $rootScope.$broadcast('qr', questRes);
              });
            } else {
      errorService.worklightError('Bad Request');
            };
          } else {
      errorService.worklightError('Http Failure ' + result.status);
        };
      },
      onFailure : errorService.worklightError
    });
  }
});
The codeService itself is quite simple, although, since value sets could potentially come from a variety of places, this service could become a lot more complicated. In this case, I am just scraping contained value sets from the Questionnaire resource itself:
rhizome.factory('codeService', function($rootScope, errorService) {
  var codeService = {};
  codeService.codedConcept = Object;
   
  codeService.loadCodedConcepts = function(contained) {
    for (c in contained) {
      codeService.codedConcept[contained[c].id] = contained[c].define.concept;
    }
  };
   
  codeService.getCodedConcept = function(opt, remHash) {
    if (remHash) {
      opt = opt.substr(1);
    }
    return(codeService.codedConcept[opt]);          
  };
   
  return codeService;
});    
Angular services can be difficult to grasp at first, but they are one of the more important features of the framework, since they allow you to make your client-side more portable and standardized; however, this particular service is little more than a stub at this point. It deals with a hash sign which is probably included with the value set id, which is useful. Once the coded concepts have been scraped out of the Questionnaire, the document is displayed using the included template and a response controller.
questioncare.controller( 'QuestionnaireController',
  function($scope, errorService, codeService) {
   
    $scope.showQuestionnaire = false;
   
    $scope.$on('qr', function (event, arg) {
      $scope.questionnaire = arg;
      $scope.group = $scope.questionnaire.group;
      $scope.humanReadable = $scope.questionnaire.text.div;
      $scope.showQuestionnaire = true;
    });
          
    $scope.getOptions = function(opt) {
      return codeService.getCodedConcept(opt, true);
    };

});
Again, there is nothing too complicated here. Notice how the humanReadable questionnaire text div gets bound into an element that allows HTML to be rendered. Also, a second function is used to get and then display the options because these need to be repeated, as you can see in the Questionnaire.html. In addition, the entire questionnaire template is hidden until it is populated.

Next steps here will be to work with nested questionnaires, where selected options will traverse through a hierarchy of question groups. At this point, it may be useful to use Angular custom directives, although I am also trying to be careful about anything that will be subject to change with Angular 2.0, such as controllers.

More and more as I work with Angular, Worklight and HL7 FHIR, it strikes me that what is important here is building a library of standard services and templates on the client side, and then simply binding into it. Once DSTU2 is complete for FHIR it will become less of a moving target, but resources like Questionnaire, which has been the subject of several connect-a-thons now, seem especially stable.

Tuesday, December 30, 2014

MatchstickTV and FirefoxOS

Earlier this year, I spent some time developing for FirefoxOS, a Mobile OS based on a linux kernel and Mozilla browser. To be honest, I have a Revolution phone from Geeksphone which flashes between Android and FirefoxOS, and it has been Android since day one. It work well for what it needs to do as an Android device. However, the idea of an instant developer community for FirefoxOS is compelling - it just hasn't appeared yet because the OS hasn't become a large enough target yet. And, like ChromeOS before it, this may never happen.

MatchstickTV is a recent kickstarter project that takes FirefoxOS and uses it to run an HDMI dongle very similar to Chromecast, but based on open source apps on an open source development platform and an open source OS. It's a little cheaper as well, but I suspect that is not an important selling feature. On the other hand... because there is nothing in particular to license here, this sort of thing could become a great conference giveaway over time, just like USB sticks used to be.

Honestly, I think a tablet using FirefoxOS with a bunch of onboard educational applications - similar to the original OLPC program, perhaps - would be a really good thing. There is a niche for browser-based mobile, and Mozilla is doing a lot of smart, good things to capture it.

Monday, December 29, 2014

Atomized Integration, IBM Worklight and AngularJS

Over the past year, I have worked fairly extensively with IBM Worklight, Big Blue's enterprise mobility package. In the coming year, I plan to find more things to do with Bluemix, IBM's cloud mashup line; for now, some thoughts.


In general, my guidance has been to use open source mobility frameworks, PhoneGap for cross-platform, Bootstrap for Responsive Web Design, Angular for templating, and some form of OAuth2 for security, at least until the vendor solutions from IBM, Oracle, et al reach a higher level of maturity, since these are stepping stones.

If you look at the latest Gartner quadrants for enterprise mobility and cloud for the previous year, you will see IBM maturing in the MADP space and Oracle maturing in the cloud space... but maturity in both areas is necessary for enterprise mobility to fire on all pistons.

Worklight does three things really well:
  1. Simple adaptation on the server-side, using Rhino-based Javascript adapters.
  2. Integrating with existing Websphere and SAM infrastructure.
  3. Increasing productivity through modularization and emulation.
Probably the biggest win here is 3. I started out 2014 working with Firefox OS, Saxon-CE and AngularJS, so I was already committed to using Javascript and XSL as much as possible, and Worklight Adapters played into this approach nicely; however, after *hating* the slowness of native Android development using the Android toolkit, what I appreciated most about Worklight was being able to use an emulator that ran as smoothly as the Firefox OS simulator (which is really just a browser plugin). On the server-side, we are becoming more accustomed to devOps tools like JRebel; on the client-side, we should have similar expectations - is, don't use the Android emulator if you can avoid it. It sucks.

I have mentioned previously how much I like Worklight's lightweight Rhino-based adapters. They are intentionally lightweight, eschewing any sort of SOA reusability. A Worklight adapter does one thing, and it does it well. This can be initially quite pleasant, then very frustrating, and then liberating, as you sort out how much integration you need to do in your client applications. My experience has been that a well designed piece of XSL can convert an XML data source into some standards-compliant JSON, and then a client-side library service can take it from there.

For instance, consider that I have an XML data source containing a number of patient records. Let's say it is NIEM compliant XML. I could build a client application that can consume NIEM compliant JSON, and then all I would need to do in Worklight is create a very simple boilerplate adapter that transforms the XML into JSON. This is assuming that my server-side data source doesn't already support JSON-flavoured NIEM, which would be even simpler. In other words, if my intent is to take a NIEM compliant data source and build a NIEM compliant mobile application, this is quite straightforward. Server-side Worklight adaptation transforms XML into JSON; client-side Angular data-binding injects JSON into the HTML-based presentation layer, and presto, you have an application.

Granted, the development process is not that easy, and let's consider now that we have a number of data sources, some of which are NIEM compliant, some of which are HL7 compliant, some of which are based on direct SQL access, and some of which are ad hoc.

When you look at the various Worklight adaptation examples, you might get the idea that RSS is treated preferentially, which is untrue; however, thinking of these adapters as syndication is still a useful approach.

Throughout the past year, I have been working with HL7 FHIR, a draft standard from HL7 that among other things introduces a JSON-based pattern for aggregation and composition that is essentially Atom syndication in JSON instead of XML. It turns out that if all of my Worklight adapters create Atom-compliant JSON on the server-side, then I can use a Javascript Atom library in the client, and it really doesn't matter what format my data sources are using. By the time they reach my client application, they are all Atom-based.

The client-side service that I have written - using Angular for modularization - is responsible for merging multiple Atom streams. Once I have a single Atom stream, data-binding takes place, so that information can be presented. In practice, this can be frustrating because Atom is intended for serialization of information, but an Atom bundle can also contain relative links between entries. This is fundamental to the way HL7 FHIR works, but not NIEM, so I have ended up creating synthetic and essentially schemaless resources as necessary. Ideally, all information could be mapped into Atom-syndicated FHIR resources. Maybe that's a good project for this year.

Adaptation frameworks always run into a problem based around the decision to go lightweight or go modular. I like that Worklight has gone lightweight, but I am frustrated that I can't reuse just a little bit more code between adapters. In particular, I would really like to use a single set of XSL transforms to support multiple adapters. Perhaps there is a way to do this, but for now, I am still forcing myself to prune my adaptation code as much as possible to keep it easy to maintain. If I find myself using the full set of DocBook or DITA transforms in an adapter, it's probably time to rethink my approach.

On the whole, I have enjoyed working with Worklight adapters immensely; I don't think this would be the case if I was not also using Angular or some other Javascript framework to support development of client-side services. I haven't particularly used the built-in Worklight support for Dojo or JQuery, but I'd go so far as to say that without some sort of hybrid framework support, you will lose much of the productivity that Worklight gives you. After a year, I have reached an understanding that I would not enjoy using a framework like Angular without a platform like Worklight, and I would not enjoy using a platform like Worklight without a framework like Angular.

Unless, of course, the platform was also a framework, which is what approaches like Meteor promise. 

  

Saturday, December 27, 2014

Some Canadian Context for HL7 FHIR


I work in Healthcare Messaging in Canada; specifically, I work in messaging in British Columbia, where we work primarily with Point of Service applications and Clinical Information Systems that generate and consume messages in the HL7 v2 pipe and caret notation, with a foundation of registries and repositories that use a version of HL7 v3 Messaging XML. More or less, this follows Canada Health Infoway's iEHR blueprint; however, following Infoway's original blueprint, we would have HL7 v3 at the Point of Service as well as the foundation.

HL7 v2 is still used extensively in other Canadian jurisdictions. Some use v2 almost exclusively. In Canada, we have a mix of v2, v3, with some CDA. The United States, on the other hand, never embraced v3, creating a desperate need for a better messaging layer. In this case, FHIR will accomplish things in the U.S. that v3 could not, and that leaves Canada in a challenging position - continuing on with further investment in HL7 v3 makes little sense. Like CDA before it, FHIR can be used to augment these projects; there are enough similarities between FHIR XML and v3 Messaging to make this plausible.

Ongoing CDA projects in Canada are bound to continue as such, which will be worth paying attention to as CDA projects in the States start shifting to HL7 FHIR as an implementation standard. The message from Infoway recently here is to use the appropriate standard for the work at hand, and I expect this message to percolate on both sides of the border; but what does this really imply? How do you decide? For new business cases which would previously have required a document standard like CDA, HL7 FHIR is going to be compelling, as well as low risk, local, and greenfield projects.

Worth noting is the four ways that FHIR can be used. As previously discussed, FHIR supports both Messaging and Document use cases; but, perhaps more importantly, FHIR also supports both REST and Service use cases. In addition, FHIR is in many ways custom built for the security and transport requirements of mobile use cases, and contains resource definitions that will enable social use cases like circle of care and information provenance. For existing health information systems and applications, as well as new, FHIR creates new ways to expose, access, and share information; providing not only tools, but also challenges.

Tuesday, December 23, 2014

Yosemite Project and other Chimera

In Greek mythology, the chimera  was a monstrous fire-breathing hybrid nightmare composed of the parts of more than one animal, a lion with the head of a goat rising out of its back, and a tail with a snake's head; a nasty piece of business, eventually dispatched by Bellerophon with some assistance from Pegasus.


Chimera was also the subject of a presentation by Jeni Tennison, OBE, of the Open Data Institute and W3C TAG, at XMLPrague 2012, entitled "Collisions, Chimera and Consonance in Web Content." In this presentation, she introduces a compelling argument that suggests that currently, in the web, we are dealing with four different formats: HTML, XML, JSON, and RDF.

In many ways, these formats complement one another. Sometimes, they clash, creating impedance and dissonance, and sometimes they merge, forming weird and wonderful hybrids. Tennison's presentation is really quite remarkable, and well worth watching as each of these formats evolves.

As I have previously mentioned, another set of presentations, from Dataversity and SemanticWeb.com, are also worth watching and paying attention to. These deal with the Yosemite Project, ongoing work which intends to position RDF as a Universal Healthcare Exchange Language. This work is important in part because it directly addresses how to go about migrating and transforming between formats, once you can establish a common representation using RDF. In many ways, this is a mythical undertaking, but also very promising.

For instance, with the work underway with Project Argonaut and HL7 FHIR, you are looking at a standard for healthcare that comes in two flavours, XML and JSON; however, like its predecessor HL7 CDA, FHIR relies on a human-readable portion, which in this case means HTML5. Add to that the work underway with Yosemite - go watch the presentations! Now you have an ecosystem that supports appropriate use of HTML, XML, JSON, and RDF - the subject of  Dr. Tennison's XMLPrague presentation - now in the context of healthcare. This is really what John Halamka has referred to as the "HTTP and HTML for healthcare".

If you broaden your horizons just a little, you will see some of the work which is also being carried out by Health & Human Services and the NIEM Health Domain, as a counterpart to the work of HL7 International. NIEM is primarily an XML-based standard, but in the last couple years, the underlying tooling there is expanding into UML-, JSON-, and HTML-based representations. With the support of some underlying ontology work, perhaps in concert with Yosemite, NIEM too could be used to create linked health data. These are all very exciting, very important things that are happening very very quickly, and it is a great time to get involved with some of these projects and initiatives.

Monday, December 15, 2014

Project Yosemite, SMART on FHIR, and the Argonauts

The Argonaut Project is a collaboration between Health industry vendors like McKesson, Epic, Meditech and so forth, along with the Mayo Clinic and Beth Israel Deaconess Medical Center, to provide the necessary resources to complete the work of the upcoming HL7 FHIR DSTU (Draft Standard for Trial Use). As Grahame Grieve elaborates on OpenHealthNews, Argonaut is aimed at three particular pieces of work:
  1. Security
  2. CCDA to FHIR Mapping
  3. FHIR Implementation Testing
This work is intended for completion by May 2015. As described, the Security piece initially involves SMART on FHIR®, a platform developed by Harvard Medical School and Boston Children's Hospital, implementing open standards for healthcare data, authorization, and UI integration. For authorization, SMART uses OAuth2, a profile for which will most likely become built in to the FHIR standard.

Josh Mandel, the lead architect behind SMART on FHIR® also spoke recently as part of a series on  of five presentations on Project Yosemite, held by SemanticWeb.org and DataVersity. Project Yosemite began a year or so ago with the Yosemite Manifesto, which establishes RDF (the Resource Description Framework that underlies the Semantic Web and Linked Data) as the best candidate for a universal healthcare exchange language. Project Yosemite follows two paths, "Standards" and "Translation", based on the premise that standards adoption is of primary importance, but that there will always be a need to translate between standards, and even between versions of the same standard.

The idea here is that once you build ontological mappings of various healthcare standards into RDF representations, then Semantic mapping tools like SPINMap and TopQuadrant's TopBraid can be used to construct robust migration/translation layers. This is the first step in producing a distributed network of Linked Health providers, similar to the work currently taking place with Linked Data. At this point, the presentation recordings from DataVersity are not yet all available, but they are definitely worth watching.

HL7 FHIR provides a potential successor to several HL7 standards currently in use internationally. Migration is a critical success factor here, and Project Yosemite presents a different way to approach migration. Perhaps coincidentally, RDF and FHIR are both resource-based approaches; RSS is a syndication format that emerged from work with RDF, and FHIR uses a similar syndication format, Atom, to aggregate and compose health resources, like Patient and Observation.

Project Yosemite benfits FHIR and Project Argonaut, Argonaut accelerates the first phase of ONC Data Access Framework (DAF) project. Project Yosemite is involved with ICD-11. This seems like lot of convergence, and the next 6 months will really show how much. It's a great time to get involved.