<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-15227981</id><updated>2012-02-07T14:31:01.709-08:00</updated><category term='Heroku'/><category term='XML'/><category term='XSD'/><category term='Palm Pre Plus T-Mobile Blackberry'/><category term='Java'/><category term='Mythbuster'/><category term='NoSQL'/><category term='Play'/><title type='text'>G-Man's Uber  Software Engineering Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gman.eichberger.de/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default?start-index=26&amp;max-results=25'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>70</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-15227981.post-875525915263153111</id><published>2011-11-10T15:54:00.000-08:00</published><updated>2011-11-10T16:09:47.050-08:00</updated><title type='text'>Safari Books Online</title><content type='html'>I always loved the idea of having access to the &lt;a href="http://safaribooksonline.com/Corporate/Index/"&gt;Safari library&lt;/a&gt; and I had recently another couple of months paired with some time to actually use it. Again despite trying to read as much as I could  I only managed to read about three to four books in the last four months. I enjoyed it the most on my 24" LCD monitor followed by the laptop scree and last by my TouchPad. I was running the TouchPad on both WebOS and Android but the browser version just stinks. Make some dedicated reading app - That can't be too difficult. Another note on the TouchPad: I read the Economist (Safari doesn't have a usable offline mode) on an airplane ride and my eyes hurt after two hours.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The missing offline mode supposedly gets mitigated by earning tokens which you can use to download content (like one token per chapter) but after three months I didn't earn enough tokens to download any book which renders this feature completely useless.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The interface is borderline useless. The HTML interface is worse than the real one but I am still trying to figure out how to effectively get to the next page without using the scroll bar. A web browser does this with &lt;space&gt; &lt;space&gt;but that doesn't work seamlessly in Safari. As much as I like it when a book looks like a book - a screen doesn't have pages I need to turn. The chapter should just be a flow of text and NOT interrupted by footers and headers...&lt;/space&gt;&lt;/space&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I actually did the math and if I would have to pay myself for books I might be better off just buying a Kindle version every month than subscribing to Safari. So as much as I like it and as much as I would want every company I work for to give me a subscription it isn't that valuable for me to get a subscription myself if the workplace doesn't offer it. In that case I would rather by the books outright...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-875525915263153111?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/875525915263153111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=875525915263153111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/875525915263153111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/875525915263153111'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2011/11/safari-books-online.html' title='Safari Books Online'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-8810726722854399038</id><published>2011-10-25T12:20:00.000-07:00</published><updated>2011-10-25T12:29:15.882-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Play'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Heroku'/><title type='text'>Play on Heroku</title><content type='html'>Having some time on my hand I finally got to check out &lt;a href="http://www.playframework.org/"&gt;play&lt;/a&gt; on &lt;a href="http://www.heroku.com/"&gt;Heroku&lt;/a&gt;. I have been dabbling with play earlier when I was trying to run Scala on it but this time I was trying to do some barebone Java app. For a chance from usual dev environment eclipse I was taking IntelliJ for a spin.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As opposed to the description &lt;a href="http://www.playframework.org/documentation/1.2.3/ide#intellij"&gt;here&lt;/a&gt; you need to say under VM args &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 24px; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;-Dapplication.path=“path to your app”&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The "." is just wrong and wouldn't work for me -- I guess you would need to start IntelliJ in the same directory your play app is located?&lt;br /&gt;&lt;br /&gt;Anyhow, development was pretty straight forward. I enjoyed that heroku was forcing you to use git and the deployment was also very easy (compared to GAE).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-8810726722854399038?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/8810726722854399038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=8810726722854399038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/8810726722854399038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/8810726722854399038'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2011/10/play-on-heroku.html' title='Play on Heroku'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-5931310491773163057</id><published>2011-08-01T10:43:00.000-07:00</published><updated>2011-08-01T10:45:29.792-07:00</updated><title type='text'>s+b Generation C</title><content type='html'>I recently noticed an article on s+b about "&lt;a href="http://www.strategy-business.com/article/11110"&gt;Generation C&lt;/a&gt;" - which highlights some of the ideas I have been teaching and speaking about. Though they came up with that independently from me it just shows that great minds think alike :-)  &lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class=" down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;img src="img/blank.gif" alt="Link" class="gl_link" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-5931310491773163057?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/5931310491773163057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=5931310491773163057' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/5931310491773163057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/5931310491773163057'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2011/08/sb-generation-c.html' title='s+b Generation C'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-211759685793138756</id><published>2011-06-25T21:23:00.000-07:00</published><updated>2011-06-25T21:25:13.931-07:00</updated><title type='text'>Speaking @ SoCalCodeCamp</title><content type='html'>The link to my presentation on &lt;a href="http://www.evernote.com/pub/xgerman/CloudClass"&gt;Evernote&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-211759685793138756?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/211759685793138756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=211759685793138756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/211759685793138756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/211759685793138756'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2011/06/speaking-socalcodecamp.html' title='Speaking @ SoCalCodeCamp'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-1651730280949938382</id><published>2011-06-03T14:31:00.000-07:00</published><updated>2011-06-25T21:23:48.340-07:00</updated><title type='text'>Book Review: Career Game &amp; Power</title><content type='html'>&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.amazon.com/gp/product/0804756287/ref=as_li_ss_il?ie=UTF8&amp;amp;tag=ennovatcom-20&amp;amp;linkCode=as2&amp;amp;camp=217153&amp;amp;creative=399349&amp;amp;creativeASIN=0804756287"&gt;&lt;img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&amp;amp;Format=_SL110_&amp;amp;ASIN=0804756287&amp;amp;MarketPlace=US&amp;amp;ID=AsinImage&amp;amp;WS=1&amp;amp;tag=ennovatcom-20&amp;amp;ServiceVersion=20070822" /&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0804756287&amp;amp;camp=217153&amp;amp;creative=399349" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0061789089/ref=as_li_ss_il?ie=UTF8&amp;amp;tag=ennovatcom-20&amp;amp;linkCode=as2&amp;amp;camp=217153&amp;amp;creative=399349&amp;amp;creativeASIN=0061789089"&gt;&lt;img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&amp;amp;Format=_SL110_&amp;amp;ASIN=0061789089&amp;amp;MarketPlace=US&amp;amp;ID=AsinImage&amp;amp;WS=1&amp;amp;tag=ennovatcom-20&amp;amp;ServiceVersion=20070822" /&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0061789089&amp;amp;camp=217153&amp;amp;creative=399349" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;I have read a couple of career books before and they mostly were motivational or geared towards getting a job so I was intrigued to find some book which uses game theory ("Your Career Game") to help you advance and land a job. Unfortunately the book is written mostly for MBA students so the game theory part is surfacy at best and if you are used to at least engineering math kind of disappointing. Nevertheless they finish each chapter with interviews of real people and highlight what "career game moves" they did. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The essence of this book is basically to find a sponsor and mentor who takes you under his wing. In my career I was fortunate enough to have both when I started out at PwC after school. My boss was my mentor and he was great and put me in touch with other interesting people in the organization. Things just happened naturally without much thinking for me. I guess because the main goal was to bring in money (by billing hours or selling projects) there was no ambiguity and it was in my bosses best interest to expose me to many people to get me billing more hours up. Promoting was good again because then they could charge more for me. Needless to say the partnerships goal were pretty much aligned with my career. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When I came to the US I started working in software engineering and had a hard time finding bosses who acted as sponsors or mentors. Honestly I still thought things would just happen naturally but I guess in that case the first book ("Career Game") would recommend to do better homework if the company you are considering is "good for your career" having a reputation for great mentoring or sponsoring.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I liked the second book "Power" much more because it's lessons are far more applicable.  They show research that for instance the performance rating is totally unrelated to your performance and more to how much your boss likes you. Consequently you should spend your time managing up and if you made a bad first impression just leave. Pfeffer also gives tips on building a power base (by choosing influential mentors) and cites surprising research like over-the-top flattery is not considered insincere by the recipient. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They are both pretty good books because they prompted me to some action. The first one ran in some open door with the mentoring: I totally need to increase the numbers of mentors in my life. But I think the "Power" book will be more helpful because I should probably focus more on building a "power base" and increasing my "likability". &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-1651730280949938382?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/1651730280949938382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=1651730280949938382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/1651730280949938382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/1651730280949938382'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2011/06/book-review-career-game-power.html' title='Book Review: Career Game &amp; Power'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-4854744019726950045</id><published>2011-03-30T13:43:00.000-07:00</published><updated>2011-03-30T14:18:33.362-07:00</updated><title type='text'>Working with four continents</title><content type='html'>The last couple of months I have been working with a team out of Israel, a team out of Shanghai, an architect based in London, and me out of the US. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My job is to work under the guidance of the architect to develop a component which integrates tightly with what the team in Israel is doing but keeping the people in Shanghai in the loop so they can take over my piece. The easiest part is to keep Shanghai in the loop - I just do a presentation/training session every three weeks in the evening (usually 5 pm my time). They listen, ask a few questions -- but from colleagues having done such things I know that it might be good to give them homework and quizzes to assess the level of their understanding. But I kind of refuse (like I dow with my adult students) to drop people back to college level :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Working with the architect is awesome, too: I have him on IM and can drop him a note and he gets back to me really fast. But since he is like me new to the Israel team he does know the same amount as I do about how things should be done on this micro code level where teams differ. Do you use return codes for errors or exceptions? (Turns out they do both) and so on.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am mostly working with a Senior Engineer and a manager in Israel and they are both really sharp people and a pleasure to work with. I send them e-mails and they usually get back the next day. I send them diffs and they tell me what to change and we have frequent screen sharing meetings (7 am my time) to discuss some of my more complicated changes. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That all sounds great until you discover at 9 am some pattern or detail in their code you don't understand but you probably need to to do your work. Then you have to wait until the next day for the answer. So I found it helpful to switch to some other thing to work on if I am blocked or do some speculative coding to show them how I think it should be done and send it to them to correct me. I have discovered quite some things that way which weren't apparent (to me) by reading their code. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Does it make sense to work that way? I am pretty convinced if I would be co-located at least with the Israel team I would avoid some rework, spent less time searching their source code, and ultimately get more done. On the downside I would probably slow them down a lot with me asking them stuff every 10 minutes or so. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the other hand I know the piece I am supposed to code for them inside out so having them do it would probably take even longer. But all things equal having a Senior guy on site might be more productive.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I always advocate to fly people to actually meet each other for a few days to code together and get to know each other but with travel budgets tight that often isn't an option. Also often teams contain people from many continents so the way I work this though second best is probably more productive that other things.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The management of my coding is old school. So I don't call in to any daily stand-ups nor do I participate in planning or review meetings. I just keep a representative on each continent informed about my progress and they coordinate with QA and other parts on my behalf. Which let's me focus on coding and I don't have to get on the phone at crazy hours. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I know that this is frowned upon in the trade and we all should have one big scrum we all call in together but this works surprisingly well -- which I attribute to the fact that most of the people I interact with are quite senior and just know what to do. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-4854744019726950045?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/4854744019726950045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=4854744019726950045' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/4854744019726950045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/4854744019726950045'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2011/03/working-with-four-continents.html' title='Working with four continents'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-3994975304464126349</id><published>2011-01-19T15:23:00.001-08:00</published><updated>2011-01-19T15:30:03.605-08:00</updated><title type='text'>Play framework with cygwin</title><content type='html'>For whatever reason the people doing the &lt;a href="http://www.playframework.org/"&gt;play framework&lt;/a&gt; force people on Windows to use cmd instead of cygwin. If you have the Python installed under Windows (not cygwin - "the windows and the cygwin python are completely different" -&lt;a href="http://cygwin.com/ml/cygwin/2004-02/msg01120.html"&gt; http://cygwin.com/ml/cygwin/2004-02/msg01120.html&lt;/a&gt;) you can use the following script. I name it play.sh and put it in the play directory:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;play=`which play`&lt;br /&gt;python `cygpath -wp $play $1 $2 $3 $4 $5 $6 $7 $8 $9`&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Play attention to the quotes... (the script is based on the idea put forth here: &lt;a href="http://www.inonit.com/cygwin/faq/"&gt;http://www.inonit.com/cygwin/faq/&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Note: You still need to have the play directory in your path otherwise which won't work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-3994975304464126349?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/3994975304464126349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=3994975304464126349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/3994975304464126349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/3994975304464126349'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2011/01/play-framework-with-cygwin.html' title='Play framework with cygwin'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-2807430273909795127</id><published>2011-01-18T09:58:00.000-08:00</published><updated>2011-01-18T10:32:37.836-08:00</updated><title type='text'>Membase talk</title><content type='html'>Yesterday I had the pleasure to listen to a talk from &lt;a href="http://www.membase.org/"&gt;Membase&lt;/a&gt;. They lost the T-Shirts in the mail, didn't have beer with the pizza - but &lt;span style="font-style: italic;"&gt;promised &lt;/span&gt;to go to a non-specified bar afterward. I left after about 3.5 hours and they still weren't on the way to the bar...&lt;br /&gt;&lt;br /&gt;Membase is basically the popular &lt;a href="http://memcached.org/"&gt;memcached &lt;/a&gt;with a persistence layer. It has dual licensing - once a "community edition" under Apache license and another one where you pay. They are used on hundreds of servers at Zynga and NHN. Membase is protocol compatible to memcached but it's using &lt;a href="http://code.google.com/p/moxi/"&gt;moxi &lt;/a&gt;(a memcached proxy) for scalability and potential failover.&lt;br /&gt;&lt;br /&gt;Membase doesn't have many of the fancy features other No-SQL databases offer. They don't have a query language nor some map-reduce and even no automatic failover. In fact a node will confirm that it has stored a value &lt;span style="font-style: italic;"&gt;before &lt;/span&gt;it distributes it to other nodes and writes it to disk. Which leaves the data in case of failure exposed to some minor loss or at least inconsistence (aka the latest value might be gone). Furthermore in the failure case the cluster only notifies that a node failed so clients will get errors accessing the failed node until a system administrator has decided manually a failover is apporiate (which is clicking a button on the UI) or brings the broken node back up. They were also decidedly mute about network splits (one of the big enemies of distributed system) and don't support multi-datacenter deployments (the most common source of those splits) yet.&lt;br /&gt;&lt;br /&gt;They are basically some memcached on steroids, fast, highly distributable, (kind of) consistent, etc.  They don't solve the same problems like dynamo or cassandra who either allow you to always write and/or always read from the data store at the expense of consistency. Membase overall is highly consistent (except in some error cases) at the expense of failing reads and writes once a node dies.&lt;br /&gt;&lt;br /&gt;The administration, set-up, etc. are really easy and being able to use the existing memcached protocol makes this a clear winner in the ease of use. They also have some interesting features with the "tap-interface" which allows third party modules to look (aka tap) into all the data in the cluster and do smart things with it. An example would be lucene indexing...&lt;br /&gt;&lt;br /&gt;The use cases are either an extension of memcached (e.g. session caching) and/or something which needs massive scale, speed, and simplicity like Zynga's games. One mantra they repeated over and over was: "If half our servers fail we want to be able to handle half of our user's requests" Not every system scales that way so this is quite an accomplishment.&lt;br /&gt;&lt;br /&gt;Future plans include to get some more of the popular No-SQL features like (prefix and range) queries and code running on the nodes (like map-reduce) called "node code".&lt;br /&gt;&lt;br /&gt;Given the real potential of data loss this system probably appeals to people already using memcached and running out of memory. They now can add disk storage to it together with some very cool administration ui. There are some other use cases where the eventual loss of data is outweigh  by ease of use and speed. Apparently gaming and entertainment can tolerate this risk whereas I wouldn't recommend that solution to store bank account data ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-2807430273909795127?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/2807430273909795127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=2807430273909795127' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/2807430273909795127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/2807430273909795127'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2011/01/membase-talk.html' title='Membase talk'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-1205161474650297112</id><published>2010-12-02T13:50:00.000-08:00</published><updated>2010-12-02T14:07:59.853-08:00</updated><title type='text'>Seattle CloudCamp</title><content type='html'>To learn more about the cloud (after all I will be teaching a &lt;a href="http://extension.ucsd.edu/studyarea/index.cfm?vAction=singleCourse&amp;amp;vCourse=CSE-41137&amp;amp;vStudyAreaId=14"&gt;cloud clas&lt;/a&gt;s in about a month) I went to CloudCamp here in Seattle last night.&lt;br /&gt;&lt;br /&gt;They had speakers from all the major companies: Amazon Web Services, Microsoft Azure, and Google AppEngine. Here are my brief notes:&lt;br /&gt;&lt;br /&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves/&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-priority:99;  mso-style-qformat:yes;  mso-style-parent:"";  mso-padding-alt:0in 5.4pt 0in 5.4pt;  mso-para-margin:0in;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:10.0pt;  font-family:"Times New Roman","serif";} &lt;/style&gt; &lt;![endif]--&gt;  &lt;ul&gt;&lt;li&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Cloud Security seems to be the hot topic du jour and the way to deal with it is encryption to keep data safe and digital signatures to make sure nobody forged the data&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;ul&gt;&lt;li&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;IBM announced another appliance which disperses web sphere images to hyper visors – not sure why they always invent new 1U appliances...&lt;/li&gt;&lt;/ul&gt;  &lt;ul&gt;&lt;li&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Google was there in force and was pushing their appengine (they now have some way to use their &lt;a href="http://code.google.com/apis/predict/"&gt;machine learning algorithms in the cloud&lt;/a&gt;) but the most interesting thing was &lt;a href="http://code.google.com/p/appscale/"&gt;AppScale &lt;/a&gt;an OpenSource technology to install an AppEngine environment on your own servers&lt;/li&gt;&lt;/ul&gt;  &lt;ul&gt;&lt;li&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Microsoft gave a keynote about their Azure thing which seems to be shaping up. Anyway, they hyped &lt;a href="http://www.microsoft.com/en-us/appfabric/azure/default.aspx"&gt;AppFabric &lt;/a&gt;as the solution to everything  --&lt;/li&gt;&lt;/ul&gt;  &lt;ul&gt;&lt;li&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Disaster Recovery in the cloud: Amazon is offering a&lt;a href="http://aws.amazon.com/vpc/"&gt; Virtual Private Clou&lt;/a&gt;&lt;a href="http://aws.amazon.com/vpc/"&gt;d &lt;/a&gt;to replicate a company’s physical infrastructure and use it for disaster recovery just in case. I believe this will have a significant impact on continuity planning and is something to watch.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;ul&gt;&lt;li&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Community Cloud – companies/universities/etc. consolidate their computing centers to have one. As example they cited some site in China where in some technology park the provincial government (together with IBM) was running some data center used by all the tenants of this park. &lt;/li&gt;&lt;/ul&gt;  &lt;ul&gt;&lt;li&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;The speakers agreed that NoSQL is going through some big fragmentation – right now we have &gt;40 NoSQL solution whereas there are only 5-6 SQL databases. This needs to be weeded down to a sustainable amount… &lt;/li&gt;&lt;/ul&gt;  &lt;ul&gt;&lt;li&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Another thing they agreed on was that there is no clear, good definition what the cloud actually is&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-1205161474650297112?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/1205161474650297112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=1205161474650297112' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/1205161474650297112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/1205161474650297112'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2010/12/seattle-cloudcamp.html' title='Seattle CloudCamp'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-6013412639778959264</id><published>2010-09-30T09:02:00.000-07:00</published><updated>2010-09-30T09:27:49.198-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NoSQL'/><title type='text'>NoSQL's Tim Anglade in Seattle</title><content type='html'>You know that a meeting is important if a friend from San Diego forwards you a meeting announcement for Seattle. &lt;a href="http://fr.linkedin.com/in/timanglade"&gt;Tim Anglade&lt;/a&gt; is the initiator of the &lt;a href="http://nosqlsummer.org/"&gt;NoSQL Summer&lt;/a&gt; which I actually attended a few times here in Seattle. Tim is on a trip around the world to videotape interviews with all the important NoSQL guys... interesting task and probably a great job if you can get it ;-) In his presentation he talked about the following topics:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Open source or not?&lt;/span&gt;&lt;br /&gt;He thinks that Open Source might lead to compromises in quality since everybody can add whatever they want. More importantly he believes though NoSQL systems are complicated and need plenty  of support right now this might not hold true for the future as companies build up capabilities in house. Hence the Open Source business model might not be sustainable for the NoSQL companies in the long run.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fanboys ahoy&lt;/span&gt;&lt;br /&gt;Most people like one NoSQL implementation, e.g. &lt;a href="http://couchdb.apache.org/"&gt;Couch &lt;/a&gt;vs. &lt;a href="http://www.mongodb.org/"&gt;Mongo&lt;/a&gt;, over another without properly looking at strength and weaknesses of each. I guess what he wanted to say that if your only tool is a hammer everything looks like a nail. So it seems to be important to take a step back and look for the best NoSQL solution for a given problem rather than the other way around.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Is it an industry yet?&lt;/span&gt;&lt;br /&gt;Most definitely not but they are getting there. A wildcard in Tim's view is if some heavyweight like Oracle is getting in. This would validate the technology and accelerate growth...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nobody cares?&lt;/span&gt;&lt;br /&gt;He through up a slide from a recent eWeek survey where about 44% didn't care about NoSQL. My impression is that NoSQL is gaining traction a lot of places and will be quite relevant in developing new products. I am not sure how long it will take to trickle down to everyday operations -- will your SAP run on NoSQL next year? Probably not...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Where's the ceiling?&lt;/span&gt;&lt;br /&gt;With the database world growing at a rapid pace (there is more and  more data each year) the market is getting bigger and hence the slice  for NoSQL is getting bigger (by just growing with the market). So the  jury is still out there if it is a 100 Mio market or several  billions....&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Consolidation or Balkanization&lt;/span&gt;&lt;br /&gt;As he pointed out in the fanboy thought the NoSQL community is torn between fans of one project over another which suggests Balkanization.  On the other hand projects could take ideas from other projects and incorporate them (to even merging - like &lt;a href="http://struts.apache.org/2.x/index.html"&gt;Struts 2&lt;/a&gt; attempted for the web). I have seen a lot of Balkanization myself but with the NoSQL summer a little bit more understanding of other technologies seems to happen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lowering the bar&lt;/span&gt;&lt;br /&gt;NoSQL is hard to understand so he is urging all the projects to "lower the bar" by providing good documentation and example configuration files which allow developers to have a system up and running in minutes...&lt;br /&gt;&lt;br /&gt;He is also hoping that his efforts like the NoSQL summer will foster understanding of the technology and therefore "lower the bar".&lt;br /&gt;&lt;br /&gt;Some new stuff he has planned are the &lt;a href="http://nosqltapes.com/"&gt;NoSQL tapes&lt;/a&gt; and the NoSQL winter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-6013412639778959264?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/6013412639778959264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=6013412639778959264' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/6013412639778959264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/6013412639778959264'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2010/09/nosqls-tim-anglade-in-seattle.html' title='NoSQL&apos;s Tim Anglade in Seattle'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-4484386685261503142</id><published>2010-08-10T21:43:00.000-07:00</published><updated>2010-08-10T22:15:48.740-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Palm Pre Plus T-Mobile Blackberry'/><title type='text'>Palm Pre Plus on TMobile</title><content type='html'>A few weeks back at the &lt;a href="http://www.capitolhillblockparty.com/"&gt;Capitol Hill Blockparty&lt;/a&gt; I put my name in a raffle for an ATT branded &lt;a href="http://www.palm.com/us/products/phones/preplus/index.html"&gt;Palm Pre Plus&lt;/a&gt; and a few days later I got an e-mail from Palm letting me know that I won a spanking new one. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When it arrived it was of course sim locked which means it didn't work with T-Mobile. Calling ATT and asking for an unlock code (as the phone instructed me to do) didn't yield any result because the phone wasn't in their data base. The Internet claimed that you can actually &lt;a href="http://www.precentral.net/att-pre-plus-gets-unlocked-and-and-running-other-carriers"&gt;buy some sim unlock and make it work with T-Mobile&lt;/a&gt; (Edge only). I went ahead and sent some money to the nice people from &lt;a href="http://www.nextgenserver.com/palm_pre_unlock.htm"&gt;nextgenserver&lt;/a&gt; and promptly received a couple of e-mails.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I installed their software on my Windows 7 computer (this will get important later) but the instructions said that you need an &lt;i&gt;activated&lt;/i&gt; phone. Though I discovered later they had some instructions at the end of the document (I never read manuals from start to finish) I started off to unlock my Palm via WiFi on my own and found this great &lt;a href="http://forums.palm.com/t5/Palm-Services-for-webOS/AT-amp-T-Palm-Pre-Plus-profile-activation-on-Bell/td-p/304788"&gt;description&lt;/a&gt;. Basically you want to install &lt;a href="http://www.webos-internals.org/wiki/Application:MetaDoctor"&gt;meta doctor&lt;/a&gt; by following the description on the web site. But before you doctor your jar you should adjust the make file. Especially some option which lets you bypass the FirstUseApp needs to be activated. I ended up running the meta doctor on my CentOS server (so any Linux will probably do) and then installed on the Palm from my Mac. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This allowed me to activate the device via WiFi and got me one step closer to actually using it. Back to the nextgenserver's software: It didn't work and I asked support - back and forth troubleshooting they finally revealed to me that Windows 7 wasn't supported which was also clearly stated in the manual (did I already say I don't read manuals?). At least I can attest their support is awesome. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then I remembered that I had an old WinXP installation running under VirtualBox on my Mac. I put nextgenserver's software there, made it that the Palm was handled by VirtualBox (just click on the USB icon after you connect the Palm), and then after a couple tries (for whatever reason nextgenserver's software doesn't work the first, second, ... time) I finally got my unlock code. Being smarter I finally read the manual and found the part about resetting the diag drivers so I can put mp3s on the palm with USB. Did that and now it works like a charm.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't know if that is because I run it on T-Mobile but I noticed:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;It drops calls. Never happened with my Blackberry.&lt;/li&gt;&lt;li&gt;It crashes when I put it in my pocket (this seems to be a common problem and can be &lt;a href="http://www.precentral.net/slider-crashes-inspire-macgyver-solution"&gt;solved with some paper&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;It get unresponsive very often - the Blackberry showed a spinning wheel but the Palm just is unresponsive so I don't know what is going on.&lt;/li&gt;&lt;li&gt;The edge data doesn't seem to be happy all the time. But that can also be TMobile. I occasionally had to reboot my Blackberry to get the data back. (might be TMobile's revenge for me being on a grandfathered $5.99 data plan)&lt;/li&gt;&lt;li&gt;The web browser is awesome but e-mail lacks a search function. The GMail app on Blackberry had that and I am addicted to it. But the Palm mail looks nicer&lt;/li&gt;&lt;li&gt;Almost every app looks nicer on the Palm. TinyTwitter on the Blackberry was a pain whereas Spaz on the Palm is awesome&lt;/li&gt;&lt;li&gt;The card interface is awesome. I really like being able to check the status of each app while sliding&lt;/li&gt;&lt;li&gt;The browser stops rendering when in card view. It will only load the web site when in full view, WTF?? I love opening multiple browser windows... and then checking back. Opera mini on Blackberry did a better job.&lt;/li&gt;&lt;li&gt;The headphones leave an aesthetically unpleasing gap...&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;It's a really neat device and far more fun then my old Blackberry... so overall I am happy. &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-4484386685261503142?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/4484386685261503142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=4484386685261503142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/4484386685261503142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/4484386685261503142'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2010/08/palm-pre-plus-on-tmobile.html' title='Palm Pre Plus on TMobile'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-6457290602494355072</id><published>2010-06-28T11:30:00.000-07:00</published><updated>2010-06-28T11:47:26.282-07:00</updated><title type='text'>32 bit Flash on 64 bit Linux</title><content type='html'>I am running some 64 bit version of CentOS and was quite happy for a while with the 64 bit alpha Flash plugin Adobe made available in their labs for some time. Hulu changed from working to non-working, etc. but other sites like ComedyCentral were happy.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, last week &lt;a href="http://linux.slashdot.org/story/10/06/11/1338207/Adobe-Temporarily-Kills-64-Bit-Flash-For-Linux"&gt;Adobe pulled the 64 bit version of Flash&lt;/a&gt; and so I decided in order to get a better Flash experience to install the 32 bit Flash.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I spent about two days on and off playing with the various settings of nspluginwrapper which gave me Flash without sound, Flash which crashed, Flash... but it never worked right. This morning I decided to just remove the 64 bit Firefox and install the 32 bit one instead, added Flash and everything worked as expected.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are some tricks so just follow those steps:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Add adobe repository to yum (see &lt;a href="http://www.if-not-true-then-false.com/2010/install-adobe-flash-player-10-on-fedora-centos-red-hat-rhel/"&gt;here&lt;/a&gt; - step 2) &lt;/li&gt;&lt;li&gt;Add the 32 bit repo to yum (see &lt;a href="http://www.if-not-true-then-false.com/2010/install-adobe-flash-player-10-on-fedora-centos-red-hat-rhel/"&gt;here&lt;/a&gt; - step 4 b)&lt;/li&gt;&lt;li&gt;Remove firefox - &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;yum remove firefox&lt;/span&gt; &lt;/li&gt;&lt;li&gt;and remove flash, nsplugin if installed previously&lt;/li&gt;&lt;li&gt;Add i386 versions of everything: &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;yum install firefox.i386 flash-plugin.i386&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#110000;"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(17, 0, 0); line-height: 15px; white-space: pre; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;alsa-utils.i386&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="color:#110000;"&gt;&lt;span class="Apple-style-span"  style="line-height: 15px; white-space: pre; font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;Try it out &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="color:#110000;"&gt;&lt;span class="Apple-style-span"  style="line-height: 15px; white-space: pre; font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;If it doesn't work follow the tip &lt;a href="http://www.bhcblog.com/2009/05/04/solution-skype-error-while-loading-shared-libraries-libasoundso2-wrong-elf-class-elfclass64/"&gt;here&lt;/a&gt; and remove and install alsa libs again.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:arial;color:#110000;"&gt;&lt;span class="Apple-style-span"  style="line-height: 15px; white-space: pre; font-size:medium;"&gt;Hope that makes your flash work...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-6457290602494355072?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/6457290602494355072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=6457290602494355072' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/6457290602494355072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/6457290602494355072'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2010/06/32-bit-flash-on-64-bit-linux.html' title='32 bit Flash on 64 bit Linux'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-1329733974705173996</id><published>2010-04-14T14:37:00.000-07:00</published><updated>2010-04-14T14:39:47.875-07:00</updated><title type='text'>Talk at SDJUG, 4/20 7 pm</title><content type='html'>I will be giving a talk at the local Java User Group about The Server Side Java Conference in Vegas I attended a couple of weeks back. Please check at &lt;a href="http://sdjug.org/"&gt;http://sdjug.org/&lt;/a&gt; for more information.&lt;br /&gt;&lt;br /&gt;I will be talking on:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;HTML 5 and the Semantic Web&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-weight: bold;"&gt;&lt;li&gt;The future of web frameworks&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;Java EE 6.0&lt;/li&gt;&lt;li&gt;JSF 2.0&lt;/li&gt;&lt;li&gt;Java FX&lt;/li&gt;&lt;li&gt;Spring 3.0&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;ul&gt;&lt;li&gt;&lt;b&gt;The Cloud&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;The Cloud Continuum&lt;/li&gt;&lt;li&gt;Elastic Data on the Cloud&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-1329733974705173996?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/1329733974705173996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=1329733974705173996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/1329733974705173996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/1329733974705173996'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2010/04/talk-at-sdjug-420-7-pm.html' title='Talk at SDJUG, 4/20 7 pm'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-7324491664479966494</id><published>2010-03-29T14:35:00.001-07:00</published><updated>2010-03-30T16:49:45.389-07:00</updated><title type='text'>This blog has moved</title><content type='html'>&lt;br /&gt;       This blog is now located at http://gman.eichberger.de/.&lt;br /&gt;       You will be automatically redirected in 30 seconds, or you may click &lt;a href='http://gman.eichberger.de/'&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;       For feed subscribers, please update your feed subscriptions to&lt;br /&gt;       http://gman.eichberger.de/feeds/posts/default.&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-7324491664479966494?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://gman.eichberger.de/' title='This blog has moved'/><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/7324491664479966494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=7324491664479966494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/7324491664479966494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/7324491664479966494'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2010/03/this-blog-has-moved.html' title='This blog has moved'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-8362947447034585329</id><published>2010-02-25T10:35:00.000-08:00</published><updated>2010-02-25T10:42:36.267-08:00</updated><title type='text'>NIO proxy for manipulating traffic</title><content type='html'>I wrote some little proxy for manipulating the traffic between a web service client and server - though it can be used for other traffic as well. I used those two fantastic sites to brush up on NIO: &lt;a href="http://www.exampledepot.com/egs/java.nio/NbClientSocket.html"&gt;Example Depot&lt;/a&gt; and &lt;a href="http://www.ibm.com/developerworks/java/library/j-javaio/"&gt;IBM developerWorks&lt;/a&gt;. Here's the code I came up with:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.net.InetSocketAddress;&lt;br /&gt;import java.nio.channels.SelectionKey;&lt;br /&gt;import java.nio.channels.Selector;&lt;br /&gt;import java.nio.channels.ServerSocketChannel;&lt;br /&gt;import java.nio.channels.SocketChannel;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;&lt;br /&gt;public class NIOTunnel {&lt;br /&gt;    int port = 8080;&lt;br /&gt;    String hostName = "localhost";&lt;br /&gt;    int hostPort = 8089;&lt;br /&gt;    private ServerSocketChannel ssServerChannel;&lt;br /&gt;    private Selector selector;&lt;br /&gt;&lt;br /&gt;    protected SocketChannel createClientSocket() throws IOException {&lt;br /&gt;        SocketChannel sChannel = SocketChannel.open();&lt;br /&gt;        sChannel.configureBlocking(false); // Send a connection request to the&lt;br /&gt;        // server; this method is&lt;br /&gt;        // non-blocking&lt;br /&gt;        sChannel.connect(new InetSocketAddress(hostName, hostPort));&lt;br /&gt;&lt;br /&gt;        return sChannel;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected void createServerChannel() throws IOException {&lt;br /&gt;        ssServerChannel = ServerSocketChannel.open();&lt;br /&gt;        ssServerChannel.configureBlocking(false);&lt;br /&gt;        ssServerChannel.socket().bind(new InetSocketAddress(port));&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected void setUpAndWait() throws IOException {&lt;br /&gt;        selector = Selector.open();&lt;br /&gt;        // Register both channels with selector&lt;br /&gt;        createServerChannel();&lt;br /&gt;        ssServerChannel.register(selector, SelectionKey.OP_ACCEPT);&lt;br /&gt;&lt;br /&gt;        while (true) { // Wait for an event&lt;br /&gt;            selector.select(); // Get list of selection keys with pending events&lt;br /&gt;            Iterator&lt;selectionkey&gt; it = selector.selectedKeys().iterator(); // Process&lt;br /&gt;                                                                            // each&lt;br /&gt;                                                                            // key&lt;br /&gt;            while (it.hasNext()) { // Get the selection key&lt;br /&gt;                SelectionKey key = (SelectionKey) it.next(); // Remove it from&lt;br /&gt;                                                             // the list to&lt;br /&gt;                                                             // indicate that it&lt;br /&gt;                                                             // is being&lt;br /&gt;                                                             // processed&lt;br /&gt;                it.remove(); // Check if it's a connection request&lt;br /&gt;                SocketChannel socket;&lt;br /&gt;                if (key.isAcceptable()) {&lt;br /&gt;                    System.out.println("Acceptable Key");&lt;br /&gt;                    ServerSocketChannel ssc = (ServerSocketChannel) key.channel();&lt;br /&gt;                    socket = (SocketChannel) ssc.accept();&lt;br /&gt;                    socket.configureBlocking(false);&lt;br /&gt;                    ConnectionHandler h = new ConnectionHandler(socket, createClientSocket());&lt;br /&gt;                    h.run();&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) throws IOException {&lt;br /&gt;        NIOTunnel tunnel = new NIOTunnel();&lt;br /&gt;        tunnel.setUpAndWait();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class ConnectionHandler extends Thread {&lt;br /&gt;    private SocketChannel serverChannel;&lt;br /&gt;    private SocketChannel clientChannel;&lt;br /&gt;    private Selector selector;&lt;br /&gt;    private ModifyTraffic modifyTraffic;&lt;br /&gt;   &lt;br /&gt;    public ConnectionHandler(SocketChannel serverChannel, SocketChannel clientChannel) {&lt;br /&gt;        this.serverChannel = serverChannel;&lt;br /&gt;        this.clientChannel = clientChannel;&lt;br /&gt;        this.modifyTraffic = new ModifyTraffic();&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    public void run() {&lt;br /&gt;        try {&lt;br /&gt;            selector = Selector.open();&lt;br /&gt;            while (!clientChannel.finishConnect()) { &lt;br /&gt;                //wait&lt;br /&gt;            }&lt;br /&gt;            SelectionKey client = clientChannel.register(selector,SelectionKey.OP_READ|SelectionKey.OP_WRITE);&lt;br /&gt;            SelectionKey server = serverChannel.register(selector,SelectionKey.OP_READ|SelectionKey.OP_WRITE);&lt;br /&gt;           &lt;br /&gt;            client.attach(new WriteStorage(false));&lt;br /&gt;            server.attach(new WriteStorage(true));&lt;br /&gt;           &lt;br /&gt;            while (client.isValid() &amp;amp;&amp;amp; server.isValid() )&lt;br /&gt;            {  &lt;br /&gt;                selector.select();&lt;br /&gt;                Set&lt;selectionkey&gt; readyKeys = selector.selectedKeys();&lt;br /&gt;                Iterator&lt;selectionkey&gt; it = readyKeys.iterator();&lt;br /&gt;&lt;br /&gt;                while (it.hasNext()) {&lt;br /&gt;                    SelectionKey key = (SelectionKey)it.next();&lt;br /&gt;                    it.remove();&lt;br /&gt;                   &lt;br /&gt;                    if (key.isValid() &amp;amp;&amp;amp; key.isReadable()) {&lt;br /&gt;                        String ret = readMessage(key);&lt;br /&gt;                        WriteStorage ws = (WriteStorage) key.attachment();&lt;br /&gt;                        if (ws.isServer()) {&lt;br /&gt;                            ((WriteStorage)client.attachment()).append(modifyTraffic.server(ret));&lt;br /&gt;                        } else {&lt;br /&gt;                            ((WriteStorage)server.attachment()).append(modifyTraffic.client(ret));&lt;br /&gt;                        }&lt;br /&gt;                        continue;&lt;br /&gt;                    }&lt;br /&gt;                   &lt;br /&gt;                    if (key.isValid() &amp;amp;&amp;amp; key.isWritable()) {&lt;br /&gt;                       writeMessage(key, (WriteStorage)key.attachment());&lt;br /&gt;                    }&lt;br /&gt;                   &lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;           &lt;br /&gt;        } catch (IOException e) {&lt;br /&gt;            // TODO Auto-generated catch block&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;            return;&lt;br /&gt;        } finally {&lt;br /&gt;            try {&lt;br /&gt;                selector.close();&lt;br /&gt;                clientChannel.close();&lt;br /&gt;                serverChannel.close();&lt;br /&gt;            } catch (IOException e) {&lt;br /&gt;                // TODO Auto-generated catch block&lt;br /&gt;                e.printStackTrace();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    public void writeMessage(SelectionKey key, WriteStorage writeStorage) throws IOException&lt;br /&gt;    {&lt;br /&gt;        SocketChannel socket = (SocketChannel)key.channel();&lt;br /&gt;        ByteBuffer buffer = ByteBuffer.wrap(writeStorage.getString().getBytes());&lt;br /&gt;        int nBytes = socket.write(buffer);&lt;br /&gt;        writeStorage.clear();&lt;br /&gt;    }&lt;br /&gt;       &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;    public String readMessage(SelectionKey key) throws IOException&lt;br /&gt;    {&lt;br /&gt;        int nBytes = 0;&lt;br /&gt;        SocketChannel socket = (SocketChannel)key.channel();&lt;br /&gt;        ByteBuffer buf = ByteBuffer.allocate(1024);&lt;br /&gt;            nBytes = socket.read(buf);&lt;br /&gt;            if (nBytes == -1) {&lt;br /&gt;                return null;&lt;br /&gt;            }&lt;br /&gt;            buf.flip();&lt;br /&gt;            Charset charset = Charset.forName("us-ascii");&lt;br /&gt;            CharsetDecoder decoder = charset.newDecoder();&lt;br /&gt;            CharBuffer charBuffer = decoder.decode(buf);&lt;br /&gt;            String result = charBuffer.toString();&lt;br /&gt;            System.out.println(result);&lt;br /&gt;            return result;&lt;br /&gt;&lt;br /&gt;    } &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class WriteStorage {&lt;br /&gt;    private StringBuffer toWrite;&lt;br /&gt;    private boolean server;&lt;br /&gt;&lt;br /&gt;    public WriteStorage(boolean server) {&lt;br /&gt;        this.setServer(server);&lt;br /&gt;        clear();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public boolean isServer() {&lt;br /&gt;        return server;&lt;br /&gt;    }&lt;br /&gt;    public void setServer(boolean server) {&lt;br /&gt;        this.server = server;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public void clear() {&lt;br /&gt;        toWrite = new StringBuffer();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public void append(String s) {&lt;br /&gt;        toWrite.append(s);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public String getString() {&lt;br /&gt;        return toWrite.toString();&lt;br /&gt;    }   &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-8362947447034585329?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/8362947447034585329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=8362947447034585329' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/8362947447034585329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/8362947447034585329'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2010/02/nio-proxy-for-manipulating-traffic.html' title='NIO proxy for manipulating traffic'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-4290464311036094223</id><published>2010-01-20T13:43:00.000-08:00</published><updated>2010-01-20T14:23:48.568-08:00</updated><title type='text'>WBem, Wiseman, Windows, Java and Negotiate authentication</title><content type='html'>I was playing around with &lt;a href="http://en.wikipedia.org/wiki/Web-Based_Enterprise_Management"&gt;WBem &lt;/a&gt;and tried to access the Windows Remote stuff on my Vista laptop. To be special Mocrosoft is calling their WBem implementation &lt;a href="http://msdn.microsoft.com/en-us/library/aa384426%28VS.85%29.aspx"&gt;Windows Remote&lt;/a&gt; (WinRM). Because it's complicate &lt;a href="http://blogs.technet.com/jonjor/archive/2009/01/09/winrm-windows-remote-management-troubleshooting.aspx"&gt;here &lt;/a&gt;is some good blog entry on how to make WinRM work for you.&lt;br /&gt;&lt;br /&gt;Back to &lt;a href="https://wiseman.dev.java.net/"&gt;Wiseman&lt;/a&gt;: Denis Rachal has posted some code to start/stop a service using Wiseman and WinRM to the Wiseman's user's mailing list on 6/18/2009. The problem with Wiseman is that you need to set up your WinRM to use &lt;span style="font-style: italic;"&gt;unencrypted communication and basic authentication&lt;/span&gt;. Because the encryption is relatively new  and "invented" by MS called "HTTP-SPNEGO-session-encrypted" the &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=3&amp;amp;ved=0CA8QFjAC&amp;amp;url=http%3A%2F%2Fdownload.microsoft.com%2Fdownload%2Fa%2Fe%2F6%2Fae6e4142-aa58-45c6-8dcf-a657e5900cd3%2F%255BMS-WSMV%255D.pdf&amp;amp;ei=JstQS8-ENceztgfxzI2xBA&amp;amp;usg=AFQjCNHx5HqxXXhgVjfi4LMzPQDEECM3Bg&amp;amp;sig2=rNmiMRyogC-40SrFACn0jg"&gt;RFC &lt;/a&gt;(Google cache -- as you might expect from MS:-) is kind-a cryptic...&lt;br /&gt;&lt;br /&gt;But we can do something about the authentication and use Negotiate by using the &lt;a href="http://spnego.sourceforge.net/api/net/sourceforge/spnego/SpnegoHttpURLConnection.html"&gt;SpnegoHttpUrlConnection&lt;/a&gt;  implementation from the &lt;a href="http://spnego.sourceforge.net/"&gt;SPNEGO project&lt;/a&gt;. Make sure to read through all their pre-flight documentation to set up kerberos and so on (keyword: krb5.conf, login.conf) The account you use needs to be at least a local administrator and it is helpful to prefix the domain for the user name (MY_DOMAIN\MY-USERNAME) Once this works you can rework Denis' example and have it support the Negotiate protocol as I did:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&lt;br /&gt;/**&lt;br /&gt;* Copyright (C) 2006-2009 Hewlett-Packard Development Company, L.P.&lt;br /&gt;*&lt;br /&gt;* Licensed under the Apache License, Version 2.0 (the "License");&lt;br /&gt;* you may not use this file except in compliance with the License.&lt;br /&gt;* You may obtain a copy of the License at&lt;br /&gt;*&lt;br /&gt;*  http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;*&lt;br /&gt;* Unless required by applicable law or agreed to in writing, software&lt;br /&gt;* distributed under the License is distributed on an "AS IS" BASIS,&lt;br /&gt;* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;* See the License for the specific language governing permissions and&lt;br /&gt;* limitations under the License.&lt;br /&gt;*&lt;br /&gt;* Authors: Denis Rachal (denis.rachal@hp.com)&lt;br /&gt;*/&lt;br /&gt;package com.hp.wsman.client.transport;&lt;br /&gt;&lt;br /&gt;import java.io.ByteArrayOutputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.InputStream;&lt;br /&gt;import java.io.OutputStream;&lt;br /&gt;import java.net.Authenticator;&lt;br /&gt;import java.net.HttpURLConnection;&lt;br /&gt;import java.net.PasswordAuthentication;&lt;br /&gt;import java.net.URL;&lt;br /&gt;import java.net.URLConnection;&lt;br /&gt;import java.security.KeyManagementException;&lt;br /&gt;import java.security.NoSuchAlgorithmException;&lt;br /&gt;import java.security.PrivilegedActionException;&lt;br /&gt;import java.security.SecureRandom;&lt;br /&gt;import java.util.Map.Entry;&lt;br /&gt;import java.util.logging.Level;&lt;br /&gt;import java.util.logging.Logger;&lt;br /&gt;&lt;br /&gt;import javax.net.ssl.HostnameVerifier;&lt;br /&gt;import javax.net.ssl.HttpsURLConnection;&lt;br /&gt;import javax.net.ssl.SSLContext;&lt;br /&gt;import javax.net.ssl.TrustManager;&lt;br /&gt;import javax.net.ssl.X509TrustManager;&lt;br /&gt;import javax.security.auth.login.LoginException;&lt;br /&gt;import javax.xml.bind.JAXBException;&lt;br /&gt;import javax.xml.soap.SOAPException;&lt;br /&gt;import javax.xml.soap.SOAPMessage;&lt;br /&gt;&lt;br /&gt;import org.ietf.jgss.GSSException;&lt;br /&gt;&lt;br /&gt;import net.sourceforge.spnego.SpnegoHttpURLConnection;&lt;br /&gt;&lt;br /&gt;import sun.misc.BASE64Encoder;&lt;br /&gt;&lt;br /&gt;import com.sun.ws.management.Message;&lt;br /&gt;import com.sun.ws.management.addressing.Addressing;&lt;br /&gt;import com.sun.ws.management.transport.ContentType;&lt;br /&gt;&lt;br /&gt;public final class HttpClient {&lt;br /&gt;&lt;br /&gt;private static final Logger LOG = Logger.getLogger(HttpClient.class&lt;br /&gt;  .getName());&lt;br /&gt;private static PasswordAuthentication auth;&lt;br /&gt;&lt;br /&gt;private HttpClient() {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static {&lt;br /&gt;    System.setProperty("java.security.krb5.conf", "C:\\Users\\eichbege\\wiseman-client\\client\\src\\krb5.conf");&lt;br /&gt;    System.setProperty("sun.security.krb5.debug", "false");&lt;br /&gt;    System.setProperty("java.security.auth.login.config", "C:\\Users\\eichbege\\wiseman-client\\client\\src\\login.conf");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static class MyAuthenticator extends Authenticator {&lt;br /&gt;      public PasswordAuthentication getPasswordAuthentication() {&lt;br /&gt;          // I haven't checked getRequestingScheme() here, since for NTLM&lt;br /&gt;          // and Negotiate, the usrname and password are all the same.&lt;br /&gt;          System.err.println("Feeding username and password for " + getRequestingScheme());&lt;br /&gt;          return auth;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public static void setPasswordAuthentication(&lt;br /&gt;  final PasswordAuthentication pauth) {&lt;br /&gt; auth = pauth;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public static void setTrustManager(final X509TrustManager trustManager)&lt;br /&gt;  throws NoSuchAlgorithmException, KeyManagementException {&lt;br /&gt;&lt;br /&gt; final TrustManager[] tm = { trustManager };&lt;br /&gt; final SSLContext sslContext = SSLContext.getInstance("SSL");&lt;br /&gt; sslContext.init(null, tm, new SecureRandom());&lt;br /&gt; HttpsURLConnection.setDefaultSSLSocketFactory(sslContext&lt;br /&gt;   .getSocketFactory());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void setHostnameVerifier(final HostnameVerifier hv) {&lt;br /&gt; HttpsURLConnection.setDefaultHostnameVerifier(hv);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static HttpURLConnection initConnection(final String to,&lt;br /&gt;  final ContentType ct, Object msg) throws IOException {&lt;br /&gt; if (to == null) {&lt;br /&gt;  throw new IllegalArgumentException("Required Element is missing: "&lt;br /&gt;    + Addressing.TO);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; if (auth != null) {&lt;br /&gt;          //Authenticator.setDefault(new MyAuthenticator());&lt;br /&gt;        &lt;br /&gt;//          String encodedUserPassword = new BASE64Encoder().encode((auth&lt;br /&gt;//                  .getUserName()&lt;br /&gt;//                  + ":" + new String(auth.getPassword())).getBytes());&lt;br /&gt;//          conn.setRequestProperty("Authorization", "Basic "&lt;br /&gt;//                  + encodedUserPassword);&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt; final URL dest = new URL(to);&lt;br /&gt; URLConnection conn = null;&lt;br /&gt; SpnegoHttpURLConnection spnego = null;&lt;br /&gt; try {&lt;br /&gt;     spnego = new SpnegoHttpURLConnection("custom-client", auth.getUserName(), auth.getPassword().toString());&lt;br /&gt;     spnego.setRequestMethod("POST");&lt;br /&gt;     spnego.setRequestProperty("Content-Type",&lt;br /&gt;                ct == null ? ContentType.DEFAULT_CONTENT_TYPE.toString() : ct&lt;br /&gt;                        .toString());&lt;br /&gt;        spnego.setRequestProperty("User-Agent", "https://wiseman.dev.java.net");&lt;br /&gt;        spnego.setRequestProperty("Accept", ContentType.ACCEPTABLE_CONTENT_TYPES);&lt;br /&gt;        conn = spnego.connect(dest, transfer(msg));&lt;br /&gt;      } catch (GSSException e) {&lt;br /&gt;          // TODO Auto-generated catch block&lt;br /&gt;          e.printStackTrace();&lt;br /&gt;      } catch (PrivilegedActionException e) {&lt;br /&gt;          // TODO Auto-generated catch block&lt;br /&gt;          e.printStackTrace();&lt;br /&gt;      } catch (LoginException e) {&lt;br /&gt;          // TODO Auto-generated catch block&lt;br /&gt;          e.printStackTrace();&lt;br /&gt;      } catch (SOAPException e) {&lt;br /&gt;          // TODO Auto-generated catch block&lt;br /&gt;          e.printStackTrace();&lt;br /&gt;      } catch (JAXBException e) {&lt;br /&gt;          // TODO Auto-generated catch block&lt;br /&gt;          e.printStackTrace();&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;  //Authenticator.setDefault(new MyAuthenticator());&lt;br /&gt;  //conn = dest.openConnection();&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; final HttpURLConnection http = (HttpURLConnection) conn;&lt;br /&gt; //http.setRequestMethod("POST");&lt;br /&gt;&lt;br /&gt; return http;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// type of data can be Message or byte[], others will throw&lt;br /&gt;// IllegalArgumentException&lt;br /&gt;private static ByteArrayOutputStream transfer(final Object data)&lt;br /&gt;  throws IOException, SOAPException, JAXBException {&lt;br /&gt;    ByteArrayOutputStream os = null;&lt;br /&gt; try {&lt;br /&gt;  os = new ByteArrayOutputStream();&lt;br /&gt;  if (data instanceof Message) {&lt;br /&gt;   ((Message) data).writeTo(os);&lt;br /&gt;  } else if (data instanceof SOAPMessage) {&lt;br /&gt;   ((SOAPMessage) data).writeTo(os);&lt;br /&gt;  } else if (data instanceof byte[]) {&lt;br /&gt;   os.write((byte[]) data);&lt;br /&gt;  } else {&lt;br /&gt;   throw new IllegalArgumentException("Type of data not handled: "&lt;br /&gt;     + data.getClass().getName());&lt;br /&gt;  }&lt;br /&gt;  return os;&lt;br /&gt; } finally {&lt;br /&gt;  if (os != null) {&lt;br /&gt;   os.close();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static Addressing sendRequest(final SOAPMessage msg,&lt;br /&gt;  final String destination) throws IOException, SOAPException,&lt;br /&gt;  JAXBException {&lt;br /&gt;&lt;br /&gt; if (LOG.isLoggable(Level.FINE))&lt;br /&gt;  LOG.fine("&lt;request&gt;\n" + msg + "&lt;/request&gt;\n");&lt;br /&gt; final HttpURLConnection http = initRequest(destination, ContentType&lt;br /&gt;   .createFromEncoding((String) msg&lt;br /&gt;     .getProperty(SOAPMessage.CHARACTER_SET_ENCODING)), msg);&lt;br /&gt; //transfer(http, msg);&lt;br /&gt; final Addressing response = readResponse(http);&lt;br /&gt; if (LOG.isLoggable(Level.FINE)) {&lt;br /&gt;  if (response.getBody().hasFault())&lt;br /&gt;   LOG.fine("&lt;fault&gt;\n" + response + "&lt;/fault&gt;\n");&lt;br /&gt;  else&lt;br /&gt;   LOG.fine("&lt;response&gt;\n" + response + "&lt;/response&gt;\n");&lt;br /&gt; }&lt;br /&gt; return response;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static Addressing sendRequest(final SOAPMessage msg,&lt;br /&gt;  final String destination, Entry&lt;string, string=""&gt;... headers)&lt;br /&gt;  throws IOException, SOAPException, JAXBException {&lt;br /&gt;&lt;br /&gt; if (LOG.isLoggable(Level.FINE))&lt;br /&gt;  LOG.fine("&lt;request&gt;\n" + msg + "&lt;/request&gt;\n");&lt;br /&gt; final HttpURLConnection http = initRequest(destination, ContentType&lt;br /&gt;   .createFromEncoding((String) msg&lt;br /&gt;     .getProperty(SOAPMessage.CHARACTER_SET_ENCODING)), msg);&lt;br /&gt;//  if (headers != null) {&lt;br /&gt;//   for (Entry&lt;string, string=""&gt; entry : headers) {&lt;br /&gt;//    http.setRequestProperty(entry.getKey(), entry.getValue());&lt;br /&gt;//   }&lt;br /&gt;//  }&lt;br /&gt;//&lt;br /&gt;//  transfer(http, msg);&lt;br /&gt; final Addressing response = readResponse(http);&lt;br /&gt; if (LOG.isLoggable(Level.FINE)) {&lt;br /&gt;  if (response.getBody().hasFault())&lt;br /&gt;   LOG.fine("&lt;fault&gt;\n" + response + "&lt;/fault&gt;\n");&lt;br /&gt;  else&lt;br /&gt;   LOG.fine("&lt;response&gt;\n" + response + "&lt;/response&gt;\n");&lt;br /&gt; }&lt;br /&gt; return response;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static Addressing sendRequest(final Addressing msg,&lt;br /&gt;  final Entry&lt;string, string=""&gt;... headers) throws IOException,&lt;br /&gt;  JAXBException, SOAPException {&lt;br /&gt;&lt;br /&gt; if (LOG.isLoggable(Level.FINE))&lt;br /&gt;  LOG.fine("&lt;request&gt;\n" + msg + "&lt;/request&gt;\n");&lt;br /&gt; final HttpURLConnection http = initRequest(msg.getTo(), msg&lt;br /&gt;   .getContentType(), msg);&lt;br /&gt;&lt;br /&gt;//  if (headers != null) {&lt;br /&gt;//   for (Entry&lt;string, string=""&gt; entry : headers) {&lt;br /&gt;//    http.setRequestProperty(entry.getKey(), entry.getValue());&lt;br /&gt;//   }&lt;br /&gt;//  }&lt;br /&gt;&lt;br /&gt; //transfer(http, msg);&lt;br /&gt; final Addressing response = readResponse(http);&lt;br /&gt; if (LOG.isLoggable(Level.FINE)) {&lt;br /&gt;  if (response.getBody().hasFault())&lt;br /&gt;   LOG.fine("&lt;fault&gt;\n" + response + "&lt;/fault&gt;\n");&lt;br /&gt;  else&lt;br /&gt;   LOG.fine("&lt;response&gt;\n" + response + "&lt;/response&gt;\n");&lt;br /&gt; }&lt;br /&gt; response.setXmlBinding(msg.getXmlBinding());&lt;br /&gt; return response;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static HttpURLConnection createHttpConnection(String destination,&lt;br /&gt;  Object data) throws SOAPException, JAXBException, IOException {&lt;br /&gt; final HttpURLConnection http = initRequest(destination, null, null);&lt;br /&gt;&lt;br /&gt; return http;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static HttpURLConnection initRequest(final String destination,&lt;br /&gt;  final ContentType contentType, Object msg) throws IOException {&lt;br /&gt;&lt;br /&gt; final HttpURLConnection http = initConnection(destination, contentType, msg);&lt;br /&gt; return http;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static Addressing readResponse(final HttpURLConnection http)&lt;br /&gt;  throws IOException, SOAPException {&lt;br /&gt;&lt;br /&gt; final InputStream is;&lt;br /&gt; final int response = http.getResponseCode();&lt;br /&gt; if (response == HttpURLConnection.HTTP_OK) {&lt;br /&gt;  is = http.getInputStream();&lt;br /&gt; } else if (response == HttpURLConnection.HTTP_BAD_REQUEST&lt;br /&gt;   || response == HttpURLConnection.HTTP_INTERNAL_ERROR) {&lt;br /&gt;  // read the fault from the error stream&lt;br /&gt;  is = http.getErrorStream();&lt;br /&gt; } else {&lt;br /&gt;  final String detail = http.getResponseMessage();&lt;br /&gt;  throw new IOException(detail == null ? Integer.toString(response)&lt;br /&gt;    : detail);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; final String responseType = http.getContentType();&lt;br /&gt; final ContentType contentType = ContentType&lt;br /&gt;   .createFromHttpContentType(responseType);&lt;br /&gt; if (contentType == null || !contentType.isAcceptable()) {&lt;br /&gt;  // dump the first 4k bytes of the response for help in debugging&lt;br /&gt;  if (LOG.isLoggable(Level.INFO)) {&lt;br /&gt;   final byte[] buffer = new byte[4096];&lt;br /&gt;   final int nread = is.read(buffer);&lt;br /&gt;   if (nread &gt; 0) {&lt;br /&gt;    final ByteArrayOutputStream bos = new ByteArrayOutputStream(&lt;br /&gt;      buffer.length);&lt;br /&gt;    bos.write(buffer, 0, nread);&lt;br /&gt;    LOG.info("Response discarded: "&lt;br /&gt;      + new String(bos.toByteArray()));&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  throw new IOException(&lt;br /&gt;    "Content-Type of response is not acceptable: "&lt;br /&gt;      + responseType);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; final Addressing addr;&lt;br /&gt; try {&lt;br /&gt;  addr = new Addressing(is);&lt;br /&gt; } finally {&lt;br /&gt;  if (is != null) {&lt;br /&gt;   is.close();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; addr.setContentType(contentType);&lt;br /&gt;&lt;br /&gt; return addr;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static int sendResponse(final String to, final byte[] bits,&lt;br /&gt;  final ContentType contentType) throws IOException, SOAPException,&lt;br /&gt;  JAXBException {&lt;br /&gt; final HttpURLConnection http = initConnection(to, contentType, bits);&lt;br /&gt; return http.getResponseCode();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static int sendResponse(final Addressing msg) throws IOException,&lt;br /&gt;  SOAPException, JAXBException {&lt;br /&gt; final HttpURLConnection http = initConnection(msg.getTo(), msg&lt;br /&gt;   .getContentType(), msg);&lt;br /&gt; return http.getResponseCode();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/pre&gt;Supposedly you could achieve the same with the standard HTTP connection from Java 6 (see &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/net/http-auth.html"&gt;tutorial&lt;/a&gt;) but I couldn't get to work. So who knows... anyway the SPNEGO project's solution worked for me with an unencrypted setup on Windows Vista.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-4290464311036094223?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/4290464311036094223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=4290464311036094223' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/4290464311036094223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/4290464311036094223'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2010/01/wbem-wiseman-windows-java-and-negotiate.html' title='WBem, Wiseman, Windows, Java and Negotiate authentication'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-8571980282113821214</id><published>2009-12-07T22:04:00.000-08:00</published><updated>2009-12-07T22:19:02.747-08:00</updated><title type='text'>Spring and REST</title><content type='html'>After loving for more than two years Don Brown's fantastic &lt;a href="http://struts.apache.org/2.x/docs/rest-plugin.html"&gt;REST plugin&lt;/a&gt; for Struts2 I decendent again into Spring's version of REST (see http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/) My simple porting of Don Brown's demo app to Spring failed again (I tried 12 months ago to use some work from &lt;a href="http://www.carbonfive.com/community/archives/2007/06/parameterized_rest_urls_with_spring_mvc.html"&gt;carbon five&lt;/a&gt;) Anyway why, why does it not work I thought I had it figured out:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&lt;br /&gt;package edu.ucsd.extension.springmvchelloworld;&lt;br /&gt;&lt;br /&gt;import java.util.Collection;&lt;br /&gt;&lt;br /&gt;import org.springframework.stereotype.Controller;&lt;br /&gt;import org.springframework.ui.Model;&lt;br /&gt;import org.springframework.web.bind.annotation.PathVariable;&lt;br /&gt;import org.springframework.web.bind.annotation.RequestMapping;&lt;br /&gt;import org.springframework.web.bind.annotation.RequestMethod;&lt;br /&gt;import org.springframework.web.servlet.ModelAndView;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@Controller&lt;br /&gt;public class OrdersController {&lt;br /&gt;    &lt;br /&gt;    private Order model = new Order();&lt;br /&gt;    private Collection&lt;Order&gt; list;&lt;br /&gt;    private OrdersService ordersService = new OrdersService();&lt;br /&gt;&lt;br /&gt;    // GET /orders/1&lt;br /&gt;    @RequestMapping("{orderId}")&lt;br /&gt;    public String show(@PathVariable String id, Model model) {&lt;br /&gt;     System.out.println("Showing order " + id);&lt;br /&gt;  setId(id);&lt;br /&gt;        model.addAttribute("order", getModel());&lt;br /&gt;        return "show";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // GET /orders&lt;br /&gt; @RequestMapping&lt;br /&gt;    public String index(Model model) {&lt;br /&gt;        list = ordersService.getAll();&lt;br /&gt;        model.addAttribute("orders", list);&lt;br /&gt;        return "orders-index";&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    // GET /orders/1/edit&lt;br /&gt; @RequestMapping("/{orderId}/edit")&lt;br /&gt;    public String edit(@PathVariable String id, Model model) {&lt;br /&gt;  this.setId(id);&lt;br /&gt;  model.addAttribute("order", getModel());&lt;br /&gt;        return "orders-edit";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // GET /orders/new&lt;br /&gt; @RequestMapping("/new")&lt;br /&gt;    public String editNew(Model model) {&lt;br /&gt;        model.addAttribute("order", new Order());&lt;br /&gt;        return "orders-editNew";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // GET /orders/1/deleteConfirm&lt;br /&gt; @RequestMapping("/{orderId}/deleteConfirm")&lt;br /&gt;    public String deleteConfirm(@PathVariable String id) {&lt;br /&gt;  this.setId(id);&lt;br /&gt;        return "orders-deleteConfirm";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // DELETE /orders/1&lt;br /&gt; @RequestMapping(value="/{orderId}", method=RequestMethod.DELETE)&lt;br /&gt;    public String destroy(@PathVariable String id) {&lt;br /&gt;        ordersService.remove(id);&lt;br /&gt;        //addActionMessage("Order removed successfully");&lt;br /&gt;        return "orders-index";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // POST /orders&lt;br /&gt; @RequestMapping(method=RequestMethod.POST)&lt;br /&gt;    public ModelAndView create(Order model) {&lt;br /&gt;        ordersService.save(model);&lt;br /&gt;        return new ModelAndView("orders-show", "model", getModel());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // PUT /orders/1&lt;br /&gt; @RequestMapping(value="/{orderId}", method=RequestMethod.PUT)&lt;br /&gt;    public String update(@PathVariable String id, Order model) {&lt;br /&gt;        ordersService.save(model);&lt;br /&gt;        return "order-index";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setId(String id) {&lt;br /&gt;        if (id != null) {&lt;br /&gt;            this.model = ordersService.get(id);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public Object getModel() {&lt;br /&gt;        return (list != null ? list : model);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Well, I guess there is some other trick I am missing.&lt;br /&gt;&lt;br /&gt;BTW: the repository in the POM file needs to look like:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Xml"&gt;&lt;br /&gt; &lt;repository&gt;&lt;br /&gt;  &lt;id&gt;org.springsource.maven.snapshot&lt;/id&gt;&lt;br /&gt;   &lt;name&gt;Springframework milestone&lt;/name&gt;&lt;br /&gt;   &lt;url&gt;http://maven.springframework.org/milestone&lt;/url&gt;&lt;br /&gt; &lt;/repository&gt; &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-8571980282113821214?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/8571980282113821214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=8571980282113821214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/8571980282113821214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/8571980282113821214'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2009/12/spring-and-rest.html' title='Spring and REST'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-5003601268240869717</id><published>2009-11-15T18:56:00.000-08:00</published><updated>2009-11-15T19:10:38.778-08:00</updated><title type='text'>The Passionate Programmer</title><content type='html'>&lt;a href="http://www.amazon.com/gp/product/1934356344?ie=UTF8&amp;amp;tag=ennovatcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1934356344"&gt;&lt;img border="0" src="https://images-na.ssl-images-amazon.com/images/I/41fyjTVARFL._SL160_.jpg" /&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=ennovatcom-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1934356344" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;&lt;br /&gt;I have been reading the &lt;a href="http://www.amazon.com/gp/product/1934356344?ie=UTF8&amp;amp;tag=ennovatcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1934356344"&gt;The Passionate Programmer: Creating a Remarkable Career in Software Development (Pragmatic Life)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=ennovatcom-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1934356344" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; and I think it is an absolute must read. I stumbled upon it on Matt's blog (see &lt;a href="http://raibledesigns.com/rd/entry/the_passionate_programmer_by_chad"&gt;http://raibledesigns.com/rd/entry/the_passionate_programmer_by_chad&lt;/a&gt;) and I immediately liked the book. Chad is doing an incredible job explaining how to stay relevant and increase your career in "computers". The most impressive pieces are when he explains how to function in a corporate environment. "Make your manager happy he controls your pay" I can't say often enough how important that is. He also prefers a role maintaining software over some new project because oddly enough it gives you more freedom. His comparisons with the music scene are refreshing however probably not for everyone...&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway for $15 it's a must read :-)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-5003601268240869717?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/5003601268240869717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=5003601268240869717' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/5003601268240869717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/5003601268240869717'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2009/11/passionate-programmer.html' title='The Passionate Programmer'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-8000252263166033687</id><published>2009-08-28T20:08:00.000-07:00</published><updated>2009-08-28T20:11:33.413-07:00</updated><title type='text'>Springing in Action</title><content type='html'>I have been asked to develop an online class for UCSD Extension covering Spring -- I am really excited and I will try to get it going soon --&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On another note I started a new job with HP Software working among other things with JSF -- soon I can say I have seen all the web frameworks in the world :-) &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-8000252263166033687?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/8000252263166033687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=8000252263166033687' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/8000252263166033687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/8000252263166033687'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2009/08/springing-in-action.html' title='Springing in Action'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-5792927833633568540</id><published>2009-06-26T10:23:00.001-07:00</published><updated>2009-06-26T10:24:04.388-07:00</updated><title type='text'>SDCodeCamp</title><content type='html'>Saturday, 6/27 I will be talking on Scala and Spring -- check out their home page (&lt;a href="http://www.socalcodecamp.com/"&gt;http://www.socalcodecamp.com/&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-5792927833633568540?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/5792927833633568540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=5792927833633568540' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/5792927833633568540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/5792927833633568540'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2009/06/sdcodecamp.html' title='SDCodeCamp'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-481432636694751209</id><published>2009-05-25T20:53:00.000-07:00</published><updated>2009-05-25T20:56:51.635-07:00</updated><title type='text'>IntelliJ always errors when loading Scala facet</title><content type='html'>The last couple of weeks every time I opened my project with IntelliJ I would get an error with the Scala plugin and the system would become unusable while indexing all the time.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I considered switching from my usual stack Struts 2/Spring/Hibernate to Lift/JPA and Eclipse but after I invalidated the cache (File -&gt; Invalidate Caches) it seems to work again.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-481432636694751209?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/481432636694751209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=481432636694751209' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/481432636694751209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/481432636694751209'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2009/05/intellij-always-errors-when-loading.html' title='IntelliJ always errors when loading Scala facet'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-3920212391934311493</id><published>2009-03-27T20:23:00.000-07:00</published><updated>2009-05-25T21:00:47.788-07:00</updated><title type='text'>Simple cron like scheduler in Scala</title><content type='html'>Today in my Scala explorations I ran into the problem that I wanted some scheduler like Quarz or java.util.Timer -- that should be easy in scala I thought an came up with the following:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="textmate-source"&gt;&lt;span class="source source_scala"&gt;&lt;span class="keyword keyword_control keyword_control_untitled keyword_control_untitled_scala"&gt;private&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_untitled keyword_control_untitled_scala"&gt;val&lt;/span&gt; timedActor = actor {&lt;br /&gt;    &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_scala"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_scala"&gt;//&lt;/span&gt;once a day&lt;br /&gt;&lt;/span&gt;      &lt;span class="keyword keyword_control keyword_control_untitled keyword_control_untitled_scala"&gt;while&lt;/span&gt; (&lt;span class="keyword keyword_control keyword_control_untitled keyword_control_untitled_scala"&gt;true&lt;/span&gt;) {&lt;br /&gt;      performTask&lt;br /&gt;      &lt;span class="keyword keyword_control keyword_control_untitled keyword_control_untitled_scala"&gt;val&lt;/span&gt; c = Calendar.getInstance&lt;br /&gt;      c.set(Calendar.HOUR_OF_DAY, &lt;span class="constant constant_numeric constant_numeric_scala"&gt;0&lt;/span&gt;) &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_scala"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_scala"&gt;//&lt;/span&gt;midnight&lt;br /&gt;&lt;/span&gt;        c.set(Calendar.MINUTE,&lt;span class="constant constant_numeric constant_numeric_scala"&gt;0&lt;/span&gt;)&lt;br /&gt;      c.add(Calendar.DAY_OF_YEAR, &lt;span class="constant constant_numeric constant_numeric_scala"&gt;1&lt;/span&gt;) &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_scala"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_scala"&gt;//&lt;/span&gt;next day&lt;br /&gt;&lt;/span&gt;        &lt;span class="keyword keyword_control keyword_control_untitled keyword_control_untitled_scala"&gt;val&lt;/span&gt; sleepAmount = c.getTimeInMillis - Calendar.getInstance.getTimeInMillis&lt;br /&gt;      Thread.sleep(sleepAmount)&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pretty &lt;s&gt;slick&lt;/s&gt; heavy weight (check the comment for a better implementation) -- they should include that in one of their libraries...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-3920212391934311493?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/3920212391934311493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=3920212391934311493' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/3920212391934311493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/3920212391934311493'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2009/03/simple-cron-like-scheduler-in-scala.html' title='Simple cron like scheduler in Scala'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-5899311530803797245</id><published>2009-03-19T05:40:00.000-07:00</published><updated>2009-03-27T20:45:36.697-07:00</updated><title type='text'>HTML Screen Scraping</title><content type='html'>For some little side project I found myself screen scraping some HTML sites for information. My first idea was to access the pages with the URL class and then use &lt;a href="http://home.ccil.org/~cowan/XML/tagsoup/"&gt;TagSoup&lt;/a&gt; for parsing (see &lt;a href="http://groovysnippets.blogspot.com/2008/11/groovy-screen-scraping-example.html"&gt;this Blog Entry&lt;/a&gt; for an example). This in fact worked quite well and &lt;a href="http://www.ibm.com/developerworks/library/x-scalaxml/"&gt;using XPath from Scala&lt;/a&gt; was a blast. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nevertheless the scraping sometimes didn't work because for some weird reason the site I was scraping demanded a JavaScript enabled browser (and sending forms is no real fun with that approach). So I turned to &lt;a href="http://htmlunit.sourceforge.net/gettingStarted.html"&gt;HTMLUnit&lt;/a&gt; which seems to be an even better screen scrape tool. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now what we really need is a HTMLUnit which gives us simple access to a TagSoup of the content...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-5899311530803797245?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/5899311530803797245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=5899311530803797245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/5899311530803797245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/5899311530803797245'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2009/03/html-screen-scraping.html' title='HTML Screen Scraping'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-7854246194769652369</id><published>2009-02-02T09:51:00.000-08:00</published><updated>2009-02-02T09:52:00.941-08:00</updated><title type='text'>Java and Concurrency</title><content type='html'>Check out Alex Miller's  fantastic blog posts at &lt;a href="http://www.nofluffjuststuff.com/blog/alex_miller/2009/01/java_concurrency_bugs_3__atomic__atomic__atomic.html"&gt;http://www.nofluffjuststuff.com/blog/alex_miller/2009/01/java_concurrency_bugs_3__atomic__atomic__atomic.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-7854246194769652369?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/7854246194769652369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=7854246194769652369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/7854246194769652369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/7854246194769652369'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2009/02/java-and-concurrency.html' title='Java and Concurrency'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15227981.post-3802989645728222934</id><published>2009-01-07T12:16:00.000-08:00</published><updated>2009-01-07T12:18:21.668-08:00</updated><title type='text'>Full program @ UCSD</title><content type='html'>Here is &lt;a href="http://extension.ucsd.edu/about/index.cfm?vAction=instructorDetail&amp;amp;vContactID=12859&amp;amp;vDepartmentCode=CS"&gt;my teaching schedule&lt;/a&gt; for this quarter:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://extension.ucsd.edu/studyarea/index.cfm?vAction=singleCourse&amp;amp;vStudyAreaID=14&amp;amp;vCourse=CSE-41033"&gt;Introduction to the Spring Framework&lt;/a&gt; (Winter 2009)&lt;/p&gt;         &lt;p&gt;&lt;a href="http://extension.ucsd.edu/studyarea/index.cfm?vAction=singleCourse&amp;amp;vStudyAreaID=14&amp;amp;vCourse=CSE-40479"&gt;Java Programming I: Introduction to Java Programming&lt;/a&gt; (Winter 2009)&lt;/p&gt;         &lt;p&gt;&lt;a href="http://extension.ucsd.edu/studyarea/index.cfm?vAction=singleCourse&amp;amp;vStudyAreaID=14&amp;amp;vCourse=CSE-40910"&gt;Mapping Objects to Relational Databases using Hibernate&lt;/a&gt; (Winter 2009)&lt;/p&gt;         &lt;p&gt;&lt;a href="http://extension.ucsd.edu/studyarea/index.cfm?vAction=singleCourse&amp;amp;vStudyAreaID=14&amp;amp;vCourse=CSE-41068"&gt;Struts 2.0&lt;/a&gt; (Winter 2009)&lt;/p&gt;&lt;p&gt;That's plenty and I am really excited about that line-up --&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15227981-3802989645728222934?l=gman.eichberger.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gman.eichberger.de/feeds/3802989645728222934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15227981&amp;postID=3802989645728222934' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/3802989645728222934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15227981/posts/default/3802989645728222934'/><link rel='alternate' type='text/html' href='http://gman.eichberger.de/2009/01/full-program-ucsd.html' title='Full program @ UCSD'/><author><name>German</name><uri>http://www.blogger.com/profile/00681190123559980817</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
