<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Bruce Grant's Tech Blog</title>
  <subtitle type="html">
   Bruce Grant's technical blog
  </subtitle>
  <updated>2010-09-07T23:51:07Z</updated>
  <id>http://www.bxgrant.com/blog/1</id>
  <link rel="alternate" type="text/html" hreflang="en" href="http://www.bxgrant.com/blog/1"/>
  <link rel="self" type="application/atom+xml" href="http://www.bxgrant.com/blog/1/atom"/>
  <icon>http://www.bxgrant.com/static/images/BxLaf/logo.png</icon>
  <rights>Copyright (c) www.bxgrant.com</rights>
  <generator uri="http://www.bxgrant.com" version="1.0">
     BX Blog Engine 1.0
  </generator>
  <entry>
    <title>WebM Compared to H.264</title>
    <link rel="alternate" type="text/html" href="http://www.bxgrant.com/entry/98"/>
    <id>http://www.bxgrant.com/entry/98</id>
    <updated>2010-08-02T13:14:21Z</updated>
    <published>2010-08-02T13:12:40-06:00</published>
    <author>
      <name>Bruce Grant</name>
      <uri>http://www.bxgrant.com/blog/1</uri>
    </author>
    
    

    <content type="html" xml:lang="en" xml:base="http://www.bxgrant.com/blog/1">
      &lt;div class=&quot;bxWikiDocBody&quot;&gt;I wrote an &lt;a href=&quot;http://www.bxgrant.com/entry/96&quot;&gt;article&lt;/a&gt;  a while back about Google's new video platform named WebM and explained it could be an alternative to the encumbered h.264 approach.  After I wrote that article, a friend of mine shot back quickly with a review that blasted VP8 and WebM from a technical perspective, hitting it on quality of picture, performance encoding and decoding as well as quality at a given bit-rate.  Google around and you'll find many blasting Google for backing the effort.&lt;br /&gt;
&lt;br /&gt;
As you Google, you'll also &lt;a href=&quot;http://www.streamingmedia.com/Articles/ReadArticle.aspx?ArticleID=68594&amp;PageNum=1&quot;&gt;find some saying&lt;/a&gt; that WebM will likely be, &quot;Good enough,&quot; for many applications.  I agree that it's likely to take a while for VP8 to get near where h.264 is and to get a large enough client, server and middleware ecosphere to make it relevant.  However, there doesn't seem to be much doubt that it'll get there.  So, there's really only one reason that would inhibit large-scale adoption of WebM over h.264: patent infringement.&lt;br /&gt;
&lt;br /&gt;
As &lt;a href=&quot;http://www.electronista.com/articles/10/05/20/jobs.believes.webm.may.violate.patents/&quot;&gt;this article explains&lt;/a&gt; , just because something is open source doesn't mean it's not encumbered by patents the same as h.264.  The MPEGLA, the group that enforces patents for h.264, is &lt;a href=&quot;http://www.electronista.com/articles/10/05/21/mpeg.la.making.patent.pool.to.fee.webm/&quot;&gt;coming after WebM with a vengeance&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
It will be interesting to see what Google does.&lt;/div&gt; 	      &lt;p&gt;&lt;b&gt;Tags: &lt;/b&gt; 
	  	    &lt;a href=&quot;/tag/1/video&quot; rel=&quot;tag&quot;&gt;video&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/codec&quot; rel=&quot;tag&quot;&gt;codec&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/vp8&quot; rel=&quot;tag&quot;&gt;vp8&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/h.264&quot; rel=&quot;tag&quot;&gt;h.264&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/webm&quot; rel=&quot;tag&quot;&gt;webm&lt;/a&gt;      
	      &lt;/p&gt;

    </content>
  </entry>
  <entry>
    <title>A Brief Primer on Internet Video</title>
    <link rel="alternate" type="text/html" href="http://www.bxgrant.com/entry/97"/>
    <id>http://www.bxgrant.com/entry/97</id>
    <updated>2010-05-20T12:34:27Z</updated>
    <published>2010-05-20T09:08:27-06:00</published>
    <author>
      <name>Bruce Grant</name>
      <uri>http://www.bxgrant.com/blog/1</uri>
    </author>
    
    

    <content type="html" xml:lang="en" xml:base="http://www.bxgrant.com/blog/1">
      &lt;div class=&quot;bxWikiDocBody&quot;&gt;With all that's going on around video over the Internet, I thought I'd put down some of the basic concepts involved.  A company looking to embrace Internet video will need to fully understand each of the following components of an Internet video ecosystem.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;Video Codec&lt;/span&gt;&lt;br /&gt;
You're going to need to choose how to encode your video.  Raw video file sizes are still far too large for playback over the open Internet.  A video codec takes the raw format and uses math tricks to &quot;compress&quot; it.  You use an encoder to &quot;compress the video&quot; and a decoder to &quot;un-compress&quot; the video right before you play it.  You can't play &quot;compressed&quot; video the same way you can't get at a word doc in a zip file until you unzip it.  The most common video codec is h.264 but it's not free.  At a certain point you have to pay to use it and you pay a lot.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;Audio Codec&lt;/span&gt;&lt;br /&gt;
You'll need an audio codec to compress audio just as you need a video codec for the video.  You'll need an audio encoder/decoder as well.  The most popular formats are AAC and Dolby's AC3.  Neither of them are free.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;Container Format&lt;/span&gt;&lt;br /&gt;
Here's where things get interesting.  You're going to need to bundle your audio and video together and send it over the Internet to a video player.  The most common container format if you're using h.264 has been either MPEG 2 or MPEG 4.  Broadcast television is sent to your TV wrapped using an MPEG2 container.  The Flash Video (flv) container is also very popular.  Many container formats support embedding other content in them including closed-captioning information, multiple audio tracks, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;Video Player&lt;/span&gt;&lt;br /&gt;
Lastly, you're going to need a video player that can un-bundle the content from its container format, decode the audio, decode the video and play the content - preferably embedded within a web page.  The video player will fail to play the content if the viewer's computer doesn't have the audio and video codecs installed on the local computer that correspond to the audio/video codecs used to encode the content in the first place.  Flash remains far and away the most popular video player used in web pages to play back video.  However, there are some challenges.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;Psuedo Streaming over the Web&lt;/span&gt;&lt;br /&gt;
Traditionally, video players, Flash included, begin downloading the video content over the Internet and bring down the bits of the file a piece at a time.  If the video player can't download the content fast enough, eventually there's nothing to play and the player will stop playing until it catches up - very annoying.  Also, jumping around inside the video timeline to watch from a new place in the episode or movie can be very problematic.  Remember, traditionally the content is one big file being retrieved over the Internet.  So, for a long time you couldn't jump to a place in the video you were watching until you had downloaded the content up to that point in the episode or movie.  Google's YouTube and others got around the problem of not being able to jump to an arbitrary location in the video by supporting something called pseudo-streaming.&lt;br /&gt;
&lt;br /&gt;
Pseudo streaming requires a program on the server to intercept a request to retrieve a huge video file and instead return part of a video file.  A video player will ask the server to retrieve the file starting from a specific place within the file.  While not perfect, this solution is good enough and everyone from YouTube to CBS.com used this approach to let viewers click to anyplace in a TV show or video and start playing.  Pretty much everyone used this technique until a year or two ago.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;Chunked Video Streaming over the Web&lt;/span&gt;&lt;br /&gt;
Three or four years ago, the company I worked for, Move Networks,  invented an ingenious way to deliver video.  They broke a single TV show or movie video up into lots of independent video files, each a valid movie with a complete container format wrapping the audio and video.  Each file contained just a few seconds of the content.  Then, they also encoded the same small chunks of video over and over at different quality levels resulting in small files that varied in size from just a few kilobytes to several megabytes.  They created their own video player that would get the highest quality chunk of video it could before it ran out of content to play and stopped.  This made the time it took to start playing content a second or less and also made jumping from place to place in the video timeline nearly instant.&lt;br /&gt;
&lt;br /&gt;
Just over a year ago, both Apple and Microsoft copied this approach nearly exactly.  Since then open source solutions have emerged that emulate this approach to one degree or another.&lt;/div&gt; 	      &lt;p&gt;&lt;b&gt;Tags: &lt;/b&gt; 
	  	    &lt;a href=&quot;/tag/1/video&quot; rel=&quot;tag&quot;&gt;video&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/codec&quot; rel=&quot;tag&quot;&gt;codec&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/h.264&quot; rel=&quot;tag&quot;&gt;h.264&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/aac&quot; rel=&quot;tag&quot;&gt;aac&lt;/a&gt;      
	      &lt;/p&gt;

    </content>
  </entry>
  <entry>
    <title>Google, VP8 &amp; Video for Small Companies</title>
    <link rel="alternate" type="text/html" href="http://www.bxgrant.com/entry/96"/>
    <id>http://www.bxgrant.com/entry/96</id>
    <updated>2010-08-02T12:51:02Z</updated>
    <published>2010-05-20T08:54:35-06:00</published>
    <author>
      <name>Bruce Grant</name>
      <uri>http://www.bxgrant.com/blog/1</uri>
    </author>
    
    

    <content type="html" xml:lang="en" xml:base="http://www.bxgrant.com/blog/1">
      &lt;div class=&quot;bxWikiDocBody&quot;&gt;&lt;a href=&quot;http://googleblog.blogspot.com/2010/05/google-io-2010-day-1-more-powerful-web.html&quot;&gt;Google's blog&lt;/a&gt; from the first day of Google I/0 2010 included a very important announcement whose significance some may have missed.  Google announced &lt;a href=&quot;http://webmproject.blogspot.com/2010/05/introducing-webm-open-web-media-project.html&quot;&gt;WebM&lt;/a&gt; with a website for its &lt;a href=&quot;http://www.webmproject.org/&quot;&gt;tools and code&lt;/a&gt;.  &quot;The WebM project is dedicated to developing a high-quality, open video format for the web that is freely available to everyone.&quot;&lt;br /&gt;
&lt;br /&gt;
I spent a few years working for Move Networks, a pioneer in the Internet Video space, and right now I'm helping a different company create a solution that revolves around capturing, transcoding and delivering high-quality video over an IP network.  Many companies are adding video to their various products and solutions and those that haven't yet have it on the drawing board for the near future.  The following provides some insight into some of the questions a company will need to answer in deciding on a solution.&lt;br /&gt;
&lt;br /&gt;
Jump over to my &lt;a href=&quot;http://www.bxgrant.com/entry/97&quot;&gt;Internet Video Primer&lt;/a&gt; if terms like pseudo streaming and chunked video are foreign to you.  It's pretty short.&lt;br /&gt;
&lt;br /&gt;
I've chosen Flash as an integral part of the solution I'm helping create at my current company, despite the fact that I can't stand Flash.  I chose it because there really isn't a good alternative yet.  We're encoding our content here in h.264 because the ecosphere around h.264 is so mature and complete:  we're using h.264 encoders (hardware and software), our transcoding tools work well with h.264 and of course Flash play s h.264.  Still, there are some serious problems with this solution that will wind up costing this company a lot of money in the long term and Google's WebM project could eventually solve these problems.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;Problem:&lt;/span&gt; h.264 interoperbility&lt;br /&gt;
h.264 is a kitchen sink format, attempting to provide the best possible quality/size trade-offs for high to low quality and high to low encoded video size and the result is a very complicated format that often causes interoperability issues as you move from device to device and player to player&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;WebM Solution:&lt;/span&gt; VP8&lt;br /&gt;
I learned that Google acquired On2's VP8 not quite &lt;a href=&quot;http://blog.coull.com/2009/08/07/a-google-video-format-vp8/&quot;&gt;a year ago&lt;/a&gt; and like most in the industry realized that the slick VP8 codec, a much more focused codec, could help with some of the h.264 interoperability issues.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;Problem:&lt;/span&gt; h.264/aac codecs are proprietary&lt;br /&gt;
The most popular video and audio codecs out there are proprietary and you have to pay to use them.  This isn't a problem for many small companies initially because you don't usually pay until you get a lot of eyeballs and even then often you're using technologies that have payed for the right to use these codecs for you.  However, with success a company can quickly find itself paying large licensing fees if they're not careful.  Also, the proprietary nature of these codecs inhibits more video players and encoding technologies from embracing them.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;WebM Solution:&lt;/span&gt; VP8 / Vorbis&lt;br /&gt;
Google paid a grundle for VP8 and has now made it free as in beer.  Companies can use VP8 for video and the already open source Vorbis for audio.  I used VP8's predecessor, On2 VP7, for years and was very pleased with its quality.  VP8 is supposed to be a lot faster to encode and decode with the same quality.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;Problem:&lt;/span&gt; proprietary video players&lt;br /&gt;
Flash remains the de-facto standard for playing back video over the Internet in a web page.  Flash has some serious problems.  It's extremely slow.  Flash is a general-purpose animation platform.  It doesn't actually play video that well compared to video players that specialize in just playing video.  Flash takes more horsepower to play video than it should and I just don't want to be locked into a single vendor, Adobe.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;WebM Solution:&lt;/span&gt; HTML 5 with VP8/Vorbis&lt;br /&gt;
&lt;a href=&quot;http://en.wikipedia.org/wiki/HTML5&quot;&gt;HTML 5&lt;/a&gt; is a set of emerging open standards for creating sophisticated, next generation web pages.  It includes a brain-dead way to play video that lets the web browser pick any installed video player that can play the content.  Apple and Adobe have fought Google on this standard because both Apple and Adobe are highly motivated to cripple how truly &quot;open&quot; this standard is so that their proprietary video players remain relevant: Apple Quicktime and the Adobe Flash Plugin.  Google has given the HTML 5 video playback standard some real teeth by providing an world class, truly free video codec.&lt;br /&gt;
&lt;br /&gt;
So, does Google's WebM bring nirvanna to small companies wanting to embrace video over the Internet?  Unfortunately not, at least not yet.  The entire industry has moved to h.264 video encoding and it will take some time to create a sufficiently mature ecosphere around VP8 to gain widespread adoption.  It's also possible that Google is too late and that WebM will fail to reach the critical mass necessary to convince device manufacturers, content owners and video management companies to embrace it.  We'll see.&lt;br /&gt;
&lt;br /&gt;
There are a few factors in Google's favor here.  First, Google's already converting its YouTube content to the new VP8/Ogg approach.  YouTube all by itself is a force powerful enough to sway an entire industry.  Then there's the fact that Google's wagon is hitched to HTML 5 and make no mistake, HTML 5 is going to win and win big.  Developers, whether creating desktop apps or mobile phone apps, are already embracing it.  Lets see, on one side I've got tons of infrastructure and support but I'm encumbered with license fees and on the other I've got Google and free.  They're going to win a lot of developers over quickly.&lt;br /&gt;
&lt;br /&gt;
Stay tuned.  It should be interesting to see how this all shakes out.&lt;/div&gt; 	      &lt;p&gt;&lt;b&gt;Tags: &lt;/b&gt; 
	  	    &lt;a href=&quot;/tag/1/google&quot; rel=&quot;tag&quot;&gt;google&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/video&quot; rel=&quot;tag&quot;&gt;video&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/codec&quot; rel=&quot;tag&quot;&gt;codec&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/vp8&quot; rel=&quot;tag&quot;&gt;vp8&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/webm&quot; rel=&quot;tag&quot;&gt;webm&lt;/a&gt;      
	      &lt;/p&gt;

    </content>
  </entry>
  <entry>
    <title>A Moderate Look at the iPhone vs. Android Question</title>
    <link rel="alternate" type="text/html" href="http://www.bxgrant.com/entry/95"/>
    <id>http://www.bxgrant.com/entry/95</id>
    <updated>2010-05-18T21:44:38Z</updated>
    <published>2010-05-18T17:46:16-06:00</published>
    <author>
      <name>Bruce Grant</name>
      <uri>http://www.bxgrant.com/blog/1</uri>
    </author>
    
    

    <content type="html" xml:lang="en" xml:base="http://www.bxgrant.com/blog/1">
      &lt;div class=&quot;bxWikiDocBody&quot;&gt;A buddy of mine recently &lt;a href=&quot;http://www.scotthawker.com/scott/?p=2155&quot;&gt;commented&lt;/a&gt; on an article that ripped on the immaturity of the Android platform and its overall lack of spit and polish.  I agree that the iPhone is certainly well ahead of the Android platform in overall usability, stability and performance.  I also agree that Android stands on the edge of a knife as the platform threatens to fragment with all the quick releases Google has made to try and mature it and the mods various phone carriers have made to their own versions.&lt;br /&gt;
&lt;br /&gt;
Still, the writer of the article Scott retaliated against lacks balance - ahem, Apple Fanboy anyone - and I'm sick to death of extreme voices in our country beating out more moderate, reasoned consideration of issues.  So, here's my moderate opinion.&lt;br /&gt;
&lt;br /&gt;
Let me mention that I have been writing and managing those who write mobile applications since the Palm Treo 600 days.  I will also mention that I have researched the mobile phone space, platform features and development approaches for each of the major mobile device families intensively for the last few months.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;Maturity, Stability and Polish Argument&lt;/span&gt;&lt;br /&gt;
The iPhone has a lot more problems than people would lead you to believe.  The fact that it's currently better than Android with stability doesn't discount the fact that the iPhone lacks the quality that Mac's of yesteryear enjoyed.  I own an iPhone and it locks up and crashes on me for the same reason that Android phones do - poorly written apps destabilize the operating system.  I have purchased audio books on the App Store that at random locations within the book simply cause the iPhone to shut down.  Is this the iPhone book audio player's fault or whoever created the digital book?  Hard to say.  All I know is that I can make my iPhone crash regularly if I use it a lot, including the phone dialing app.&lt;br /&gt;
&lt;br /&gt;
I've spent many a fun hour manually deleting email one-at-a-freakin' time because the iPhone doesn't let you delete email in batch mode.  Friends complain that they can't hear me well when I use the microphone that comes built into the iPhone headphones and I've tried everything I can Google to fix it including buying new headphones.  Another friend of mine, sometimes known by the moniker slemon, has found several major bugs and missing features on his iPhone 3GS to the extent he wonders if the thing works at all for something as fundamental as email.&lt;br /&gt;
&lt;br /&gt;
I convinced my wife to buy an Android My Touch phone.  When she has occasion to use my iPhone she remarks that things are simply faster, more fluid and easier on her brain than her My Touch.  Yes, Android is &quot;geeky&quot; and less mature than the iPhone.  Will it ever be as &quot;polished&quot; as the iPhone?  Doubtful.  Few put the time and energy into the human interface that Apple does.  Still, it will soon be &quot;good enough&quot; that to most it just won't matter.  The Apple true believers will always deride the competition and Apple excels at creating a cultish following.  However, the mainstream will do just fine with her Android, especially as the software hardens, the hardware it deploys on improves and the Android phones begin to standardize on the one or two OS versions Google will release each year.&lt;br /&gt;
&lt;br /&gt;
 &lt;span class=&quot;bxWikiBold&quot;&gt;Developers and the Apple Control Freakness Argument&lt;/span&gt;&lt;br /&gt;
Google, Microsoft,  Apple... they're for profit companies that want to dominate the mobile industry and will use whatever they think works for them to achieve this.  In Apple's case, this means that they are going to strong-arm 3rd parties and demand developers write apps using XCode and Objective-C.  Meanwhile, Apple will prohibit the use of cross-platform tools that would simplify iPhone development and bring a measure of write once mobile apps at the cost of cracking Apple's proprietary armor and perhaps lead to some lesser quality apps on the iPhone.&lt;br /&gt;
&lt;br /&gt;
Google benefits from creating an open platform that enjoys widespread adoption.  Google will embrace third parties and encourage the use of any tool, approach or framework that will increase the number of apps for Android, leading to further demand for Android.  Developers and the informed tech press will lambaste Apple's maniacal pursuit of controlling all things iPhone while praising Google for its open, seemingly close-to-philanthropic approach. &lt;br /&gt;
&lt;br /&gt;
What does this mean?  It means that all good corporations are selfish, self-centered and seek his own best interest over any other corporation, group or individual.  It just so happens that what Apple sees as its winning formula leads most sane, non-Fanboy developers and would-be partners to hate their guts - me included.  However, I clearly understand that Google's desire to rule the world is no less rabid than Apple's.  Its just that I don't like dictators, even benign ones that think they know better than I how to develop for and use their cool products.  Let's say Apple's right and they do know better than I and let's also say this very control is what enables them to create singular, amazing products... it doesn't change the revulsion I feel at the manipulation and control.  I can't help it.  I was raised free-born.&lt;/div&gt; 	      &lt;p&gt;&lt;b&gt;Tags: &lt;/b&gt; 
	      &lt;/p&gt;

    </content>
  </entry>
  <entry>
    <title>Leximizing Tech Words</title>
    <link rel="alternate" type="text/html" href="http://www.bxgrant.com/entry/94"/>
    <id>http://www.bxgrant.com/entry/94</id>
    <updated>2010-05-11T08:15:48Z</updated>
    <published>2010-05-10T20:17:46-06:00</published>
    <author>
      <name>Bruce Grant</name>
      <uri>http://www.bxgrant.com/blog/1</uri>
    </author>
    
    

    <content type="html" xml:lang="en" xml:base="http://www.bxgrant.com/blog/1">
      &lt;div class=&quot;bxWikiDocBody&quot;&gt;If you work in a software &quot;tech&quot; firm I'm sure you've noticed a continuing trend with certain pop techie words: the lexical exposure everyone in the office gets continues to increase crazily.  Certain individuals seek to leximize these words by saying them over and over, even in contexts where they make no sense.  Then, the non-techies start feeling threatened, say a product manager, and then they start using the geek words so they look smarter.  You know things are off the deep end when your CEO starts using these words in an all-hands meeting.  &lt;br /&gt;
&lt;br /&gt;
A few months ago I nearly fell off my chair when I heard a sales guy throw out this little gem, &quot;We just need to crank up some Ajax HTML that Rests to the customer's IT and we can make the change the customer wants.  Really, it's simple lets just add it to the iteration.&quot;&lt;br /&gt;
&lt;br /&gt;
Just say no and don't participate in leximizing these words.&lt;/div&gt; 	      &lt;p&gt;&lt;b&gt;Tags: &lt;/b&gt; 
	  	    &lt;a href=&quot;/tag/1/language&quot; rel=&quot;tag&quot;&gt;language&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/leximize&quot; rel=&quot;tag&quot;&gt;leximize&lt;/a&gt;      
	      &lt;/p&gt;

    </content>
  </entry>
  <entry>
    <title>Fallout from the Apple SDK ban of Indirect Development Tools</title>
    <link rel="alternate" type="text/html" href="http://www.bxgrant.com/entry/93"/>
    <id>http://www.bxgrant.com/entry/93</id>
    <updated>2010-04-17T19:51:13Z</updated>
    <published>2010-04-17T19:16:54-07:00</published>
    <author>
      <name>Bruce Grant</name>
      <uri>http://www.bxgrant.com/blog/1</uri>
    </author>
    
    

    <content type="html" xml:lang="en" xml:base="http://www.bxgrant.com/blog/1">
      &lt;div class=&quot;bxWikiDocBody&quot;&gt;The whole blogosphere is lit up over the recent iPhone Developer SDK language which appears to prohibit the use of development tools that cross-compile from some language or environment to a native iPhone application: &lt;a href=&quot;http://daringfireball.net/2010/04/iphone_agreement_bans_flash_compiler&quot;&gt;one article&lt;/a&gt;, &lt;a href=&quot;http://www.techradar.com/news/phone-and-communications/mobile-phones/iphone-4-0-os-sdk-sparks-developer-backlash-682433&quot;&gt;second article&lt;/a&gt;, &lt;a href=&quot;http://37signals.com/svn/posts/2273-five-rational-arguments-against-apples-331-policy&quot;&gt;third article&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
While I am frustrated with the Apple mentality that they feel works so well for them - closed, uber-control of their platforms and application tools - I am more interested in the actual impact to the approaches I want to pursue that may now be prohibited.&lt;br /&gt;
&lt;br /&gt;
I am no Apple bigot.  I do not love Object-C.  I do not like X-Code, it is proprietary and inferior to most modern development platforms including both Eclipse and Microsoft .NET.  I also cannot afford to continue building one-off applications native to each mobile device platform.  It's not cost-effective and prohibits smaller companies from competing across platforms.&lt;br /&gt;
&lt;br /&gt;
So, does this mean I won't be able to create iPhone apps using development tools that allow you to write in a single language and environment and then generate native applications for iPhone, Android, etc?  Maybe and maybe not.&lt;br /&gt;
&lt;br /&gt;
Some of these cross-compiling tools claim to have received a pass from Apple.  Let's break them down and see why they might still be OK to use or not, depending on what the shake-out of the new SDK language is.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;Rhomobile Rhodes&lt;/span&gt;&lt;br /&gt;
Use Ruby to create apps for multiple mobile platforms, including iPhone.  The apps created by Rhodes are interpreted on the fly in the resulting application with a bundled Ruby interpreter.  While Rhodes thinks they're OK with these two posts: &lt;a href=&quot;http://rhomobile.com/2010/04/09/iphone-4-0-sdk-rules/&quot;&gt;one&lt;/a&gt; and &lt;a href=&quot;http://rhomobile.com/2010/04/11/more-detail-about-rhomobile-products-moving-forward/&quot;&gt;two&lt;/a&gt;, I have my doubts.  They are definitely creating an indirection that seems to be prohibited in this statement included in section 3.3.1 of the developer SDK: &quot;Applications that link to Documented APIs through an intermediary translation or compatibility layer or tool are prohibited.&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;PhoneGap&lt;/span&gt;&lt;br /&gt;
They provide access to native application functionality through vendor-provided standard JS calls.  The whole app is nothing more than JavaScript and HTML and so it might explain why Apple may have &lt;a href=&quot;http://www.phonegap.com/2010/04/14/phonegap-and-the-apple-developer-license-agreement/&quot;&gt;given them a pass to keep going.&lt;/a&gt;  So, it may be that not all hope is lost.  However, there are occasions when you simply need to get closer to the metal than what HTML 5 and native phone extensions provide.  However, if you can make this approach work for you then PhoneGap may keep the promise of write once and deploy to multiple mobile platforms alive.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;Appcelerator: Titanium&lt;/span&gt;&lt;br /&gt;
This tool rocks.  You write in a single language/environment and then it creates native Object-C code that does what you intended.  I think the debate is open as to whether or not Appcelerator is toast.  They don't require a run-time interpreter like Rhodes does but they do use an indirection before getting to native Objective-C:  &lt;a href=&quot;http://developer.appcelerator.com/question/16101/is-appcelerator-titanium-now-banned-on-the-iphone&quot;&gt;check this thread out on the subject&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bxWikiBold&quot;&gt;Unity 3D&lt;/span&gt;&lt;br /&gt;
Unity has a killer platform for creating powerful games without having to write apps specific to each device.  They have a huge following and some of the most popular games on the iPhone AppStore are created using 3D.  &lt;a href=&quot;http://blogs.unity3d.com/2010/04/10/unity-and-the-iphone-os-4-0/&quot;&gt;Here's what the CEO of Unity&lt;/a&gt; says on the subject.&lt;br /&gt;
&lt;br /&gt;
So, the long of the short of it is that no one knows whether this move by Apple was specifically targeted at preventing Adobe from releasing a cross-compiler for Flash on the iPhone, effectively getting around the ban on Flash on the iPhone and iPad or if it is targeted at all tools that one way or another attempt to do the same thing.&lt;br /&gt;
&lt;br /&gt;
It appears that at least one approach, albeit the least powerful, may remain viable.  I'll keep watching this with keen interest because it will affect me in a personal way.&lt;/div&gt; 	      &lt;p&gt;&lt;b&gt;Tags: &lt;/b&gt; 
	  	    &lt;a href=&quot;/tag/1/apple&quot; rel=&quot;tag&quot;&gt;apple&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/iphone&quot; rel=&quot;tag&quot;&gt;iphone&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/sdk&quot; rel=&quot;tag&quot;&gt;sdk&lt;/a&gt;      
	      &lt;/p&gt;

    </content>
  </entry>
  <entry>
    <title>Subsonic - Getting Free of Itunes</title>
    <link rel="alternate" type="text/html" href="http://www.bxgrant.com/entry/91"/>
    <id>http://www.bxgrant.com/entry/91</id>
    <updated>2010-04-02T15:18:30Z</updated>
    <published>2010-04-02T14:44:46-07:00</published>
    <author>
      <name>Bruce Grant</name>
      <uri>http://www.bxgrant.com/blog/1</uri>
    </author>
    
    

    <content type="html" xml:lang="en" xml:base="http://www.bxgrant.com/blog/1">
      &lt;div class=&quot;bxWikiDocBody&quot;&gt;My latest attempt to get free from itunes is an opensource project names &lt;a href=&quot;http://www.subsonic.org/pages/index.jsp&quot;&gt;subsonic&lt;/a&gt;.  Why do I want to be free of itunes?&lt;br /&gt;
&lt;br /&gt;
Well, beside the fact that I can't stand the Apple uber-control-factor, there's also the pain of dealing with my mp3 collection every time I change laptops (which is frequent these days).  With subsonic, I hope to keep all my music on my server, use a web interface to set how often I listen to what, the star rating and so forth and then access the music and playlists from any laptop, iphone device, android device, whatever.&lt;br /&gt;
&lt;br /&gt;
So, in comes Subsonic.  I'm going to try it out.&lt;br /&gt;
&lt;br /&gt;
Here are the steps I took to install it on ubuntu:&lt;br /&gt;
&lt;br /&gt;
&lt;ol class=&quot;bxWikiOutline1&quot;&gt;&lt;li&gt;&lt;div class=&quot;bxTitle&quot;&gt; Installing Subsonic Streaming&lt;/div&gt;&lt;ol class=&quot;bxWikiOutline2&quot;&gt;&lt;li&gt;&lt;div class=&quot;bxTitle&quot;&gt; Get the war file&lt;/div&gt;&lt;div class=&quot;bxText&quot;&gt; http://www.subsonic.org/pages/download.jsp&lt;br /&gt;
 I got version 3.9, the latest as of the time I installed.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;bxTitle&quot;&gt; Modify apache conf rules to allow subsonic to work with modjk&lt;/div&gt;&lt;div class=&quot;bxText&quot;&gt;&lt;div class=&quot;bxWikiCalloutCode&quot;&gt;&lt;div class=&quot;codeBody&quot;&gt;&lt;div class=&quot;calloutTitle&quot;&gt;&lt;div class=&quot;titleText&quot;&gt;Apache Rules&lt;/div&gt;&lt;div class=&quot;copyCalloutCode&quot;&gt;&lt;a href=&quot;javascript:BxUtil.copyToClipboard('apacheRulesCopy')&quot;&gt;Copy&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;calloutText&quot; style=&quot;&quot;&gt;&lt;a name=&quot;apacheRules1Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;1&lt;/span&gt;&lt;span id=&quot;apacheRules1&quot;&gt;  RewriteCond %{REQUEST_URI} !^/subsonic&lt;/span&gt;
&lt;a name=&quot;apacheRules2Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;2&lt;/span&gt;&lt;span id=&quot;apacheRules2&quot;&gt; &amp;lt;Location &quot;/subsonic/*&quot;&amp;gt;&lt;/span&gt;
&lt;a name=&quot;apacheRules3Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;3&lt;/span&gt;&lt;span id=&quot;apacheRules3&quot;&gt;    ExpiresDefault &quot;now&quot;&lt;/span&gt;
&lt;a name=&quot;apacheRules4Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;4&lt;/span&gt;&lt;span id=&quot;apacheRules4&quot;&gt;    JkMount ajp13_worker&lt;/span&gt;
&lt;a name=&quot;apacheRules5Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;5&lt;/span&gt;&lt;span id=&quot;apacheRules5&quot;&gt;  &amp;lt;/Location&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div id=&quot;apacheRulesCopy&quot; style=&quot;display:none&quot;&gt;  RewriteCond %{REQUEST_URI} !^/subsonic
 &amp;lt;Location &quot;/subsonic/*&quot;&amp;gt;
    ExpiresDefault &quot;now&quot;
    JkMount ajp13_worker
  &amp;lt;/Location&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;clear:both&quot;&gt;&lt;/div&gt;&lt;script type=&quot;text/javascript&quot;&gt;var _apacheRulesRow;&lt;/script&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;bxTitle&quot;&gt; Get Lame&lt;/div&gt;&lt;div class=&quot;bxText&quot;&gt; I didn't have lame installed and it wanted it.&lt;br /&gt;
&lt;div class=&quot;bxWikiCalloutCode&quot;&gt;&lt;div class=&quot;codeBody&quot;&gt;&lt;div class=&quot;calloutTitle&quot;&gt;&lt;div class=&quot;titleText&quot;&gt;Install Lame&lt;/div&gt;&lt;div class=&quot;copyCalloutCode&quot;&gt;&lt;a href=&quot;javascript:BxUtil.copyToClipboard('installLameCopy')&quot;&gt;Copy&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;calloutText&quot; style=&quot;padding: 4px;min-height:0px;&quot;&gt;&lt;a name=&quot;installLame1Link&quot; /&gt;&lt;span id=&quot;installLame1&quot;&gt; sudo apt-get install lame flac faad vorbis-tools ffmpeg&lt;/span&gt;&lt;/div&gt;&lt;div id=&quot;installLameCopy&quot; style=&quot;display:none&quot;&gt; sudo apt-get install lame flac faad vorbis-tools ffmpeg&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;clear:both&quot;&gt;&lt;/div&gt;&lt;script type=&quot;text/javascript&quot;&gt;var _installLameRow;&lt;/script&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt; 	      &lt;p&gt;&lt;b&gt;Tags: &lt;/b&gt; 
	      &lt;/p&gt;

    </content>
  </entry>
  <entry>
    <title>Simpler Way to Acquire Log4J Logger</title>
    <link rel="alternate" type="text/html" href="http://www.bxgrant.com/entry/90"/>
    <id>http://www.bxgrant.com/entry/90</id>
    <updated>2010-04-02T08:09:34Z</updated>
    <published>2010-04-02T08:09:34-07:00</published>
    <author>
      <name>Bruce Grant</name>
      <uri>http://www.bxgrant.com/blog/1</uri>
    </author>
    
    

    <content type="html" xml:lang="en" xml:base="http://www.bxgrant.com/blog/1">
      &lt;div class=&quot;bxWikiDocBody&quot;&gt;I &lt;a href=&quot;http://firstclassthoughts.co.uk/java/getting_log4j_loggers.html&quot;&gt;came across&lt;/a&gt; a simpler and cleaner way to acquire a logger that rocks for preventing the common boilerplate logger code that we sometimes forget to customize on a class for class basis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So instead of...&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bxWikiCalloutCode&quot;&gt;&lt;div class=&quot;codeBody&quot;&gt;&lt;div class=&quot;calloutTitle&quot;&gt;&lt;div class=&quot;titleText&quot;&gt;Common Way&lt;/div&gt;&lt;div class=&quot;copyCalloutCode&quot;&gt;&lt;a href=&quot;javascript:BxUtil.copyToClipboard('oldWayCopy')&quot;&gt;Copy&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;calloutText&quot; style=&quot;&quot;&gt;&lt;a name=&quot;oldWay1Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;1&lt;/span&gt;&lt;span id=&quot;oldWay1&quot;&gt;import org.apache.log4j.Logger;&lt;/span&gt;
&lt;a name=&quot;oldWay2Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;2&lt;/span&gt;&lt;span id=&quot;oldWay2&quot;&gt;&lt;/span&gt;
&lt;a name=&quot;oldWay3Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;3&lt;/span&gt;&lt;span id=&quot;oldWay3&quot;&gt;class Foo {&lt;/span&gt;
&lt;a name=&quot;oldWay4Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;4&lt;/span&gt;&lt;span id=&quot;oldWay4&quot;&gt;    private final Logger log = Logger.getLogger( this.getClass() );&lt;/span&gt;
&lt;a name=&quot;oldWay5Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;5&lt;/span&gt;&lt;span id=&quot;oldWay5&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div id=&quot;oldWayCopy&quot; style=&quot;display:none&quot;&gt;import org.apache.log4j.Logger;

class Foo {
    private final Logger log = Logger.getLogger( this.getClass() );
}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;clear:both&quot;&gt;&lt;/div&gt;&lt;script type=&quot;text/javascript&quot;&gt;var _oldWayRow;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
You can just do...&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bxWikiCalloutCode&quot;&gt;&lt;div class=&quot;codeBody&quot;&gt;&lt;div class=&quot;calloutTitle&quot;&gt;&lt;div class=&quot;titleText&quot;&gt;Better Way&lt;/div&gt;&lt;div class=&quot;copyCalloutCode&quot;&gt;&lt;a href=&quot;javascript:BxUtil.copyToClipboard('newWayCopy')&quot;&gt;Copy&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;calloutText&quot; style=&quot;&quot;&gt;&lt;a name=&quot;newWay1Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;1&lt;/span&gt;&lt;span id=&quot;newWay1&quot;&gt;import org.apache.log4j.Logger;&lt;/span&gt;
&lt;a name=&quot;newWay2Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;2&lt;/span&gt;&lt;span id=&quot;newWay2&quot;&gt;import spiffy.log4j.LoggerHelper;&lt;/span&gt;
&lt;a name=&quot;newWay3Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;3&lt;/span&gt;&lt;span id=&quot;newWay3&quot;&gt;&lt;/span&gt;
&lt;a name=&quot;newWay4Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;4&lt;/span&gt;&lt;span id=&quot;newWay4&quot;&gt;class Bar {&lt;/span&gt;
&lt;a name=&quot;newWay5Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;5&lt;/span&gt;&lt;span id=&quot;newWay5&quot;&gt;    private static final Logger log = LoggerHelper.getLogger();&lt;/span&gt;
&lt;a name=&quot;newWay6Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;6&lt;/span&gt;&lt;span id=&quot;newWay6&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div id=&quot;newWayCopy&quot; style=&quot;display:none&quot;&gt;import org.apache.log4j.Logger;
import spiffy.log4j.LoggerHelper;

class Bar {
    private static final Logger log = LoggerHelper.getLogger();
}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;clear:both&quot;&gt;&lt;/div&gt;&lt;script type=&quot;text/javascript&quot;&gt;var _newWayRow;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
It accomplishes this simply by looking at the call stack...&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bxWikiCalloutCode&quot;&gt;&lt;div class=&quot;codeBody&quot;&gt;&lt;div class=&quot;calloutTitle&quot;&gt;&lt;div class=&quot;titleText&quot;&gt;Call Stack Method&lt;/div&gt;&lt;div class=&quot;copyCalloutCode&quot;&gt;&lt;a href=&quot;javascript:BxUtil.copyToClipboard('callStackCopy')&quot;&gt;Copy&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;calloutText&quot; style=&quot;&quot;&gt;&lt;a name=&quot;callStack1Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;1&lt;/span&gt;&lt;span id=&quot;callStack1&quot;&gt;public static Logger getLogger()&lt;/span&gt;
&lt;a name=&quot;callStack2Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;2&lt;/span&gt;&lt;span id=&quot;callStack2&quot;&gt;{&lt;/span&gt;
&lt;a name=&quot;callStack3Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;3&lt;/span&gt;&lt;span id=&quot;callStack3&quot;&gt;  final Throwable t = new Throwable();&lt;/span&gt;
&lt;a name=&quot;callStack4Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;4&lt;/span&gt;&lt;span id=&quot;callStack4&quot;&gt;  t.fillInStackTrace();&lt;/span&gt;
&lt;a name=&quot;callStack5Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;5&lt;/span&gt;&lt;span id=&quot;callStack5&quot;&gt;  return Logger.getLogger(t.getStackTrace()[1].getClassName());&lt;/span&gt;
&lt;a name=&quot;callStack6Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;6&lt;/span&gt;&lt;span id=&quot;callStack6&quot;&gt;}&lt;/span&gt;
&lt;a name=&quot;callStack7Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;7&lt;/span&gt;&lt;span id=&quot;callStack7&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id=&quot;callStackCopy&quot; style=&quot;display:none&quot;&gt;public static Logger getLogger()
{
  final Throwable t = new Throwable();
  t.fillInStackTrace();
  return Logger.getLogger(t.getStackTrace()[1].getClassName());
}
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;clear:both&quot;&gt;&lt;/div&gt;&lt;script type=&quot;text/javascript&quot;&gt;var _callStackRow;&lt;/script&gt;&lt;/div&gt; 	      &lt;p&gt;&lt;b&gt;Tags: &lt;/b&gt; 
	  	    &lt;a href=&quot;/tag/1/mindshare&quot; rel=&quot;tag&quot;&gt;mindshare&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/logging&quot; rel=&quot;tag&quot;&gt;logging&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/log4j&quot; rel=&quot;tag&quot;&gt;log4j&lt;/a&gt;      
	      &lt;/p&gt;

    </content>
  </entry>
  <entry>
    <title>Building a Jar  and Including Classes from Dependencies using Maven</title>
    <link rel="alternate" type="text/html" href="http://www.bxgrant.com/entry/88"/>
    <id>http://www.bxgrant.com/entry/88</id>
    <updated>2010-02-24T14:49:30Z</updated>
    <published>2010-02-24T11:09:08-07:00</published>
    <author>
      <name>Bruce Grant</name>
      <uri>http://www.bxgrant.com/blog/1</uri>
    </author>
    
    

    <content type="html" xml:lang="en" xml:base="http://www.bxgrant.com/blog/1">
      &lt;div class=&quot;bxWikiDocBody&quot;&gt;I finally figured out how to build a jar file using Maven that will include the class files from dependent jars in the resulting jar I build.&lt;br /&gt;
&lt;br /&gt;
There's a Maven plugin named shade that will include all the classes from all dependent jar files by default.&lt;br /&gt;
&lt;br /&gt;
Here's my pom.xml file that makes it happen.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bxWikiCalloutCode&quot;&gt;&lt;div class=&quot;codeBody&quot;&gt;&lt;div class=&quot;calloutText&quot; style=&quot;&quot;&gt;&lt;a name=&quot;shade&quot; name=&quot;pom.xml1Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;&amp;nbsp;1&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml1&quot;&gt;&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; &lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml2Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;&amp;nbsp;2&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml2&quot;&gt;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml3Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;&amp;nbsp;3&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml3&quot;&gt;  xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 &lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml4Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;&amp;nbsp;4&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml4&quot;&gt;             http://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml5Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;&amp;nbsp;5&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml5&quot;&gt;  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml6Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;&amp;nbsp;6&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml6&quot;&gt;  &amp;lt;groupId&amp;gt;mygroupname&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml7Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;&amp;nbsp;7&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml7&quot;&gt;  &amp;lt;artifactId&amp;gt;myartifactname&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml8Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;&amp;nbsp;8&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml8&quot;&gt;  &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml9Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;&amp;nbsp;9&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml9&quot;&gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml10Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;10&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml10&quot;&gt;  &amp;lt;properties&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml11Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;11&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml11&quot;&gt;    &amp;lt;final.jar.name&amp;gt;myjarfilename&amp;lt;/final.jar.name&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml12Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;12&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml12&quot;&gt;  &amp;lt;/properties&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml13Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;13&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml13&quot;&gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml14Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;14&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml14&quot;&gt;  &amp;lt;build&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml15Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;15&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml15&quot;&gt;    &amp;lt;plugins&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml16Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;16&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml16&quot;&gt;      &amp;lt;plugin&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml17Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;17&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml17&quot;&gt;        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml18Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;18&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml18&quot;&gt;        &amp;lt;artifactId&amp;gt;maven-shade-plugin&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml19Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;19&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml19&quot;&gt;        &amp;lt;version&amp;gt;1.3.1&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml20Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;20&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml20&quot;&gt;        &amp;lt;executions&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml21Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;21&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml21&quot;&gt;          &amp;lt;execution&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml22Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;22&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml22&quot;&gt;            &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml23Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;23&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml23&quot;&gt;            &amp;lt;goals&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml24Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;24&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml24&quot;&gt;              &amp;lt;goal&amp;gt;shade&amp;lt;/goal&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml25Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;25&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml25&quot;&gt;            &amp;lt;/goals&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml26Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;26&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml26&quot;&gt;            &amp;lt;configuration&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml27Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;27&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml27&quot;&gt;              &amp;lt;finalName&amp;gt;${final.jar.name}&amp;lt;/finalName&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml28Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;28&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml28&quot;&gt;              &amp;lt;artifactSet&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml29Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;29&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml29&quot;&gt;                &amp;lt;excludes&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml30Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;30&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml30&quot;&gt;                  &amp;lt;exclude&amp;gt;server.policy&amp;lt;/exclude&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml31Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;31&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml31&quot;&gt;                &amp;lt;/excludes&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml32Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;32&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml32&quot;&gt;              &amp;lt;/artifactSet&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml33Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;33&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml33&quot;&gt;            &amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml34Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;34&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml34&quot;&gt;          &amp;lt;/execution&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml35Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;35&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml35&quot;&gt;        &amp;lt;/executions&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml36Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;36&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml36&quot;&gt;      &amp;lt;/plugin&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml37Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;37&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml37&quot;&gt;    &amp;lt;/plugins&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml38Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;38&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml38&quot;&gt;  &amp;lt;/build&amp;gt;&lt;/span&gt;
&lt;a name=&quot;shade&quot; name=&quot;pom.xml39Link&quot; /&gt;&lt;span class=&quot;rowNum&quot;&gt;39&lt;/span&gt;&lt;span id=&quot;shade&quot; name=&quot;pom.xml39&quot;&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div id=&quot;shade&quot; name=&quot;pom.xmlCopy&quot; style=&quot;display:none&quot;&gt;&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; 
xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 
             http://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
  &amp;lt;groupId&amp;gt;mygroupname&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;myartifactname&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;

  &amp;lt;properties&amp;gt;
    &amp;lt;final.jar.name&amp;gt;myjarfilename&amp;lt;/final.jar.name&amp;gt;
  &amp;lt;/properties&amp;gt;

  &amp;lt;build&amp;gt;
    &amp;lt;plugins&amp;gt;
      &amp;lt;plugin&amp;gt;
        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;maven-shade-plugin&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;1.3.1&amp;lt;/version&amp;gt;
        &amp;lt;executions&amp;gt;
          &amp;lt;execution&amp;gt;
            &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;
            &amp;lt;goals&amp;gt;
              &amp;lt;goal&amp;gt;shade&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
            &amp;lt;configuration&amp;gt;
              &amp;lt;finalName&amp;gt;${final.jar.name}&amp;lt;/finalName&amp;gt;
              &amp;lt;artifactSet&amp;gt;
                &amp;lt;excludes&amp;gt;
                  &amp;lt;exclude&amp;gt;server.policy&amp;lt;/exclude&amp;gt;
                &amp;lt;/excludes&amp;gt;
              &amp;lt;/artifactSet&amp;gt;
            &amp;lt;/configuration&amp;gt;
          &amp;lt;/execution&amp;gt;
        &amp;lt;/executions&amp;gt;
      &amp;lt;/plugin&amp;gt;
    &amp;lt;/plugins&amp;gt;
  &amp;lt;/build&amp;gt;
&amp;lt;/project&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;copyCalloutCode&quot;&gt;&lt;a href=&quot;javascript:BxUtil.copyToClipboard('shade&quot; name=&quot;pom.xmlCopy')&quot; style=&quot;color:#21206b&quot;&gt;Copy&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;clear:both&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;clear:both&quot;&gt;&lt;/div&gt;&lt;script type=&quot;text/javascript&quot;&gt;var _shade&quot; name=&quot;pom.xmlRow;&lt;/script&gt;&lt;/div&gt; 	      &lt;p&gt;&lt;b&gt;Tags: &lt;/b&gt; 
	  	    &lt;a href=&quot;/tag/1/java&quot; rel=&quot;tag&quot;&gt;java&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/Maven&quot; rel=&quot;tag&quot;&gt;Maven&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/jar&quot; rel=&quot;tag&quot;&gt;jar&lt;/a&gt;      
	      &lt;/p&gt;

    </content>
  </entry>
  <entry>
    <title>Old World and New World Web Apps</title>
    <link rel="alternate" type="text/html" href="http://www.bxgrant.com/entry/87"/>
    <id>http://www.bxgrant.com/entry/87</id>
    <updated>2010-02-18T13:12:04Z</updated>
    <published>2010-02-18T10:18:43-07:00</published>
    <author>
      <name>Bruce Grant</name>
      <uri>http://www.bxgrant.com/blog/1</uri>
    </author>
    
    

    <content type="html" xml:lang="en" xml:base="http://www.bxgrant.com/blog/1">
      &lt;div class=&quot;bxWikiDocBody&quot;&gt;A veritable cornucopia of web application approaches and frameworks, some old school and some new school, confuse even the most experienced.  This article attempts to delineate the most popular of the approaches and the reasons why one would adopt one over another for a project.&lt;/div&gt; 	      &lt;p&gt;&lt;b&gt;Tags: &lt;/b&gt; 
	  	    &lt;a href=&quot;/tag/1/java&quot; rel=&quot;tag&quot;&gt;java&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/web+application&quot; rel=&quot;tag&quot;&gt;web application&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/python&quot; rel=&quot;tag&quot;&gt;python&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/ruby&quot; rel=&quot;tag&quot;&gt;ruby&lt;/a&gt;&amp;nbsp;      
	  	    &lt;a href=&quot;/tag/1/MS+ASP&quot; rel=&quot;tag&quot;&gt;MS ASP&lt;/a&gt;      
	      &lt;/p&gt;

    </content>
  </entry>
</feed>
