<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-36700117</id><updated>2011-09-13T07:29:10.818-07:00</updated><category term='NUnit'/><category term='HP'/><category term='Vista'/><category term='Microsoft'/><category term='GoogleBooks'/><category term='LibraryThing'/><category term='XNA'/><category term='Google'/><category term='C#'/><category term='Anime'/><category term='Map'/><category term='GDataApi'/><category term='Admin'/><category term='Games'/><category term='GBA'/><category term='NDS'/><category term='Tokyo'/><category term='Eclipse'/><category term='Mac'/><category term='Game Design'/><category term='GoodReads'/><category term='Android'/><category term='Skeptics'/><category term='Video'/><category term='TED'/><category term='Homebrew'/><title type='text'>garykac</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-36700117.post-8287150205072785471</id><published>2010-06-21T07:48:00.000-07:00</published><updated>2010-06-21T07:49:03.018-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GoogleBooks'/><category scheme='http://www.blogger.com/atom/ns#' term='GoodReads'/><category scheme='http://www.blogger.com/atom/ns#' term='LibraryThing'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Which book API to use for a mobile book app? (Part II)</title><content type='html'>&lt;i&gt;(...continued from &lt;a href="http://garykac.blogspot.com/2010/06/which-book-api-to-use-for-mobile-book.html"&gt;Part I&lt;/a&gt;...)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Here is an evaluation of the various Book APIs available with regard to their suitability for use in a standalone Android application.  Please see &lt;a href="http://garykac.blogspot.com/2010/06/which-book-api-to-use-for-mobile-book.html"&gt;Part I&lt;/a&gt; for more background information - this post contains just the raw evaluation and conclusions.&lt;br /&gt;&lt;br /&gt;&lt;p style="font-size: x-large;font-style:bold;background-color:#e0e0e0"&gt;&lt;a href="http://amazon.com/"&gt;Amazon&lt;/a&gt;&lt;/p&gt;Previously called "eCommerce Service API" (or ECS), Amazon's &lt;a href="https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html"&gt;Product Advertising API&lt;/a&gt; is part of the &lt;a href="http://aws.amazon.com/"&gt;Amazon Web Services&lt;/a&gt; (AWS), although the correct link is challenging to find if you start from the top AWS link.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/"&gt;Developer Guide&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Access&lt;/b&gt;&lt;br /&gt;Provides basic Item Search/Lookup and List Search/Lookup.  Lists aren't exactly the same a bookshelves, but I suppose that they're close enough.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Read/Write&lt;/b&gt;&lt;br /&gt;As far as I can tell in the API, there is no way to add a new list or add an item to an existing list. You can, of course, edit/modify the shopping cart, so write access is provided by the API. It seems that Amazon wants the API to be read-only unless you're trying to buy something.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Auth&lt;/b&gt;&lt;br /&gt;Each app that wants to use the API needs to register for an AWSAccessKeyId and then use that ID in all requests.&lt;br /&gt;&lt;br /&gt;I didn't investigate how one would access non-public lists using this API. Presumably this would require some further authentication, but the API restrictions made me stop evaluating.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Restrictions&lt;/b&gt;&lt;br /&gt;From the &lt;a href="https://affiliate-program.amazon.com/gp/advertising/api/detail/agreement.html"&gt;license agreement&lt;/a&gt;, the purpose of the API is to "permit you to advertise items offered on the Amazon Site". Each app that wants to use the API requires enrollment and approval by Amazon (it's apparently not an automated process).&lt;br /&gt;&lt;br /&gt;The license mentions that&lt;br /&gt;&lt;blockquote&gt;Unsuitable applications include those that:&lt;br /&gt;(a) do not have as their principal purpose advertising and marketing the Amazon Site and driving sales of products and services on the Amazon Site;&lt;/blockquote&gt;!!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;Given the access limitations and the license requirements, this API does not seem suitable for use for this purpose.  It might be worth considering in the future if I want to extend this app by adding a link to an Amazon page.&lt;br /&gt;&lt;br /&gt;&lt;p style="font-size: x-large;font-style:bold;background-color:#e0e0e0"&gt;&lt;a href="http://www.anobii.com/"&gt;aNobii&lt;/a&gt;&lt;/p&gt;&lt;a href="http://www.anobii.com/api_home"&gt;aNobii API Home&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Access&lt;/b&gt;&lt;br /&gt;aNobii has 3 API calls: item.getInfo, shelf.getSimpleShelf and contributor.getInfo.&lt;br /&gt;&lt;br /&gt;These seem like they would be enough for a basic read API, but I was unable to get them to work correctly (I kept getting getting a code 401 "Missing parameter(s)" error - was my api_key wrong or was I passing the wrong book id, I have no idea).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Read/Write&lt;/b&gt;&lt;br /&gt;Read-only.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Auth&lt;/b&gt;&lt;br /&gt;Requires a devkey with an extra "secret" id that you combine and then run through a MD5 hash to create your real API key.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Restrictions&lt;/b&gt;&lt;br /&gt;The &lt;a href="http://www.anobii.com/api_term_of_use"&gt;terms of service&lt;/a&gt; include the following: &lt;br /&gt;&lt;blockquote&gt;b. You shall not:&lt;br /&gt;Use aNobii APIs for any application that replicates or attempts to replace the essential user experience of aNobii.com.&lt;/blockquote&gt;Since I'm sure a mobile book management app could easily be construed as replacing the "essential user experience" of aNobii.com, it's probably&lt;br /&gt;not valid to use the API for this.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;As with all of the APIs that require a devkey, there is an issue with assigning a devkey to an application that is distributed (like a phone app). Even though each app is run by a separate user, they all are counted toward the same app id.&lt;br /&gt;&lt;br /&gt;Perhaps this would work if each user could get easily get their own developer key + private key. The user would enter this info once when they installed the app.&lt;br /&gt;&lt;br /&gt;In any case, since this is read-only (and didn't seem to work properly for me), I'll probably pass on this for now since the APIs provided by other sources provide more functionality.&lt;br /&gt;&lt;br /&gt;&lt;p style="font-size: x-large;font-style:bold;background-color:#e0e0e0"&gt;&lt;a href="http://www.goodreads.com/"&gt;GoodReads&lt;/a&gt;&lt;/p&gt;&lt;b&gt;Access&lt;/b&gt;&lt;br /&gt;Nice API with access to most things that you could want. Book info, shelf info for a user, list of books in a shelf.&lt;br /&gt;&lt;br /&gt;Examples:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Get a list of shelves:&lt;br /&gt;http://www.goodreads.com/shelf/list?format=xml&amp;amp;v=2&amp;amp;key=&amp;lt;devkey&amp;gt;&amp;amp;user_id=&amp;lt;id&amp;gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Get list of books in shelf:&lt;br /&gt;http://www.goodreads.com/review/list?format=xml&amp;amp;v=2&amp;amp;key=&amp;lt;devkey&amp;gt;&amp;amp;id=&amp;lt;id&amp;gt;&amp;amp;shelf=&amp;lt;shelf-name&amp;gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Read/Write&lt;/b&gt;&lt;br /&gt;Both reads and writes are supported.  Writes require authentication.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Auth&lt;/b&gt;&lt;br /&gt;Most API calls require either a devkey or require that a user be authorized via OAuth.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Restrictions&lt;/b&gt;&lt;br /&gt;License is pretty standard. API queries are limited to no more than 1 query/second.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;GoodReads has a well thought-out API and handles authorization properly. The only concern is that some are OAuth-based while others are devkey based. Since the devkey based accesses are limited to 1 query/second, this may be a problem when incorporating calls into a standalone app (since the app would be installed on lots of different end-user devices).&lt;br /&gt;&lt;br /&gt;However, this definitely seems like something worth pursuing.&lt;br /&gt;&lt;br /&gt;&lt;p style="font-size: x-large;font-style:bold;background-color:#e0e0e0"&gt;&lt;a href="http://books.google.com/"&gt;Google Books&lt;/a&gt;&lt;/p&gt;&lt;a href="http://code.google.com/apis/books/docs/getting-started.html"&gt;Google Book Search API - Getting Started Guide&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/apis/books/docs/gdata/developers_guide_protocol.html"&gt;Google Book Search Data API : Developer's Guide&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Access&lt;/b&gt;&lt;br /&gt;Basic book info and shelves (with shelf editing) are supported.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Read/Write&lt;/b&gt;&lt;br /&gt;Book data can be read and user shelf info can be read/written (with authentication).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Auth&lt;/b&gt;&lt;br /&gt;General book queries don't require authorization, but to access user-specific data (like bookshelves) it is necessary to have the user authenticate. All writes also require authentication.&lt;br /&gt;&lt;br /&gt;Since the Google Books data is exposed using the Google Data protocol, this authentication can be done using either AuthSub, OAuth or ClientLogin, as described in the &lt;a href="http://code.google.com/apis/gdata/docs/auth/overview.html"&gt;Google Data Authentication page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Restrictions&lt;/b&gt;&lt;br /&gt;The &lt;a href="http://code.google.com/apis/books/terms.html"&gt;Terms of Service&lt;/a&gt; are long and "legal" and deal mostly with requiring that you don't misrepresent yourself (or your app), that you respect Google trademarks and the privacy of the users and that you abide by all applicable laws. Most of it seems pretty boilerplate for a web service.&lt;br /&gt;&lt;br /&gt;No queries/second restrictions, although I suspect if your app started &lt;a href="http://en.wikipedia.org/wiki/Denial-of-service_attack"&gt;DoS&lt;/a&gt;ing the service it would get cut off rather quickly.&lt;br /&gt;&lt;br /&gt;The only item that stood out is that Google reserves the right to insert advertising in the content. This isn't the case with any of the Google Books APIs that I've ever used and I'm not sure how that would work when using a simple text-based API. In any case, this doesn't seem to be an issue but it's worth being aware of.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;In order to securely access user data (like bookshelf info), having a system that allows the end-user (rather than the app developer) provide credentials is essential. This is one of the few APIs that supports this.&lt;br /&gt;&lt;br /&gt;&lt;p style="font-size: x-large;font-style:bold;background-color:#e0e0e0"&gt;&lt;a href="http://isbndb.com/"&gt;ISBNdb&lt;/a&gt;&lt;/p&gt;&lt;a href="http://isbndb.com/docs/api/"&gt;Developer API&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ISBNdb crawls various libraries to build/maintain a database of ISBNs.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Access&lt;/b&gt;&lt;br /&gt;Only provides basic ISBN book lookup.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;blockquote&gt;http://isbndb.com/api/books.xml?access_key=&amp;lt;key&amp;gt;&amp;amp;index1=isbn&amp;amp;value1=&amp;lt;isbn&amp;gt;&lt;/blockquote&gt;&lt;b&gt;Read/Write&lt;/b&gt;&lt;br /&gt;Read-only.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Auth&lt;/b&gt;&lt;br /&gt;Dev key required to access.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Restrictions&lt;/b&gt;&lt;br /&gt;None mentioned on site.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;Not worth investigating further for this application since this info seems readily available elsewhere with fewer restrictions.&lt;br /&gt;&lt;br /&gt;&lt;p style="font-size: x-large;font-style:bold;background-color:#e0e0e0"&gt;&lt;a href="http://www.librarything.com/"&gt;LibraryThing&lt;/a&gt;&lt;/p&gt;&lt;a href="http://www.librarything.com/services/"&gt;LibraryThing APIs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;LibraryThing has a collection of different APIs rather than one coherent API. They are divided into 4 basic categories: Covers, JSON, Webservices, and Misc.&lt;br /&gt;&lt;br /&gt;Covers&lt;ul&gt;&lt;li&gt;Used to get book covers given an ISBN.&lt;/li&gt;&lt;li&gt;Requires a devkey and is limited to 1000 queries/day&lt;/li&gt;&lt;/ul&gt;JSON APIs&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.librarything.com/wiki/index.php/LibraryThing_JSON_Books_API"&gt;Books API&lt;/a&gt;&lt;br /&gt; &lt;ul&gt;&lt;li&gt;This allows you to lookup a book on LibraryThing.&lt;/li&gt;&lt;li&gt;The &lt;a href="http://www.librarything.com/wiki/index.php/LibraryThing_JSON_Books_API"&gt;Books API&lt;/a&gt; page shows 2 different example formats:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;http://www.librarything.com/api/json_books.php?userid=&amp;lt;user-id&amp;gt;&amp;amp;key=&amp;lt;key&amp;gt;&amp;amp;showstructure=1&lt;/li&gt;&lt;li&gt;http://www.librarything.com/api_getdata.php?userid=&amp;lt;user-id&amp;gt;&amp;amp;key=&amp;lt;key&amp;gt;&amp;amp;showstructure=1&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;They both return basically the same info, but the "json_books" version includes a bunch of widget-creating JavaScript at the top before the data begins.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Works (book search) API&lt;ul&gt;&lt;li&gt;This is a book search API and the only documentation relating to it is in this &lt;a href="http://www.librarything.com/blogs/thingology/2008/03/first-cut-works-json-api/"&gt;blog post&lt;/a&gt;&lt;/li&gt;&lt;li&gt;This doesn't require a developer key.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://www.librarything.com/services/rest/documentation/1.0/"&gt;WebServices APIs&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;This appears to be a work-in-progress since it only provides access to a LibraryThing works and authors. I didn't see way to access user lists.&lt;/li&gt;&lt;li&gt;This requires an apikey and is limited to 1000 queries/day.&lt;/li&gt;&lt;li&gt;Example:&lt;ul&gt;&lt;li&gt; http://www.librarything.com/services/rest/1.0/?method=librarything.ck.getwork&amp;amp;apikey=&amp;lt;apikey&amp;gt;&amp;amp;id=&amp;lt;librarything-id&amp;gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;Misc APIs&lt;ul&gt;&lt;li&gt;Easy Linking: Link to LibraryThing using ISBN (rather than LibraryThing book id).&lt;/li&gt;&lt;li&gt;ThingISBN: given an ISBN, return a list of related ISBNs&lt;/li&gt;&lt;li&gt;ISBN -&amp;gt; LibraryThing book id&lt;/li&gt;&lt;li&gt;ISBN -&amp;gt; book language&lt;/li&gt;&lt;li&gt;ISBN validate&lt;/li&gt;&lt;li&gt;Title -&amp;gt; list of possible ISBNs&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Access&lt;/b&gt;&lt;br /&gt;These APIs provide basic access to book data.  However, none of the APIs appears to provide access to the user collections. Shelf functionality could be re-created using the tags (which &lt;i&gt;are&lt;/i&gt; available in the API), but it seems odd not to use LibraryThing's native "shelf" concept&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Read/Write&lt;/b&gt;&lt;br /&gt;Mostly read access but write access of sort-of there. You can add a book using:&lt;br /&gt;&lt;blockquote&gt;http://www.librarything.com/addbook/&amp;lt;isbn&amp;gt;&lt;/blockquote&gt;But this assumes that you are already logged in, so it doesn't really work for a standalone app.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Auth&lt;/b&gt;&lt;br /&gt;Devkeys are required for the JSON and WebServices API calls (although different keys are needed for each). No real Authentication is provided to access user data.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Restrictions&lt;/b&gt;&lt;br /&gt;Most API calls require a devkey and they're all limited to 1000 queries/day.&lt;br /&gt;&lt;br /&gt;Some of the license requirements are quite odd. For example, the JSON Books API actually says the following:&lt;br /&gt;&lt;blockquote&gt;We have yet to settle on a license. You agree to abide by whatever license we eventually choose.&lt;/blockquote&gt;!!&lt;br /&gt;&lt;br /&gt;In addition, both of the JSON APIs have the following in the license:&lt;br /&gt;&lt;blockquote&gt;Must be run as Javascript on user's browser, not fetched by a server; cannot be stored, except for browser caching. Commercial use requires a hard (non-JS) link to LibraryThing on every page that returns results.&lt;/blockquote&gt;Which is clearly not the case if I want to run call this from a phone app.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;Overall, while there are many things to like about what LibraryThing provides, there are too many parts that don't seem mature enough to support a phone app based on the current APIs.  In addition, the licensing requirements for some of the APIs are best described as quirky and certainly preclude creating things like phone apps.&lt;br /&gt;&lt;br /&gt;Still, I was left with the impression that there's some useful stuff here and it might be useful to add some sort of LibraryThing integration.&lt;br /&gt;&lt;br /&gt;&lt;p style="font-size: x-large;font-style:bold;background-color:#e0e0e0"&gt;&lt;a href="http://openlibrary.org/"&gt;OpenLibrary&lt;/a&gt;&lt;/p&gt;&lt;a href="http://openlibrary.org/dev/docs/api"&gt;OpenLibrary APIs:&lt;/a&gt;&lt;br /&gt;&lt;a href="http://openlibrary.org/dev/docs/restful_api"&gt;REST API&lt;/a&gt;&lt;br /&gt;&lt;a href="http://openlibrary.org/dev/docs/api/books"&gt;Books API&lt;/a&gt;&lt;br /&gt;&lt;a href="http://openlibrary.org/dev/docs/api/covers"&gt;Covers API&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Access&lt;/b&gt;&lt;br /&gt;Basic access to books. E.g., using:&lt;blockquote&gt;http://openlibrary.org/api/books?bibkeys=ISBN:&amp;lt;isbn&amp;gt;&amp;amp;details=true&lt;/blockquote&gt;No access to lists since it's a new feature that they're still working on.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Read/Write&lt;/b&gt;&lt;br /&gt;Read only.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Auth&lt;/b&gt;&lt;br /&gt;OpenLibrary allows you to login automatically by POSTing to http://openlibrary.org/account/login.  This sets a login cookie and is apparently intended for web access.&lt;br /&gt;&lt;br /&gt;The API doesn't have or require authentication.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Restrictions&lt;/b&gt;&lt;br /&gt;None mentioned on the site.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;Issues:&lt;ul&gt;&lt;li&gt;Lack of support for lists&lt;/li&gt;&lt;li&gt;Lack of write support&lt;/li&gt;&lt;/ul&gt;Not worth investigating further for this application.&lt;br /&gt;&lt;br /&gt;&lt;p style="font-size: x-large;font-style:bold;background-color:#e0e0e0"&gt;&lt;a href="http://www.worldcat.org/"&gt;WorldCat&lt;/a&gt;&lt;/p&gt;&lt;a href="http://worldcat.org/devnet/wiki/SearchAPIDetails"&gt;WorldCat Search API&lt;/a&gt;&lt;br /&gt;&lt;a href="http://worldcat.org/devnet/wiki/BasicAPIDetails"&gt;WorldCat Basic API&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Access&lt;/b&gt;&lt;br /&gt;Provides basic access to books, but doesn't appear to allow access to user created lists.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Read/Write&lt;/b&gt;&lt;br /&gt;Read-only.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Auth&lt;/b&gt;&lt;br /&gt;Requires a devkey for all access&lt;br /&gt;&lt;br /&gt;For example to do a simple lookup by ISBN:&lt;br /&gt;&lt;blockquote&gt;http://www.worldcat.org/webservices/catalog/content/isbn/&amp;lt;isbn&amp;gt;?wskey=&amp;lt;key&amp;gt;&lt;/blockquote&gt;where &amp;lt;key&amp;gt; is your assigned key.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Restrictions&lt;/b&gt;&lt;br /&gt;Limited to 1000 queries per day.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;Issues:&lt;ul&gt;&lt;li&gt;Devkey + query limit make this inappropriate for an app unless each user gets their own devkey&lt;/li&gt;&lt;li&gt;Lack of access to user created lists&lt;/li&gt;&lt;li&gt;Lack of write functionality&lt;/li&gt;&lt;/ul&gt;Not worth investigating further for this application.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Whew! I'm glad that's done.   Please let me know if you see any errors or omissions.&lt;br /&gt;&lt;br /&gt;I need to say that I'm actually a bit surprised that more APIs didn't make the cut and with how critical the Auth problem ended up being. I was also kinda hoping that &lt;a href="http://www.librarything.com/"&gt;LibraryThing&lt;/a&gt; would do better than it did.&lt;br /&gt;&lt;br /&gt;But now it's time to start playing more with the 2 finalists (&lt;a href="http://www.goodreads.com/"&gt;GoodReads&lt;/a&gt; and &lt;a href="http://books.google.com/"&gt;Google Books&lt;/a&gt;) to see how well they work in practice. Perhaps I'll experiment a bit more with &lt;a href="http://www.librarything.com/"&gt;LibraryThing&lt;/a&gt; as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-8287150205072785471?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/8287150205072785471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=8287150205072785471' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/8287150205072785471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/8287150205072785471'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2010/06/which-book-api-to-use-for-mobile-book_21.html' title='Which book API to use for a mobile book app? (Part II)'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-1093033701251882301</id><published>2010-06-21T07:47:00.000-07:00</published><updated>2010-06-21T07:51:01.830-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GoogleBooks'/><category scheme='http://www.blogger.com/atom/ns#' term='GoodReads'/><category scheme='http://www.blogger.com/atom/ns#' term='LibraryThing'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Which book API to use for a mobile book app?  (Part I)</title><content type='html'>So I'm starting to look into creating a book management app that will run on my Android phone.  There are a few of these apps available in the Android Marketplace, but none of them do quite what I'm looking for.&lt;br /&gt;&lt;br /&gt;What am I looking for?  Well, I have a few requirements:&lt;ul&gt;&lt;li&gt;Needs to be able to add new books easily (via barcode scanner)&lt;/li&gt;&lt;li&gt;Should automatically get book info from online sources&lt;/li&gt;&lt;li&gt;Should allow books to be arranged in "shelves" or tagged&lt;/li&gt;&lt;li&gt;Should store my list of books online&lt;/li&gt;&lt;/ul&gt;The first few requirements are fairly easy - it's the last one that makes things interesting. While it'd be far easier for me to create (yet another) local database to store this information, there are some big advantages to having everything stored "in the cloud":&lt;ul&gt;&lt;li&gt;The data is available on other devices (via the website)&lt;/li&gt;&lt;li&gt;The data is backed up (if something happens to my phone)&lt;/li&gt;&lt;li&gt;It's easy to share&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;Given this requirement, I could either write my own online data storage app or I can take advantage of the already-existing services out there.&lt;br /&gt;&lt;br /&gt;"Writing my own" is not as bad as it sounds. A simple &lt;a href="http://code.google.com/appengine/"&gt;AppEngine&lt;/a&gt; app could be thrown together to handle this. The problem is that while this would work for me with my books, it wouldn't be able to handle &lt;i&gt;other people's&lt;/i&gt; books (without running into the free service limits). The code could be open-sourced to make it easy to others to create their own instance of this web app for their own books, but that's starting to become needlessly complicated.&lt;br /&gt;&lt;br /&gt;So using an existing online book manager is the right path to take. Fortunately, there are a bunch of decent ones out there to choose from that seem to provide (at least part of) what is needed:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/"&gt;Amazon&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.anobii.com/"&gt;aNobii&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.goodreads.com/"&gt;GoodReads&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://books.google.com/"&gt;Google Books&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://isbndb.com/"&gt;ISBNdb&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.librarything.com/"&gt;LibraryThing&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://openlibrary.org/"&gt;OpenLibrary&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.worldcat.org/"&gt;WorldCat&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;The trick is to find which one (or more) supports the features that I want. Note that there are a few other services out there (like &lt;a href="http://www.shelfari.com/"&gt;Shelfari&lt;/a&gt;) not listed because they don't have a developer API.  If you know of any others that are worth investigating, please let me know.&lt;br /&gt;&lt;br /&gt;Now, in an ideal world, this (proposed) phone app would be a simple front-end and the user would be able to select from a number of different online book managers to use as a backend. While this is great for users (they can pick/choose their favorite online book management site), the sad reality is that this sort of things is challenging for (mostly) technical reasons. This is where a standard interface for accessing personal libraries would come in handy. But, alas, such a thing does not exist.&lt;br /&gt;&lt;br /&gt;So how can I choose from amongst the available options? It seems I need to sit down with each of them and see what they're capable of and then compare that with my requirements listed above.&lt;br /&gt;&lt;br /&gt;To do that, I've broken things out into 4 sections and evaluated each API. These four sections are : Access, Read/Write, Auth and Restrictions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Access&lt;/b&gt;&lt;br /&gt;Quite simply this evaluates whether or not the API provides access to the required data.&lt;br /&gt;&lt;br /&gt;In its simplest form, a "user library" app needs a list of books (&lt;a href="http://en.wikipedia.org/wiki/Isbn"&gt;ISBN&lt;/a&gt;s or &lt;a href="http://en.wikipedia.org/wiki/European_Article_Number"&gt;EAN&lt;/a&gt;s) and way to arrange them into groups (bookshelves or labels).&lt;br /&gt;&lt;br /&gt;More generally, my app needs access to an API that provides the ability to:&lt;ul&gt;&lt;li&gt;Get general book info&lt;ul&gt;&lt;li&gt;Given an ISBN, get the title, author, pub info, thumbnail, ...&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Get user specific info&lt;ul&gt;&lt;li&gt;Get a list of bookshelves (or get a list of labels)&lt;/li&gt;&lt;li&gt;Get a list of books in a bookshelf (or get a list of all books with a particular label)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Read/Write&lt;/b&gt;&lt;br /&gt;Technically, this is part of "Access", but I broke it out for some reason during the evaluation and ended up leaving it that way. Since all APIs (pretty much by definition) provide read access, the real question here is "do they provide write access?".&lt;br /&gt;&lt;br /&gt;The write access required is:&lt;ul&gt;&lt;li&gt;Update user specific info&lt;ul&gt;&lt;li&gt;Add a new bookshelf (or label)&lt;/li&gt;&lt;li&gt;Add a new book&lt;/li&gt;&lt;li&gt;Add/update user info for a book&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;The bare minimum is to be able to add a new book to a shelf. The other 2 are 'would be nice's.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Auth&lt;/b&gt;&lt;br /&gt;This is where things start getting tricky. "Auth" is a combination of "authentication" (is the user who they say they are) and "authorization" (does the user have access to the requested resource).&lt;br /&gt;&lt;br /&gt;So the question is : "How does the API authenticate/authorize the user to provide access to the data?"&lt;br /&gt;&lt;br /&gt;Often there will be different levels of Auth provided by the same API. To get general book info, the API doesn't need to know who you are. But to get (or update) info on a private shelf, it needs to verify that you are the owner of that shelf.&lt;br /&gt;&lt;br /&gt;As a preview of things to come, this is the area where most APIs fall down. The most common problem being that they attempt to authorize the application (through the use of a devkey or something similar) rather than the user of the application.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Restrictions&lt;/b&gt;&lt;br /&gt;This (almost) final section discusses limits and licensing restrictions on the API.&lt;br /&gt;&lt;br /&gt;Most of the restrictions in the license agreements are pretty typical. Things like:&lt;ul&gt;&lt;li&gt;You can't use the API to harvest data&lt;/li&gt;&lt;li&gt;You can't relicense the data&lt;/li&gt;&lt;li&gt;You agree not the break the law&lt;/li&gt;&lt;li&gt;Not for commercial use&lt;/li&gt;&lt;/ul&gt;So I'll only be breaking out issues that either fall outside what is typical or that may impact the app.&lt;br /&gt;&lt;br /&gt;The 2 common issues that pop up here are:&lt;ul&gt;&lt;li&gt;Acceptable use for the API - Does the agreement forbid what I'm trying to do?&lt;/li&gt;&lt;li&gt;QPS (queries/second) restrictions - Are the QPS restrictions low enough to cause concern?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Conclusions&lt;/b&gt;&lt;br /&gt;And finally, each sections ends with a brief set of conclusions. It's important to note that these conclusions do not evaluate the service as-a-whole, but rather specifically to their suitability for this particular application.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Public disclosure&lt;/b&gt;: I should note that, while I do work at Google, I do not work on the Android or Google Books teams, so I'm not tied to promoting these particular products. My hope with this evaluation is to compare the various options in a fair manner since this Android book-app project falls outside the scope of what I do at work. In addition, I should explicitly state: "&lt;b&gt;The views represented here are my own and not those of my employer.&lt;/b&gt;"&lt;br /&gt;&lt;br /&gt;So, onward with the API evaluations (in &lt;a href="http://garykac.blogspot.com/2010/06/which-book-api-to-use-for-mobile-book_21.html"&gt;Part II&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;i&gt;[Edit: added link to Part II]&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-1093033701251882301?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/1093033701251882301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=1093033701251882301' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/1093033701251882301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/1093033701251882301'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2010/06/which-book-api-to-use-for-mobile-book.html' title='Which book API to use for a mobile book app?  (Part I)'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-4790358535551378374</id><published>2010-06-16T10:32:00.000-07:00</published><updated>2010-06-16T10:35:16.931-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Using the Android SDK on a Mac, Eclipse is really slow. How can I speed it up?</title><content type='html'>Most useful link I've hit in the past few days:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/2787055/using-the-android-sdk-on-a-mac-eclipse-is-really-slow-how-can-i-speed-it-up"&gt;http://stackoverflow.com/questions/2787055/using-the-android-sdk-on-a-mac-eclipse-is-really-slow-how-can-i-speed-it-up&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mac Eclipse was painfully slow (15 seconds to switch between tabs in the same project).  Editing the eclipse.ini file as described made it usable again. Yay!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-4790358535551378374?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/4790358535551378374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=4790358535551378374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/4790358535551378374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/4790358535551378374'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2010/06/using-android-sdk-on-mac-eclipse-is.html' title='Using the Android SDK on a Mac, Eclipse is really slow. How can I speed it up?'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-3635805299663416090</id><published>2010-06-06T17:43:00.001-07:00</published><updated>2010-06-06T21:33:27.073-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GoogleBooks'/><category scheme='http://www.blogger.com/atom/ns#' term='GDataApi'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Using the Google Books API</title><content type='html'>I recently started playing around with the Google Books API and ran into some issues that (at least to me) were not clear in the documentation.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Authentication&lt;/h3&gt;Perhaps it's just me, but I found the &lt;a href="http://code.google.com/apis/books/docs/gdata/developers_guide_protocol.html#Authenticating"&gt;Authenticating&lt;/a&gt; section of the Books API to be somewhat difficult to follow.  This is unfortunate since this step is absolutely necessary to do anything with the API.&lt;br /&gt;&lt;br /&gt;I found the &lt;a href="http://code.google.com/apis/analytics/docs/gwo/index.html"&gt;Getting Started&lt;/a&gt; page for accessing the Google Website Optimizer API to be a lot easier to deal with.  These instructions were based on another document : &lt;a href="http://code.google.com/apis/gdata/articles/using_cURL.html"&gt;Using cURL to interact with Google Data services&lt;/a&gt;. Basically, you create 2 scripts : one to record your authorization token and another to access the feeds using this token.&lt;br /&gt;&lt;br /&gt;I've modified these scripts to work with the Books API.  Note that these are shell scripts that work on Linux and Macintosh. For Windows, you'd need to create equivalent batch files to replicate this.&lt;br /&gt;&lt;br /&gt;The first script is called &lt;span style="font-family: 'courier new'; "&gt;getAuthToken.sh&lt;/span&gt; and is used to request and record your authorization token :&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;read -p 'Username: ' username&lt;br /&gt;stty -echo&lt;br /&gt;read -p "Password: " password; echo&lt;br /&gt;stty echo&lt;br /&gt;curl -d  "accountType=GOOGLE&amp;Email=$username&amp;Passwd=$password&amp;source=books-feed&amp;service=print"  https://www.google.com/accounts/ClientLogin | grep 'Auth=' | sed  s/Auth=// &gt; ~/.booksAuthToken&lt;br /&gt;echo "Token: "&lt;br /&gt;cat ~/.booksAuthToken&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;The second script is called &lt;span style="font-family: 'courier new'; "&gt;getBooksFeed.sh&lt;/span&gt; and is a convenience wrapper to make it easier to access the feeds :&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;authToken=`cat ~/.booksAuthToken`&lt;br /&gt;url="http://books.google.com/books/feeds/users/me/$1"&lt;br /&gt;curl --silent --header "Authorization: GoogleLogin Auth=$authToken" -L "$url" | tidy -xml -indent -quiet&lt;br /&gt;echo ""&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;To use these scripts, first use &lt;span style="font-family: 'courier new'; "&gt;getAuthToken.sh&lt;/span&gt; to get your authorization token. Then you can access the Books feeds by using &lt;span style="font-family: 'courier new'; "&gt;getBooksFeed.sh&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;For example, you can get a list of your collections with :&lt;br /&gt;&lt;blockquote style="font-family: 'courier new';font-size: 14px"&gt;getBooksFeed.sh collections&lt;/blockquote&gt;and a list of books with :&lt;br /&gt;&lt;blockquote style="font-family: 'courier new';font-size: 14px"&gt;getBooksFeed.sh volumes&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;Bookshelves&lt;/h3&gt;In January of this year, the &lt;a href="http://booksearch.blogspot.com/2010/01/updated-books-home-page-and-my-library.html"&gt;Google Books team introduced "bookshelves"&lt;/a&gt;, which replace the labels that could previously be added to books. With this change, your "My Library" now has a set of shelves.  Individual books in your collection can belong to one or more bookshelves.&lt;br /&gt;&lt;br /&gt;There are 5 bookshelves created automatically for you (and you can't delete them if you don't want them. Grrr..). These default bookshelves are :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"Reviewed" - This is your public bookshelf.  It cannot be made private, so anything you place here will always be visible to everyone.&lt;/li&gt;&lt;li&gt;"Favorites" - This is your default bookshelf. &lt;/li&gt;&lt;li&gt;"Reading now"&lt;/li&gt;&lt;li&gt;"To read"&lt;/li&gt;&lt;li&gt;"Have read"&lt;/li&gt;&lt;/ul&gt;Unfortunately, the documentation for using Google Books API doesn't talk about how to access individual bookshelves. For example, to access your library, both the &lt;a href="http://code.google.com/apis/books/docs/gdata/developers_guide_protocol.html#RetrievingAllBooksInLibrary"&gt;Google Books API Developer's Guide&lt;/a&gt; and the &lt;a href="http://code.google.com/apis/books/docs/gdata/reference.html#LibraryFeed"&gt;Google Books Data API : Reference Guide&lt;/a&gt; say to use :&lt;br /&gt;&lt;blockquote style="font-family: 'courier new';font-size: 14px"&gt;http://books.google.com/books/feeds/users/me/collections/library/volumes&lt;br /&gt;&lt;/blockquote&gt;The problem is that this URL doesn't return all of the books in the user library &amp;mdash; it only returns the books in the default bookshelf ("Favorites").&lt;br /&gt;&lt;br /&gt;To get a list of the books in a different bookshelf, you need to use the following URL :&lt;br /&gt;&lt;blockquote style="font-family: 'courier new';font-size: 14px"&gt;http://books.google.com/books/feeds/users/me/collections/&amp;lt;id&amp;gt;/volumes&lt;/blockquote&gt;which requires that you know the &amp;lt;id&amp;gt; of the bookshelf you want to search.  You can get these IDs by requesting a list of bookshelves :&lt;br /&gt;&lt;blockquote style="font-family: 'courier new';font-size: 14px"&gt;http://books.google.com/books/feeds/users/me/collections&lt;/blockquote&gt;This will return a list of all bookshelves in the user library and each entry will contain a URL that contains the bookshelf ID.  The pre-defined shelves have numbers between 0 and 5, whereas user-defined shelves seem to start at 1001.&lt;br /&gt;&lt;br /&gt;For my account, 0 = "Favorites", 2 = "To read", 3 = "Reading now", 4 = "Have read", and 5 = "Reviewed".  Bookshelf ID = 1 doesn't seem to be defined.&lt;br /&gt;&lt;br /&gt;So, using "library" as the &amp;lt;id&amp;gt; appears to be an alias for bookshelf "0" which is somewhat misleading since "library" implies all bookshelves, whereas it actually returns only those volumes in the "Favorites" bookshelf.  My guess is that this is an artifact of the old pre-bookshelf days that didn't quite translate well.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Searching bookshelves&lt;/h3&gt;To search your library, the &lt;a href="http://code.google.com/apis/books/docs/gdata/developers_guide_protocol.html#RetrievingBooksInLibraryWithQuery"&gt;Developer's Guide&lt;/a&gt; says to use :&lt;br /&gt;&lt;blockquote style="font-family: 'courier new';font-size: 14px"&gt;http://books.google.com/books/feeds/users/me/collections/library/volumes?q=bear&lt;/blockquote&gt;But this will only search the default ("Favorites") bookshelf. The proper way to search your entire library is to use :&lt;br /&gt;&lt;blockquote style="font-family: 'courier new';font-size: 14px"&gt;http://books.google.com/books/feeds/users/me/volumes?q=bear&lt;/blockquote&gt;which will search all of your bookshelves.&lt;br /&gt;&lt;br /&gt;To search a single bookshelf, you can use :&lt;br /&gt;&lt;blockquote style="font-family: 'courier new';font-size: 14px"&gt;http://books.google.com/books/feeds/users/me/collections/&amp;lt;id&amp;gt;/volumes?q=bear&lt;/blockquote&gt;where &amp;lt;id&amp;gt; is the ID of the bookshelf to search.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Summary&lt;/h3&gt;&lt;i&gt;Note: This section gives the parameter that you would pass to the &lt;span style="font-family: 'courier new'; "&gt;getBooksFeed.sh&lt;/span&gt; script.  If you need the full URL for these feeds, add the following at the beginning :&lt;/i&gt;&lt;br /&gt;&lt;blockquote style="font-family: 'courier new';font-size: 14px"&gt;http://books.google.com/books/feeds/users/me/&lt;/blockquote&gt;To get a list of all your bookshelves :&lt;br /&gt;&lt;blockquote style="font-family: 'courier new';font-size: 14px"&gt;collections&lt;/blockquote&gt;To get information about a specific bookshelf :&lt;br /&gt;&lt;blockquote style="font-family: 'courier new';font-size: 14px"&gt;collections/&amp;lt;id&amp;gt;&lt;/blockquote&gt;To get a list of all the books in a bookshelf :&lt;br /&gt;&lt;blockquote style="font-family: 'courier new';font-size: 14px"&gt;collections/&amp;lt;id&amp;gt;/volumes&lt;/blockquote&gt;To get a list of all your books :&lt;br /&gt;&lt;blockquote style="font-family: 'courier new';font-size: 14px"&gt;volumes&lt;/blockquote&gt;To search all your books (in all bookshelves) :&lt;br /&gt;&lt;blockquote style="font-family: 'courier new';font-size: 14px"&gt;volumes?&amp;lt;search-term&amp;gt;&lt;/blockquote&gt;To search within a specific bookshelf :&lt;br /&gt;&lt;blockquote style="font-family: 'courier new';font-size: 14px"&gt;collections/&amp;lt;id&amp;gt;/volumes?&amp;lt;search-term&amp;gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-3635805299663416090?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/3635805299663416090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=3635805299663416090' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/3635805299663416090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/3635805299663416090'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2010/06/using-google-books-api.html' title='Using the Google Books API'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-96175775277924254</id><published>2009-07-06T22:00:00.000-07:00</published><updated>2009-07-06T22:06:40.010-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HP'/><title type='text'>HP Pavilion dv6</title><content type='html'>This is a nice little laptop. The screen is pretty and it's not too big. It runs fairly cool (at least compared with my old HP laptop).&lt;br /&gt;&lt;br /&gt;And the keyboard is nice. I wish is were backlit, and while I like the numeric keypad on the right, I don't think that I love it. With the old laptop, I was (subconsciously) used to aligning my right hand with the edge of the laptop, and I can't do that anymore. The touchpad is slightly offset to be more aligned with the main keyboard - a little odd at first, but not a big deal. I find that I'm sitting a little bit to the left when I use the computer so that I'm aligned with the keyboard as well.&lt;br /&gt;&lt;br /&gt;But it's very nice so far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-96175775277924254?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/96175775277924254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=96175775277924254' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/96175775277924254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/96175775277924254'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2009/07/hp-pavilion-dv6.html' title='HP Pavilion dv6'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-5501786195299613278</id><published>2009-07-06T21:39:00.000-07:00</published><updated>2009-07-06T22:00:37.918-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><category scheme='http://www.blogger.com/atom/ns#' term='HP'/><title type='text'>New Laptop with Vista</title><content type='html'>I was planning on skipping the whole Vista thing. Not that there was anything terribly wrong with it - just that it didn't really give me anything that I really needed.&lt;br /&gt;&lt;br /&gt;We got a netbook earlier this year and I was glad that it came with XP because that meant that "things just worked". This is partially a comment on XP functioning nicely (thankyouverymuch) and partially a comment on family members expectations when using a computer. "Things just work" and "things are where they are supposed to be". Changing to a new OS means that things are going to move around and I had no great need/desire to figure out where everything had moved (and then show everyone else in the household).&lt;br /&gt;&lt;br /&gt;Well, my XP laptop is now encountering problems and it'll take a while to get it back in working order. In the meantime, I needed a new laptop and CostCo was having a good deal on a HP Psvilion dv6. I was irritated with CostCo for being closed on the 4th of July (how could they do that to me!), but not irritated enough to go shopping elsewhere for a computer. So I waited an entire day without a computer.&lt;br /&gt;&lt;br /&gt;And yesterday I brought it home.&lt;br /&gt;&lt;br /&gt;Vista.&lt;br /&gt;&lt;br /&gt;Now what? Do I play the "I'm too cool to use Vista" game and install XP on this machine? Or do I go straight to Windows 7 and hope that the various upgrades go smoothly?&lt;br /&gt;&lt;br /&gt;Ah, I'm too lazy for that. Let's just see how Vista works. I'm sure it's perfectly usable...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-5501786195299613278?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/5501786195299613278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=5501786195299613278' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/5501786195299613278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/5501786195299613278'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2009/07/new-laptop-with-vista.html' title='New Laptop with Vista'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-2845619187698894386</id><published>2009-04-05T07:18:00.000-07:00</published><updated>2009-04-05T07:33:19.076-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Admin'/><title type='text'>Disabling startup items in WinXP</title><content type='html'>Looking at the task manager this morning, I noticed a bunch of old/garbage items running -- like WDBtnMgr, which is a "button manager" for WD hard drives that was left over from when we briefly owned one (&lt;span style="font-style:italic;"&gt;we returned it, partially because of the software it insisted on installing everywhere, and partially because it tried to be clever with power management and didn't always connect properly. In any case, why would I want a "button manager" for a hard disk?&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Anyway, while searching I found this site: &lt;a href="http://www.wikihow.com/Alter-Startup-Programs-in-Windows-XP"&gt;http://www.wikihow.com/Alter-Startup-Programs-in-Windows-XP&lt;/a&gt; which shows how to use &lt;tt&gt;msconfig&lt;/tt&gt; to disable the startup items.&lt;br /&gt;&lt;br /&gt;But the most useful information on that page (for me, at least) is the link to &lt;a href="http://www.processlibrary.com/"&gt;ProcessLibrary&lt;/a&gt;, which is a list of all those cryptic process names with information about each one. Very useful!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-2845619187698894386?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/2845619187698894386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=2845619187698894386' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/2845619187698894386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/2845619187698894386'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2009/04/disabling-startup-items-in-winxp.html' title='Disabling startup items in WinXP'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-2556711096140067277</id><published>2009-01-14T19:11:00.000-08:00</published><updated>2009-01-14T21:50:27.453-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='NUnit'/><title type='text'>Debugging C# NUnit unit tests</title><content type='html'>I'm finally getting around to adding unit tests to a C# project I'm working on and got a chance to play around with &lt;a href="http://nunit.org/index.php?p=home"&gt;NUnit&lt;/a&gt;. Yes, I know, I should've started adding these tests long ago (like when I started the project), but better late than never.&lt;br /&gt;&lt;br /&gt;Using NUnit is quite easy:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Download the MSI from &lt;a href="http://nunit.org/index.php?p=download"&gt;http://nunit.org&lt;/a&gt; (Current version 2.4.8)&lt;/li&gt;&lt;li&gt;Install&lt;/li&gt;&lt;li&gt;Add a Reference to "nunit.framework" in your project&lt;/li&gt;&lt;/ul&gt;Now for each class that needs a unittest, you add&lt;br /&gt;&lt;pre&gt; using NUnit.Framework;&lt;/pre&gt;at the top of the file and add a new class that you mark with a [TestFixture] attribute. This attribute is used by the NUnit GUI app to identify the classes that contain your unit tests.&lt;br /&gt;&lt;br /&gt;Within your new [TestFixture] class, add tests by including methods marked with a [Test] attribute, and you can optionally have SetUp/TearDown methods to make your tests easier to manage.&lt;br /&gt;&lt;br /&gt;Here is a stub [TestFixture] class with a single [Test]:&lt;br /&gt;&lt;pre&gt; [TestFixture]&lt;br /&gt; public class Utils_Test&lt;br /&gt; {&lt;br /&gt;     [Test]&lt;br /&gt;     public void Test_XXX()&lt;br /&gt;     {&lt;br /&gt;         // The unit test.&lt;br /&gt;         Assert.IsTrue(true);&lt;br /&gt;     }&lt;br /&gt; }&lt;/pre&gt;If you want to add the SetUp/TearDown methods, they are marked with their own attributes as follows:&lt;pre&gt; [TestFixture]&lt;br /&gt; public class Utils_Test&lt;br /&gt; {&lt;br /&gt;     [TestFixtureSetUp]&lt;br /&gt;     public void FixtureInit()&lt;br /&gt;     {&lt;br /&gt;         // Initialization for the entire TestFixture.&lt;br /&gt;         // Called once at beginning before any tests.&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     [TestFixtureTearDown]&lt;br /&gt;     public void FixtureCleanup()&lt;br /&gt;     {&lt;br /&gt;         // Cleanup for the entire TestFixture.&lt;br /&gt;         // Called once at end of all tests (even if they throw exceptions).&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     [SetUp]&lt;br /&gt;     public void TestInit()&lt;br /&gt;     {&lt;br /&gt;         // Init for each test.&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     [TearDown]&lt;br /&gt;     public void TestCleanup()&lt;br /&gt;     {&lt;br /&gt;         // Cleanup after running each test.&lt;br /&gt;         // Called even if the test throws an exceptions.&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     [Test]&lt;br /&gt;     public void Test_XXX()&lt;br /&gt;     {&lt;br /&gt;         // The unit test.&lt;br /&gt;         Assert.IsTrue(true);&lt;br /&gt;     }&lt;br /&gt; }&lt;/pre&gt;But again, all you really need is the [Test] method.&lt;br /&gt;&lt;br /&gt;Once you've done this and built your project, you can launch the NUnit GUI exe, point it at your assembly and it will find and run all (or some, if you choose) of your tests.&lt;br /&gt;&lt;br /&gt;One problem is that when you encounter a failing test, you can't just jump in and debug your code. The free &lt;a href="http://www.microsoft.com/express/vcsharp/"&gt;Visual Studio C# Express Edition&lt;/a&gt; doesn't allow you to attach to a running process like the non-free Professional versions of Visual Studio.&lt;br /&gt;&lt;br /&gt;To get around this, I added the following TestSuite class to seek out (using reflection) and call all of the unit tests (just like what the NUnit GUI does).&lt;br /&gt;&lt;pre&gt; using NUnit.Framework;&lt;br /&gt; using System;&lt;br /&gt; using System.Collections.Generic;&lt;br /&gt; using System.Reflection;&lt;br /&gt; using System.Text;&lt;br /&gt;&lt;br /&gt; namespace MyApplication&lt;br /&gt; {&lt;br /&gt;     public class TestSuite&lt;br /&gt;     {&lt;br /&gt;         public static void RunTests()&lt;br /&gt;         {&lt;br /&gt;             int nTests = 0;&lt;br /&gt;             int nFailedTests = 0;&lt;br /&gt;&lt;br /&gt;             foreach (Type t in Assembly.GetExecutingAssembly().GetTypes())&lt;br /&gt;             {&lt;br /&gt;                 if (t.GetCustomAttributes(typeof(TestFixtureAttribute), false).Length != 0)&lt;br /&gt;                 {&lt;br /&gt;                     // Gather test info.&lt;br /&gt;                     MethodInfo mFixtureSetup = null;&lt;br /&gt;                     MethodInfo mFixtureTearDown = null;&lt;br /&gt;                     MethodInfo mSetup = null;&lt;br /&gt;                     MethodInfo mTearDown = null;&lt;br /&gt;                     List&amp;lt;methodinfo&amp;gt; mTests = new List&lt;methodinfo&gt;();&lt;br /&gt;                     foreach (MethodInfo m in t.GetMethods())&lt;br /&gt;                     {&lt;br /&gt;                         if (m.GetCustomAttributes(typeof(TestFixtureSetUpAttribute), false).Length != 0)&lt;br /&gt;                             mFixtureSetup = m;&lt;br /&gt;&lt;br /&gt;                         if (m.GetCustomAttributes(typeof(TestFixtureTearDownAttribute), false).Length != 0)&lt;br /&gt;                             mFixtureTearDown = m;&lt;br /&gt;&lt;br /&gt;                         if (m.GetCustomAttributes(typeof(SetUpAttribute), false).Length != 0)&lt;br /&gt;                             mSetup = m;&lt;br /&gt;&lt;br /&gt;                         if (m.GetCustomAttributes(typeof(TearDownAttribute), false).Length != 0)&lt;br /&gt;                             mTearDown = m;&lt;br /&gt;&lt;br /&gt;                         if (m.GetCustomAttributes(typeof(TestAttribute), false).Length != 0)&lt;br /&gt;                             mTests.Add(m);&lt;br /&gt;                     }&lt;br /&gt;&lt;br /&gt;                     // Run tests&lt;br /&gt;                     object obj = Activator.CreateInstance(t);&lt;br /&gt;&lt;br /&gt;                     if (mFixtureSetup != null)&lt;br /&gt;                         mFixtureSetup.Invoke(obj, null);&lt;br /&gt;&lt;br /&gt;                     foreach (MethodInfo m in mTests)&lt;br /&gt;                     {&lt;br /&gt;                         nTests++;&lt;br /&gt;                         if (mSetup != null)&lt;br /&gt;                             mSetup.Invoke(obj, null);&lt;br /&gt;&lt;br /&gt;                     try&lt;br /&gt;                     {&lt;br /&gt;                         m.Invoke(obj, null);&lt;br /&gt;                     } catch (Exception) {&lt;br /&gt;                         nFailedTests++;&lt;br /&gt;                         Console.WriteLine(String.Format("Exception thrown in {0} during {1} test. ", t.Name, m.Name));&lt;br /&gt;                     }&lt;br /&gt;      &lt;br /&gt;                     if (mTearDown != null)&lt;br /&gt;                         mTearDown.Invoke(obj, null);&lt;br /&gt;                 }&lt;br /&gt;     &lt;br /&gt;                 if (mFixtureTearDown != null)&lt;br /&gt;                     mFixtureTearDown.Invoke(obj, null);&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;         System.Windows.Forms.MessageBox.Show(String.Format("{0} tests. {1} failed", nTests, nFailedTests),&lt;br /&gt;                 "Unit test results");&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt; }&lt;/pre&gt;And then I add a call to &lt;pre&gt; TestSuite.RunTests();&lt;/pre&gt;somewhere in my application so that I can run the unittests from within the app.&lt;br /&gt;&lt;br /&gt;So now when I encounter a unittest failure in the NUnit GUI, I can set a breakpoint at an appropriate place in the code and then run the unittests in the Visual Studio debugger.&lt;br /&gt;&lt;br /&gt;It's not perfect, but it works.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;[Note: older versions of NUnit had a [&lt;a href="http://www.nunit.org/index.php?p=suite&amp;r=2.4.4"&gt;Suite&lt;/a&gt;] attribute that could be used to set up test suites, but this doesn't seem to be present in the most recent releases. In addition, you apparently needed to add each unittest to the test suite manually, which is just asking for problems with missing tests.]&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-2556711096140067277?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/2556711096140067277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=2556711096140067277' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/2556711096140067277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/2556711096140067277'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2009/01/debugging-c-nunit-unit-tests.html' title='Debugging C# NUnit unit tests'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-4020635703143693678</id><published>2008-11-19T16:45:00.000-08:00</published><updated>2008-11-19T16:55:35.534-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game Design'/><title type='text'>Rescue Princess 2.0 Application</title><content type='html'>Slides from a talk that Danc gave at the local Seattle chapter of &lt;a href="http://www.ixda.org/"&gt;IxDA&lt;/a&gt; (Interaction Design Association): "Building a Princess Saving App" and how it compares to application development in general.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lostgarden.com/2008/10/princess-rescuing-application-slides.html"&gt;http://lostgarden.com/2008/10/princess-rescuing-application-slides.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-4020635703143693678?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/4020635703143693678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=4020635703143693678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/4020635703143693678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/4020635703143693678'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2008/11/rescue-princess-20-application.html' title='Rescue Princess 2.0 Application'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-2505707594816184517</id><published>2008-11-19T13:05:00.001-08:00</published><updated>2008-11-23T21:49:46.383-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Video'/><category scheme='http://www.blogger.com/atom/ns#' term='TED'/><category scheme='http://www.blogger.com/atom/ns#' term='Skeptics'/><title type='text'>Stairway to Satan</title><content type='html'>This video from Michael Shermer (director of &lt;a href="http://www.skeptic.com/"&gt;Sceptics Society&lt;/a&gt;, publisher of &lt;a href="http://www.skeptic.com/the_magazine/"&gt;Sceptic Magazine&lt;/a&gt;) discusses why people believe strange things.&lt;br /&gt;&lt;br /&gt;The talk is from the 2006 &lt;a href="http://www.ted.com"&gt;TED Conference&lt;/a&gt;. The entire (14 minute) talk is interesting, but skip ahead to 9:30 to hear the section on Led Zeppelin's &lt;span style="font-style:italic;"&gt;Stairway to Heaven&lt;/span&gt; which supposedly has satanic messages when you play the song backwards. Interesting demonstration of how pre-conditioning can trick you into seeing/hearing/believing things that aren't really there.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/8T_jwq9ph8k&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/8T_jwq9ph8k&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=8T_jwq9ph8k"&gt;http://www.youtube.com/watch?v=8T_jwq9ph8k&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-2505707594816184517?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/2505707594816184517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=2505707594816184517' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/2505707594816184517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/2505707594816184517'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2008/11/this-video-from-michael-shermer.html' title='Stairway to Satan'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-4671206783929707519</id><published>2008-10-18T09:41:00.000-07:00</published><updated>2008-10-18T11:01:09.726-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='NDS'/><title type='text'>Waiting for 2009年3月...</title><content type='html'>&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;a href="http://www.level5.co.jp/products/dq9/index2.html"&gt;Dragon Quest IX&lt;/a&gt;&lt;/span&gt; (&lt;span style="font-weight: normal;"&gt;&lt;span class="t_nihongo_kanji" lang="ja"&gt;ドラゴンクエストIX 星空の守り人&lt;/span&gt;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;Developed by &lt;a href="http://en.wikipedia.org/wiki/Level-5"&gt;Level 5&lt;/a&gt;, published by &lt;a href="http://en.wikipedia.org/wiki/Square_Enix"&gt;Squenix&lt;/a&gt;. This video was taken at this year's &lt;a href="http://tgs.cesa.or.jp/english/"&gt;Tokyo Game Show&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div style="width: 550px; text-align: center;"&gt;&lt;embed type="application/x-shockwave-flash" src="http://gamevideos.1up.com/swf/gamevideos11.swf?embedded=1&amp;amp;fullscreen=1&amp;amp;autoplay=0&amp;amp;src=http://gamevideos.1up.com/video/videoListXML%3Fid%3D22090%26adPlay%3Dtrue" align="middle" height="319" width="500"&gt;&lt;/embed&gt;&lt;a href="http://gamevideos.1up.com/video/id/22090" target="_blank"&gt;&lt;br/&gt;Dragon Quest IX trailer from TGS 2008 [1up]&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Coming March 2009 for Nintendo DS (in Japan. No official date for US).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;a href="http://www.level5.co.jp/products/ninokuni/index.html"&gt;Ni no Kuni&lt;/a&gt;&lt;/span&gt; (&lt;span style="font-weight: normal;"&gt;&lt;span class="t_nihongo_kanji" lang="ja"&gt;ニノ国&lt;/span&gt;&lt;/span&gt; - The Another World)&lt;br /&gt;&lt;br /&gt;Developed by Level 5 with &lt;a href="http://en.wikipedia.org/wiki/Studio_Ghibli"&gt;Studio Ghibli&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="width: 550px; text-align: center;"&gt;&lt;a href="http://kotaku.com/5063489/studio-ghiblilevel-5-game-the-debut-trailer"&gt;&lt;img src="http://dsmedia.ign.com/ds/image/article/913/913818/first-look-ni-no-kuni-20080926074138272.jpg" alt="Ni no kuni screenshot"/&gt;&lt;br/&gt;Ninokuni trailer [Kotaku]&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="width: 550px; text-align: center;"&gt;&lt;a href="http://kotaku.com/5063027/studio-ghiblilevel-5-game-box-gives-other-game-boxes-the-finger"&gt;&lt;img src="http://kotaku.com/assets/images/gallery/9/2008/10/smallish_2940470413_62505d88d7_o.jpg" alt="Spell book from Ni no Kuni"/&gt;&lt;br/&gt;Ninokuni promotional packaging [Kotaku]&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Coming 2009 for Nintendo DS (No official dates for Japan/US release).&lt;br /&gt;&lt;br /&gt;Have I mentioned how much I love Level 5?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-4671206783929707519?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/4671206783929707519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=4671206783929707519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/4671206783929707519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/4671206783929707519'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2008/10/20093.html' title='Waiting for 2009年3月...'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-2170723083758471907</id><published>2008-10-11T07:10:00.000-07:00</published><updated>2008-10-11T09:51:19.016-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NDS'/><category scheme='http://www.blogger.com/atom/ns#' term='Homebrew'/><title type='text'>Nintendo DSi and homebrew</title><content type='html'>The most interesting aspect of Nintendo's recently announced DSi is the addition of SD slot. According to reports, this card is intended to store photos, video, music and games from the DSi Shop. So, wow! it sounds like Nintendo is actually allowing users to play games from a re-writeable memory card. This sounds perfect for homebrew.&lt;br /&gt;&lt;br /&gt;It also sounds perfect for game piracy, which is why I'm doubtful that Nintendo would make this slot anywhere near as useful as it sounds. Aside from maximizing their market share, Nintendo's greatest desire is to eliminate game piracy for their systems.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nintendo vs. the Aarrr! 4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Earlier this year &lt;a href="http://news.cnet.com/8301-13772_3-10003166-52.html"&gt;Nintendo sued a group of companies in Japan&lt;/a&gt; for importing "game copying devices" like the R4DS. Because that's how they view them - simply as "game copying devices" with the implication that &lt;span style="font-style: italic;"&gt;all&lt;/span&gt; game copying is illegal.&lt;br /&gt;&lt;br /&gt;Of course, that's how they have to present their case. If they drew attention to the various uses for these cartridges which are clearly non-infringing like &lt;a href="http://dev-scene.com/NDS/Moonshell"&gt;Moonshell&lt;/a&gt;, &lt;a href="http://www.dragonminded.com/?loc=ndsdev/DSOrganize"&gt;DS Organize&lt;/a&gt;, and the numerous homebrew titles, then they would be presenting a weaker (but more truthful) case.&lt;br /&gt;&lt;br /&gt;Granted, it's likely (although I have no figures) that a significant number of R4 carts have at least one pirated game on them. And the "game backup" defense that is often used is weak because Nintendo made it impossible for normal users to create their own backups. This is important because the courts view a file you made yourself differently from a file you downloaded from the web. One is a backup and the other is not - even if the 2 files are identical and you own a legitimate copy.&lt;br /&gt;&lt;br /&gt;Regardless, the legality of these carts (in the U.S. at least) will likely be determined by the precedent established in the &lt;a href="http://w2.eff.org/legal/cases/betamax/"&gt;Betamax case&lt;/a&gt;. This is where the "significant/substantial non-infringing use" defense comes into play. That is, the legality of these devices will depend on whether or not they support a non-infringing use like homebrew. Since all of these devices effectively enable homebrew, it probably more realistically comes down to whether or not there is a vibrant ("significant") homebrew community using these devices.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What about the DSi?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With the addition of music and video playback in the DSi, they're undermining the need for some homebrew like Moonshell. But there will always be a demand for other homebrew apps and games. If they really want to eliminate the R4, M3 and other carts, then they need to eliminate the &lt;span style="font-style: italic;"&gt;need&lt;/span&gt; for these devices. That means having some Nintendo sanctioned method for writing your own games. With the addition of the SD card in the DSi, they now have a mechanism for doing this.&lt;br /&gt;&lt;br /&gt;But will they do it? Sadly, I think that it's unlikely. My guess is that Nintendo has a love/hate relationship with homebrew. Actually, it's probably more of an "indifferent/hate" relationship. Some people in the company probably think it's cool what people are doing with their hardware, while others can only see dollars (and yen) lost to evil pirates.&lt;br /&gt;&lt;br /&gt;And even if they do allow user-created games to run from the SD card, there are so many ways for them to screw it up and render it (mostly) useless. The most obvious mistake would be to not grant these SD card-based games full access to the hardware, but they could also require that apps be signed or some other nonsense. Nintendo just needs to look at how Apple is handling &lt;a href="http://gizmodo.com/5054435/apple-kicks-podcaster-iphone-app-developer-in-the-nuts-again"&gt;approvals for the iPhone App store&lt;/a&gt; for inspiration.&lt;br /&gt;&lt;br /&gt;But this is all speculation. We know very little about what Nintendo is planning on doing with the DSi. My hope is that they will enable homebrew on the SD card, but I'm not holding my breath.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-2170723083758471907?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/2170723083758471907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=2170723083758471907' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/2170723083758471907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/2170723083758471907'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2008/10/nintendo-dsi-and-homebrew.html' title='Nintendo DSi and homebrew'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-647518642252135026</id><published>2007-12-30T18:11:00.000-08:00</published><updated>2007-12-30T18:53:40.382-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NDS'/><title type='text'>Converting videos for use with Moonshell (NDS)</title><content type='html'>One of the tasks that I needed to do over the holidays was to get some Nintendo DS/GBA flash carts set up for some people who are just getting started in Gameboy/DS homebrew development. Even though the primary use for this card is for homebrew, I thought it would be nice to get some audio/video playback working as well.&lt;br /&gt;&lt;br /&gt;So I installed the multimedia player (homebrew) app &lt;span style="font-weight: bold;"&gt;Moonshell &lt;/span&gt;onto the DS flash carts. The latest version of Moonshell can be found in Moonlight's &lt;a href="http://mdxonline.dyndns.org/archives/nds/"&gt;NDS archive&lt;/a&gt;. As of this post, &lt;a href="http://mdxonline.dyndns.org/archives/2007/08/moonshell_ver171p1_top_page.shtml"&gt;Version 1.71+1&lt;/a&gt; (August 2007) is the most recent version.&lt;br /&gt;&lt;br /&gt;To use image and music files with Moonshell, you just copy your JPG/MP3 files (or a few other formats) over to your  flash card and Moonshell will show/play them just fine.&lt;br /&gt;&lt;br /&gt;Video, however, is a different beast as Moonshell won't dynamically convert the format or the size - it expects the video file to be GBA screen-sized and to be encoded in MPG1 video/MP2 audio. This means that you need to convert the videos into DPG format, which is a special format specific to the NDS and Moonshell. To convert videos into this format, there are a few free tools available (presented in the order in which I discovered them):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;dpgenc.exe&lt;/span&gt; - This is included in the dpgtools distribution that comes with Moonshell. A basic tutorial on how to use (an older version of) this is at can be found in the &lt;a href="http://forums.maxconsole.net/showthread.php?t=18663"&gt;MaxConsole Forums&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;BatchDPG&lt;/span&gt; - This is an alternative to dpgenc created by LS5, another homebrew developer. The &lt;a href="http://ls5.citizendeleted.com/?Download"&gt;official site&lt;/a&gt; still has the old original 1.0 version (with source), but updated versions from various people are also available (like Firon's &lt;a href="http://utorrent.com/BatchDPG_v1.2.7z"&gt;1.2&lt;/a&gt; version). Be sure to review Yee and Firon's &lt;a href="http://m3wiki.com/index.php?title=Yee_and_Firon%27s_%28Guide%29_Videos_on_Moonshell_with_BatchDPG_Guide"&gt;BatchDPG Guide&lt;/a&gt; because there are a number of pre-requisites (AviSynth, ffdshow, .Net Framework 1.1) that you'll need to have installed for this to work.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;SUPER&lt;/span&gt; by eRightSoft - "Simplified, Universal Player Encoder and Recorder" - This is a general video/audio converter that contains special support for DPG files. It can be downloaded from the &lt;a href="http://www.erightsoft.com/SUPER.html"&gt;SUPER main page&lt;/a&gt;, although to get to the actual download link, you'll have to navigate through a number of links. If you get frustrated trying to find the download, here is a &lt;a href="http://www.erightsoft.info/GetFile.php?SUPERsetup.exe"&gt;direct download&lt;/a&gt; link. The latest build is 2007.23 (4 July 2007).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;All of these applications are basically GUI wrappers around &lt;a href="http://ffmpeg.mplayerhq.hu/"&gt;ffmpeg &lt;/a&gt;or &lt;a href="http://sourceforge.net/projects/ffdshow"&gt;ffdshow&lt;/a&gt;, which are standard audio/video encoding/decoding libraries. The first two applications (dpgenc, BatchDPG) are specific for Moonshell DPG files whereas the last one (SUPER) is a general purpose tool that can be used for all sorts of audio/video conversions.&lt;br /&gt;&lt;br /&gt;I tried all of these tools and had luck only with SUPER. There are clearly people out there using dpgenc and BatchDPG successfully, but I kept encountering problems with the conversion - probably codec related, but I didn't bother tracking them down since SUPER worked "out of the box" for my tasks.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;Using SUPER to create DPG files...&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;To create DPG video files using SUPER, select "Nintendo - DS" from the dropdown list of output containers. This will simplify the interface by removing options that are not appropriate for DPG containers.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/garykac/SUPERDPG/photo#5149954130252388498"&gt;&lt;img src="http://lh6.google.com/garykac/R3hP_u8_2JI/AAAAAAAAAHE/1AbfL0q4s_o/s288/super-select-container.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;Select "Nintendo - DS" as the Output Container&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Now you can drag a video file into the window to add it to the filelist. Press the "Encode" button and SUPER will chug away and drop the newly encoded video file into your output directory.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/garykac/SUPERDPG/photo#5149954130252388514"&gt;&lt;img src="http://lh6.google.com/garykac/R3hP_u8_2KI/AAAAAAAAAHM/rygtfCjfUu8/s288/super-encode.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;Drag your video files into the SUPER window&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;One nice thing about SUPER is that, while the interface is a bit busy, there is plenty of context-sensitive help that pops up when you hover over the elements in the UI. This makes it  fairly easy to get started with the program and get things working. To set the output directory, for example, just hover over the Output box and a message will pop up telling you how to set the output options.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-647518642252135026?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/647518642252135026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=647518642252135026' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/647518642252135026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/647518642252135026'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2007/12/converting-videos-for-use-with.html' title='Converting videos for use with Moonshell (NDS)'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-5495106050128597212</id><published>2007-11-14T17:07:00.000-08:00</published><updated>2007-11-14T21:22:09.308-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Bedlam DL3 : 10 years and 1 month ago today</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/garykac/BedlamDL3/photo#5132872363189245186"&gt;&lt;img src="http://lh4.google.com/garykac/RzugOB1QlQI/AAAAAAAAAFk/DmVZXTMhqms/s400/bedlam_dl3_front.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;October 14th was the 10th anniversary of &lt;a href="http://msexchangeteam.com/archive/2004/04/08/109626.aspx"&gt;Bedlam DL3&lt;/a&gt;. These images are from the  "I survived Bedlam DL3" t-shirt designed by &lt;a href="http://www.flee.com/"&gt;Frank Lee&lt;/a&gt;, who was also in the Outlook group at the time Bedlam occurred.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;The back of the Bedlam shirt is far more interesting - it contains choice extracts from some of the emails messages that were sent to the list.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/garykac/BedlamDL3/photo#5132872668131923234"&gt;&lt;img src="http://lh3.google.com/garykac/Rzugfx1QlSI/AAAAAAAAAFw/uUJx8Wl13NI/s400/bedlam_dl3_back.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;...I see that I'm a member of this alias. I never subscribed to it, and would like to know:&lt;br /&gt;a) am I supposed to be on it?&lt;br /&gt;b) what is it?&lt;br /&gt;&lt;br /&gt;Ditto!&lt;br /&gt;ditto????&lt;br /&gt;Ditto to the response below.&lt;br /&gt;How big is this alias anyway?&lt;br /&gt;Wider distribution...&lt;br /&gt;same here...&lt;br /&gt;Here, as well..&lt;br /&gt;Here too.....&lt;br /&gt;Yep. Over here, too.&lt;br /&gt;yep&lt;br /&gt;and here...&lt;br /&gt;Myself also.........&lt;br /&gt;And me.&lt;br /&gt;Very good question&lt;br /&gt;very very good question&lt;br /&gt;in fact an excellent question&lt;br /&gt;couldn't agree more&lt;br /&gt;Yes, I also think so.&lt;br /&gt;I concur...&lt;br /&gt;Likewise...&lt;br /&gt;Me too!&lt;br /&gt;Me too. Any ideas?&lt;br /&gt;Me, too. I have no idea, either.&lt;br /&gt;me too? What is this?&lt;br /&gt;Yeah, me too.&lt;br /&gt;me three...&lt;br /&gt;moi, aussi.&lt;br /&gt;do not "me too" this is apparently a huge list&lt;br /&gt;it would probably be a good idea to halt the "me too's" before they get out of hand.&lt;br /&gt;At the risk of adding to the avalanche of "me too's:" Me too!&lt;br /&gt;What does it mean?&lt;br /&gt;It's everywhere...&lt;br /&gt;I think there are a few of us...&lt;br /&gt;And me.&lt;br /&gt;spooky...&lt;br /&gt;How odd.&lt;br /&gt;Count me in on the puzzlement.&lt;br /&gt;I am also not related to this alias.&lt;br /&gt;I'm curious also.&lt;br /&gt;OK - I am on it to. Thank you&lt;br /&gt;I am now curious also.&lt;br /&gt;I'm sort of liking it.&lt;br /&gt;Can I be part of the fun too?&lt;br /&gt;Ummm...why am I on this mail?&lt;br /&gt;I'm taking care of this....&lt;br /&gt;I'm still stumped.&lt;br /&gt;Dear sir. Or madam.&lt;br /&gt;How you doing?&lt;br /&gt;what was the original question?&lt;br /&gt;Uhhhh huhu huhu huhu....They said.."Member"&lt;br /&gt;&lt;br /&gt;I don't know how I got on here either...and I'm in Tampa.&lt;br /&gt;In Montreal too....&lt;br /&gt;what is this message about?&lt;br /&gt;Maybe if we keep this up we'll figure out what we all have in common...&lt;br /&gt;Maybe someone else is trying to figure out what we all have in common......&lt;br /&gt;Maybe we should all come up with a reason for being on this undecipherable alias&lt;br /&gt;any explanations ???&lt;br /&gt;Are we all redheads??&lt;br /&gt;it has something to do with the seattle bedlam society.&lt;br /&gt;It is a new High Society Club??&lt;br /&gt;I think that someone's messing with us.&lt;br /&gt;Perhaps this is a CIA plot...&lt;br /&gt;You all have been selected by our race because or your special computer software skills and abilities&lt;br /&gt;It's a conspiracy&lt;br /&gt;It is Greatly Annoying.&lt;br /&gt;I'm not certain how all of you got on our little football pool&lt;br /&gt;CAN you all please STOP sending mail to the whole alias????&lt;br /&gt;I can't resist--I have to add.&lt;br /&gt;please do not announce your membership to the alias.&lt;br /&gt;we are wasting many people's time!&lt;br /&gt;Please stop replying all or emailing Bedlam DL 3.&lt;br /&gt;PLEASE - no reply all.&lt;br /&gt;Please, let's all stop sending messages on this alias&lt;br /&gt;Would everyone please stop replying to all on this thread&lt;br /&gt;I suggest that we all stop replying to this alias.&lt;br /&gt;lets don't blast back with reply alls&lt;br /&gt;hummm we all seem to be thinking the same thing.&lt;br /&gt;exclude my name please&lt;br /&gt;Exlude my name too, please!!!&lt;br /&gt;It is unnecessarily cluttering inboxes of everyone on the alias.&lt;br /&gt;I do not know why I am on it of what it is.&lt;br /&gt;It's forced me to learn how to use the Inbox Assistant to auto-delete.&lt;br /&gt;I guess I've joined the club too.... are there dues? :)&lt;br /&gt;I'm shocked at the incompetence of all those how have sent silly responses to the list.&lt;br /&gt;Please spam me when I'm done with this mail. I deserve it.&lt;br /&gt;My mom doesn't know what the Bedlam DL3 alias is for.&lt;br /&gt;I'm thinking of having a party at the Speakeasy for all members of the "Bedlam" alias.&lt;br /&gt;How come we're Bedlam 3? Aren't we good enough to be Bedlam 1?&lt;br /&gt;"Bedlam" relates to insanity&lt;br /&gt;"Stop the insanity"&lt;br /&gt;&lt;br /&gt;PLEASE, NOBODY SEND ANY MORE MAIL TO THIS ALIAS. EVER.&lt;br /&gt;&lt;br /&gt;Reply to All.&lt;br /&gt;October 14, 1997&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ah. Those were the days... For a snapshot of what it was like to be in the Outlook group at that time, check out Frank's &lt;a href="http://www.flee.com/ltd/album/album.htm"&gt;Our LTD Album&lt;/a&gt; pages - the LTD was our official Outlook vehicle for a while.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;OK. If I'd've been paying attention, I would've posted this exactly on the 10th anniversary. But I'm not cycling though all my t-shirts as often as I used to (probably because I have more of them now), so I didn't see my reminder t-shirt until late October.&lt;br /&gt;&lt;br /&gt;[It looks like someone on Channel9 already &lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=69940"&gt;posted images of the shirt&lt;/a&gt; back in 2005 (although all I see are broken images). Oh well.]&lt;br /&gt;&lt;br /&gt;[Update: Fixed a typo and the image links]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-5495106050128597212?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/5495106050128597212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=5495106050128597212' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/5495106050128597212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/5495106050128597212'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2007/11/bedlam-dl3-10-years-and-1-month-ago.html' title='Bedlam DL3 : 10 years and 1 month ago today'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-8723436793094542622</id><published>2007-10-03T09:43:00.000-07:00</published><updated>2008-12-10T12:49:50.058-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='NDS'/><title type='text'>Milking goats on your DS</title><content type='html'>Yaknow, I was thinking just the other day that there weren't enough goat-milking games for the DS and lo! I see these new screenshots for Konami's upcoming "Lost in Blue 3".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Qhf82R7sD-g/RwPHYOc0lsI/AAAAAAAAAEk/7iE5tNB1W78/s1600-h/lib-goat.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Qhf82R7sD-g/RwPHYOc0lsI/AAAAAAAAAEk/7iE5tNB1W78/s400/lib-goat.jpg" alt="" id="BLOGGER_PHOTO_ID_5117152820632786626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;From some of the other released screenshots (see &lt;a href="http://www.gamebrink.com/forums/user-news/17496-lost-blue-3-screens.html"&gt;gamebrink&lt;/a&gt; or &lt;a href="http://www.nintendic.com/news/1159"&gt;nintendic&lt;/a&gt;), it looks like this game also affords you the opportunity to be attacked by leopards or to sing with dolphins.&lt;br /&gt;&lt;br /&gt;I wonder if there's a Wii version coming out...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-8723436793094542622?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/8723436793094542622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=8723436793094542622' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/8723436793094542622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/8723436793094542622'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2007/10/milking-goats-on-your-ds.html' title='Milking goats on your DS'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Qhf82R7sD-g/RwPHYOc0lsI/AAAAAAAAAEk/7iE5tNB1W78/s72-c/lib-goat.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-8933180189434161586</id><published>2007-05-13T06:15:00.000-07:00</published><updated>2008-12-10T12:49:50.389-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Map'/><category scheme='http://www.blogger.com/atom/ns#' term='Anime'/><category scheme='http://www.blogger.com/atom/ns#' term='Tokyo'/><title type='text'>Anime Shopping Guide to Tokyo</title><content type='html'>Last month, &lt;a href="http://www.google.com/intl/en/press/annc/my_maps.html"&gt;Google launched My Maps&lt;/a&gt;, which provides a basic point-n-click interface so you can create map annotations and then save them as custom maps. For the launch of My Maps, I created a couple of demonstration maps. One of them, &lt;a href="http://maps.google.fr/maps/ms?ie=UTF8&amp;hl=fr&amp;amp;msa=0&amp;msid=103763259662194171141.000001119b4b856600854"&gt;Les Arrondissements de Paris&lt;/a&gt;, is easy to find in the Mes Cartes tab of &lt;a href="http://maps.google.fr/"&gt;maps.google.fr&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5064046208193459026" style="DISPLAY: block; MARGIN: 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_Qhf82R7sD-g/RkcbMiWI81I/AAAAAAAAAEM/dER8Tp6TuzM/s320/mymaps_ss.png" border="0" /&gt;&lt;br /&gt;But the other map I created was (I felt) far more interesting and useful. It's the &lt;a href="http://maps.google.com/maps/ms?ie=UTF8&amp;hl=en&amp;amp;msa=0&amp;msid=107698874966682313812.00000110cd8130ca0f005&amp;amp;om=1&amp;ll=35.690206,139.676399&amp;amp;spn=0.144997,0.270882&amp;amp;z=12"&gt;Tokyo Anime Shopping Guide&lt;/a&gt; and it contains markers, links and photos of interesting places to visit on your next anime shopping junket to Tokyo.&lt;br /&gt;&lt;br /&gt;If you have any suggestions/updates/contributions that you'd like to see included in this map, let me know. I'll be updating this map whenever I visit Tokyo - which unfortunately isn't as often as I'd like.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-8933180189434161586?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/8933180189434161586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=8933180189434161586' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/8933180189434161586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/8933180189434161586'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2007/05/anime-shopping-guide-to-tokyo.html' title='Anime Shopping Guide to Tokyo'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Qhf82R7sD-g/RkcbMiWI81I/AAAAAAAAAEM/dER8Tp6TuzM/s72-c/mymaps_ss.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-786236656938391280</id><published>2007-04-30T07:27:00.000-07:00</published><updated>2007-04-30T07:31:26.038-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>XNAExtras - What's going on</title><content type='html'>Many people have been asking me about the current status of XNAExtras. The short answer is that it is currently in Microsoft's hands - they own the code and if they decide to release it then I can continue doing some work with it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-786236656938391280?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/786236656938391280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=786236656938391280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/786236656938391280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/786236656938391280'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2007/04/xnaextras-whats-going-on_30.html' title='XNAExtras - What&apos;s going on'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-1022416660908565917</id><published>2007-04-28T08:51:00.000-07:00</published><updated>2008-12-10T12:49:50.547-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GBA'/><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='NDS'/><title type='text'>Teaching GBA Homebrew to Kids</title><content type='html'>This past Thursday (April 26th) was Take Your Offspring to Work Day*. This is where you bring your young-uns in to work and then you show them what you do for your job. Rather than have them come in and watch me browse the web all day, I thought it would be nice to run a class for all the kids that were coming into Google's Kirkland office.&lt;br /&gt;&lt;br /&gt;I've been putting together a simple Intro to Programming class for a local Montessori school so this seemed like a perfect opportunity to test things out before the trial run this summer.&lt;br /&gt;&lt;br /&gt;The full class targets 10-12 year olds and starts with a basic introduction to computer engineering (binary, bytes, how things are represented in memory, ...), and then some gaming stuff like creating your own sprites, and then some code to move them around the screen, and then either animation or more coding depending on what direction the kids want to go.&lt;br /&gt;&lt;br /&gt;For the 1-hour TYOTWD version, I needed to simplify things a bit so I dropped the computer engineering intro and replaced it with a demo of &lt;a href="http://www.zelda.com/minishcap/"&gt;The Legend of Zelda - The Minish Cap&lt;/a&gt; running in an emulator. I demoed the game using the &lt;a href="http://nocash.emubase.de/gba-dev.htm"&gt;debugger version of No$gba&lt;/a&gt; so that I could show how the different background layers and sprites were used in the game.&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5058511142105183042" style="FLOAT: right; MARGIN: 10px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_Qhf82R7sD-g/RjNxFSWI80I/AAAAAAAAAEE/hx9Hor7IFwQ/s200/spritely-ss.PNG" border="0" /&gt;After that, I showed them how to create their own sprites using &lt;strong&gt;Spritely&lt;/strong&gt;, which is a sprite editor that I am writing. Now there are a number of nice tile/map editors out there, but none of them was perfect for what I wanted to do - they are either too complicated, or force you to work with tiles (instead of sprites), or cost money, or are really map/background editors, or have some other problem.&lt;br /&gt;&lt;br /&gt;I wrote Spritely with a mind to make it easy to create GBA/NDS sprites, and I made a bunch of simplifying assumptions along the way. It only handles 8x8 pixel tiles, only allows the sprite sizes supported by the GBA/NDS, and restricts you to 16-color palettes. But it does allow you to directly edit multi-tile sprites.&lt;br /&gt;&lt;br /&gt;In addition, Spritely has an option to generate the source code for a complete GBA or NDS project (including makefile) that you can compile and see your sprites in action. The generated project doesn't do much - it just allows you to move your sprites around - but it demonstrates the basics. The generated code requires that you have the latest version of &lt;a href="http://www.devkitpro.org/"&gt;devKitPro&lt;/a&gt; installed, but that's OK since I pre-installed everything needed on the laptops that the kids were using.&lt;br /&gt;&lt;br /&gt;So in summary, I had the kids:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create some sprites using Spritely&lt;/li&gt;&lt;li&gt;Export the GBA/NDS project from Spritely into a directory&lt;/li&gt;&lt;li&gt;Open a command prompt and "cd" to that directory&lt;/li&gt;&lt;li&gt;Type "make"&lt;/li&gt;&lt;li&gt;Double-click the .gba or .nds ROM to run the program in an emulator (either &lt;a href="http://vba.ngemu.com/"&gt;VisualBoyAdvance&lt;/a&gt; or the standard version of &lt;a href="http://nocash.emubase.de/gba.htm"&gt;No$gba&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;Yes, that's right. I had 10 year olds pulling up a command prompt and typing "make" to build their project. And it worked.&lt;br /&gt;&lt;br /&gt;I also had a couple of cartridges available so that they could see their creation running on a real GBA/NDS. One 7-year old walked around with an NDS playing her "game" for (what seemed like) half an hour. Google was also nice enough to buy a few NDS cartridges to give out as prizes.&lt;br /&gt;&lt;br /&gt;Note that even though I was targetting 10-12 year olds, there were kids ranging in age from 6 to 16 present. The younger kids needed their parents (or siblings) help with the computer, but had no problem creating their own sprites once they were shown the basics. I had hoped to go into the source code a bit with the older kids, but didn't have time.&lt;br /&gt;&lt;br /&gt;Now, the TYOTWD class was slated to take an hour, but we kept an extra hour at the end for people who wanted to stay on and keep working. We ended up having to chase the kids off to the next event after nearly 2 and a half hours.&lt;br /&gt;&lt;br /&gt;So it seems like it was a success. It started out a bit rough because my laptop wouldn't connect to the projector properly, and we didn't have One Laptop Per Child so the kids had to share, and the room was a bit cramped. But all-in-all it looked like the kids were excited to be there. It was nice to overhear some of them talking to their parents afterwards: "I hope you got all that information dad, because I want to keep doing this when we get home".&lt;br /&gt;&lt;br /&gt;Hopefully at least one of the kids will continue their interest in programming. Maybe we'll see some innovative GBA/NDS homebrew coming out a few years from now.&lt;br /&gt;&lt;br /&gt;As a final note, the kids were using a preview version of Spritely. I'll be releasing it widely once I fix a few obvious flaws and add a few more features.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;* Take Your Offspring to Work Day (TYOTWD) is also known as Take Your (Daughters / Daughters and Sons / Spawn) to Work Day &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;GBA = Gameboy Advance&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;NDS = Nintendo DS&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-1022416660908565917?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/1022416660908565917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=1022416660908565917' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/1022416660908565917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/1022416660908565917'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2007/04/teaching-gba-homebrew-to-kids.html' title='Teaching GBA Homebrew to Kids'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Qhf82R7sD-g/RjNxFSWI80I/AAAAAAAAAEE/hx9Hor7IFwQ/s72-c/spritely-ss.PNG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-116507121653459657</id><published>2006-12-02T06:45:00.000-08:00</published><updated>2007-04-28T07:30:28.402-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Unemployed and uninsured</title><content type='html'>"So what do you do for a living?"&lt;br /&gt;"I'm... uh... well, I'm between jobs at the moment."&lt;br /&gt;&lt;br /&gt;My last day at Microsoft was yesterday, and I don't start my new job at Google for a whole 2 days. That'll give me plenty of time to fix up all the stuff in the house that needs fixin'.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-116507121653459657?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/116507121653459657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=116507121653459657' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/116507121653459657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/116507121653459657'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2006/12/unemployed-and-uninsured.html' title='Unemployed and uninsured'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36700117.post-116197134580511228</id><published>2006-12-01T06:00:00.000-08:00</published><updated>2006-12-01T06:04:36.003-08:00</updated><title type='text'>Start page</title><content type='html'>This blog starts here...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36700117-116197134580511228?l=garykac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garykac.blogspot.com/feeds/116197134580511228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36700117&amp;postID=116197134580511228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/116197134580511228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36700117/posts/default/116197134580511228'/><link rel='alternate' type='text/html' href='http://garykac.blogspot.com/2006/12/start-page.html' title='Start page'/><author><name>Gary Kacmarcik</name><uri>http://www.blogger.com/profile/06251485476040169610</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
