SyntaxHighlighter

SyntaxHighlighter

Monday, September 26, 2016

An ast "Hello World": Getting Started with Python's Abstract Syntax Trees


I've been working on a Python library which - for a number of reasons - needs to dynamically alter itself. Essentially, I want it to parse a document and to generate some code based on that parsed file.

ast

It turns out that Python's ast module lets me do exactly what I need. I came across some quite useful supplementary documentation on ast. But, to get started, I needed something simpler that those advanced examples. I therefore wrote a "Hello world!" program using ast. Here it is, in case you were looking for that, too.

Hello world!

Since I've become test infected, I wanted to structure my "Hello world!" ast program using unit tests.

So, to start, I tracked down a suitable "Hello world!" unit test in Python.

Hello world! in ast

Then I rewrote the Greeter.py class to use ast. My version constructs an abstract syntax tree for an Assignment. Specifically, it assigns the string "Hello world!" to the variable "m". The code then fixes the locations, compiles the code and executes it dynamically.

Obviously, the above code is a lot more work than simply assigning the string value to the variable directly. But it meant I now had the world's simplest ast program.

Nothing

Armed with this most basic of unit tests, I was then in a position to work out how to support various other types of code in ast.

For example, here's a snippet of ast code which uses ast to generate an abstract syntax tree to assign an empty type to a variable named "nothing". In other words, equivalent to nothing = ()

Invoking Methods

One of the hardest things for me to figure out was how to invoke a method of a class.

First, I worked out to call a function - one not attached to an instance of a class. But to call a method of a class, I needed to understand a bit more about how Python itself is implemented.

Calling Functions

Here's some Python ast code to call a function _foo() and assign the returned value to a variable called "result", i.e. equivalent to result = foo() And here's a variant where you pass in a value, i.e. equivalent to result = bar("some value")

In Python, Methods are Attributes of Classes

Having figured out how to call functions and pass parameters to them, I reckoned that calling a method on a class would be similar.
And it sort of was - I still needed to use ast.Call to invoke the method. But it took me quite a while to figure out how to tell it which class method to call. For example, if I wanted to call

result = self._baz(theResult)

should I pass in a function name of "self._baz"? (I tried that - it didn't work). Eventually, I worked out that self._baz is an attribute of the instance object referred to as "self". In Python, instance objects have two kinds of valid attribute names, data attributes and methods. Which meant that the code to call one method of an instance from another method looks like this:
I had never thought that profoundly about how Python is really implemented behind the scenes. Although many of the Python design decisions are actually quite well documented.

An ast Short Cut

In the process of working out how to invoke instance object methods, I came up with a general-purpose shortcut. It turns out that - since Python 2.6 - ast has a very handy helper method called "ast.parse()". This - in combination with ast.dump() - will let you very quickly figure out the correct ast pattern to use for a given bit of Python code. For example, here's how to figure out how to invoke an instance object method

005-Syntax by vicdunk
https://flic.kr/p/dUdQkm
Hopefully, that will be enough to get you going on your own Python ast adventures!

Monday, September 19, 2016

Falcor and GraphQL: Querying JSON APIs (Part Five of Three)

What's the best way to query a REST API which returns JSON? I look at two popular libraries - Netflix's Falcor and Facebook's GraphQL - which aim to overcome problems with API performance and "chattiness".

Querying JSON

XML (and related standards such as XSLT and XQuery) benefit from the power of XPath for selecting and querying XML. However, JSON has no direct equivalent to XPath. (Although there are a lot of projects which have named them selves [jJ][Pp]ath!)

I still like the approach taken by JSONiq- it is essentially XQuery for JSON. However, in this post, I want to talk about two libraries - Falcor and GraphQL - which address the problem in a somewhat different way: how to get just the JSON you want from an API?
2009APR101606 by Peter Renshaw
https://flic.kr/p/6dYAsw

Trade Offs: Speed and Complexity

When you write a client for a typical REST API, you have to confront two basic problems: performance and complexity. On the one hand, if a REST API contains more data than you need, then you're paying a penalty for every unnecessary byte (being transferred over the network and parsed by your code). On the other hand, if a given API response doesn't have everything you need, then you will need to make follow-up calls, which adds complexity and, of course, more latency as you choreograph the back-and-forth.

The designer of the REST API should try to anticipate likely uses, so that they can provide just the right information, in the right ways. And, as I've previously recommended, it is a good idea to build in support for full or partial API responses. However, part of what is exciting about APIs is that they unlock innovation. So, if your API is a success, you will - by definition - have hard-to-anticipate uses of your design.
Sit! by Craig Sunter
https://flic.kr/p/rZ2tyS

Sitting in the Middle

Rather than rely on the REST API perfectly fitting your needs (or supporting a powerful query language) why not have an adapter which sits in-between your client and the REST API? Both Netflix's Falcor and Facebook's GraphQL take this approach: they are each implemented as servers which you configure to turn the REST API you have to work with into one that you want to work with. They differ somewhat in their philosophy and power, however.
Falcor

Falcor - All of the Data in One Giant Model

Netflix has open-sourced their Falcor library, which they use to power their UIs. At the time of writing, it is still in "Developer Preview", however, many people outside of Netflix are using Falcor. You can try out the demo Falcor application or read the Falcor documentation for more details.

Falcor adds some capabilities to the standard JSON model - such as "virtual JSON models" and a "JSON Graph" - to make it easier to cache data on the client side. Using Falcor, you can

  • eliminate the need for multiple HTTP requests to get all the data you need
  • cache the data locally for better performance
  • deal with data using graphs, which are more flexible than the standard tree-model used in JSON
  • adapt JSON or non-JSON APIs into a JSON model customized for your application

Falcor is a server-side Javascript library run within a nodejs server. You construct a Falcor data model and define how each component maps to the actual APIs you need to use via "paths". Your application then interacts with the Falcor data model you've defined, while the Falcor server takes care of interacting with the APIs to get you the data you need, including handling caching for greater performance - particularly when you have multiple instances of your application querying a single data model.

A nice overview of working with Falcor is provided by Auth0. And you can find a lot more documentation on the Falcor website.
GraphQL

GraphQL - a Schema and Resolve Functions

Facebook has open-sourced their GraphQL library, which they developed to power their mobile and web apps. At the time of writing, Facebook has released a working draft of the GraphQL spec and a reference implementation in Javascript. They have also created an implementation you can actually download and use. Various people have started to build GraphQL tools and implementations, including GraphQL support in Python (one of my favourite languages). Check out the GraphQL documentation for more details.

As a GraphQL client, you send the server a query, which defines what data you want back. For example

{
  user(id: "1") {
    name
  }
}

Which says "give me back the name of the user who has an id=1".

On the GraphQL server side, you need to configure the schema and the resolve functions. The schema defines the data model which may be fetched from the server. The resolve functions map the fields in the schema into the backend services. A GraphQL resolve function therefore contains whatever code is necessary to fetch and transform data from a backend service - such as a REST API, a MongoDB or a SQL RDBMS - into the form promised by the schema.

There's a nice overview of working with GraphQL on RisingStack. And you can find Facebook's full documentation on GraphQL.

"Choice" by Jeremy Brooks
https://flic.kr/p/nyPkd2

Which One Should You Choose?

Falcor is somewhat simpler to learn than GraphQL. In part, this is because GraphQL is more powerful - in particular it has a much a more sophisticated query capability. Both libraries have been implemented in Javascript, but only GraphQL is designed to be implemented in other languages, too.

Finally, it is worth considering whether you want to adopt either one at all: the REST architecture (when implemented correctly) has tremendous support for caching and scalability. So, rather than abandon a REST API altogether, consider whether you have the option of instead tuning it to perform better (tip: look at the granularity of the resources you've defined).

Designing JSON

This is part of my occasional series on designing and working with JSON:

This post - the fifth in the trilogy - picks up on a topic I discussed in Part 3 - Lessons Learnt - how to select and query the JSON you get back from an API.

Tuesday, July 26, 2016

Making Progress on Rights - W3C Permissions Obligations and Expressions First Public Working Drafts


I've been working within W3C's Permissions & Obligations Expression (POE) Working Group as an Invited Expert. We have just issued our First Public Working Drafts:
"one" by Andre Chinn
https://flic.kr/p/5pGcyx
The W3C POE WG aims to create recommendations for permissions, obligations and licensing statements for digital content. The WG is using the W3C ODRL Community Group specifications as the starting point for its work. These are the same specifications which form the foundation of IPTC's RightsML work.
"poe" by 为民 王
https://flic.kr/p/gp2Bc
If you're interested in digital content, then I recommend looking at - and commenting on - the W3C POE drafts. The ODRL Information Model describes the foundational concepts, entities and relationships of ODRL. The ODRL Vocabulary & Expression describes how to encode the ODRL model in XML, JSON and RDF.
"Use in case of emergency" by Katia Sosnowiez
https://flic.kr/p/5MMhFz
The POE WG has also published the Use Case and Requirements Note. I have contributed one of the Use Cases: News Permissions and Restrictions. Again, the Working Group is looking for feedback on - and contributions to - the Use Cases, so that it can derive a detailed set of requirements for the POE work.

Monday, July 20, 2015

Do the Right Thing

"Do the Right Thing" by Laure Wayaffe
https://flic.kr/p/4TsH5c
Da Mayor: Doctor...
Mookie: C'mon, what. What?
Da Mayor: Always do the right thing.
Mookie: That's it?
Da Mayor: That's it.
Mookie: I got it, I'm gone.


Tony Crabbe asserts that time management is just making our busy lives worse - that the emphasis on breaking down tasks into smaller and smaller slices does mean that you cram in more stuff into a given time period but that you're not getting to the big, important things that can't be timesliced.

 Tagged! by jdhancock
https://flic.kr/p/4TsH5c
Maybe. Or maybe the techniques which used to work no longer do, since those techniques are actually changing us?
By coincidence, I've been playing with some ways that are a little different than the make-a-list and tick things off style of time management. Though I'm treating all of them as supplements, to try and help me get to the important-but-not-urgent things.
13/52 : Charte canadienne des droits et libertés by Eric Constantineau
https://flic.kr/p/9ukSAr

Habitrpg - "HabitRPG is a free habit building and productivity app that treats your real life like a game. With in-game rewards and punishments to motivate you and a strong social network to inspire you, HabitRPG can help you achieve your goals to become healthy, hard-working, and happy."

So, in fact, this is pretty close to the traditional make-a-list time management technique, but with added gamification. However, what I use it for is things like chores or habits that I want to cultivate but don't want to clutter up my to-do list. I can pick which days of the week I want dailies to appear and I associate different levels of difficulty. It has nice feedback to tell me how often I'm getting to something (e.g. by changing colours), has a holiday feature (where you check into an Inn) so you don't get penalized for changes in your routine but also let's you declare task bankruptcy by killing your character off altogether and then getting a fresh, re-incarnated one. Fun.
harpseal by gale
https://flic.kr/p/8TVRq
BJ Fogg's "Tiny Habits program can create new behaviors in your life." In some ways, this is the ultimate timeslice technique, in that you break down things into the tiniest possible steps - e.g. rather than "I want to floss my teeth twice a day" - you resolve "I will floss a single tooth". Then you tie that action to a trigger action - something you do routinely - e.g. "after I step out of the shower". The idea is to grow a set of positive new habits to habits you already have. Of course, if you're already flossing one tooth, you may as well floss a second. So, eventually, you find yourself flossing all of them. Although these are microtasks, they are not on your to-do list. Instead - the hope is - they just become automatic habits, that you don't need to think about.
I've been able to develop some good habits (e.g. tidying up my car) but - like everything else - sticking with it is the tricky thing. And not *every* desirable habit is easy to pair with a trigger action.
The Chili Pipeline by Viewminder
https://flic.kr/p/aL62z6
Blog Course - John Somnez (of SimpleProgrammer) offers a "FREE Email Course "How To Build A Blog That Will Boost Your Career" Will Show You How To Do It The RIGHT WAY... FAST!". It is essentially a three week course that takes you step-by-step to setting up a blog, from setting up Wordpress through a marketing strategy. Posting to my blog is something I know I should do - and have been kinda doing for the last few years. Actually having someone email me about it every week, with concrete steps to follow and even personally replying to my emails, makes a big difference with really doing it, though. Basically, John's course isn't a time management technique, but more of a coach - helping me do what it is I know I *ought* to do, but haven't been able to do entirely on my own.
Vulture Peak by Wonderlane
https://flic.kr/p/6B5sD2
Lark - A fitness / nutrition app, Lark lets you "Chat 1-on-1 with your nutritionist in your pocket". On my iPhone 6, it makes use of Apple's iOS 8 HealthKit, to track my daily movements. It can also be configured to help me with nutrition, by letting me log what I eat. What's different about this one is that it simulates someone texting with you. It is like a relentlessly upbeat friend, who is obsessively monitoring how much you walk or run each day, plus always asking about what you've had for breakfast. That might sound annoying, but it is actually pretty encouraging. It has certainly got me eating more fruit and vegetables and nudged me into exercising a little more.
do the right thing by paolobarzman
https://flic.kr/p/b2h2fc
The last two I list above - John's Blog Course and the Lark chatbot - are an interesting development, beyond time management lists. They are essentially coaches who encourage you to do the things you know *should* be doing, but aren't: do the right thing. That's it.

Wednesday, April 22, 2015

Getting Topical at the IPTC Spring Meeting

Last summer, I became Chairman of the IPTC. My goal as Chair is to make IPTC better by improving the face-to-face meetings and improving how we communicate. So, how are we doing?

The IPTC is the global standards body of the news media. We provide the technical foundation for the news ecosystem. We recently held our Spring face-to-face meeting in New York, NY. Feedback from attendees was that the meeting was a success.

One of the things we did differently in this meeting was to put less emphasis on formal reports from the different standards initiatives within IPTC and more focus on active discussions, even when not connected to a particular standard.We held five topical sessions:
  • Taxonomies in news and the semantic exchange
  • Sports working session on Sports-in-JSON and new semantic tools in SportsML 3
  • HTML in NewsML-G2
  • Video metadata
  • APIs

Generally, the feedback on these was very positive. The main complaint was that sessions were held in parallel, whereas some people wanted to attend more than one topic session at the same time.

Also, taking advantage of our location in NYC, we were able to include a wider net of organizations and individuals in our meeting than might other wise attend - including Bloomberg, NPR, Business Wire, PR Newswire.
Overall, the meeting was much less formal than in recent years - we only had one vote (for a NewsML-G2 update). Hopefully, the meeting was a little friendlier and less intimidating for new attendees.

We are planning on building on this experience for our next face-to-face meeting 1st-3rd June in Warsaw. You can see some of the ideas that have been suggested already and please get in touch if you would like to suggest a topical session for either Warsaw or our October AGM in London.

Friday, April 17, 2015

More Concise ODRL and RightsML Expressions in XML using DRY Asset Patterns

DRY

Don't repeat yourself (DRY) is a much-loved principle of software engineering.

Essentially, the DRY principle states that you should strive to express any particular piece of information only once. This simplification typically improves maintainability and understandability. Systems which require you to repeat information are known by DRY-adherents as "WET" systems (for "We Enjoy Typing" or "Write Everything Twice").

DRY ODRL

In ODRL (and hence RightsML) every permission or prohibition refers to a particular asset.

When you have more than one permission or prohibition to express for a particular asset, this means you need to repeatedly refer to the same asset. How do you avoid repeating more than absolutely necessary to identify which asset the permission or prohibition constrains?

XML Linking

One solution for minimizing the amount of XML Markup is to use XML Linking. Here's an example where you identify an asset o:asset/@id=as1 and then use an @idref to refer to it in other permission or prohibition blocks.

<o:Policy xmlns:o="http://www.w3.org/ns/odrl/2/" type="http://www.w3.org/ns/odrl/2/Set" uid="http://example.com/policy:Z1XZ">
  <o:permission>
    <o:asset id="as1" uid="http://example.com/music:1234908" relation="http://www.w3.org/ns/odrl/2/target"/>
    <o:action id="ac1" name="http://www.w3.org/ns/odrl/2/play"/>
    <o:constraint id="c1" name="http://www.w3.org/ns/odrl/2/spatial" operator="http://www.w3.org/ns/odrl/2/eq" rightOperand="http://www.itu.int/tML/tML-ISO-3166:it"/>
    <o:party id="p1" uid="http://example.com/sony:10" function="http://www.w3.org/ns/odrl/2/assigner"/>
    <o:party id= "p2" uid="http://example.com/billie:888" function="http://www.w3.org/ns/odrl/2/assignee"/>
  </o:permission>

  <o:prohibition>
    <o:asset idref="as1"/>
    <o:action idref="ac1"/>
    <o:constraint name="http://www.w3.org/ns/odrl/2/spatial" operator="http://www.w3.org/ns/odrl/2/eq" rightOperand="http://www.itu.int/tML/tML-ISO-3166:fr"/>
    <o:party idref="p1"/>
    <o:party idref="p2"/>
  </o:prohibition>
</o:Policy>


Embed the ODRL inside the Asset Markup

The other thing you can do is to have markup for the asset itself (rnews:Article in the below example) embed the ODRL policy. This means that the ODRL is even more concise, as it only needs to refer to the ID of the asset.

<rnews:Article xml:id="item8HEX">
  <rnews:title>Allies are Split<rnews:title>
  <rnews:description>Rebel fighters take control...<rnews:description>

...

  <o:Policy xmlns:o="http://www.w3.org/ns/odrl/2/" type="http://www.w3.org/ns/odrl/2/Set" uid="http://example.com/policy:ABAABA">
  <o:permission>
    <o:asset uid="#item8HEX"/>
    <o:action name="http://w3.org/ns/odrl/vocab#distribute"/>
    <o:constraint name="http://www.w3.org/ns/odrl/2/dateTime" operator="http://www.w3.org/ns/odrl/2/gteq" rightOperand="2011-11-11"/>
  </o:permission>
</o:policy>

...

</rnews:Article>





Tuesday, February 3, 2015

JSON Design Principles (Part Four of Three)

As a followup to my own series on designing JSON, I thought I would add a fourth entry in the trilogy:
I came across HTTP API design guide extracted from work on the Heroku Platform API.

This is interesting in part because some of the design principles it espouses (use objects a lot to group things together e.g. owner.id) somewhat contradict some of the design principles I came up with (keep things as flat as possible e.g. owner_id). Just as I do, this Heroku guide emphasizes that this is a set of principles, not the only way to do things.

This guide also discusses how to construct an API (e.g. Require Versioning in the Accept Header). I've designed a handful of REST APIs, learning more each time, of course. The advice in the Heroku guide rings true to me and covers quite a few ideas I'd like to try out myself, next time.