<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/topics-files/atom2xhtml.xsl" type="text/xsl"?>
<!-- This is a 512 byte XML comment that one must put into XML Atom feeds
such that browsers like Firefox 2.0 and IE7 will obey the XSL stylesheet.
Everybody hates overbearing browsers.
This is a 512 byte XML comment that one must put into XML Atom feeds
such that browsers like Firefox 2.0 and IE7 will obey the XSL stylesheet.
Everybody hates overbearing browsers.
This is a 512 byte XML comment that one must put into XML Atom feeds
such that browsers like Firefox 2.0 and IE7 will obey the XSL stylesheet.
Everybody hates overbearing browsers.
This is a 512 byte XML comment that one must put into XML Atom feeds
such that browsers like Firefox 2.0 and IE7 will obey the XSL stylesheet.
Everybody hates overbearing browsers.
This is a 512 byte XML comment that one must put into XML Atom feeds
such that browsers like Firefox 2.0 and IE7 will obey the XSL stylesheet.
Everybody hates overbearing browsers.
This is a 512 byte XML comment that one must put into XML Atom feeds
such that browsers like Firefox 2.0 and IE7 will obey the XSL stylesheet.
Everybody hates overbearing browsers. -->
<feed xmlns="http://www.w3.org/2005/Atom"
><title
>Blog@Case Topics: web services</title
><link rel="self" href="http://blog.case.edu/topics/web%20services"
 /><id
>http://blog.case.edu/topics/web%20services</id
><category term="web services" label="web services"
 /><link rel="related" href="http://blog.case.edu/topics/linkblog" title="linkblog"
 /><link rel="related" href="http://blog.case.edu/topics/http" title="http"
 /><link rel="related" href="http://blog.case.edu/topics/mainblog" title="mainblog"
 /><link rel="related" href="http://blog.case.edu/topics/programming" title="programming"
 /><link rel="related" href="http://blog.case.edu/topics/general%20information%20technology" title="general information technology"
 /><link rel="related" href="http://blog.case.edu/topics/weblog%20tech" title="weblog tech"
 /><link rel="related" href="http://blog.case.edu/topics/federated%20identity" title="federated identity"
 /><link rel="related" href="http://blog.case.edu/topics/blog@case%20developments" title="blog@case developments"
 /><link rel="related" href="http://blog.case.edu/topics/shibboleth" title="shibboleth"
 /><link rel="related" href="http://blog.case.edu/topics/failures%20of%20technology" title="failures of technology"
 /><link rel="related" href="http://blog.case.edu/topics/syndicated%20feeds" title="syndicated feeds"
 /><contributor
><name
>Gregory Szorc</name
><email
>gregory.szorc@case.edu</email
><uri
>http://blog.case.edu/gps10</uri
></contributor
><contributor
><name
>Jeremy Smith</name
><email
>jeremy.smith@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></contributor
><contributor
><name
>Brandon Siegel</name
><email
>brandon.e.siegel@case.edu</email
><uri
>http://blog.case.edu/bes7</uri
></contributor
><updated
>2008-02-22T21:55:36Z</updated
><entry
><title
>iPhone Home Theater Remote Control Project</title
><link href="http://blog.case.edu/gps10/2009/01/18/iphone_home_theater_remote_control_project"
 /><id
>http://blog.case.edu/gps10/2009/01/18/iphone_home_theater_remote_control_project</id
><published
>2009-01-19T04:50:19Z</published
><updated
>2009-01-19T05:52:29Z</updated
><category term="home theater" label="home theater"
 /><category term="iPhone" label="iPhone"
 /><category term="web services" label="web services"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>"Who needs universal remotes or expensive home automation products when you have a computer in your pocket?" This is the question I asked myself a few weeks ago while growing tired of managing the four remotes and mouse and keyboard that control my home theater components. There was a break in my otherwise hectic schedule and I hadn't taken on any cool personal projects in a while, so I thought, why not build something. In the months prior, I have built a handful of components to control my home theater components, but I have never tied them together. After all, where would I control them from? The iPhone, always being in my pocket or within an arm's reach, is the answer to that question. So, I decided to build a home theater remote control for my iPhone. I considered writing a native iPhone application, but I don't have an Intel Mac and the investment wasn't worth it. Besides, the HTML support of the iPhone is superb and there are many templates out there for creating very impressive-looking HTML applications for iPhone. In a few hours, I was able to piece together a nifty-looking web site that displayed my musical library. It took a few more hours to hack together the backend components and expose them through HTTP so the iPhone's browser could make AJAX calls. Here are all the details:
<h3>Components</h3>
<ul>
<li>Pioneer PDP-5080 television</li>
<li>Emotiva MMC-1 preamp</li>
<li>Emotiva XPA-5 amplifier</li>
<li>PC running Vista 64</li>
<li>Foobar 2000 audio player</li>
</ul>
<h3>Interconnections and Control</h3>
<ul>
<li>RS-232 to TV</li>
<li>RS-232 to preamp</li>
<li>trigger cable between amp and preamp (for amp's power)</li>
<li>Foobar plugins running HTTP and socket servers for control</li>
<li>TOSLINK audio cable between PC and preamp</li>
<li>Apache HTTP server w/ mod_perl</li>
</ul>
<h3>Other Requirements</h3>
<ul>
<li>Music library with full 
<a href="http://musicbrainz.org/">MusicBrainz</a> tags (I used Picard)</li>
</ul>
<h2>Features and Capabilities</h2>
<ul>
<li>Full control of preamp functionality, including power toggling, input switching, and volume control</li>
<li>Basic control of television, including power toggling and input switching (I only using my television as a monitor, so this is all I need)</li>
<li>RESTful HTTP APIs to Foobar 2000 to play or enqueue tracks, albums, artists, stop and start playback, pause, change tracks, etc</li>
<li>iPhone-optimized website to control everything and view system status</li>
<li>Bluetooth signal polling to toggle system power state (powers on when I walk in range and powers off when I leave)</li>
</ul>
<h2>Screenshots</h2>I still have a bit of work to do in the UI department, but here are some screenshots. 
<img alt="Main Screen" src="http://blog.case.edu/gps10/2009/01/19/IMG_0001[1].PNG" width="320" height="480" /> 
<img alt="Main Source Control" src="http://blog.case.edu/gps10/2009/01/19/IMG_0005[1].PNG" width="320" height="480" /> 
<img alt="Music Index" src="http://blog.case.edu/gps10/2009/01/19/IMG_0006[1].PNG" width="320" height="480" /> 
<img alt="Album List" src="http://blog.case.edu/gps10/2009/01/19/IMG_0008[1].PNG" width="320" height="480" /> 
<img alt="Album Info" src="http://blog.case.edu/gps10/2009/01/19/IMG_0009[1].PNG" width="320" height="480" /> 
<img alt="Emotiva Control" src="http://blog.case.edu/gps10/2009/01/19/IMG_0010[1].PNG" width="320" height="480" />
<h2>Future Enhancements</h2>I currently don't have my DVR/cable tuner or DVD player bussed into my PC. Neither offers a remote control method besides IR. I will likely purchase or build an IR transmitter to control these components in the near future. (I may take the easy road and buy a TiVo, which I believe has a sufficient network-level API.) I have built a few applications to control my home theater using voice and Vista's built-in speech recognizer. However, I don't have a good way of shipping audio from my couch to my PC. My living room layout won't allow a cable to be routed. A Bluetooth microphone is possible, but seems a little awkward. Ideally, the iPhone would record utterances and ship them, but I would need to write a native application for that. Microphone arrays (for optimal noise cancellation and audio pick-up from across the room) would be a possible solution, but I'm not satisfied with any current product.
<h3>Regarding Perl</h3>Long-time readers may have noticed I am using Perl instead of PHP for the backend. It took a while after first exposure, but I have warmed up to Perl. Actually, it has usurped PHP as my language of choice for all areas where PHP once held the crown. There are still some parts of PHP I like better, but the language just didn't scale to meet my needs. Specifically, it didn't give me the low-level control and flexibility that Perl offers. And, CPAN puts PEAR to shame.</div
></content
><author
><name
>Gregory Szorc</name
><email
>gregory.szorc@case.edu</email
><uri
>http://blog.case.edu/gps10</uri
></author
></entry
><entry
><title
>Zero Sign On</title
><link href="http://blog.case.edu/jeremy.smith/2008/02/22/zero_sign_on"
 /><id
>http://blog.case.edu/jeremy.smith/2008/02/22/zero_sign_on</id
><published
>2008-02-22T18:53:37Z</published
><updated
>2008-02-22T21:55:36Z</updated
><category term="Web Services" label="Web Services"
 /><category term="cas" label="cas"
 /><category term="identity management" label="identity management"
 /><category term="linkblog" label="linkblog"
 /><category term="openid" label="openid"
 /><category term="single sign on" label="single sign on"
 /><category term="sso" label="sso"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>
<p>
<a title="Dr Nic : Zero Sign On - 1 better or Infinitely better than Single Sign On?" href="http://drnicwilliams.com/2008/02/22/zero-sign-on-with-client-certificates/">Zero Sign On - Better than Single Sign On?</a>
</p>
<p>We've talked about doing this here with 
<a href="http://wiki.case.edu/CAS">CAS</a>.</p>
</div
></content
><author
><name
>Jeremy Smith</name
><email
>jeremy.smith@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></author
></entry
><entry
><title
>Can I Link to It?</title
><link href="http://blog.case.edu/jeremy.smith/2007/12/29/can_i_link_to_it"
 /><id
>http://blog.case.edu/jeremy.smith/2007/12/29/can_i_link_to_it</id
><published
>2007-12-29T18:17:23Z</published
><updated
>2008-01-23T23:58:38Z</updated
><category term="General Information Technology" label="General Information Technology"
 /><category term="Web Services" label="Web Services"
 /><category term="enterprise systems" label="enterprise systems"
 /><category term="information architecture" label="information architecture"
 /><category term="it" label="it"
 /><category term="mainblog" label="mainblog"
 /><category term="rest" label="rest"
 /><category term="web" label="web"
 /><category term="web 2.0" label="web 2.0"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>
<a title="Derivadow.com" href="http://derivadow.com/">Tom Scott</a>, of the 
<a title="BBC - bbc.co.uk homepage - Home of the BBC on the Internet" href="http://www.bbc.co.uk/">BBC</a>, comments on 
<a href="http://www.bbc.co.uk/blogs/radiolabs/2007/12/show_your_workings.shtml">Jamie&#226;&#8364;&#8482;s comments</a> about Jamie's work on the design of 
<a href="http://www.bbc.co.uk/programmes/">BBC&#226;&#8364;&#8482;s /programmes service</a> in his post 
<a title="Web design 2.0 - it&#226;&#8364;&#8482;s all about the resource and its URL &#239;&#191;&#189; Derivadow.com" href="http://derivadow.com/2007/12/28/web-design-20-its-all-about-the-resource-and-its-url/">Web design 2.0 - it&#226;&#8364;&#8482;s all about the resource and its URL</a>. It touches on something I constantly hammer on: 
<strong>Everything important should have a URL</strong> Put another way: 
<strong>Can I link to it?</strong> That's the way I phrase it in meetings when people say something like "I am-developing/have-developed web blah-blah-blah so-on-and-so-forth." The next thing out of my mouth is "
<em>can I link to it?</em>" And I don't mean link to a page that shows it. I mean 
<em>directly</em> link to the "web thing" (i.e. "resource"; i.e. "data") that was created. Sure, it's a blanket statement that ignores nuances and such (I don't even want to get into ETags with the people). I just find that it is a useful question for an "inside the Enterprise" environment in trying to improve IT architecture &#8212; it's catchy; it's to the point; and it can be (in general) easily comprehendible by people. (By the way, the web design at 
<a href="http://derivadow.com/">derivadow.com</a> (which, according to the site's 
<a title="Colophon &#239;&#191;&#189; Derivadow.com" href="http://derivadow.com/colophon/">colophon</a> is based on the "
<em>ChaosTheory</em>" Wordpress theme) looks a lot like 
<a href="http://subtraction.com">Khio Vinh's subtraction.com</a>.)</div
></content
><author
><name
>Jeremy Smith</name
><email
>jeremy.smith@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></author
></entry
><entry
><title
>RESTful Web Services and Web Services Security</title
><link href="http://blog.case.edu/gps10/2007/09/07/restful_web_services_and_web_services_security"
 /><id
>http://blog.case.edu/gps10/2007/09/07/restful_web_services_and_web_services_security</id
><published
>2007-09-07T05:41:35Z</published
><updated
>2007-09-07T06:59:45Z</updated
><category term="middleware" label="middleware"
 /><category term="security" label="security"
 /><category term="web services" label="web services"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>Courtesy of my employer, I am now a happy owner (well, I guess I am technically the possessor) of the excellent O'Reilly text 
<i>
<a href="http://www.oreilly.com/catalog/9780596529260/">RESTful Web Services</a>
</i>. Upon reading the foreward, I knew this would be an excellent book:
<blockquote>A renaissance of HTTP appreciation is building and, under the banner of REST, shows a credible alternative to what the merchants of complexity are trying to ram down everyone's throats... [this book] shows you how to use those principles without the drama, the big words, and the miles of indirection that have scared a generation of web developers into thinking that web services are so hard that you have to rely on BigCo implementations to get anything done.</blockquote>The book does an excellent job of clarifying a lot of the misunderstanding surrounding the concepts of REST and also does a great job of explaining proper web service development (with an emphasis on REST, of course). Although I am usually critical of most of what I read, I ate up nearly everything in this book. And, because the authors did such a good job explaining their stance on everything, I can still be pro-REST and understanding of RPC services (SOAP) at the same time. Yes, the book did reaffirm my belief that SOAP is bloated and unecessary for many applications. However, the authors could see beyond religious zealousness and admit that there are times when SOAP, or other complex message formats or web service styles are preferred. This was all in chapter 10, a chapter dedicated to comparing "resource-oriented architecture" (RESTful) to "Big Web services" (SOAP). Anyway, I could go on and on rambling about this book and my love for it, but why spoil it for you ;) Instead, I'll just post my big takeaways (many of these I already felt, it was just reassuring to see them in print).
<ul>
<li>Use status codes appropriately</li>
<li>Adhere to safety and idempotence definitions found in 
<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1">Section 9.1</a> of RFC 2616</li>
<li>SOAP over HTTP is a message transport mechanism inside of a message transport mechanism and is thus redundant</li>
<li>Use URI's and query parameters appropriately</li>
</ul>Although I felt I understood the concepts behind REST pretty well, this book explained a few things I didn't. It also armed me with the means to defend choices in web services design. Furthermore, now I have something more reputable than a blog that I can point a colleage towards. For long term value, the appendencies listing each HTTP status code, its importance, and when to use it is invaluable. I often see status codes used by their table of contents definition (406 Not Acceptable takes on new meaning when you actually read the proper usage in RFC 2616). If you would like a good education on web services and how to properly use HTTP, I highly recommend 
<i>RESTful Web Services</i>. Enough of the book review... In somewhat related news, a 3rd party client at work recently rejected our initial specification for a proposed web services, stating that they preferred to use SOAP. Now, there is nothing wrong with that. I can understand why they want us to supply a WSDL so they can plug it into their favorite IDE and have it spit out an interface. Fine by me. Although I consider a SOAP interface to be inappropriate and overengineering the solution to the problem at hand, I gave in, knowing the customer couldn't be persuaded. At least it was a simple service, so I cranked out the WSDL and a working server (automatically generated from the WSDL, of course) in under an hour. Not too bad. Anyway, during further conversations with the client, we started talking about security for our B2B web services. Their first suggestion was to use WS-Security. My head almost exploded. I was expecting to hear the normal answer, which was to use transport level encryption (SSL). Not being fully up to date with the BigCo buzzword that is WS-*, and wanting to keep an open mind, I approached a few coworkers after the meeting and asked both the question, "what are the advantages of WS-Security over transport level encryption?" The first coworker laughed at me, gave me the I-know-you-are-a-better-engineering-than-to-be-asking-this-question look, and responded with something along the lines of "who the hell is wanting to use WS-Security?" The second colleage, whose job is more or less network security, gave a similar reaction. Anyway, both alerted me to the presentation, 
<a href="http://www.isecpartners.com/files/iSEC_HILL_AttackingXMLSecurity_bh07.pdf">Attacking XML Security</a>, which was given at Black Hat this year. It does a great job of explaining why transport level security (SSL, firewalls, etc) is much preferred over message level (XML encryption, WS-*, etc). In a nutshell, SSL is simple, stable, and proven, whereas WS-* is complex, new(er), and not thorougly tested. In addition, WS-* gives attackers a larger attack surface, which includes XML parsers, protocol handlers, remote references, etc. Compare this to SSL, which has a single attack surface: the SSL implementation itself. Using the chain strength analogy, I would rather focus on one link (SSL) than many (with WS-*). Basically, "security's worst enemy is complexity." I guess we know what that makes WS-*.</div
></content
><author
><name
>Gregory Szorc</name
><email
>gregory.szorc@case.edu</email
><uri
>http://blog.case.edu/gps10</uri
></author
></entry
><entry
><title
>Yahoo! Mail Web API</title
><link href="http://blog.case.edu/jeremy.smith/2007/03/29/yahoo_mail_web_api"
 /><id
>http://blog.case.edu/jeremy.smith/2007/03/29/yahoo_mail_web_api</id
><published
>2007-03-29T21:13:29Z</published
><updated
>2007-03-29T21:15:42Z</updated
><category term="Email Services" label="Email Services"
 /><category term="Web Services" label="Web Services"
 /><category term="linkblog" label="linkblog"
 /><category term="yahoo" label="yahoo"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>
<a title="Yahoo! Mail API and Unlimited Storage (by Jeremy Zawodny)" href="http://jeremy.zawodny.com/blog/archives/008785.html">Yahoo! Implements IMAP Over SOAP</a> One wonders what they found in IMAP that was lacking. I would have loved to be at the meeting (this is an imaginary meeting that took place only in my head) where one small developer raises his hand and asks "why don't we just use IMA..." but couldn't finish the sentence as the rest of the room shouted "
<strong>SOAP! SOAP! SOAP!</strong>"</div
></content
><author
><name
>Jeremy Smith</name
><email
>jeremy.smith@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></author
></entry
><entry
><title
>OpenID Server Integrated with CAS</title
><link href="http://blog.case.edu/jeremy.smith/2007/03/09/openid_server_integrated_with_cas"
 /><id
>http://blog.case.edu/jeremy.smith/2007/03/09/openid_server_integrated_with_cas</id
><published
>2007-03-10T00:53:01Z</published
><updated
>2007-03-10T00:55:54Z</updated
><category term="Federated Identity" label="Federated Identity"
 /><category term="HTTP" label="HTTP"
 /><category term="Programming" label="Programming"
 /><category term="Shibboleth" label="Shibboleth"
 /><category term="Web Services" label="Web Services"
 /><category term="cas" label="cas"
 /><category term="identity management" label="identity management"
 /><category term="mainblog" label="mainblog"
 /><category term="openid" label="openid"
 /><category term="web" label="web"
 /><category term="web standards" label="web standards"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>With the help of some of the Network Engineers (to get some magic routing working), I cobbled together an 
<a title="OpenID: an actually distributed identity system" href="http://openid.net/">OpenID</a> server and integrated it with 
<a href="http://www.case.edu">Case's</a> 
<a title="Case Central Authentication Service (CAS)" href="https://login.case.edu">Single Sign On</a> system, 
<a title="Central Authentication Service - CaseWiki" href="http://wiki.case.edu/Central_Authentication_Service">CAS</a>. The "server" end-point is located at 
<a href="http://login.case.edu/id">http://login.case.edu/id</a>. Your "identity URL" is the 
<em>first.last</em> portion of your email address followed with 
<strong>.id.case.edu</strong>. For example, my email is 
<a href="mailto:jeremy.smith@case.edu">jeremy.smith@case.edu</a>, so my OpenID identity URL is 
<a href="http://jeremy.smith.id.case.edu">
<strong>jeremy.smith.id.case.edu</strong>
</a>. For those averse to typing (like I am), you can also use your 
<a title="Case Network ID - CaseWiki" href="http://wiki.case.edu/Case_Network_ID">Case Network ID</a> followed by 
<strong>.id.case.edu</strong>. So, I could also use 
<a href="http://jms18.id.case.edu">
<strong>jms18.id.case.edu</strong>
</a>. If you want to try logging in with it, you can head over to 
<a title="Simon Willison's Weblog" href="http://simonwillison.net/">Simon Willison's Weblog</a> and, at the top where it says "Sign in with OpenID," click on that and enter 
<strong>&lt;USERNAME&gt;.id.case.edu</strong>. A better example is logging into 
<a title="Free Worldwide Travel Guides - Wikitravel" href="http://wikitravel.org/">Wikitravel</a> because it shows how information (such as nicknames, email address, full name, etc.) can be shared between a OpenID Provider and client. You can sign in to Wikitravel 
<a title="Login with OpenID - Wikitravel" href="http://wikitravel.org/en/Special:OpenIDLogin">here</a>. The information sharing part doesn't so much "work" yet. I'm getting there. And because it is integrated upwards towards 
<a href="http://wiki.case.edu/CAS">CAS</a>, it should interoperate with all of the other "identity systems/protocols" we've integrated with CAS like 
<a title="Shibboleth Project - Internet2 Middleware" href="http://shibboleth.internet2.edu/">Shibboleth</a> (and, in testing, Oracle's Single Sign On, Sun's, and 
<a title="Google Apps - SAML-based Single Sign-On" href="http://code.google.com/apis/apps/sso/saml_reference_implementation.html">Google's SAML-based Single Sign-On</a>). I may throw up some screencasts showing the effects of this by bouncing in between normal CAS-protected apps (like this 
<a href="http://blog.case.edu">blog system</a> or the 
<a href="http://wiki.case.edu">wiki</a>), Shibboleth protected ones, and OpenID protected ones.</div
></content
><author
><name
></name
><email
>blog-admin@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></author
></entry
><entry
><title
>Web Application Performance and Scalability</title
><link href="http://blog.case.edu/gps10/2007/02/25/web_application_performance_and_scalability"
 /><id
>http://blog.case.edu/gps10/2007/02/25/web_application_performance_and_scalability</id
><published
>2007-02-25T20:00:00Z</published
><updated
>2007-02-25T21:10:25Z</updated
><category term="HTTP" label="HTTP"
 /><category term="optimization" label="optimization"
 /><category term="scaling" label="scaling"
 /><category term="web services" label="web services"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>If you frequent community-driven news sites such as 
<a href="http://www.digg.com">Digg</a> and 
<a href="http://www.reddit.com">Reddit</a>, you often come across posts on how to get every drop of performance out of your web application. The sister issue of scalability is oftentimes addressed, usually in its manifestation, loss of service due to overwhelming usage. These performance-enhancing and scalability guides often focus on software-level solutions. Use this data type. Use that API or framework. Use caching in your application-- and here is how to implement it in Perl/Ruby/PHP/Java/.NET. There is always the tip on how to make a simple caching framework in your favorite web application language. There is always the list of settings to tune your web server and your script execution engine. These are all fine and dandy, but people always seem to overlook the obvious solution. Most web applications generate the same set of data for sequential requests, even highly-dynamic, user-driven, Web 2.0 sites. With this in mind, we realize that all web applications share the simple trait that they communicate using the HTTP protocol. There is a server. There is a client. In between there is HTTP. Nothing more. Nothing less. And wouldn't you know it, the 
<a href="http://www.w3.org/Protocols/rfc2616/rfc2616.html">HTTP specification</a> has a 
<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html">whole section</a> on caching! So, next time you are trying to squeeze hits per second out of your web application, don't search the net for obscure hacks and optimizations, turn to the specs. Introducing a few extra HTTP headers into your dynamically-generated response and adding a web cache, such as 
<a href="http://www.squid-cache.org/">Squid</a>, in front of your main web server will do more than you realize. Even if you implement caching inside of your web script, you still have to go through all the overhead to initialize the script for each request. In many cases, the functionality of your page output cache can be duplicated using HTTP caching. It makes no sense to execute a script for a simple HTTP GET request. In the ideal world, the only time a request should actually hit your script server is when new data is being sent or when the HTTP cache does not have the data you seek. Now that you have been enlightened, your challenge is to implement it. I admit, it can be challenging, especially when content on your site is highly dynamic. But just think of the smile on your face when you realize you just increased capacity by a factor of ten without buying new hardware. Never underestimate the power of the HTTP protocol.</div
></content
><author
><name
>Gregory Szorc</name
><email
>gregory.szorc@case.edu</email
><uri
>http://blog.case.edu/gps10</uri
></author
></entry
><entry
><title
>Web APIs Are Just Web Sites</title
><link href="http://blog.case.edu/jeremy.smith/2007/01/16/web_apis_are_just_web_sites"
 /><id
>http://blog.case.edu/jeremy.smith/2007/01/16/web_apis_are_just_web_sites</id
><published
>2007-01-16T17:41:13Z</published
><updated
>2007-01-16T17:41:29Z</updated
><category term="HTTP" label="HTTP"
 /><category term="Web Services" label="Web Services"
 /><category term="linkblog" label="linkblog"
 /><category term="web" label="web"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>
<a title="Paul Downey &#239;&#191;&#189; Blog Archive &#239;&#191;&#189; Web APIs Are Just Web Sites" href="http://blog.whatfettle.com/2007/01/11/good-web-apis-are-just-web-sites/">Web APIs Are Just Web Sites</a> Nobody believes me when I tell them that.</div
></content
><author
><name
>Jeremy Smith</name
><email
>jeremy.smith@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></author
></entry
><entry
><title
>SOAPy Google Searching No More</title
><link href="http://blog.case.edu/jeremy.smith/2006/12/18/soapy_google_searching_no_more"
 /><id
>http://blog.case.edu/jeremy.smith/2006/12/18/soapy_google_searching_no_more</id
><published
>2006-12-18T20:01:13Z</published
><updated
>2006-12-18T20:02:12Z</updated
><category term="Web Services" label="Web Services"
 /><category term="google" label="google"
 /><category term="linkblog" label="linkblog"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>
<a title="Google Deprecates Their SOAP Search API" href="http://radar.oreilly.com/archives/2006/12/google_depreciates_SOAP_API.html">Google Deprecates Their SOAP Search API</a>
</div
></content
><author
><name
>Jeremy Smith</name
><email
>jeremy.smith@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></author
></entry
><entry
><title
>Observer's RSS Feed</title
><link href="http://blog.case.edu/jeremy.smith/2006/12/14/observers_rss_feed"
 /><id
>http://blog.case.edu/jeremy.smith/2006/12/14/observers_rss_feed</id
><published
>2006-12-14T20:51:11Z</published
><updated
>2006-12-14T20:55:29Z</updated
><category term="Web Services" label="Web Services"
 /><category term="linkblog" label="linkblog"
 /><category term="observer" label="observer"
 /><category term="rss" label="rss"
 /><category term="syndicated feeds" label="syndicated feeds"
 /><category term="xml" label="xml"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>Just in time for 
<a href="http://wiki.case.edu/Winter_Break">Winter Break</a>, 
<a title="The Observer" href="http://observer.case.edu/">The Observer's</a> 
<a title="The Observer" href="http://observer.case.edu/feed.xml">RSS feed</a> is back! 
<a title="Jeremy Smith's blog: Observer's Broken Feed" href="http://blog.case.edu/jms18/2006/09/29/observer_broken_feed">Finally</a>! Just one note, can you guys change the 
<code>&lt;link&gt;</code> element from 
<code>http://observer</code> to 
<code>http://observer.case.edu</code>? Not using a 
<acronym title="Fully Qualified Domain Name">FQDN</acronym> doesn't make sense.</div
></content
><author
><name
>Jeremy Smith</name
><email
>jeremy.smith@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></author
></entry
><entry
><title
>SOAP v. Rest</title
><link href="http://blog.case.edu/jeremy.smith/2006/11/17/soap_v_rest"
 /><id
>http://blog.case.edu/jeremy.smith/2006/11/17/soap_v_rest</id
><published
>2006-11-17T08:01:59Z</published
><updated
>2006-11-17T18:47:26Z</updated
><category term="HTTP" label="HTTP"
 /><category term="Web Services" label="Web Services"
 /><category term="linkblog" label="linkblog"
 /><category term="rest" label="rest"
 /><category term="web standards" label="web standards"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>Because I can't help but link to SOAP/REST discussions: 
<a title="Pete Lacey&#226;&#8364;&#8482;s Weblog :: The S stands for Simple" href="http://wanderingbarque.com/nonintersecting/2006/11/15/the-s-stands-for-simple/">The S stands for Simple</a> 
<a title="Getting Data | The REST Dialogues | What Not How | http://duncan-cragg.org/blog/" href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/">The REST Dialogues</a> A well reasoned response from the other side: 
<a title="Ian Foster: Web Fundamentalism" href="http://ianfoster.typepad.com/blog/2006/11/the_web_thought.html">Web Fundamentalism</a>. My take... there is a reason CORBA, DCOM, RMI, etc. have failed while the "web" has not, and recreating RMI-"principles" atop HTTP (or SMTP or whatever else) may suffer the same fate. (
<strong>Update:</strong> Sam Ruby has a good post describing some of the 
<a title="Sam Ruby: The H stands for Hyper" href="http://www.intertwingly.net/blog/2006/11/17/The-H-stands-for-Hyper">imperfections encountered</a> with REST style programming (make sure to follow all of his links; they are all worth reading).)</div
></content
><author
><name
>Jeremy Smith</name
><email
>jeremy.smith@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></author
></entry
><entry
><title
>HTTP and Microformats</title
><link href="http://blog.case.edu/jeremy.smith/2006/11/12/http_and_microformats"
 /><id
>http://blog.case.edu/jeremy.smith/2006/11/12/http_and_microformats</id
><published
>2006-11-12T20:19:59Z</published
><updated
>2006-11-12T20:58:33Z</updated
><category term="HTTP" label="HTTP"
 /><category term="Web Services" label="Web Services"
 /><category term="linkblog" label="linkblog"
 /><category term="microformats" label="microformats"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>
<a title="err.the_blog.find_by_title('Me and uFormats')" href="http://errtheblog.com/post/37">Remember when everyone realized that HTTP was really good at what it did and since we already knew it, we should just use it and stop going crazy with proprietary / complex / lesser known protocols?</a> I think that only like 3% of people have realized that. The other 97% are still using huge "frameworks" and "stacks" to implement something as simple as 
<a title="HTTP/1.1: Status Code Definitions" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5">caching</a> 
<a title="HTTP/1.1: Header Field Definitions" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1">et al</a>. But that's not what the article focuses on. Go read it. It describes use-cases for 
<a title="microformats" href="http://microformats.org/">microformats</a>.</div
></content
><author
><name
>Jeremy Smith</name
><email
>jeremy.smith@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></author
></entry
><entry
><title
>Testing Word 2007 Blog Integration</title
><link href="http://blog.case.edu/bes7/2006/11/05/testing_word_2007_blog_integration"
 /><id
>http://blog.case.edu/bes7/2006/11/05/testing_word_2007_blog_integration</id
><published
>2006-11-06T04:21:38Z</published
><updated
>2008-04-22T19:00:26Z</updated
><category term="2007" label="2007"
 /><category term="Filer" label="Filer"
 /><category term="MetaWebLog" label="MetaWebLog"
 /><category term="Microsoft" label="Microsoft"
 /><category term="Web Services" label="Web Services"
 /><category term="WebDAV" label="WebDAV"
 /><category term="Word" label="Word"
 /><category term="blog" label="blog"
 /><category term="integration" label="integration"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>
<p>It seems that Word 2007 has direct support for posting blog entries through services such as Windows Live Spaces and Blogger. While Windows Live Spaces is not surprising, is the inclusion of Blogger (a Google service) a sign that things are changing at Microsoft? What is more, they have also added support for any blog service that supports either ATOM or MetaWebLog API. After some digging, it turns out that blog.case.edu does use the MetaWebLog API, so I'm giving it a test.</p>
<p>If anyone else is interested in trying this out, simply tell Word 2007 to make a New Blog Post (Office Menu -&gt; New -&gt; Blog post). A wizard will come up asking if you'd like to register with a Blog service &#226;&#8364;&#8220; tell it yes, and then for the provider, specify 'Other'. Enter your Case ID and password, make sure 'MetaWebLog' is selected as the API, and enter 
<a href="http://blog.case.edu/mt/mt-xmlrpc.cgi">http://blog.case.edu/mt/mt-xmlrpc.cgi</a> as the Blog Post URL. If you'd like to have Word automatically upload images to your Filer space, it's really quite simple. When prompted for your Image Provider's information, select 'My own server' from the list, enter 
<a href="https://filer.case.edu/dav/abc123">https://filer.case.edu/dav/abc123</a> as the Upload URL (use your own Case ID instead of abc123), and 
<a href="http://filer.case.edu/abc123">http://filer.case.edu/abc123</a> as the Source URL (again use your own Case ID here). Finish the wizard and you should be good to go.</p>
<p>What is interesting is that this is a great example of how powerful web services can be. Once your account is set up, you can 'Open Existing' to open any blog posts you've made (even ones you didn't make through Word) for revision or just to look over. You can insert category and tag info into your post (caveat: this was the only thing I haven't been able to get working so far &#226;&#8364;&#8220; seems like a bug). Word even has some integration with image hosting providers (none are preloaded yet, though it does support WebDAV interfaces such as Filer). All this works because the MetaWebLog API provides a list of functions to any API client (in this case, Word). These functions are standardized though a number of RFCs so that anyone can make an interoperable blog client or host as long as they abide by the contracts set forth in the RFC documents. Word and the blog.case.edu server then communicate by transferring XML documents which represent the client's requests and the server's responses. Again these XML documents follow a standardized schema which must be adhered to in order for clients and servers to communicate successfully.</p>
<p>The surprise is that the folks at Microsoft have not created their own 'better' schema and API, nor have they 'embraced-and-extended' the existing ones. Instead they have put their ego in check to produce a very impressive, interoperable piece of software. It seems that in the past year or so we've really seen a breath of fresh air at Microsoft, and hopefully we can look forward to more cool, interoperable products in the future.</p>
</div
></content
><author
><name
>Brandon Siegel</name
><email
>brandon.e.siegel@case.edu</email
><uri
>http://blog.case.edu/bes7</uri
></author
></entry
><entry
><title
>SOA</title
><link href="http://blog.case.edu/jeremy.smith/2006/11/02/soa"
 /><id
>http://blog.case.edu/jeremy.smith/2006/11/02/soa</id
><published
>2006-11-02T07:13:43Z</published
><updated
>2006-11-02T07:15:05Z</updated
><category term="Failures of Technology" label="Failures of Technology"
 /><category term="General Information Technology" label="General Information Technology"
 /><category term="Web Services" label="Web Services"
 /><category term="it" label="it"
 /><category term="linkblog" label="linkblog"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>
<a title="SOA Facts" href="http://soafacts.com/">SOA can write and compile itself</a>
</div
></content
><author
><name
>Jeremy Smith</name
><email
>jeremy.smith@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></author
></entry
><entry
><title
>Calendar Data Synchronization</title
><link href="http://blog.case.edu/jeremy.smith/2006/06/13/calendar_data_synchronization"
 /><id
>http://blog.case.edu/jeremy.smith/2006/06/13/calendar_data_synchronization</id
><published
>2006-06-13T19:53:03Z</published
><updated
>2006-06-13T19:52:14Z</updated
><category term="Web Services" label="Web Services"
 /><category term="atom" label="atom"
 /><category term="calendar" label="calendar"
 /><category term="linkblog" label="linkblog"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>
<a title="Jon Udell: Google Calendar and its API" href="http://weblog.infoworld.com/udell/2006/06/13.html#a1468">Google Calendar and its Atom API</a> The world of meshing your calendar data is already here. The world of all of your disparate calendaring applications' data synchronizing with one another is nigh. (And, thankfully, it had nothing to do with 
<a title="OMA Enabler Releases and Specifications - OMA Data Synchronization Phase 2" href="http://www.openmobilealliance.org/release_program/ds_v112.html">Open Mobile Alliance Data Synchronization and Device Management</a> specification.)</div
></content
><author
><name
>Jeremy Smith</name
><email
>jeremy.smith@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></author
></entry
><entry
><title
>Subscribe to Your Oracle Calendar iCal File</title
><link href="http://blog.case.edu/jeremy.smith/2006/06/02/subscribe_to_your_oracle_calendar_ical_file"
 /><id
>http://blog.case.edu/jeremy.smith/2006/06/02/subscribe_to_your_oracle_calendar_ical_file</id
><published
>2006-06-02T19:31:31Z</published
><updated
>2006-06-02T19:31:56Z</updated
><category term="Web Services" label="Web Services"
 /><category term="calendar" label="calendar"
 /><category term="mainblog" label="mainblog"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>I've taken a real liking to 
<a href="http://calendar.google.com">Google Calendar</a>. One thing that always bothered me about our 
<a href="http://calendar.case.edu">calendar</a> was that there was no way to access the contents of your calendar via HTTP. 
<a href="http://blog.case.edu/gps10" title="Greg Szorc">Greg</a> whipped up a 
<a href="http://webservices.case.edu/calendar/oracle/download">downloader</a> for iCal files, but if the calendaring app you're using doesn't support HTTP Auth, you're out of luck. So, I "scratched the itch" and made a way for you to generate a "secret" URL that when dereferenced returns your Oracle Calendar's iCal file. I updated the documentation on the 
<a title="Calendaring" href="http://webservices.case.edu/calendar/">Webservices Calendaring page</a> and updated the 
<a title="Oracle Calendar - CaseWiki" href="http://wiki.case.edu/Oracle_Calendar#URL_Referencable_iCal_File">Case Wiki</a> with some documentation on using it. This post could be considered a companion piece to my last post about 
<a title="Jeremy Smith's blog: Don't Limit Access of Your IT Information/Service" href="http://blog.case.edu/jms18/2006/06/02/dont_limit_access_of_your_it_informationservice">making your data/service more open</a>. 
<a title="Small Pieces Loosely Joined" href="http://www.smallpieces.com/">Small pieces loosely joined</a> (&#8592; I just love linking to that). To restate it in some other 
<a title="Building Web Services the REST Way" href="http://www.xfront.com/REST-Web-Services.html">terms</a>, everything important should have a URI.</div
></content
><author
><name
>Jeremy Smith</name
><email
>jeremy.smith@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></author
></entry
><entry
><title
>STREST</title
><link href="http://blog.case.edu/jeremy.smith/2006/05/27/strest"
 /><id
>http://blog.case.edu/jeremy.smith/2006/05/27/strest</id
><published
>2006-05-28T01:13:59Z</published
><updated
>2006-05-28T01:15:50Z</updated
><category term="Web Services" label="Web Services"
 /><category term="linkblog" label="linkblog"
 /><category term="rest" label="rest"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>
<a title="STREST (Service-Trampled REST) Will Break Web 2.0 | What Not How | http://duncan-cragg.org/blog/" href="http://duncan-cragg.org/blog/post/strest-service-trampled-rest-will-break-web-20/">STREST (Service-Trampled REST)</a> For all those places who offer a "REST" API without actually knowing what REST is.</div
></content
><author
><name
>Jeremy Smith</name
><email
>jeremy.smith@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></author
></entry
><entry
><title
>Web Oriented Services</title
><link href="http://blog.case.edu/jeremy.smith/2006/05/25/web_oriented_services"
 /><id
>http://blog.case.edu/jeremy.smith/2006/05/25/web_oriented_services</id
><published
>2006-05-25T17:03:41Z</published
><updated
>2006-05-25T17:03:24Z</updated
><category term="HTTP" label="HTTP"
 /><category term="Web Services" label="Web Services"
 /><category term="linkblog" label="linkblog"
 /><category term="rest" label="rest"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>
<a title="Does Java EE 5 getting REST mean WOA will break out? | Enterprise Web 2.0 | ZDNet.com" href="http://blogs.zdnet.com/Hinchcliffe/?p=43">REST puts the Web back into Web services by taking what's been so successful with the fundamental protocol of the Web, namely HTTP, and making it into a seemingly ideal Web services architecture.</a>
</div
></content
><author
><name
>Jeremy Smith</name
><email
>jeremy.smith@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></author
></entry
><entry
><title
>Google Calendar API Coming</title
><link href="http://blog.case.edu/jeremy.smith/2006/04/14/google_calendar_api_coming"
 /><id
>http://blog.case.edu/jeremy.smith/2006/04/14/google_calendar_api_coming</id
><published
>2006-04-14T19:29:26Z</published
><updated
>2006-04-14T19:31:52Z</updated
><category term="Web Services" label="Web Services"
 /><category term="calendar" label="calendar"
 /><category term="google" label="google"
 /><category term="mainblog" label="mainblog"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>You've no doubt heard about 
<a title="Google Calendar" href="https://www.google.com/accounts/NewServiceAccount?service=cl&amp;continue=http%3A%2F%2Fwww.google.com%2Fcalendar%2F">Google Calendar</a>. From 
<a title="Re: Google Calendar" href="http://www.imc.org/atom-syntax/mail-archive/msg18159.html">this email</a> to the Atom syntax mailing list, news about a calendaring API is revealed:
<blockquote>The Calendar Data API support (these feeds plus the ability to programmatically create, query, edit, and delete Calendar events) isn't officially launched yet... the release is going to be slightly staggered from the main Calendar Web UI launch that happened today.</blockquote>That's good news. I hope they use WebDAV + HTTP Auth. Or, in an unlikely scenario, it would also be nice if they used the 
<abbr title="Atom Publishing Protocol">APP</abbr>.</div
></content
><author
><name
>Jeremy Smith</name
><email
>jeremy.smith@case.edu</email
><uri
>http://blog.case.edu/jeremy.smith</uri
></author
></entry
><entry
><title
>Student Affairs Weather Data</title
><link href="http://blog.case.edu/gps10/2006/03/24/student_affairs_weather_data"
 /><id
>http://blog.case.edu/gps10/2006/03/24/student_affairs_weather_data</id
><published
>2006-03-24T16:41:43Z</published
><updated
>2006-03-24T16:56:04Z</updated
><category term="Case IT" label="Case IT"
 /><category term="Case IT" label="Case IT"
 /><category term="web services" label="web services"
 /><content type="xhtml"
><div xmlns="http://www.w3.org/1999/xhtml"
>I just saw the new Student Affairs weather applet at 
<a href="http://studentaffairs.case.edu/living/resources/weather/">http://studentaffairs.case.edu/living/resources/weather/</a>. Things like this are no good to me unless there is XML available. Well, Query 
<a href="http://studentaffairs.case.edu/living/resources/weather/wdlconfig.xml">http://studentaffairs.case.edu/living/resources/weather/wdlconfig.xml</a> to get an XML document of the config for the weather applet. It takes a parameter, "nocache" whose value appears to be the current UNIX timestamp out to two decimal places. This config will provide some insight into how things operate. To get the actual data, query 
<a href="http://studentaffairs.case.edu/living/resources/weather/clientraw.aspx">http://studentaffairs.case.edu/living/resources/weather/clientraw.aspx</a>. This document also takes the "nocache" paramater and the value is also the UNIX timestamp. The later link is the one that actually returns the data. The data is formatted as a string with spaces separating the data values. There are no labels to describe what field belongs to what, but it shouldn't be that difficult to decipher. It might be possible to open up the flash applet in an editor and see how it processes the data return. Why XML was not used to transfer data, I do not know. Other links of interest are 
<a href="http://studentaffairs.case.edu/living/resources/weather/clientrawextra.aspx">http://studentaffairs.case.edu/living/resources/weather/clientrawextra.aspx</a> and 
<a href="http://studentaffairs.case.edu/living/resources/weather/clientrawdaily.aspx">http://studentaffairs.case.edu/living/resources/weather/clientrawdaily.aspx</a>. Both also take the "nocache" attribute. This is a really cool applet. For $25, I am not complaining. Still, XML would have been so nice. Oh well. By the way, the data in the table on the bottom actually comes from the Weather Channel's SOAP api. However, Wade Commons' real-time data is invaluable. I must have it.</div
></content
><author
><name
>Gregory Szorc</name
><email
>gregory.szorc@case.edu</email
><uri
>http://blog.case.edu/gps10</uri
></author
></entry
></feed
>