<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>SamuraiBlog.com &#187; Articles</title>
	<atom:link href="http://samuraiblog.com/wordpress/category/articles/feed/" rel="self" type="application/rss+xml" />
	<link>http://samuraiblog.com/wordpress</link>
	<description>Cursing and Cigarettes</description>
	<pubDate>Sat, 24 Apr 2010 01:36:47 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Web Console and Browser Added to django-json-rpc</title>
		<link>http://samuraiblog.com/wordpress/2009/11/07/django-json-rpc-web-console/</link>
		<comments>http://samuraiblog.com/wordpress/2009/11/07/django-json-rpc-web-console/#comments</comments>
		<pubDate>Sun, 08 Nov 2009 04:48:41 +0000</pubDate>
		<dc:creator>Samuel Sutch</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<category><![CDATA[Code]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[django]]></category>

		<category><![CDATA[django-json-rpc]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://samuraiblog.com/wordpress/?p=218</guid>
		<description><![CDATA[This morning I put the finishing touches on the web console and service browser for <a href="http://github.com/samuraisam/django-json-rpc">django-json-rpc</a>. It's a fully-bundled utility to aid in rapid development of your web service. It's available on github now and will be a published to PyPI soon as I work out one more interface bug. A <a href="http://logjamm.in/django-json-rpc/json/browse/">live demo</a> is available. Screen after the jump.]]></description>
			<content:encoded><![CDATA[<p>This morning I put the finishing touches on the web console and service browser for <a href="http://github.com/samuraisam/django-json-rpc">django-json-rpc</a>. It&#8217;s a fully-bundled utility to aid in rapid development of your web service. It&#8217;s available on github now and will be a published to PyPI soon as I work out one more interface bug. A <a href="http://logjamm.in/django-json-rpc/json/browse/">live demo</a> is available. Check it out:</p>
<p><img src="http://samuraiblog.com/wordpress/wp-content/uploads/2009/11/jsonrpcbrowserscreen.png" alt="jsonrpcbrowserscreen" title="jsonrpcbrowserscreen" width="504" height="639" class="aligncenter size-full wp-image-226" /></p>
]]></content:encoded>
			<wfw:commentRss>http://samuraiblog.com/wordpress/2009/11/07/django-json-rpc-web-console/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JSON-RPC in Objective-C</title>
		<link>http://samuraiblog.com/wordpress/2009/11/06/json-rpc-in-objective-c/</link>
		<comments>http://samuraiblog.com/wordpress/2009/11/06/json-rpc-in-objective-c/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 12:11:28 +0000</pubDate>
		<dc:creator>Samuel Sutch</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<category><![CDATA[Code]]></category>

		<category><![CDATA[cocoa]]></category>

		<category><![CDATA[deferred]]></category>

		<category><![CDATA[deferredkit]]></category>

		<category><![CDATA[iphone]]></category>

		<category><![CDATA[json-rpc]]></category>

		<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://samuraiblog.com/wordpress/?p=208</guid>
		<description><![CDATA[Handling JSON in Objective-C is already pretty easy with the excellent strict parser provided by json-framework. However, interacting with a web service in a graphical application can be hard to get right. Frequently unresponsive or unpredictable behavior is a big turnoff for users. Recently I have been developing a lot for the iPhone and more [...]]]></description>
			<content:encoded><![CDATA[<p>Handling JSON in Objective-C is already pretty easy with the excellent strict parser provided by <a href="http://code.google.com/p/json-framework/">json-framework</a>. However, interacting with a web service in a graphical application can be hard to get right. Frequently unresponsive or unpredictable behavior is a big turnoff for users. Recently I have been developing a lot for the iPhone and more often than not, ideas that beget these applications revolve around central web applications. Many client-server interactions usually boil down to the familiar CRUD apps we&#8217;re all so familiar generating with Rails and Django but require much more effort.</p>
<p>Writing applications for a mobile device introduces several challenges: limited memory, slow network and a language and framework designed without an eye on modern agile web services. Recently while writing an iPhone application with heavy web interaction I got lazy doing all that work and wrote <a href="http://github.com/samuraisam/DeferredKit">DeferredKit</a> - a port of <a href="http://twistedmatrix.com/projects/core/documentation/howto/defer.html">Twisted&#8217;s Deferred</a> with many extensions for us Objective-C coders. DeferredKit makes asynchronous programming in Objective-C really easy with very little overhead and includes an asynchronous JSON-RPC client. It allows you to write code like this:</p>
<pre lang="c">
  - (void)doRegistration {
    [[[[[DKDeferred jsonService:SERVICE_URL]
       myApp] register:array_(self.username, self.password)]
      addCallback:callbackTS(self, doRegistrationCompleted:)]
     addErrback:callbackTS(self, doRegistrationFailed:)];
  }

  - (id)doRegistrationCompleted:(id)result {
    // do something with result
    return result;
  }

  - (id)doRegistrationFailed:(NSError *)err {
    // do something with error
    return err;
  }
</pre>
<h3>Jumping In</h3>
<p>Getting started with DeferredKit is relatively easy. Download the <a href="http://github.com/samuraisam/DeferredKit/tarball/master"source tarball</a> or pull DeferredKit from github and drop everything from <code>DeferredKit/CocoaDeferred/Source</code> into your project (you can also compile DeferredKit as a direct dependency in Xcode, a how-to is in the README).</p>
<p>First, a bit of explanation. Despite the recent addition of blocks to the Objective-C language, the blocks runtime is not available to us iPhone developers (or anybody who wants to deploy to targets older than 10.6, sadly). Also, since there is no native function object in Objective-C, functions can not be passed around as first-class citizens, stored in collection types, persisted, etc. DeferredKit provides one called <code>DKCallback</code>. You will almost never have to touch the interface of <code>DKCallback</code> since handy macros are provided to generate function objects.</p>
<p>A deferred is defined as an object that encapsulates a return value that is not yet available (meaning, it will be returned from the network when done downloading, or return from a thread when done computing). The deferred then dispatches the value to a series of callbacks as soon as it becomes available.</p>
<p>JSON-RPC is exposed in DeferredKit through a class called <code>DKJSONServiceProxy</code> which employs a bit of magic to enable the dynamic method calling pattern you saw above. For convenience, <code>autorelease</code> constructors are also provided in DKDeferred:</p>
<pre lang="c">
  id service = [DKDeferred jsonService:@"http://myservice.net/json/" name:@"myapp.sayHello"];
</pre>
<p><small>(note: don&#8217;t forget to <code>#import DKDeferred+JSON.h</code>)</small></p>
<p>Calling a method returns a deferred:</p>
<pre lang="c">
  DKDeferred *d = [service :args_array];
</pre>
<p>To which you must add at least one callback for the call to be performed. In this case, <code>callbackTS</code> builds a callback with a <code>target</code> (can be any object), and a <code>selector</code> to be performed. A callback could also be a function pointer, <code>NSInvocation</code> or any object conforming to the DKCallback protocol.</p>
<pre lang="c">
  [d addCallback:callbackTS(self, gotSayHelloResults:)];
</pre>
<p>In case your JSON-RPC server returns an error (via the <code>error</code> key) or encounters a network error or parse error, deferred will automatically call any errbacks, or &#8220;error callbacks,&#8221; added with an <code>NSError</code> object.</p>
<pre lang="c">
  [d addErrback:callbackTS(self, handleSayHelloError:)];
</pre>
<p>Callbacks and errbacks are written as a function or method which takes a single argument, the result and returns <code>id</code>. JSON-RPC results will always be an <code>NSDictionary</code> with a <code>result</code> key, among others.</p>
<pre lang="c">
  - (id)gotSayHelloResults:(id)results {
    self.helloLabel.text = [results objectForKey:@"result"];
    return nil;
  }
</pre>
<p>Errbacks are the same as callbacks except they will always be called with an <code>NSError</code> argument. The <code>userDict</code> dictionary will be populated with the error dictionary produced by your JSON-RPC server. <code>userDict</code> will be different for different error types however, so be sure to check which kind of error is being returned.</p>
<pre lang="c">
  - (id)handleSayHelloError:(NSError *)err {
    [self alertError:[[[error userDict] objectForKey:@"error"] objectForKey:@"message"]];
    return nil;
  }
</pre>
<h3>Conclusion</h3>
<p>I&#8217;ve only had the opportunity to touch on the basics of DeferredKit, but a post is coming soon with more details. It is a tested, lightweight framework for writing asynchronous code and can greatly improve your productivity when working with web services.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://samuraiblog.com/wordpress/2009/11/06/json-rpc-in-objective-c/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Django and JSON-RPC</title>
		<link>http://samuraiblog.com/wordpress/2009/11/03/django-and-json-rpc/</link>
		<comments>http://samuraiblog.com/wordpress/2009/11/03/django-and-json-rpc/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 09:47:36 +0000</pubDate>
		<dc:creator>Samuel Sutch</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<category><![CDATA[Code]]></category>

		<category><![CDATA[django]]></category>

		<category><![CDATA[django-json-rpc]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[tutorials]]></category>

		<guid isPermaLink="false">http://samuraiblog.com/wordpress/?p=167</guid>
		<description><![CDATA[In application development, I&#8217;ve yet to be the bearer of a product who&#8217;s primary functionality has not been aided or entirely supported by a central web application. It is uncommon for developers in this situation to have the luxury of using a common programming language between server and client implementations. A lot of developers will [...]]]></description>
			<content:encoded><![CDATA[<p>In application development, I&#8217;ve yet to be the bearer of a product who&#8217;s primary functionality has not been aided or entirely supported by a central web application. It is uncommon for developers in this situation to have the luxury of using a common programming language between server and client implementations. A lot of developers will end up rolling their own RPC which evolves over the lifetime of the product to meet its needs. This puts unneeded strain on the developer to fulfill the role of RPC expert as well as interface designer, and expert-everything-else.</p>
<p>I have done many primarily-RPC web applications using tomcat or PHP or twisted, but by far the best way is using Python and Django. However, I have always viewed the state of RPC in Django broken. While using Django for all sorts of other web application purposes is incredibly easy, getting started with RPC presents a lot more friction.</p>
<p>Introducing <a href="http://github.com/samuraisam/django-json-rpc">django-json-rpc</a>, a very easy way to expose your web application to the world of integrated applications.</p>
<p>Installation is as simple as:</p>
<pre lang="shell">
  easy_install django-json-rpc
</pre>
<p>Add a mount point to your <code>urls.py</code> file and import django-json-rpc.</p>
<pre lang="python">
  from jsonrpc import jsonrpc_site

  urlpatterns += patterns('',
    (r'^json/', jsonrpc_site.dispatch)
  )
</pre>
<p>The interface to django-json-rpc is exposed through only one function - the <code>jsonrpc_method</code> decorator. Functions that use this decorator may be placed anywhere in the source tree and need only import <code>jsonrpc.jsonrpc_method</code>.</p>
<pre lang="python">
  from jsonrpc import jsonrpc_method

  @jsonrpc_method('app.sayHello')
  def say_hello(request, name):
    return "Hello, " + name
</pre>
<p>To hook your views into the default jsonrpc site, they must simply be imported somewhere by Django. The best place for this is in your <code>urls.py</code> file, which should now look something like this:</p>
<pre lang="python">
  from jsonrpc import jsonrpc_site
  import myapp.views

  urlpatterns += patterns('',
    (r'^json/', jsonrpc_site.dispatch)
  )
</pre>
<p>Test your service with the provided Proxy:</p>
<pre lang="shell">
  ./manage.py runserver 8080

  ./manage.py shell
</pre>
<pre lang="python">
  >>> from jsonrpc.proxy import ServiceProxy
  >>> s = ServiceProxy('http://localhost:8080/json/')
  >>> s.app.sayHello('Sam')
  {u'error': None, u'id': u'jsonrpc', u'result': u'Hello Sam'}
</pre>
<h3>HTTP GET</h3>
<p>Django-json-rpc supports JSON-RPC version 1.1 which includes support for HTTP GET, meaning, all your REST are belong to us as well. Add the HTTP GET mount point to your <code>urls.py</code> file:</p>
<pre lang="python">
  from jsonrpc import jsonrpc_site
  import myapp.views

  urlpatterns += patterns('',
    (r'^json/', jsonrpc_site.dispatch),
    (r'^json/(?P<method>[a-zA-Z0-9.]+)$', jsonrpc_site.dispatch)
  )
</method></pre>
<p>It is required by django-json-rpc to mark each method safe for dispatch through HTTP GET. <code>jsonrpc_method('sayHello')</code> becomes:</p>
<pre lang="python">
  jsonrpc_method('app.sayHello', safe=True)
</pre>
<p>Now your method will be available at <code>http://localhost:8080/json/app.sayHello?name=Sam</code>. HTTP GET requests only support string and number typed arguments.</p>
<h3>Authentication</h3>
<p>The django-json-rpc package also supports authentication, by default using <code>django.contrib.auth</code>&#8217;s model backend - the <code>User</code> object we&#8217;re all so familiar with, however you may provide any method, including using any authentication middleware. If you aren&#8217;t using middleware, <code>username</code> and <code>password</code> arguments will automatically be added to the beginning of the argument list for your method.</p>
<pre lang="python">
  @jsonrpc_method('app.sayHello', authenticated=True)
  def say_hello(request):
    return "Hello, " + request.user.first_name
</pre>
<pre lang="python">
  >>> s.app.sayHello('samuraiblog', 'password')
  {u'error': None, u'id': u'jsonrpc', u'result': u'Hello Sam'}
</pre>
<h3>Version Agnostic</h3>
<p>django-json-rpc will continue to work regardless of which version JSON-RPC client you happen to be using. It supports all argument types supported in JSON-RPC versions 1.0, 1.1 and 2.0, and will respond if a client specifies the version in either the <code>jsonrpc</code> or <code>version</code> key.</p>
<h3>Conclusion</h3>
<p>I have used this package for the development of several commercial iPhone applications and it has greatly improved my productivity in developing a web service backend. Up next? A django-xmlrpc? Haha! Fuck that!</p>
]]></content:encoded>
			<wfw:commentRss>http://samuraiblog.com/wordpress/2009/11/03/django-and-json-rpc/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Compressing NSData objects using zlib</title>
		<link>http://samuraiblog.com/wordpress/2009/11/02/compressing-nsdata-objects-using-zlib/</link>
		<comments>http://samuraiblog.com/wordpress/2009/11/02/compressing-nsdata-objects-using-zlib/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 11:28:35 +0000</pubDate>
		<dc:creator>Samuel Sutch</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<category><![CDATA[Code]]></category>

		<category><![CDATA[cocoa]]></category>

		<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://samuraiblog.com/wordpress/?p=185</guid>
		<description><![CDATA[This entirely iPhone friendly tutorial highlights how easy it is to compress our familiar NSData objects using zlib - the most commonly used compression library on the planet. This is the same library that compresses the PNGs and PDFs, ZIPs and GZIPed files that make up your daily life.
The zlib c library, which is bundled [...]]]></description>
			<content:encoded><![CDATA[<p>This entirely iPhone friendly tutorial highlights how easy it is to compress our familiar NSData objects using zlib - the most commonly used compression library on the planet. This is the same library that compresses the PNGs and PDFs, ZIPs and GZIPed files that make up your daily life.</p>
<p>The <a href="http://www.zlib.net/">zlib c library</a>, which is bundled with all Mac OS X and iPhone 2.0+ devices offers an extensive but non obtrusive API for compressing data. The most basic functions are the stream API which serve nicely when, for instance, dealing with a large files, or matching a specific compression requirement. The method presented here is one which is utility provided by the atop the streaming API. Readers familiar with python will recognize this if ever you&#8217;ve had to handle data with the zlib module.</p>
<p>First, Allocate a data structure of type <code>const ByteF</code> containing the bytes in our uncompressed <code>NSData</code> structure.</p>
<pre lang="c">
  const Bytef *inBytes = (const Bytef *)[uncompressedData bytes];
</pre>
<p>Allocate enough data to start compressing data. The zlib manual recommends allocating 1% more than the length of your uncompressed data, plus twelve bytes. This gives zlib enough room to start compressing data, resizing the output buffer as needed.</p>
<pre lang="c">
  uLongf outLength = ([uncompressedData length] * 1.1) + 12;
  Bytef *outBytes = (Bytef *)malloc(outLength);
</pre>
<p>Now simply call <code>compress</code>:</p>
<pre lang="c">
  int z_result = compress(outBytes, &#038;outLength, inBytes, [uncompressedData length]);
</pre>
<p><code>compress</code> will return one of three constants. To handle errors, check for the return value. Depending on your situation, you could return an NSError. In this case, I return an empty NSData and check for return value length.</p>
<pre lang="c">
  NSData *ret;
  if (z_result == Z_OK) {
    ret = [NSData dataWithBytesNoCopy:outBytes length:outLength freeWhenDone:YES];
  } else {
    ret = [NSData data];
    switch (z_result) {
      case Z_MEM_ERROR:
        printf("compressData got Z_MEM_ERROR out of memory. :(");
      case Z_BUF_ERROR:
        printf("compressData got Z_BUF_ERROR output buffer wasn't larege enough :(");
      default:
        break;
    }
  }
}
</pre>
<h4>compressData function</h4>
<pre lang="c">
NSData* compressData(NSData *uncompressedData) {
  if ([uncompressedData length] == 0)
    return uncompressedData;
  const Bytef *inBytes = (const Bytef *)[uncompressedData bytes];
  uLongf outLength = ([uncompressedData length] * 1.1) + 12;
  Bytef *outBytes = (Bytef *)malloc(outLength);
  int z_result = compress(outBytes, &#038;outLength, inBytes, [uncompressedData length]);
  NSData *ret;
  if (z_result == Z_OK) {
    ret = [NSData dataWithBytesNoCopy:outBytes length:outLength freeWhenDone:YES];
  } else {
    ret = [NSData data];
    switch (z_result) {
      case Z_MEM_ERROR:
        printf("compressData got Z_MEM_ERROR out of memory. :(");
      case Z_BUF_ERROR:
        printf("compressData got Z_BUF_ERROR output buffer wasn't larege enough :(");
      default:
        break;
    }
  }
  return ret;
}
</pre>
<h4>compressData that returns an <code>NSError</code>.</h4>
<pre lang="c">
#define ZLIB_COMPRESS_DOMAIN @"zlib_compress_domain"

NSError* compressData2(NSData *inData, NSData **outData) {
  if ([inData length] == 0) {
    *outData = inData;
    return nil;
  }
  const Bytef *inBytes = (const Bytef *)[inData bytes];
  uLongf outLength = ([inData length] * 1.1) + 12;
  Bytef *outBytes = (Bytef *)malloc(outLength);
  int z_result = compress(outBytes, &#038;outLength, inBytes, [inData length]);
  if (z_result == Z_OK) {
    *outData = [NSData dataWithBytesNoCopy:outBytes length:outLength freeWhenDone:YES];
    free(outBytes);
    return nil;
  }
  return [NSError errorWithDomain:ZLIB_COMPRESS_DOMAIN
    code:z_result userInfo:[NSDictionary dictionary]];
}
</pre>
<h4>NSData category</h4>
<pre lang="c">
@interface NSData (CompressionAdditions)

- (NSData *)compress;
- (NSData *)compress:(NSError **)errorOut;

@end

@implementation NSData (CompressionAdditions)

- (NSData *)compress {
  return compressData(self);
}

- (NSData *)compress:(NSError **)errorOut {
  NSData *ret;
  *errorOut = compressData2(self, &#038;ret);
  return ret;
}

@end
</pre>
]]></content:encoded>
			<wfw:commentRss>http://samuraiblog.com/wordpress/2009/11/02/compressing-nsdata-objects-using-zlib/feed/</wfw:commentRss>
		</item>
		<item>
		<title>File Uploads in twisted.web</title>
		<link>http://samuraiblog.com/wordpress/2009/10/30/file-uploads-in-twisted-web/</link>
		<comments>http://samuraiblog.com/wordpress/2009/10/30/file-uploads-in-twisted-web/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 06:36:42 +0000</pubDate>
		<dc:creator>Samuel Sutch</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<category><![CDATA[Code]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[tutorials]]></category>

		<category><![CDATA[twisted]]></category>

		<category><![CDATA[twisted.web]]></category>

		<guid isPermaLink="false">http://samuraiblog.com/wordpress/?p=172</guid>
		<description><![CDATA[Twisted is a python package for building asynchronous applications. It&#8217;s wide range of uses and sub-packages are daunting; I&#8217;ve developed with Twisted for several years now and still find it&#8217;s vast expanse of code intimidating. Twisted in 60 seconds is an excellent resource for anyone beginning with twisted and twisted.web. Here, we&#8217;re filling yet another [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://twistedmatrix.com/trac/">Twisted</a> is a python package for building asynchronous applications. It&#8217;s wide range of uses and sub-packages are daunting; I&#8217;ve developed with Twisted for several years now and still find it&#8217;s vast expanse of code intimidating. <a href="http://jcalderone.livejournal.com/50562.html">Twisted in 60 seconds</a> is an excellent resource for anyone beginning with twisted and twisted.web. Here, we&#8217;re filling yet another gap in the twisted documentation.</p>
<p>Not surprisingly, handling file uploads in twisted.web is straight forward. Files are accessed through the <code>args</code> attribute of the <code>request</code> parameter to your render method. Since there can be multiple files for that given field, whether there are one or more, <code>request.args[FIELD_NAME]</code> will always be an array.</p>
<pre lang="python">
from twisted.internet import reactor
from twisted.web import resource, server

class FileUploadService(resource.Resource):
  def render_GET(self, request):
    return '''
<form enctype="multipart/form-data" method="post" action=".">
<input type="file" name="da_file"/>
<input type="submit"/>
              </form>

'''

  def render_POST(self, request):
    return 'You submitted a file that was %i bytes' % len(request.args['da_file'][0])

root = resource.Resource()
root.putChild("upload", FileUploadService())
factory = server.Site(root)
reactor.listenTCP(8088, factory)
reactor.run()
</pre>
<p>According to the twisted.web documentation. This method of handling file uploads is not preferred. In fact, the preferred way is to use the more complex twisted.web2 package which supports streaming uploads. However, the twisted devs are working on porting most of twisted.web2&#8217;s features to twisted.web in an effort to consolidate the two. In production code, I have chosen to stick with twisted.web since it seems to be the package which will remain the most compatible with future versions of Twisted.</p>
]]></content:encoded>
			<wfw:commentRss>http://samuraiblog.com/wordpress/2009/10/30/file-uploads-in-twisted-web/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A Cinematic Gaming Experience</title>
		<link>http://samuraiblog.com/wordpress/2008/02/18/a-cinematic-gaming-experience/</link>
		<comments>http://samuraiblog.com/wordpress/2008/02/18/a-cinematic-gaming-experience/#comments</comments>
		<pubDate>Mon, 18 Feb 2008 23:19:18 +0000</pubDate>
		<dc:creator>Samuel Sutch</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<category><![CDATA[directing]]></category>

		<category><![CDATA[film]]></category>

		<category><![CDATA[future]]></category>

		<category><![CDATA[games]]></category>

		<category><![CDATA[movies]]></category>

		<guid isPermaLink="false">http://samuraiblog.com/articles/a-cinematic-gaming-experience</guid>
		<description><![CDATA[In Half Life 2: Episode 2, the end arena is an amazing experience and something that (though I don&#8217;t claim to have a pulse, really, on the gaming industry) should stand out among all other games. SPOILER [: You are placed in a massive, valley-wide arena to fight a ridiculous onslaught of striders and hunters. [...]]]></description>
			<content:encoded><![CDATA[<p>In Half Life 2: Episode 2, the end arena is an amazing experience and something that (though I don&#8217;t claim to have a pulse, really, on the gaming industry) should stand out among all other games. <strong>SPOILER [: </strong>You are placed in a massive, valley-wide arena to fight a ridiculous onslaught of striders and hunters. Enemies that are used as bosses throughout the series are now trying to destroy the only chance your kind has for survival: and they're pummeling you with many times as many as you'd be expected to handle in the past. <strong>:]</strong></p>
<p>The environment is a beautiful wooded mountain valley. There are many completely-destroyable buildings throughout the valley: and they destroy beautifully on a massive scale. A building destroyed by a strider completely breaks down into the many components of buildings-2 x 4s, and other building products that all crash and explode, each piece falling randomly-the animations are not scripted.</p>
<p>After your trouble with the strider/hunter battle, the cinematic experience really takes off. Even though it&#8217;s the end of the game, movie mode is put on overdrive. The characters all seem to pour into their performances. You&#8217;re knocked to the ground and your camera movement is restricted. Shit goes on around you that you can&#8217;t help. Some people may be annoyed by this-but it&#8217;s vital. The restricted camera movement, the low angle, you, Gordan Freeman, pinned to the ground and helpless, like a human on the very same level as the rest cast-is all really engaging.</p>
<p>Imagine a movie director: Terry Gilliam, and a movie: 12 Monkeys. By the time of 12 Monkeys, a re-make of an older French experimental film, La Jete, Terry Gilliam is already a brilliant and accomplished director. It is classic of his style to use camera angles to convey a feeling, perhaps that of the protagonist or subject of the scene. Though it&#8217;s just not camera angles that contribute to the feel of the Gilliam film-it&#8217;s the entire experience. Terry Gilliam creates cinematic experiences.</p>
<p>The game industry has always been one that emphasizes experiences. As games push the boundaries of realism, they will naturally draw upon their past experience as super-naturalistic experiences to become hyper-real: as in movies, they will exaggerate real life in real life terms in an effort to be more engaging and more realistic. Game companies know this, look at The Sims 2. Though they had the capability to create a life simulator, it&#8217;s much more fun in the cartoony manor they executed it.  The Sims, however, can be analogous to a Judd Apatow (Superbad, 40 Yr Old Virgin) movie. They have some real elements but are largely a projection of real life, an obvious fabrication.</p>
<p>A movie like 12 Monkeys, however, is much more fitting as an analogy for the Half Life series. Sims, as with 40 Yr Old Virgin embodies what our psyche wishes it could be: fun, without care, essentially, as infants. Half Life 2 follows a much more serious thread: world destruction and the destruction of our race. It&#8217;s cinematic story line includes charismatic, likable characters, one of whom you <em>get to be</em>. The story line is as thick as it&#8217;s directing: you are but a mere human, your entire race is being used as slaves and thinned out, restricted from reproducing - your race backlashes and you can now reproduce, and who is this Alyx character, among the other Gordon admirers, her family and her familys collegues? It&#8217;s all rather impressive for a game. Which will, within a minute&#8217;s time take you frome near death to flirtatious conversation. Very compelling.</p>
<p>Where am I going with this? No where. I&#8217;ve come back to this post at least 10 times, wanted to post it and then haven&#8217;t because I have no ending.I&#8217;m just hoping games get more and more cinematic and compelling! I&#8217;m tired of Doom 3! Fuck Doom 3! What did Doom 3 innovate (or Quake 4 or COD 2,3,4 or Crysis or &#8230;)? </p>
]]></content:encoded>
			<wfw:commentRss>http://samuraiblog.com/wordpress/2008/02/18/a-cinematic-gaming-experience/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Video Sharing Sites Comparison</title>
		<link>http://samuraiblog.com/wordpress/2007/12/16/video-sharing-sites-comparison/</link>
		<comments>http://samuraiblog.com/wordpress/2007/12/16/video-sharing-sites-comparison/#comments</comments>
		<pubDate>Mon, 17 Dec 2007 05:05:13 +0000</pubDate>
		<dc:creator>Samuel Sutch</dc:creator>
		
		<category><![CDATA[Articles]]></category>

		<category><![CDATA[comparison]]></category>

		<category><![CDATA[review]]></category>

		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://samuraiblog.com/article/video-sharing-sites-comparison</guid>
		<description><![CDATA[You may have noticed I&#8217;ve been fleshing out this site recently with some of my works. When I got started doing this I thought I would scout out the best video sharing site for professionals or just people who don&#8217;t want their videos to look like shit.  So far I&#8217;ve tried YouTube, Revver, Veoh, Brightcove [...]]]></description>
			<content:encoded><![CDATA[<p>You may have noticed I&#8217;ve been fleshing out this site recently with some of my works. When I got started doing this I thought I would scout out the best video sharing site for professionals or just people who don&#8217;t want their videos to look like shit.  So far I&#8217;ve tried YouTube, Revver, Veoh, Brightcove and Blip.tv (and that&#8217;s where I stopped).</p>
<p>You see, it seems video sharing websites are all out to get &#8216;cha. They get bumpers at the end of your video, overlays, special buttons and what seems to be the whole 9 yards when it comes to usage rights. The video quality is bad. Your uploads can not exceed 100 MB. They&#8217;re allowed to play your video in desecrate desktop applications and server advertising along-side.Whoa! No thanks.</p>
<p>What I&#8217;m going to do is just run down the list. Each site has its drawbacks but ultimately sucked, save one.</p>
<p><strong>YouTube</strong></p>
<p>YouTube is the traffic king. Yes, we know that and every other comparison out there puts them at an advantage for that. Well, fuck YouTube. The picture quality of the youtube flash transcodes are absolutely horrible because they use a very low bit rate for the re-encodes. They do this, it seems, so they do not have to drop frames as all other video sites I&#8217;ve tried seem to drop frames from the video and create a jerky feeling to smooth animations and forget about pans. YouTube videos also have relatively decent (compared to all but Blip.tv) audio encodes, but they still sound like no more than 64kbps, perhaps less, and still on a mono track.</p>
<p><a href="http://www.youtube.com/watch?v=UL91pXwXkPo">The video</a> I uploaded to YouTube turned out looking pretty shitty. The words in the titles blend together due to artifacts. The motion is nice as it seems full frame rate was preserved and audio was almost acceptable.</p>
<p><strong>Veoh</strong></p>
<p>Veoh - I don&#8217;t have much to say about Veoh. Their video upload process is not a nice single page interface like most other sites, in fact taking 3 pages. Like Revver, they tell you your video is ready to watch somewhat quickly but it usually still takes another 5-10 minutes. The picture quality is decent, and without scaling the videos look pretty clear. Even so, the frame rate is drastically lower than the source video, making the animations jerky. The audio quality was horrible, ditching 2 channels for 1 and using what sounded like like less than 36kbps.</p>
<p><a href="http://www.veoh.com/videos/v1653393ya8RPgs5">The video</a> I uploaded to Veoh looks decent. It&#8217;s way more jerky than the source footage. The titles and their edges are clear. If I had to choose between YouTube and Veoh I&#8217;d choose YouTube. Using Veoh would make me feel like a whore. They pretty much get to do whatever they want with your video, including whore it out to other video sites, like MySpace, YouTube and Google Video (primarily).</p>
<p><strong>Brightcove.tv</strong></p>
<p>Originally I picked up Brightcove because I perceived it as having the best video quality. I saw Garry Newman over at garry.tv go through this same process a few months ago. He eventually settled on Brightcove so I thought I&#8217;d give it a try. Their video player is really nice. The interface is clean and subtle. Not surprisingly, the video quality is half-way decent, relative to other flash video sites. I would put its video quality on the Veoh side of a comparison between Veoh and YouTube. Despite that-they drop a high number of frames to maintain that quality and the audio is terrible. The interface to their website also kind of sucks after you upload the video. The uploading process is nice, but the so-called &#8220;dashboard&#8221; is not.</p>
<p><a href="http://www.brightcove.tv/title.jsp?title=1344660550">The video</a> I uploaded to Brightcove must be in some sort of limbo right now, possibly being reviewed for copyright infringement or something like Revver does.  Regardless, it turned out decent but with poor audio and low frame rate.</p>
<p><strong>Blip.tv</strong> - the winner, surprisingly</p>
<p>After all this uploading and waiting, I finally choose Blip.tv. I did not expect to choose Blip when I started on this journey, well, because of it&#8217;s name. It sounds like another bullshit rip off video site (like Veoh, Revver or Metacafe). That said, they have the best interface, best upload process, quick processing, no ads, allow direct downloading, will transcode your video into multiple formats, and as far as I can tell there is no upload limit. Their flash video player is really clean and lightweight, and blends in well in white-background sites AND supports 16&#215;9 videos.</p>
<p>Despite dropping frames, the videos look really good. The transcodes seem miles ahead of all the other video sites. The audio is damn near true to the source footage, with, get this: TWO channels, encoded at what sounds like 96kbps or maybe a little more.</p>
<p><a href="http://blip.tv/file/545996">The video</a> I uploaded to Blip.tv seems a little washed out (more so than the source) and is a bit jerky with good audio. You already know the story, I won&#8217;t patronize you with the details. Instead I want to show off this feature which I think all the other sites try to do with &#8220;channels&#8221; and such-but executed horribly. Blip.tv calls them &#8220;shows&#8221; but none-the-less, its just a group of your videos-executed the right way. <a href="http://samuraisam.blip.tv/">Check it out</a>, my &#8220;show&#8221; on Blip.tv. It gives you a large video area with a small browser and information area-exactly how it should be. There seems to be built in support for serial episodes of whatever you like, and it automatically creates video a video podcast for you. Fucking sweet!</p>
]]></content:encoded>
			<wfw:commentRss>http://samuraiblog.com/wordpress/2007/12/16/video-sharing-sites-comparison/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
