Christian Heilmann

Posts Tagged ‘yql’

Fantastic voyage into the web of data – my talk at the Webmontag in Frankfurt, Germany

Tuesday, August 11th, 2009

Yesterday I gave a talk at the Webmontag in Frankfurt, Germany about using APIs to build web sites from distributed data using YQL. Here are the slides of the talk followed by my notes.

Transcript / Notes

Fantastic voyage into the web of data

Web development has changed drastically in the last few years. Sadly enough not all of the options that are open to us are common practice though.

Developing the web vs. developing for the web

The main issue is that instead of using the web to develop our products we still develop products for the web. Instead of embracing the fact that there is no “offline” when it comes to web sites we still build products that keep all the content and media on one server and write mediocre solutions for people to deal with images, video content or outbound links whilst there are already great products in place that were built for exactly those use cases.

Instead of concentrating our energies on improving the content of the web – using proper textual structures, providing alternative content, adding semantic meaning and geospatial context and so on – we spend most of our days bickering on forums, mailing lists, blogs and really any other platform about the technologies that drive the web.

There are dozens of solutions on how to make rounded corners work with any old browser out there; we keep re-inventing new ways to use custom fonts on web sites yet the documentation on proper localisation and real accessibility of web products that benefit everybody are rare.

Decentralised Data

The biggest mistake in web development to me is building a single point of entry for our users and then hope that people will come. This is why we spend more time and money on SEO, link-building, newsletters and other ways of promoting our domain and brand instead of embracing the idea of the web.

The web is an interlinked structure of data – media, documents and URL endpoints. By spreading ourselves all over it we make our domain less important but we also weave ourselves into the fabric of the web.

There is a different approach to web development. About two years ago I wrote this book. In it I explained that you can build an easy to maintain and successful web site without needing to know much about programming. The lack of success of the book to me is related to the title which is far too complex. “Web Development Solutions: Ajax, APIs, Libraries, and Hosted Services Made Easy” originally was meant to be “No Bullshit Web Design”.

The trick that I explained in the book and want to re-iterate here is the following: instead of trying to bring the web to our site we are much better off bringing our site to the web.

The main core of the site should be a CMS and it doesn’t really matter which one. This could be as easy as a blogging system like WordPress or as complex as a full-blown enterprise level system like Vignette, Tridion or RedDot. The main feature should be that it is modular and that we can write our own extensions for it to retrieve data from the web.

The next step is to spread our content on the web:

The benefits of this approach are the following:

  • The data is distributed over multiple servers – even if your own web site is offline (for example for maintenance) the data lives on
  • You reach users and tap into communities that would never have ended up on your web site.
  • You get tags and comments about your content from these sites. These can become keywords and guidelines for you to write very relevant copy on your main site in the future. You know what people want to hear about rather than guessing it.
  • Comments on these sites also mean you start a channel of communication with users of the web that happens naturally instead of sending them to a complex contact form.
  • You don’t need to worry about converting image or video materials into web formats – the sites that were built exactly for that purpose automatically do that for you.
  • You allow other people to embed your content into their products and can thus piggy-back on their success and integrity.

If you want to more about this approach, check out the Developer Evangelism Handbook where I cover this in detail in the “Using the (social) web” chapter.

APIs are the key

The main key to this kind of development are Application Development Interfaces or for short APIs. Using APIs you get programmatic access to the content of the API provider. There are hundreds of APIs available for you and one site that lists them is programmable web.

Using an API can be as easy as opening an address like http://search.twitter.com/trends/current.json in a browser. In this case this will get you the currently trending topics on Twitter in JSON format.

API issues

Of course there are also problems with APIs. The main one is inconsistency. Each API has its own ways of authenticating, needs different input parameters and has different output formats and structures. That means that you have to spend a lot of time reading API documentation or – if that one doesn’t exist which happens a lot – trial and error development. The other big problem with APIs is that a lot of providers underestimate the performance the API needs and the amount of traffic it will have to deal with. Therefore you will find APIs being unavailable or constantly changing to work around traffic issues.

No need for rock stars

Whilst development using third party APIs used to be an exclusive skill set of experts this is very much over. Newer products and meta APIs allow everyone to simply put together a product using several APIs. There is no need any longer to call in a “rock star developer”

YQL - making it really easy

YQL is a meta API that allows you to mix, match, convert and filter API output in a very simple format:

select {what} from {where} where {condition(s)}

The easiest way to start playing with YQL is by using the console. This is a simulation of a call to the YQL web service and allows you to enter your query and define the output format (XML or JSON or JSON-P or JSON-PX). You then run the query and will see the results either as raw data format or as a tree to drill into. If you’re happy with the result you can copy and paste the URL to use either in a browser or your script.
You have a list of your recent queries, some demo queries to get you going and a list of all the available data tables. Data tables are the definitions that point to the third party API and they come with demo queries and a description which tells you what parameters are expected to make the request work.

For example: Frankfurt

As an example, let’s build an interface that shows information about Frankfurt.

The main piece of code that you need is a function that uses cURL to get data from the web:

function getstuff($url){
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $url);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
$buffer = curl_exec($curl_handle);
curl_close($curl_handle);
if (empty($buffer)){
return ‘Error retrieving data, please try later.’;
} else {
return $buffer;
}

}

Then you can get a description of Frankfurt from Wikipedia via YQL and the HTML table:

$root = ‘http://query.yahooapis.com/v1/public/yql?q=’;
$city = ‘Frankfurt’;
$loc = ‘Frankfurt’;

$yql = ‘select * from html where url = ‘http://en.wikipedia.org/wiki/’.$city.’’ and xpath=”//div[@id=’bodyContent’]/p” limit 3’;
$url = $root . urlencode($yql) . ‘&format=xml’;
$info = getstuff($url);
$info = preg_replace(“/.*|.*/”,’‘,$info);
$info = preg_replace(“/ ” encoding=”UTF-8”?>/”,’‘,$info);
$info = preg_replace(“//”,’‘,$info);
$info = preg_replace(“/”/wiki/”,’”http://en.wikipedia.org/wiki’,$info);

Newest events from upcoming:

$yql = ‘select * from upcoming.events.bestinplace(4) where woeid in (select woeid from geo.places where text=”’.$loc.’”) | unique(field=”description”)’;
$url = $root . urlencode($yql) . ‘&format=json’;
$events = getstuff($url);
$events = json_decode($events);
foreach($events->query->results->event as $e){
$evHTML.=’
  • $yql = ‘select * from flickr.photos.info where photo_id in (select id from flickr.photos.search where woe_id in (select woeid from geo.places where text=”’.$loc.’”) and license=6) limit 16’;
    $url = $root . urlencode($yql) . ‘&format=json’;
    $photos = getstuff($url);
    $photos = json_decode($photos);
    foreach($photos->query->results->photo as $s){
    $src = “http://farm{$s->farm}.static.flickr.com/{$s->server}/{$s->id}_{$s->secret}_s.jpg”;
    $phHTML.=’
  • title.’” src=”’.$src.’”>
  • ‘;
    }

  • And the weather forecast from Yahoo Weather:

    $yql=’select description from rss where url=”http://weather.yahooapis.com/forecastrss?p=GMXX0040&u=c”’;
    $url = $root . urlencode($yql) . ‘&format=json’;
    $weather = getstuff($url);
    $weather = json_decode($weather);
    $weHTML = $weather->query->results->item->description;

    Kobayashi Maru

    Kobayashi Maru is a fictional test that graduates of Star Fleet Academy in Star Trek have to pass in order to get their first commission. The interesting part about the test is that it cannot be solved and its purpose is to confront people with the idea of failure and death and see how they cope with it. The only person to ever successfully pass the test is James Tiberius Kirk because a) he is the definition of awesome and b) he cheated by modifying the computer program.

    YQL can be used the same way to create an API where none exists. For example by scraping the headlines of a newspaper web site using the HTML table and an xpath:

    select * from html where url=”http://faz.de” and xpath=”//h2”

    See it here or try it in the console.

    You can then go even further and translate the headlines using Google’s translation API:

    select * from google.translate where q in (select a from html where url=”http://faz.de” and xpath=”//h2”) and target=”en”;

    See it here or try it in the console.

    You can also use an API to filter cleverly to get information that normally is not readily available. For example getting all twitter updates from two different users but only when they posted a link:

    select title from twitter.user.timeline where title like “%@%” and id=”codepo8” or id=”ydn”

    See it here or try it in the console.

    Benefits of using YQL

    YQL gives you a lot of flexibility when it comes to remixing the web and filtering the results. You can:

    • mix and match APIs
    • filter results
    • simplify authentication
    • use in console or from code
    • minimal research of documentation
    • caching of results
    • proxied on Yahoos servers

    Join the web of data!

    Using YQL you can not only read and mix API data but you can also make your own data available to the world. By defining a simple XML schema as an Open Table you give YQL data access to your API endpoint. The really useful part of this is that YQL limits to the outside access to 100000 hits a day and 1000 hits an hour and caches your data for you. Thus you can have the world use your data without having to buy an own server park.

    Thanks

    I hope I got you interested in YQL - now it is up to you to have a go using it!

    Rickrolling Google translate with YQL – Rickrollwhisper

    Wednesday, August 5th, 2009

    This morning I found this wonderful blog post that shows what happens when you run the “never gonna give you up” aka. RickRoll lyrics through an automated translation tool and back into English.

    This has been a classic time waster using Babelfish in the past for me and I thought we could knock it up a notch and used YQL and the Google Translation API to automate this process.

    Check out Rickrollwhisper to see the results.

    Rickrollwhisper

    Google Translate is one of the Open Data Tables built by the outside community for YQL and you can use it simply by providing a source text and the language to translate to:

    select * from google.translate where q=”this is a test” and target=”de”;

    Try it out for yourself or see it in the console.

    The result is the text as a translatedText element:




    true

    185
    178
    2426


    Dies ist ein Test

    Using this, I simply took an array of supported languages and took a random one each time I translated the lyrics:

    $lyrics = “We’re no strangers to love,
    […]
    I just wanna tell you how I’m feeling,
    Gotta make you understand”;

    $target = getlanguage();
    $t = getstuff($lyrics,$target);
    $trans1 = ‘

    ‘.$t.’

    ‘.

    Language: ‘.$target.’

    ‘;
    $target2 = $target;
    while($target2 == $target){
    $target2 = getlanguage();
    }

    $t = getstuff($t,$target2);
    $trans2 = ‘

    ‘.$t.’

    ‘.

    Language: ‘.$target2.’

    ‘;
    $result = getstuff($t,’en’);

    function getlanguage(){
    $languages = array(‘it’,’nl’,’fr’,’de’,’sv’,’pl’,’ro’);
    return $languages[rand(0,sizeof($languages)-1)];
    }

    function getstuff($text,$target){
    $root = ‘http://query.yahooapis.com/v1/public/yql?env=’.
    ‘http%3A%2F%2Fdatatables.org%2Falltables.env&format=json&q=’;
    $yql = ‘select * from google.translate where q=”’.$text.’”’.
    ’ and target=”’.$target.’”’;
    $url = $root.urlencode($yql);
    $curl_handle = curl_init();
    curl_setopt($curl_handle, CURLOPT_URL, $url);
    curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
    curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
    $buffer = curl_exec($curl_handle);
    curl_close($curl_handle);
    if (empty($buffer)){
    return ‘Error retrieving data, please try later.’;
    } else {
    $json = json_decode($buffer);
    $result = $json->query->results->translatedText;
    return $result;
    }

    }

    Maybe I find the time to create the multitranslate as an open table to make this more generic.

    Another interesting YQL feature: XML with callback (JSON-P-X)

    Thursday, July 9th, 2009

    Yesterday’s announcement of YQL now supporting insert, update and delete somehow overshadowed another interesting new feature: XML with callback!

    XML with callback?

    On first glance having a callback parameter on an XML output doesn’t make any sense. The normal use case of callbacks is to turn JSON data into JSON-P so that you can use the data immediately in JavaScript. The reason for XML with callback is to make it easier to use the same data when getting data from the web. Say I want to use YQL to get the images and links of the people I follow from twitter. The YQL statement is:

    select * from html where url=”http://twitter.com/codepo8”
    and xpath = “//div[@id=’following_list’]”

    The XML output of this call is a pretty hefty XML document with all the HTML as an XML node structure.

    The JSON (and JSON-P output) is even worse as it gives you a structure of all the elements and their attributes as properties of nested objects:

    div: {
    id: “following_list”
    span: [
    {

    a: {
    href: “/jemimakiss”
    hreflang: “en”
    rel: “contact”
    title: “Jemima Kiss”
    img: {
    alt: “Jemima Kiss”
    height: “24”
    src: “http://s3.amazonaws.c…glasto_mini.jpg”
    width: “24”
    }

    }
    }

    //... and so on …

    Converting this back into HTML could be quite an annoying job – not to say slow. This is why YQL now offers the callback parameter for XML. The JSONP-X output as it is called in the YQL changelog makes this task a lot easier by returning a JSON object with the XML as a string:

    foo({
    “query”:{
    count“,
    updated“,
    “diagnostics”:{
    publiclyCallable“,
    “url”:{
    execution-time“,
    content
    },
    user-time
    }

    },
    “results”:[

    Jemima Kiss [...]

    ]

    });

    This makes it dead easy to render the results back as HTML:


    Nice? I think so!

    TTMMHTTM: Twitter coaching, twitter backlash, MP expenses crowdsourced, YQL for data.gov, colour checking and Pixar win

    Friday, June 19th, 2009

    Things that made me happy this morning:

    Five things for you – an introduction to the offers of the Yahoo Developer Network

    Thursday, June 18th, 2009

    Yesterday I was in Barcelona, Spain and talked to a few dozen local developers about the things they can find on the Yahoo Developer Network to have an easier time building web sites and impress their bosses. Amongst other things I showed:

    Barcelona by  codepo8.Yahoo office Barcelona by  codepo8.

    Here is the presentation and my notes with the source of the code examples for you. You can “download the slides as a PDF (11mb) from S3”:http://chrisheilmann.s3.amazonaws.com/developer-evening-barcelona.pdf or watch them on slideshare:

    Notes:

    Five things for you

    Today I am going to talk about five things Yahoo offers to developers. In case you wonder, Mortadello y Filemon is actually rather big in Germany – known as “Clever and Smart” hence I couldn’t resist using them.

    English only

    Sorry, but I don’t speak any Spanish, but there are colleagues of mine around for Q&A later who can translate if needed. Also, if I speak too fast, just shout and I will try to make it easier.

    I am Chris

    I’m Chris and I am a developer evangelist. As you can see I also speak with my hands a lot, but that is because I am passionate about what I do. I want to make the web an easier, more professional environment to work in and a media that people can enjoy regardless of ability or technical setup.

    Get this talk and others later

    This is my main web site where I publish all of the talks I give, videos and other goodies. So this presentation will end up here later on and you can re-mix it for own trainings or presentations. Creative Commons rocks.

    The Yahoo Developer Network

    I work for the Yahoo Developer Network which you might not have heard of before. In essence what the YDN does is offer almost everything you see on Yahoo – the data displayed and the interface elements used for you to use in your own products via APIs, SDKs and a great development framework. The YDN homepage is your first stop for all the information I am talking about today.

    1) Research

    Let me start by showing you some of the research we’ve done and the results we offer you to build your own solutions on. In addition to what I am showing here also make sure to chat to some of the colleagues here, as we have a research lab here in Barcelona and they are working on some really cool products.

    Patterns

    The Design Pattern Library is a collection of solutions to problems or tasks users of our web sites and applications had. We do a lot of user testing in labs and we ask the right questions to find out exactly what people consider the easiest way to for example pick a date in a web form. All of this research is documented in these use patterns with a description of the problem, an explanation of the solution and a cross-reference to where in Yahoo we use the solution. If you build an interface and you don’t have time or budget to do your own research, this is a great resource to use. The patterns are creative commons so please tell us if your experience differs and we can amend them.

    Stencils

    If you do visuals all of these patterns are also available as stencils for all major design tools. That way you can easily build and design an interface that your developers will be able to create in CSS, HTML and JavaScript.

    Performance

    The Exceptional Performance section of the Yahoo Developer Network is where we give you all the information how we made our web sites behave faster and more responsive. In our world every millisecond the page takes to load and display counts – we can relate every second wasted to money lost. While your sites might not be that dependent on great performance it does never hurt not to waste your visitors’ time. In this section you find tips and tricks how to tweak your server, how to write CSS and JavaScript and how to optimise images easily organised and explained in detail.

    2) Flexible, professional development

    As a large company we need to be professional in how we work with each other as developers. There are dozens of offices with hundreds of developers in Yahoo and we found that every developer and every office solves the same problems, makes the same mistakes and re-invents the wheel over and over again. Web development is a very undefined area and the biggest issue is that we spend 90% of our time fixing bugs rather than developing. We wanted to change that and make sure that we can concentrate on architecting our software solutions and develop and tweak them for the users’ benefit rather than fixing annoying and confusing browser bugs.

    Graded Browser Support

    The first thing we needed to make sure is that we define and describe the support we have for different browsers. This is a methodology and resource site we have called the Graded Browser Support and is something you can use for your product documentation and pitch, too. You cannot give every visitor of your web site the same experience regardless of browser and you actually should not even think that way as that kind of thinking is against the main principles the web was invented for. You have to make your products work for everybody, but you can give a different experience dependent on the sophistication of the visitors’ setups. This is what the GBS does. We define which browsers we support fully and test the high-end experience for. All other browsers don’t get this experience but something that works regardless.

    The Yahoo User Interface library

    The Yahoo User Interface library was the next big step to take towards professional development. This is a library ranging from CSS solutions, over JavaScript components up to plug and play widgets that are based on the support ideas we defined in the GBS and best practices we found in our pattern research. The YUI is where we work around all the annoying bugs and problems browsers and web technologies have to allow us to build solutions without wasting our time on wondering why they don’t work in setup xyz. By keeping all this in a base library we can fix and apply for any new technology or browser coming out. If we did all of the fixing in our sites we’d have to revisit each and every one of them when technologies change. This is not effective, hence we built ourselves a library.

    The myth of the unstyled page

    There is no such thing as an unstyled page in browsers. If you don’t apply a style sheet, then browsers have an in-build default style that varies from browser to browser. This makes it impossible for you to design a predictable interface. That’s why we created a style sheet that un-does all the styling browsers apply to a page. This means you can start with a clean canvas.

    Predictable typography

    Typography was he next hurdle. Every designer will give you font definitions in pixels and when you set the font in pixels, Internet Explorer 6 will not allow visitors to resize the text on your page to their needs. This is why we created a style sheet that resets the font of your browser to a readable minimum (again based on user testing) and has a percentage scale for you to use that relates directly to pixel sizes.

    CSS layouts

    Layout in HTML should not be done with tables or presentational markup but with CSS. The problem there is that browsers support the techniques we need to use to make them display our layouts in different ways. A lot of hacking has to be done to create a layout that works across the board. This is why we defined a grid structure for our sites and a style sheet that works. All we need to do now is add the right IDs and classes to a few DIV elements and we have a working layout. If you are really lazy, we even have a CSS grids builder tool for you. The CSS is hosted by us on a distributed network of servers and gets delivered to your visitors from a server near them which is great for performance. You can however host the CSS yourself, too.

    Specialised solutions

    The JavaScript part of the YUI is not a catch-all solution for all development tasks you’ll ever have to tackle but instead is cut up into smaller components that all do one thing and do it very well. That way you can mix and match the library components to the need of your solution and keep the footprint low.

    Widgets

    On top of the YUI components we built widgets that relate to the design patterns. These are the things you see on Yahoo’s pages – sliders, tabs, menus, rich text editors and the like. We even have a showcase where we proved that you can rebuild the interface of Yahoo mail by using these free and open source building blocks.

    Skinning

    The look and feel of all of these widgets can be changed by changing a style sheet. This is very important. You should never have to alter JavaScript simply to make a tab a different colour.

    Working widgets

    This is an example of one of the widgets – the autocomplete control. As you can see the widget is built to solve a pattern we found in the pattern design library and using our logger control gives you full information about what is happening to it at every step of the process of using it.

    Progressive enhancement

    Our widgets are built to work and to give a smoother experience only when and if the browser supports it. This means an autocomplete control will be a text box when JavaScript is turned off. A data grid or complex sortable and styled table will be a simple, accessible data table when JavaScript is turned off. That way you build working solutions for every user and you don’t promise functionality that isn’t delivered. Users trust you, if you don’t hold your promises you will lose them.

    Event driven architecture

    All of the widgets are built with custom events and if you want to enhance their functionality or override it you can do that at any point of the interaction journey by subscribing to the custom events that get fired. This allows you to build solutions that need to do something extra for you without compromising the underlying code. You should never change the library code as that stops you from being able to upgrade the library to a never version.

    The logger control

    One of the most annoying things in web development is that not every browser gives you good debugging tools. The Logger control works around that issue by providing you with a debugging console that works across all the browsers we support.

    The profiler

    If you wonder why your JavaScript is using up a lot of memory and slows the computer down you can use the YUI profiler to analyze what is going on inside your JavaScript and fix bottlenecks that way.

    3) Documentation

    Both the YUI and all of our APIs come with extensive documentation written by a professional team of tech writers.

    Online and offline docs

    The APIs come with a quick “get started” guide and a full documentation – in many cases even available offline as a PDF version.

    Step by step introduction and examples

    The full documentation comes in easy to digest chunks guiding you where you need to go to find exactly the right kind of information.To get you a quick start there are copy and paste examples of demo code.

    Code generated documentation

    In addition to this the YUI also has a JavaDoc style documentation which is generated from comments in the source code. This means it will always be up-to-date even if there are quick fixes in the code. The tool to create the documentation from JavaScript code is also available.

    Cheatsheets

    Another nice service the YUI has is a zip of PDF cheatsheets for all the different widgets. These are A4 sheets with all the necessary information to get you started and find out how to quickly change an implementation of a certain widgets.

    Forums, lists, blogs and videos

    If you are still stuck or are just not a person receptive to code or text there’s the YDN theater with lots of videos of presentations, screencasts and demos. There are forums, mailings lists and other forms of communication with the teams available in the communities section

    4) Things to impress your Boss with

    One of the things I am always trying to make sure is that you can go to work tomorrow and tell your boss about some things you can use to save the company money and time or just impress him/her. So here are some ideas.

    Build an own search engine with BOSS

    Yahoo BOSS is an API that gives you access to the search index of Yahoo. You can display results from Yahoo, re-order and display like you want and mix the results with other data. That way you can easily build a vertical search engine. Furthermore the data includes information not displayed in the normal Yahoo search results like microformats, RDF information, delicious tags and keywords.

    Research keywords for your market

    Using the keywords in the BOSS data I was able to quickly build Keywordfinder. What it does is searching Yahoo for a keyword you enter, return the 20 first results, get the keywords users entered to find these sites, rank them for you and give them back in order of relevance. You can use this to see what terms you should have in your titles, headings and copy to get more search engine love.

    Create a performance report and recommendations for your site

    YSlow is a Firefox extension that automatically tests web sites against the best practices Yahoo found in the exceptional performance section. You can easily find the issues and get inline tips how to fix them. One really impressive part is smushit, which optimizes all your images as a batch and allows you to download them as a zip to replace the original ones.

    YQL to remix the web

    YQL and especially the YQL console is a terribly easy way for you to access APIs of Yahoo and third parties without knowing much about their authentication, parameter structure or return data. By using YQL remixing the web is as easy as accessing a database. For more detail, check out this presentation on YQL

    How about a YQL demo?

    This web site about Barcelona does not contain any content on the server but pulls all of the data from third party locations – Wikipedia, Flickr, Upcoming.org and Yahoo weather. The layout was done using the YUI grids builder and the following is all the code that is needed for it to be what it is:

    PHP:

    
    $root = ‘http://query.yahooapis.com/v1/public/yql?q=’;
    $city = ‘Barcelona’;
    $loc = ‘Barcelona’;
    $yql = ‘select * from html where url = ‘http://en.wikipedia.org/wiki/’.$city.’’ and xpath=”//div[@id=’bodyContent’]/p” limit 3’;
    $url = $root . urlencode($yql) . ‘&format=xml’;
    $info = getstuff($url);
    $info = preg_replace(“/.*|.*/”,’‘,$info);
    $info = preg_replace(“/ ” encoding=”UTF-8”?>/”,’‘,$info);
    $info = preg_replace(“//”,’‘,$info);
    $info = preg_replace(“/”/wiki/”,’”http://en.wikipedia.org/wiki’,$info);

    $yql = ‘select * from upcoming.events.bestinplace(5) where woeid in ‘.
    ‘(select woeid from geo.places where text=”’.$loc.’”)’.
    ’ | unique(field=”description”)’;
    $url = $root . urlencode($yql) . ‘&format=json’;
    $events = getstuff($url);
    $events = json_decode($events);
    foreach($events->query->results->event as $e){
    $evHTML.=’

  • urls->url->content.’”>”’.<br $s->title.’” src=”’.$src.’”>

  • ‘;
    }

    $yql=’select description from rss where ‘.
    ’ url=”http://weather.yahooapis.com/forecastrss?p=SPXX0015&u=c”’;
    $url = $root . urlencode($yql) . ‘&format=json’;
    $weather = getstuff($url);
    $weather = json_decode($weather);
    $weHTML = $weather->query->results->item->description;

    function getstuff($url){
    $curl_handle = curl_init();
    curl_setopt($curl_handle, CURLOPT_URL, $url);
    curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
    curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
    $buffer = curl_exec($curl_handle);
    curl_close($curl_handle);
    if (empty($buffer)){
    return ‘Error retrieving data, please try later.’;
    } else {
    return $buffer;
    }

    }?>

    Doing multiple searches with a single HTTP request

    Another powerful option YQL gives you is to collate multiple API calls into a single request. Say for example you want to search the web for “vicky, cristina, Barcelona” and also for each of the terms on their own. This can be easily done with YQL in a single statement:

    select * from search.web where query in
    (‘vicky’,’cristina’,’barcelona’,’vicky cristina barcelona’)

    The result can be seen here and this is the PHP code that creates this demo:

    
    $root = ‘http://query.yahooapis.com/v1/public/yql?q=’;
    $yql=”select * from search.web where query in (‘vicky’,’cristina’,’barcelona’,’vicky cristina barcelona’)”;
    $url = $root . urlencode($yql) . ‘&format=json’;
    $search = getstuff($url);
    $search = json_decode($search);
    $search = $search->query->results;
    $vHTML = ‘’;
    $bHTML = ‘’;
    $vHTML = ‘’;
    $aHTML = ‘’;
    foreach($search->result as $i){
    $tmpl = ‘
  • clickurl.
    ‘”>‘.$i->dispurl.’
    )

  • ‘;
    if(preg_match(‘/vicky/i’,$i->abstract) &&
    !preg_match(‘/cristina/i’,$i->abstract) &&
    !preg_match(‘/barcelona/i’,$i->abstract)){
    $v[]=$tmpl;
    };
    if(preg_match(‘/cristina/i’,$i->abstract) &&
    !preg_match(‘/vicky/i’,$i->abstract) &&
    !preg_match(‘/barcelona/i’,$i->abstract)){
    $c[]=$tmpl;
    };
    if(!preg_match(‘/vicky/i’,$i->abstract) &&
    !preg_match(‘/cristina/i’,$i->abstract) &&
    preg_match(‘/barcelona/i’,$i->abstract)){
    $b[]=$tmpl;
    };
    if(preg_match(‘/vicky/i’,$i->abstract) &&
    preg_match(‘/cristina/i’,$i->abstract) &&
    preg_match(‘/barcelona/i’,$i->abstract)){
    $aHTML.= $tmpl;
    };
    $vHTML = @join(’ ‘,array_slice($v,0,3));
    $bHTML = @join(’ ‘,array_slice($b,0,3));
    $cHTML = @join(’ ‘,array_slice($c,0,3));

    }
    function getstuff($url){
    $curl_handle = curl_init();
    curl_setopt($curl_handle, CURLOPT_URL, $url);
    curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
    curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
    $buffer = curl_exec($curl_handle);
    curl_close($curl_handle);
    if (empty($buffer)){
    return ‘Error retrieving data, please try later.’;
    } else {
    return $buffer;
    }

    }?>

    You can also do the whole thing in JavaScript:


    5) Partnering

    The really interesting thing is that all of this is open for you to add your own data to. Using a simple XML document called an open table you can make your information available in YQL for other developers.

    You can host this XML file yourself if you don’t want the whole world to know yet. For example this open table can be used in a statement like this:

    use ‘http://eatyourgreens.org.uk/yql/nmm-search.xml’ as nmm;
    select * from nmm where category = ‘art’ and
    searchterm = ‘”tower bridge”’

    This gives developers access to all the information about the objects in the National Maritime Museum in London!

    If you want your open table to show up in the console via our team (we do review them for security and quality) all you need to do is add the table to github.