 So this talk is all about consuming open data with data.js. So we're going to see what do we mean by open data and what exactly is open data, who is using it, who is getting it, all the stuff. Data.js is an open source JavaScript library from Microsoft. So my name is Rohit. I'm one of the members for local Microsoft user group called B.NET. We run all the.NET related or the Microsoft related things. I'm also a Telerik insider, meaning Telerik. Insider is a program where we like speakers around 10 or 12 all over the world. I'm one of the guys from India. They sponsor us for our talks wherever we go. They kind of help us with our logistics, all those stuff. Having said that, let's jump right into the session. So open data protocol is a new emerging protocol. As you can see, it's actually an open protocol for sharing the data. Now imagine a thing about Twitter, right? How many of you use Twitter or Foursquare? Anybody knowing Twitter? OK. Twitter is nothing but a microblogging site. And then you have Twitter.com, for example. So you can use Twitter over the web. But when you're in the mobility, you cannot use Twitter all the time over the web. So what you have is you have other applications like Tweet.deck or Sysmic Desktop and all those. So this is the Twitter web version. Similarly, you have other applications like Tweet.deck, which is nothing but an Android or a Windows phone or an iOS. So how is that possible? That is because Twitter shares its data over REST API format and it can be consumed by anybody if you know how to read that. Similarly, this is a new emerging protocol from Microsoft. All it uses is it's a plain HTTP. It still uses REST as its kind of governing pattern or architecture, meaning every resource is available as a addressable scheme. OK, you are right. It uses Atom and Atom Perf. Atom for read, Atom Perf for publishing, meaning writing. It uses XML and JSON as the data exchange format. Everything is HTTP, nothing proprietary Microsoft or nothing proprietary any other vendor. It's pure HTTP based access. All you need to know is REST or Atom or Atom Perf. And you should know how to consume JSON or XML. So let me show you how it kind of plays around. So this is an open data. How many of you have heard about 70MM video rental service in Bangalore? It's nothing but you go sign up. You put the videos or the films in your queue. They're going to come to your house and deliver it. When you are done, call them up. They're going to come pick it up. And then they're going to get you the next set of your videos. Similarly, in the US, Netflix is a very widely known service. All you have to do is sign up for $5, go to your queue, put it into the queue, and then the video is going to come to your doorstep. So Netflix has around, I don't know how much, maybe thousands of titles available as of now. So they have exposed everything of that as open data. And this is where you get it. It's odata.netflix.com slash v2 slash catalog, if you see the URL. And if you see what is the data they're exposing, they're exposing all the genres that are available. Titles is nothing but the movies. So what is odata here? If I want to see all my genres, all I have to do is just look at the URL. I'm saying catalog slash genres. That's a collection. So I will be taken to that genres collection, and then I'll get that data here. If you see here, that genre has come back to me. They have around 399 genres, and one entry is here. So this is one piece of one record that I'm looking into. Let's assume I want to dwell directly into that one record. I don't want to see anybody else. So here is the URL. I can just directly get into that URL. You just need to know the URL. So it's going to give me just one record. And this is still HTTP. I've not used Microsoft.net, or Java, or JSP, or anything. This is just a browser, HTTP URI. Access is HTTP GET, and I'm getting my data. Let's assume I don't want all this payload. I just want to get the name. I'll get my name. Let's assume I still don't want this XML. I just want the plain text. Something's wrong there. I'll get you that URI. So basically here, what happens is I can go and then just try to do all this stuff like I want you to order by is equal to name. It's going to order by based on the name, the title. Basically, title of genre. So similarly, we have everything available here. It is exposed here. Titles, people, languages, and all this stuff. So this is OData. I didn't use any of the proprietary languages like .NET, or Java, or anything. All I knew was a REST URI pattern going one by one to the other schemes. And then I knew the HTTP GET, meaning I knew HTTP. Browser talks HTTP, so I can just get the data. So having said this as open data protocol, meaning all this is available just through the HTTP, we're going to see more about how modern web applications have been built, basically using all this data-centric nature. If you see, these are how the modern web apps are built. You have the browser, you have the HTML page, and then you have the server. So basic initial request, initial page request, you get everything back, HTML, CSS, plus JavaScript. And then afterwards, what we do is we kind of use Ajax. We make a JavaScript call using Ajax support. That goes to the server. Server gives a response. I just get back the chunk of whatever I need. It may be a data, it may be HTML, it may be CSS, or whatever it is. I bundled everything as a markup, and I get. So this is how the modern web application works nowadays, right? Having said that, we're going to see how OData kind of helps you to build a data-centric application, and Data.js, which is what the JavaScript library from Microsoft is going to help you. So another question comes back is, OK, we are building good Ajax apps, right? But is it really great? There is a reduced, I mean, basically, if you say it needs to be a great Ajax application, you've got to have your network latency kind of reduced. We all have seen, we all got used to that little circling thing, saying like, oh, loading. Facebook has its bars, right? Somebody has a circle, or whatever it is. So we know it is loading. So that's the latency, right? Because you're going at that point of time and then trying to get it. To be a great Ajax apps, you've got to reduce that latency as far as possible. Plus you've got to make it more interactive and responsive, meaning if there is any lag, the user is going to see, OK, he's going to go now get the data and then respond back. So you've got to cut down that interactiveness, I mean, you've got to have more interactiveness, and app has to be more responsive. Plus you've got to, obviously, user experience, you cannot go away without, especially now, after 2.0 and all the stuff, you've got to have your app a very good user experience. So this is what compromises a great Ajax application. Now with HTML5 coming in, these are the opportunities that we have. For example, local storage, biggest one as far as I've seen, because earlier you couldn't think of caching the data on a client side. Now you have the local storage, you have the network support, meaning the web workers are coming in, still in the nation technology, but still the web workers is going to come in. You have the advanced graphics, you have the media support now, everything. Now this is where I want to talk about data everywhere, means the open data protocol has been embraced by these many people. My slide is only this much, so I have to put five or six slides, but there's a whole bunch of people who are exposing their data as old data. Whatever I did now, you can go to your houses, have your laptop, or if you have a laptop, do the same thing now, you'll be able to hit the data, get the data. Netflix, ebay, I have an app on ebay, where I will show you currently what deals are running with just an HTTP request, okay? You have Flickr, Flickr is available as a old data, then you have Stack Overflow, Stack Overflow is very similar to what you have as a forum wherein you go and then ask your question and all this stuff, plus bunch of people who have already embraced old data. I'm going to show everything now. So having said this context, having this HTML5 opportunities, these many people exposing their data over the wire, over the, you know, as an open world, we're going to see how Data.js kinds of bridge everything and makes it easy for the developers. Okay, so now let's get to our quick demo. The demo currently I'm going to show is, let's first go to ebay. So ebay runs daily deals, right? So this is the deal for the day now. If you see here, I have a Canon, I have the Android Tablet, I have Money Clip and then I have the Adidas Shoes. These are the current daily deal which is happening. Now the same thing is exposed as old data. If you see, ebay is now exposing all this data for public consumption. It's open data now, okay? So now I'm interested in deals. So I'm going to go to deals. I'm getting the deal. Do you see this? Canon PowerShot A3000 IS-10MP Refurb. Okay, let's, I think. So it's the same guy, right? Now imagine the opportunity that you have to build up something, maybe on an Android, maybe on a Windows phone or whatever platform that you think of. It's the same guy. Canon PowerShot, I have that. Nothing fancy, HTTP, just a browser, HTTP get, I know my URI slash deals. That's the REST protocol coming into picture now. Now the same thing, let me do, I think these guys are hosted on the Azure. Yeah, they're, I think, ebay partnered with Microsoft to be on this platform and then come out with this old data and then they have a very good application which is running on desktops, which uses this. I think it's known as ebay for the people who sell stuff. So now the same thing, I'm gonna do just with an HTML, a jQuery, okay? Let me show this. Just to say that I am using jQuery. I hope everybody is familiar with this syntax. I'm doing nothing but dot a jacks, a URL. I'm telling the data type I need. I need to say jsonp because I'm going cross domain, right? I'm running from a localhost but accessing ebay.com so I'm doing a cross domain. So I'm just saying jsonp, here's the URL. Just look at the URL. All I'm trying to do is, hey get me the deals but I want the top 10 but I want you to order by title. This is old data. Just imagine if today if somebody has to write a web service which supports this, you need methods like get deals by name, get deals by title, get deals then pass, start parameter, end parameter, page, blah, blah, blah. All this is gone with old data. You play around with your URL. You say top 10, order by, you can put any order by that you want. I'm just saying order by the title, okay? So having said that, this is what I'm doing. I'm DOM ready. I have a button and the button click. I'm gonna say go get, do the data request. Here is the data request. I need to give a callback because it's a jsonp. And then once I get a callback, all I'm doing is I know the results. I'm looping through the results and then I'm gonna put it to the div. Let's hope the demo works. Okay, so I have the get data. So if you go back, that's what I have. Okay, let's bring in some Windows 7 stuff. So hope everybody knows this is the AeroSnap. Right? All I had was HTML, jQuery. That's it, right? Now, so, yeah, I mean I told order it by title. These guys, I don't know what order they are doing it. So I told do it by title. So ACMN. So that's what the OData will provide you, okay? So having said that, so this is just, I wanna bring in the point about data everywhere, right? You saw the eBay. Now I can go and do the same stuff with OData, Netflix. So now I'm gonna show one more important thing from my side because it's the local storage demo. So what local storage does is, so this is just a simple app, right? I'm trying to show how a local storage was or with HTML5 coming in, you have the concept of DOM storage or it is also known as web storage or a local storage, right? I have a simple app. If I write something here and I say store data, now this piece of information is now stored permanently on my system now, okay? Let me clear this and I say get data. I got it back, right? Okay, if you are saying I'm bluffing, so let's bring it back again. It's empty. I say get data, whatever I stored, I got it back, right? My session was over, but still I got it back. That's because that's the power of local storage. Now that is coming in with modern browsers like IE9, Chrome, Firefox, everybody is now supporting the DOM storage, right? So these two kind of play a very important role, data everywhere, meaning everybody giving you the open data plus you have these concepts like storage in all those available. So having said that, we saw how jQuery can be used. Is it something different, the data.js? Not entirely, but you saw how you had to write four lines of things saying like this is a JSONP, I need you to use this QRL and all those stuff. Now data.js, what it does is, it is doing a lot many of this stuff that you have to, as a programmer, have to take care individually with just one framework. As an open source JavaScript library called data.js, it is leveraging capabilities. What capability? The local storage capability. It will go and then kind of cache the data. It will inherently, within the network, the framework will allow you to cache your data. It can be a DOM storage if it is available. Tomorrow when the index DB is available, it will quickly switch over itself to the index DB. If none of them are available, you are on an older platform, it's gonna go and then do an in-memory caching, okay? But it will provide you the cache. It's resilient to network, meaning it can do prefetching. I mean, I think I have somewhere a smart free prefetch. Prefetching is nothing but, you know, it's not new. This terminology is not new. People would kind of program it in such a way that if you have a page on showing 10 records at a time, I would go in the background fetch next 10 records and then keep it. When users says go next, I already have the data, then I go and then prefetch next 10. So it's kind of cutting down the response, like, you know, waiting time when the user says next. I don't want to smart, I mean, wait till the user says next, I will prefetch something. So this is auto-built. All you need to do is set a keyword and it's gonna prefetch whatever data you have. Cross domain, you don't need to do anything. For example, you saw me saying like data type is jsonp, callback is equal to, I put something. Data.js will handle it for you. All you need to worry is what is your query? When the query is downloaded, what is your callback that you want to work? So you just give the reference to that. So no browser difference. The data.js is platform supported in terms of Windows, Mac OS, and in terms of browsers, IE, Firefox, Chrome, all those stuff. The cache data is there. So it's the same code. Predominantly, you don't need to change anything, right? So let's see the data.js now. So what I have done is currently I have downloaded, I don't know the, I'm not sure if you guys are able to see this very clearly or not, but let me try to zoom in. Is it better? So this is the library, the data.js. I'll give you the coordinates where to get that from. All you need is, it's very similar to whatever you have. So I just downloaded data.js and I put it into my application. And if you're wondering what this editor is, I work on Microsoft.net stack. So this is my editor, Visual Studio, but you can do this on any editors that you know of, maybe a PHP editor or whatever. There's nothing Microsoft here. It's only plain HTML. I'm just using this editor because I'm used to this. So I have my file, data.js file, plus bunch of jQuery's here. One is jQuery 1.6.4. I have the jQuery UI minified. I have the template minified. Now the same eBay example. So here you see, it's the same example. I'm gonna go to eBay, get the deals, but let's see how we do it with data.js. Data.js, once you import it, so all I have done is, I gone ahead and then I said, I said the reference to data.js, plus I have the reference to the jQuery, the normal stuff. And then all I'm doing is same. I have a button and the button click. Now look at this. I need to worry only about my URL. Okay, I said deals, give me the top 10 order by title. Now look at the API feature that OData is providing for us. Data.js is providing. They have an object called OData. All you have to say is read. Here is the query, here is the callback. Okay, so same, on get data response, all I'm doing is same code, but it's data.js is kind of, I'll tell you what other things it's happening here. If you notice the eBay deals we had written earlier, is anybody familiar with D dot results? Anybody who uses JSON, they know that different people have different way of representing the data set. Somebody say D dot results. Somebody has directly the result. They wrap the JSON directly as a result. Somebody wrap it as D and then results in all the stuff. Now, having said that, data.js is different here. It takes care of multiple different versions that the server may have it, but for it as a developer, it is always results. I don't have to care about, is it dot D or is it something or anything now? All I have to care is, okay, I got the data, data has the results. So that's all I'm doing here. So now if you run this guy, so nothing fancy, same. Okay, this is a alert which is coming because data.js is trying to access cross to mine. Okay, we have not told data.js that, hey, you should support JSONP yet, right? But it's trying to do that. So the browser is alerting you. So it's not the data.js framework. So it's gonna go, it's gonna get the same thing. There's nothing much change. Now, if we have to just, you know, since I know eBay and since I kind of approve there, whatever data they have, all I have to say is enable the JSONP callback is equal to true. I don't have to worry about suffixing callback in the URL, then saying data type is JSONP, nothing. You know, as a programmer, this is what I'm more used to. Hey, you tell me as a API, is there a switch where I can say true first? Yes, fine. So that's all I have done, right? Now, if you think this is kind of rudimentary, this is not right, we can use the templating feature. So I have the same template going around here. And then all I'm saying is, hey, here's the template, take that, here's the data, you kind of append it to this result. So nothing fancy again going on, right? So it's still work, right? The point here I'm trying to make is, OData or the data.js is trying to provide you a very rich API here. You don't have to worry about the server implementation. It takes care of it, for you, it's just results. And then you saw it's just a switch to say enable JSONP callback, yes. And then that's all, right? Now, we're gonna see about caching. I talked about caching, so yeah. Predominantly, the data.js works assuming that it's a JSON. But if you think your server is not sending you a JSON, but it's an XML, there are ways to go ahead and then put your handler, kind of, you know, it knows your XML and then you can play around. So currently inbuilt default assumes JSONP, JSON. It's coming as a JSON. So it's giving you as a kind of API. Internally it's, even if it's a jQuery or even if it is any other guy who supports Ajax, it's all XML, HTTP, you know, object at the background. Internally it's all pure JavaScript query. It's not, there may be little bit touches of jQuery, but it doesn't depend on jQuery because I can remove jQuery and then I can still work on data.js. But if I do that, then I won't be having the support of the templating or others, I have to loop. So data.js in the source code, it's pure JavaScript. There's nothing jQuery bits here and there because you can remove jQuery, have data.js, you can still, you know, get the data, you know, do, but, then you would have to write all the plumbing. You got the data loop, go through each one of them, you won't get the templating because you don't have the jQuery. If you put jQuery, use data.js to get the data, use jQuery to use the templating or put the data. So now here's the interesting stuff. I talked about local storage. Now, data.js has an input mechanism to do all those stuff. I don't have to tell anything. So they have, so here is what I'm trying to do. I, let me show you how many genres are available at, so this is the genres, right? So they have 399 records of genres available in their system, okay? Here is another tidbit about OData. Just imagine if you had to do this in today's web service, somebody is trying to say, hey, what is the count of your genres? You would need a separate web method. Get me count of genres, then they have to return that. So here, all you have to do is, at the end, just suffix dollar count. So this is OData specific, OData protocol specification which says you should support this. If you are a OData, you should support this. So I have 399 records. Now, one interesting thing that DataJS provides is the caching feature. So they have what is known as a cache available. Is the font visible for everybody? Okay, so this is a cache. All I'm doing is, I'm saying, hey, I wanna name this cache as genres because since it's a local storage, you know, it's maybe used by any application that you run. So you gotta name it very specific to your naming conventions and then have it kind of unique. So then all I'm saying is, hey, you know what? For you, the source is this collection, the genres. And then I have set a page size, meaning when you cache, I want you to cache this much data. And then I'm saying prefetch. Fine, you go and then get maybe one record, one page record, which is 10, plus you prefetch next time, okay? So if you see here, I have set prefetch 10 and I've set minus one. I'll come back to that, what minus one means. I have my template here. So what I do is, when the page loads, I'm calling get data. So what get data does is, all it's gonna do is just this much. Cache, read a range. What is the range? Here is the starting point and I want you to fetch this much. Once fetch is done, then do the uncomplete. So then is a deferred way in the jQuery. If you use jQuery, then it's like a deferred delegate, right? Only once this is done, the control passes here. So it's a deferred delegate that jQuery provide. So all I've done is, I've set my cache. Once you declare cache, it doesn't get the data. You have to say, hey, read from that, okay? So that's what being done here. So on page load, we go and load first 10 records. In the collection, okay? Then I have a link which says get more data. Yeah, so I just have one link which says get more data. And I'm calling the same thing. I would have advanced my page from zero to one or something like that. So let's see this, okay? Now I wanna show one feature of i9, which is the developer tools. One new feature of the developer tools is, now we can see what my page is going out of network. I can do the network sweeping. So I'm gonna start capturing. Let me come back again. You don't see any, I don't know how to blow it up. It's very small, okay? You don't see any data, I mean any request going out to Netflix. That is because I had already run it. It's cached. So just to prove the point, let me clear the cache, whatever it is, okay? Now I've cleared the cache. Keep looking on the right-hand side here. I'm gonna refresh my page. Did you see the two things? Okay, now here is an interesting part. Let me try to zoom it out. Just keep looking at the top. It says keep the zero, go and get me the 10. That's the cache being read, right? I just gave only one call for the read and I said zero to 10. Now what is this guy? Skip 10, get me another 10. So that's the pre-feature, okay? But I didn't do anything. I just said page size is 10, pre-fetch is 10, okay? Now keep looking at, let me turn this off. Do you see the third going in there? I had, initially I had done only zero to 10. Now I clicked again to say get more data, right? But my data was already there. So this guy went and then pre-fetched 20 to 30, right? So if we turn off all this stuff and if you don't want to notice there, just keep noticing on the left-hand side how fast it is. So now it went, right? But now if I click, I already have the page, so it's gonna come immediately, right? Now let's assume you have a situation wherein, no, I don't want to do the pre-fetching like this. I will show first page of 10 records, but in the background, I want you to go get me everything, okay? So simple, all you need to do is make the page pre-fetch size to minus one. Meaning, hey, I don't have a number. Go keep getting it, okay? Now look at the beauty of what happens. So we are clearing the cache every time we are refreshing the page. Boom. It showed me the first page, right? Look at this, what is happening? So he's gonna keep going and then storing it. Now I'll show you what happens when I click on more data. Let this finish. There are around 399, I have set page as 10, so it's gonna go 46 times. No, what it's doing is it's chunking. It's not getting all in one shot. No, it's nothing but you're breaking the chunk and the load that is going out, right? If you say, get me 399, your bandwidth is gonna get choked. So all we are doing is we are chunking that and saying, okay, get 10 by 10 by 10. So it's a concept that most of the applications use, which is known as the pre-fetching that is getting chunks. What if, for example, I just gave you an example of minus one. You may have a situation wherein you want everything, but you want in pieces, right? Now look at what happens. My data is already there. I don't have to worry about anything. So this is responsiveness that I was talking about, okay? If you're asking that way, I'll show you one more smartness that we have. I'm gonna turn off pre-fetch size, okay? I will not tell the data.js what is my pre-fetch size, but I'm gonna tell data.js, hey, my page size is 10. Just look at what happens now. Each page size is 10, okay? The way this works is they take a look at, the queue is page size. So although I turned off my pre-fetch size, you see that it still is doing 10, okay? I don't know if you guys can see that or not, but it's doing 10. I'll tell you why. That is because I set my page size as part of my cache definition. Now I removed this, but remember that I have told, give me 10. If you see the read that I'm doing, I'm saying I want you to go zero till 10, right? But the cache definition, I'm not told what is my page size. I'm not told what is the pre-fetch size, right? Still it's going 10 by 10. Somewhere I've missed something. What they do is they go and then, in theoretically what they do is they go and then pre-fetch a huge size. Like, I think close to 300 is what they go and pre-fetch. 250 or something, they pre-fetch it. If you're not told anything. You are saying I want only 10, but there's no pre-fetch being already told for it. So they go and fetch 250. So it's already there. So it won't go back again. Now for example, if I remove the cache dot clear here, and I do a next, it won't go. It's already there. Some amount of data is already there. So these are all inbuilt. There are a lot many stuff you can play around with. Now I'm gonna show one, actually, the live real world application that I built using just this much. So it's known as Netflix catalog. Actually, this is available as an open source. Anybody who's interested in how you develop using OData and all this stuff, you can go and then go to netflixcatalog.codeplex.com. You'll get the whole source code. This is built completely using JavaScript, jQuery, data.js, and then it is hitting Netflix catalog, whatever you saw. Now just imagine how with that open data you can develop like this. I don't know if you guys can see everything. Okay, now I have to do this. I'll go and then get some Kannada movies, okay? See this? There's nothing. Dot net here, or a Java here, or a JSP here, or a PHP here, nothing. It's plain HTML OData. And this is just some crazy styling that I have done, okay? Each bit of here is exposed there. This is one record exposed with this many properties. You know, the title is here, release here, rating, minutes, description. It's the box art, as they say. It's the average rating. I'm going, reading, getting it. And I'm caching this stuff. There are 399 records here, there are 99 records here. I'm caching that because I don't need it every time. But I don't cache this guy. I cache movies only when something has not changed. For example, I have a paging available here. So I have only one page available now for this guy, okay? Similarly, you can do everything. If you want, you can go and say, you know, so I'm doing a search now. I said coon, so it's giving me coon or pani and all the stuff, okay? So all this is possible using Data.js. Here is another quick example that I built. This is for actually, I don't know if I can show this or not, but still, yeah, I know. So I don't know, you gotta ask Hugh Fner for that. Okay, this is a small app that we built for, I mean, I built for a city of Vancouver. If you see there, you see the OData there. It's actually the council of Vancouver city is exposing all their expenses data as a OData. So here's a quick chart we did. So it's going now to that OData fetching the council expense data. These are all council members. And this is saying, okay, they have spent this much amount of money. So this OData fed to the government stuff. I don't know if I can show this, but don't tell anybody that I've showed you here. But yes, this kind of apps is possible. And I have built it only Data.js, jQuery, OData has been the data source, okay? So that was a quick demo about this. So there are other capabilities, like I didn't show you the right part of it. That is the most fun part of Data.js. You can actually do full crowd using Data.js, okay? There is batching. I can batch two requests in one call. There are metadata. I can pull down the metadata of your service and then check out what is everything. See, works over web storage or in memory as of now, but it will light up when index DB is available. So it's already built up for that. So if you use Data.js, you don't have to worry when you go to index DB. Today, if you're using something else, if index DB comes up, you got to change your data to kind of do everything. But use Data.js with OData, you have everything. Supported platform on Windows, Internet Explorer, Firefox, Safari, Chrome, Mac, your Windows phone also supported now iOS, Android, you know, on all platform, Data.js library will work. So where do you download Data.js? Just go here, datajs.codeflex.com. Any Q and A? I think I have three minutes or two minutes. I think, I don't know if I put that future capability, but that is one thing they're working on. Currently, since it's local storage, we have no mechanism of knowing whether it changes or something. Maybe it's in the, you know, kind of down the line that they'll try to ping something and then check out on that one. Any question? Data.js, license it comes off. Whatever producers, we call it as producers, Netflix. As of now, this is not a mission critical data or it is not a sensitive data that has been exposed. It's just a bunch of movie catalog or a eBay deal or something like that. What I showed you, van council expense, it's actually a real BBMP, it's very similar to BBMP in Bangalore, right? So it's a council in somewhere in city of Vancouver, Canada, okay? They have exposed their council expenses, okay? As a OData, you as a consumer, as a general public, write up an app, put it and say, hey, you guys are spending like this. That's the promotion of OData. We want a data which is actually open, for example, all this stuff, the tax, whatever BBMP does, yes, put it open so that I can write something like this, visualize something like this, and then go question back. So that is the promotion where we are trying to say OData can help, okay? OData as such has no specification on this one, but you bring in your .NET or your Java or anything, build a membership API kind of stuff. This guy is all about exposing. The spec is all about how I expose the data. The checks that you wanna put is your, your kind of, maybe a credential, maybe a certificate or anything. Any other, yeah, you had one? That's what, so you gotta write as a producer. Open data is a specification of all those stuff you saw. Here is a collection, collection I can browse like this, here is a top keyword, here is a skip keyword, here is the order by, here is the, so the specification is all about how do you expose the data. It doesn't deal with authentication, authorization, anything. You use OData in your whatever language you want, whatever technology you want, bring in your checks. For example, if I host this on IIS, I can cut down authentication and authorization on IIS saying like, only allow these guys, right? Data.js is just open to reach out to the open data. Any other questions I can wrap up? Okay, if anybody wants to reach me, I'm available here, abode.me slash karshepa. I tweet with this hashtag, I mean the Twitter handle, karshepa. Thank you. Thank you.