<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUMDRn4-fCp7ImA9WhRQEU4.&quot;"><id>tag:blogger.com,1999:blog-5858414</id><updated>2011-12-06T02:04:37.054+01:00</updated><category term="mobile" /><category term="logging" /><category term="optimisation" /><category term="wiki" /><category term="podcast" /><category term="semfs" /><category term="collaboration" /><category term="latex" /><category term="gwt" /><category term="maven" /><category term="ontology" /><category term="api" /><category term="cds" /><category term="calpano" /><category term="motivation" /><category term="pkm" /><category term="rdf" /><category term="iphone" /><category term="phd" /><category term="css" /><category term="ski" /><category term="plugin" /><category term="cms" /><category term="spam" /><category term="apidesign" /><category term="performance" /><category term="eclipse" /><category term="procrastination" /><category term="review" /><category term="call for paper" /><category term="usability" /><category term="backup" /><category term="web20" /><category term="sport" /><category term="oem" /><category term="semwiki" /><category term="idea" /><category term="tech" /><category term="business" /><category term="gesellschaft" /><category term="research" /><category term="java" /><category term="tool" /><category term="REST" /><category term="semantic web" /><category term="tutorial" /><category term="startup" /><category term="music" /><category term="modules" /><category term="denkwerkzeug" /><category term="memory" /><category term="swecr" /><category term="gps" /><category term="gae/j" /><category term="photo" /><category term="appengine" /><category term="german" /><category term="coding" /><category term="dev" /><category term="fun" /><category term="components" /><category term="hkw" /><category term="eswc" /><category term="gmail" /><title>Blog.Xam.de</title><subtitle type="html">Max Völkel on Personal Knowledge Management, Wikis, Semantic Web, Java, AppEngine, and personal ideas.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.xam.de/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.xam.de/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>95</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/MaxVlkel" /><feedburner:info uri="maxvlkel" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CUMDRn84fSp7ImA9WhRQEU4.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-8149062586420034811</id><published>2011-12-06T02:04:00.001+01:00</published><updated>2011-12-06T02:04:37.135+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-06T02:04:37.135+01:00</app:edited><title>Developing GWT Faster</title><content type="html">&lt;div&gt;Xydra has a nice GWT module. Compiling it was too slow. How to speed it up?&lt;/div&gt;&lt;div&gt;This is the short version of what happened:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;After exploring the &lt;a href="http://stackoverflow.com/questions/1011863/how-do-i-speed-up-the-gwt-compiler"&gt;easy ways&lt;/a&gt; we went from 5 min compile to 1,5 min. Not bad, but still too slow.&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;We tried to get (hosted) &lt;a href="http://code.google.com/intl/de/webtoolkit/doc/latest/DevGuideCompilingAndDebugging.html"&gt;development mode&lt;/a&gt; to run with GWT and Maven. A bit tricky. Maybe &lt;a href="http://www.screaming-penguin.com/node/4500"&gt;-noserver&lt;/a&gt; (doc is for GWT 1.6) helps.&lt;/div&gt; &lt;div&gt;That worked up to a certain point. We reached a strange exception from the development mode GWT pseudo-compiler (then one that communicates with the browser-plugin). The error was something about gwt-log. So maybe gwt-log is not compatible with our GWT version? So we wanted to upgrade GWT. But we did not use the GWT version consistenly. So we moved it to a new parent pom. Can you have conditional sections in the parent pom that you turn on in the children, when needed? After consulting Stackoverflow:&lt;/div&gt; &lt;div&gt;&lt;ul&gt;&lt;li&gt;Q: Can Maven compose a pom out of multiple parts? A: Only, if you&amp;#39;re &lt;a href="http://stackoverflow.com/a/8391313/123280"&gt;clever&lt;/a&gt;. It will be supported well in Maven 3.1. &lt;/li&gt;&lt;li&gt;Q: Will 3.1 come out soon? Rather not. &lt;/li&gt; &lt;li&gt;Q: Is it worth upgrading to Maven 3.0? Yes, because its faster. And compatible with 2.0 poms. And the error reporting is much clearer.&lt;/li&gt;&lt;/ul&gt;Ok. &lt;b&gt;So we upgraded to Maven 3.0.3. &lt;/b&gt;And we use profiles in a parent pom. This means, the files &amp;quot;uses-gwt.marker&amp;quot; etc are now really important. Yes, it is much faster!&lt;br&gt; &lt;br&gt;&lt;/div&gt;&lt;div&gt;So now that we were in the pom-business, we upgraded all kinds of libraries. Minor upgrades:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Upgraded from SLF4J 1.5.0 to 1.6.4, which has some bug fixes. Details at &lt;a href="http://slf4j.org/news.html" target="_blank"&gt;http://slf4j.org/news.html&lt;/a&gt;. &lt;/li&gt; &lt;li&gt;Upgraded maven-antrun-plugin from 1.2 to 1.7&lt;/li&gt;&lt;li&gt;Upgraded commons-io from 1.4 to 2.1&lt;/li&gt;&lt;li&gt;Upgraded to &lt;a href="http://code.google.com/p/gwt-log/"&gt;gwt-log 3.1.6&lt;/a&gt;, just in time they deploy to Maven Central now. Of course, like every good (*cough*) maven plugin, they changed the groupId.&lt;/li&gt; &lt;li&gt;Upgraded from &lt;a href="http://mvnrepository.com/artifact/junit/junit"&gt;JUnit&lt;/a&gt; 4.8.2 to 4.10&lt;/li&gt;&lt;li&gt;Upgraded &lt;a href="http://mvnrepository.com/artifact/log4j/log4j"&gt;Log4j&lt;/a&gt; from 1.2.14 to 1.2.16 - seems to be a pretty stable lib.&lt;/li&gt; &lt;/ul&gt; &lt;/div&gt;&lt;div&gt;Following the main goal, we also upgraded the GWT and GAE monsters:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Upgraded to Google AppEngine 1.6.0&lt;/b&gt; with the compatible &lt;a href="http://code.google.com/p/maven-gae-plugin/"&gt;maven-gae-plugin&lt;/a&gt; 0.9.2. Cool, its in Maven Central now. Yes, one repo less to use!&lt;/li&gt; &lt;li&gt;&lt;b&gt;Changed from GWT 2.x to &lt;a href="http://code.google.com/intl/de/webtoolkit/doc/latest/ReleaseNotes.html"&gt;GWT 2.4&lt;/a&gt;.&lt;/b&gt; Also using &lt;a href="http://mojo.codehaus.org/gwt-maven-plugin/"&gt;gwt-maven-plugin&lt;/a&gt; 2.4.0.&lt;/li&gt; &lt;/ul&gt;&lt;/div&gt;&lt;div&gt;... some hours later...after updating many many poms... hosted mode runs!&lt;/div&gt;&lt;div&gt;The app still runs. And much complexity from the poms is gone and has been moved to the parent pom.&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/5858414-8149062586420034811?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/sSqho1uiKCw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/8149062586420034811/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=8149062586420034811" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/8149062586420034811?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/8149062586420034811?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/sSqho1uiKCw/developing-gwt-faster.html" title="Developing GWT Faster" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2011/12/developing-gwt-faster.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcHQXY9eyp7ImA9WhRSFkk.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-3573573500240373052</id><published>2011-11-18T19:47:00.001+01:00</published><updated>2011-11-18T19:47:10.863+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-18T19:47:10.863+01:00</app:edited><title>State of GWT Widgets, Themes, and Styles</title><content type="html">We used GWT some years ago and are now starting to use it again for our web and mobile apps. Before diving head-first into code we did some research on the market for GWt widgets, themes or styles. Overall, the situation is not so promising. &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Themes:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;How to use themes: &lt;a href="http://code.google.com/intl/de/webtoolkit/doc/latest/tutorial/style.html" target="_blank"&gt;http://code.google.com/intl/de/webtoolkit/doc/latest/tutorial/style.html&lt;/a&gt;&lt;div&gt; &lt;/div&gt;&lt;/li&gt;&lt;li&gt;How to style widgets: &lt;a href="http://code.google.com/intl/de/webtoolkit/doc/latest/DevGuideUiCss.html"&gt;http://code.google.com/intl/de/webtoolkit/doc/latest/DevGuideUiCss.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;GWT (since version 2.x) comes with 3 default styles: &lt;b&gt;Standard&lt;/b&gt;, &lt;b&gt;Chrome &lt;/b&gt;and  &lt;b&gt;Dark&lt;/b&gt;. They look like &lt;a href="http://pathfindersoftware.com/wp-content/uploads/themes1.jpg" target="_blank"&gt;this&lt;/a&gt; (Screenshot). &lt;/li&gt; &lt;li&gt;Since Feb 2011: &lt;b&gt;Clean&lt;/b&gt; theme. Demo: Default widgets in &lt;a href="http://gwt.google.com/samples/Showcase/Showcase.html"&gt;Showcase sample app&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Widgets:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/intl/de/webtoolkit/doc/latest/RefWidgetGallery.html"&gt;Widget gallery&lt;/a&gt; in Standard theme&lt;/li&gt; &lt;li&gt;Same widgets in &lt;a href="http://gwt.google.com/samples/Showcase/Showcase.html"&gt;Showcase sample app&lt;/a&gt; (Clean theme)&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/docreader/#p=google-web-toolkit-incubator&amp;amp;s=google-web-toolkit-incubator&amp;amp;t=FunctionalitySummary"&gt;Experimental widgets from GWT team&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.sencha.com/products/extgwt/"&gt;Sencha GWT = ExtGWT&lt;/a&gt;, cool look with effects for $330 per developer | &lt;a href="http://www.sencha.com/examples/#overview"&gt;Demo&lt;/a&gt; - 4 themes, choose top right&lt;/li&gt;&lt;li&gt; Why are there not more widget sets here?&lt;/li&gt;&lt;/ul&gt;Mobile widgets&lt;br&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://gwtmobile.com"&gt;gwtmobile.com&lt;/a&gt;. Demo: Desktop browser: &lt;a href="http://demo.gwtmobile.com/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(65, 131, 196); text-decoration: none; "&gt;demo.gwtmobile.com&lt;/a&gt; | Mobile browser: &lt;a href="http://demobile.gwtmobile.com/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(65, 131, 196); text-decoration: none; "&gt;demobile.gwtmobile.com&lt;/a&gt;. Supports PhoneGap. (from guy who build gwt-phonegap wrapper)&lt;/li&gt; &lt;li&gt;&lt;a href="http://code.google.com/p/gwt-mosaic/"&gt;gwt-mosaic&lt;/a&gt; | 1 developer, last commit July 2011, some real-world usage, no live demo&lt;/li&gt;&lt;li&gt;Sencha Touch -- there IS a free license | &lt;a href="http://dev.sencha.com/deploy/touch/examples/kitchensink/"&gt;Demo&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://nextinterfaces.com/start/"&gt;NEXT&lt;/a&gt; very nice, but seems rather unknown | &lt;a href="http://nextinterfaces.com/demo"&gt;Demo&lt;/a&gt; looks very mac-ish&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Helper frameworks&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;For using MVP: &lt;a href="http://code.google.com/p/mvp4g/"&gt;http://code.google.com/p/mvp4g/&lt;/a&gt; OR &lt;a href="http://code.google.com/p/gwt-platform/"&gt;http://code.google.com/p/gwt-platform/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://code.google.com/p/gwtquery/"&gt;Gquery&lt;/a&gt; is like jquery, but in Java&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-3573573500240373052?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/fH2Q0y1vcM4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/3573573500240373052/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=3573573500240373052" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/3573573500240373052?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/3573573500240373052?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/fH2Q0y1vcM4/state-of-gwt-widgets-themes-and-styles.html" title="State of GWT Widgets, Themes, and Styles" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.xam.de/2011/11/state-of-gwt-widgets-themes-and-styles.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcAQHw9cCp7ImA9WhRTFE8.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-5642339060751642517</id><published>2011-11-04T18:09:00.003+01:00</published><updated>2011-11-04T18:17:21.268+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-04T18:17:21.268+01:00</app:edited><title>Ten Finalists of German Silicon Valley Accelerator</title><content type="html">Today, the &lt;a href="http://germanaccelerator.com/ten-finalists-selected/"&gt;ten finalists for the German Silicon Valley Accelerator (GSVA&lt;/a&gt;) have been selected. As they list only the company names on their blog, lets have a shorts view on which teams qualified. I've only quickly copied some stuff together so spare you the clicking. Obviously You should have your company claim and motto in copy-and-paste form on your homepage to get better &amp;nbsp;press coverage :-)&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;a href="http://www.eviscan.com/index.php"&gt;Eviscan&lt;/a&gt;&amp;nbsp;GmbH from Koblenz, 2 founders&lt;br /&gt;
&lt;div&gt;Claim: "Spurensuche und Sicherung leicht gemacht. Mit EVISCAN!"&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href="http://fairobserver.com/"&gt;Fair Observer&lt;/a&gt;, 44 listed team members, unclear legal form&lt;/div&gt;&lt;div&gt;Claim:&amp;nbsp;Fair Observer is a platform for shared understanding of our world through analysis sourced from across borders and disciplines.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.friendsurance.de/"&gt;Friendsurance&lt;/a&gt;&amp;nbsp;from&amp;nbsp;Alecto GmbH in&amp;nbsp;from Berlin,&amp;nbsp;&lt;/div&gt;Claim:&amp;nbsp;Versichere dich über Friendsurance&amp;nbsp;und sichere dir&amp;nbsp;im Schnitt&amp;nbsp;50% Rückzahlung&amp;nbsp;deiner Beiträge zum Jahresende.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.hpi-remarketing.com/"&gt;HPI Remarketing&lt;/a&gt;&amp;nbsp;GmbH from&amp;nbsp;Sulzbach&lt;br /&gt;
Claim:&amp;nbsp;Mit dem Fullserviceangebot von HPI Remarketing&amp;nbsp;sind teure Restwertfresser und lange Verkaufszeiten&amp;nbsp;Schnee von gestern.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.mashero.com/"&gt;Mashero&lt;/a&gt;&amp;nbsp;GmbH from Berlin&lt;br /&gt;
Claim:&amp;nbsp;Erfolg durch zielgruppengenaue Gestaltung und Optimierung von Online-Werbung&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.nelou.com/de/home.php"&gt;Nelou&lt;/a&gt;&amp;nbsp;from &lt;a href="http://gestyled.com/"&gt;gestyled.com&lt;/a&gt; gmbh in Berlin&lt;br /&gt;
Claim: Best of independent style.&lt;br /&gt;
Mission: nelou ist ein innovatives Off- und Online-Konzept, das Mode, Shopping und Unterhaltung zu einem neuen Erlebnis verbindet. Dank nelou vernetzen sich endlich professionelle Modedesigner und interessiertes Publikum auf einfache Art und Weise – weltweit und rund um die Uhr. Und dank der regelmäßig stattfindenden nelou Events und Shows werden Kreative zum Anfassen nah.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.pixray.com/"&gt;Pixray&lt;/a&gt;&amp;nbsp;founded as a HIT Labs UG in May 2009 by 3 founders&lt;br /&gt;
Claim: Manage and contraol digital image content.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Mission: PIXRAY stands for cutting edge research and technology in the field of computer vision. Our unique PIXRAY Engine™ revolutionizes the way companies handle their digital image content. PIXRAY's fully automated image processing solutions alter businesses notion of dealing with their image assets in an effective and reliable way. We provide the answers to industry-specific questions in the image processing and object recognition domain.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.signavio.com/de/produkte/uebersicht.html"&gt;Signavio&lt;/a&gt;&amp;nbsp;GmbH from Berlin&lt;br /&gt;
Claim:&amp;nbsp;Prozesse verstehen, optimieren und umsetzen. Dies erreicht man mit professionellem Prozessmanagement – und professionellen Werkzeugen.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.trifense.de/"&gt;Trifense&lt;/a&gt;&amp;nbsp;from Velten, Spin-Off from TU Berlin.&lt;br /&gt;
Claim: Intelligent network defense&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href="http://web.ubivent.com/"&gt;Ubivent&lt;/a&gt;&amp;nbsp;from Mannheim&lt;/div&gt;&lt;/div&gt;Claim:&amp;nbsp;Europe's leading virtual event specialist.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-5642339060751642517?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/uGJOxb9X3og" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/5642339060751642517/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=5642339060751642517" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/5642339060751642517?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/5642339060751642517?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/uGJOxb9X3og/ten-finalists-of-german-silicon-valley.html" title="Ten Finalists of German Silicon Valley Accelerator" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2011/11/ten-finalists-of-german-silicon-valley.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcNQ3o8fyp7ImA9WhRTEko.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-7779035884217842464</id><published>2011-11-03T00:54:00.001+01:00</published><updated>2011-11-03T00:54:52.477+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-03T00:54:52.477+01:00</app:edited><title>Analysis of datastore operation cost for Google AppEngine for the new pricing</title><content type="html">&lt;p style="padding-top: 1em; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 16px; font-family: Helvetica, Arial, sans-serif; background-color: rgb(255, 255, 255); "&gt; AppEngine new pricing is making me think how to reduce costs. Here is my analysis of the datastore operation costs:&lt;/p&gt;&lt;p style="padding-top: 1em; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 16px; font-family: Helvetica, Arial, sans-serif; background-color: rgb(255, 255, 255); "&gt; [Prices based on &lt;a href="http://code.google.com/intl/de-DE/appengine/kb/postpreviewpricing.html#similar_vm" style="font-family: arial; line-height: normal; "&gt;http://code.google.com/intl/de-DE/appengine/kb/postpreviewpricing.html#similar_vm&lt;/a&gt;]&lt;/p&gt; &lt;table style="border-collapse: collapse; line-height: 16px; margin-top: 1em; margin-right: 0px; margin-bottom: 0px; margin-left: 1px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-color: initial; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; clear: right; color: rgb(0, 0, 0); font-family: Helvetica, Arial, sans-serif; background-color: rgb(255, 255, 255); font-size: small; "&gt; &lt;tbody&gt;&lt;tr&gt;&lt;th style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); background-color: rgb(229, 236, 249); "&gt; High-Level Operation&lt;/th&gt;&lt;th style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); background-color: rgb(229, 236, 249); "&gt; Cost (Low-Level Operations Required)&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); "&gt; Entity Get (per entity)&lt;/td&gt;&lt;td style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); "&gt; $0.07 per 100k operations (1 Read)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); "&gt; New Entity Put (per entity) &lt;br&gt;with &lt;i&gt;k&lt;/i&gt; indexed property values&lt;br&gt;and &lt;i&gt;c&lt;/i&gt; composite index values&lt;/td&gt;&lt;td style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); "&gt; $0.20 + &lt;i&gt;k&lt;/i&gt; $0.20 + &lt;i&gt;c&lt;/i&gt; $0.10 per 100k operations &lt;br&gt;(2 Writes + 2 Writes per indexed property value + 1 Write per composite index value)&lt;br&gt;&lt;br&gt;Example with &lt;i&gt;k&lt;/i&gt;=5 and &lt;i&gt;c&lt;/i&gt;=1: $0.20 + 5 * $0.20 + 1 * $0.10 = $1.30 per 100k operations&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); "&gt; Existing Entity Put (per entity)&lt;br&gt;with &lt;i&gt;k&lt;/i&gt; indexed property values&lt;br&gt;and &lt;i&gt;c&lt;/i&gt; composite index values&lt;/td&gt;&lt;td style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); "&gt; $0.10 + &lt;i&gt;k&lt;/i&gt; $0.40 + &lt;i&gt;c&lt;/i&gt; $0.20 per 100k operations &lt;br&gt;(1 Write + 4 Writes per modified indexed property value + 2 Writes per modified composite index value)&lt;br&gt;&lt;br&gt;Example with &lt;i&gt;k&lt;/i&gt;=5 and &lt;i&gt;c&lt;/i&gt;=1: $0.20 + 5 * $0.40 + 1 * $0.20 = $2.40 per 100k operations&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); "&gt; Entity Delete (per entity)&lt;br&gt;with &lt;i&gt;k&lt;/i&gt; indexed property values&lt;br&gt;and &lt;i&gt;c&lt;/i&gt; composite index values&lt;/td&gt;&lt;td style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); "&gt; $0.20 + &lt;i&gt;k&lt;/i&gt; $0.20 + &lt;i&gt;c&lt;/i&gt; $0.10 per 100k operations &lt;br&gt;(2 Writes + 2 Writes per indexed property value + 1 Write per composite index value)&lt;br&gt;&lt;br&gt;Example with &lt;i&gt;k&lt;/i&gt;=5 and &lt;i&gt;c&lt;/i&gt;=1: $0.20 + 5 * $0.20 + 1 * $0.10 = $1.30 per 100k operations&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); "&gt; Query&lt;br&gt;with &lt;i&gt;r&lt;/i&gt; entities returned&lt;/td&gt;&lt;td style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); "&gt; $0.07 + r $0.07 per 100k operations (1 Read + 1 Read per entity returned)&lt;br&gt;&lt;br&gt;Example with &lt;i&gt;r&lt;/i&gt;=100: $0.07 + 100 * $0.07 = $7.07 per 100k operations&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); "&gt; Query (keys only)&lt;br&gt;with &lt;i&gt;r&lt;/i&gt; entities returned&lt;/td&gt;&lt;td style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); "&gt; $0.07 + &lt;i&gt;r&lt;/i&gt; $0.01 per 100k operations (1 Read + 1 Small per entity returned)&lt;br&gt;&lt;br&gt;Example with &lt;i&gt;r&lt;/i&gt;=100: $0.07 + 100 * $0.01 = $1.07 per 100k operations&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); "&gt; Key allocation (per key)&lt;/td&gt;&lt;td style="text-align: left; vertical-align: top; padding-top: 6px; padding-right: 12px; padding-bottom: 6px; padding-left: 12px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(187, 187, 187); border-right-color: rgb(187, 187, 187); border-bottom-color: rgb(187, 187, 187); border-left-color: rgb(187, 187, 187); "&gt; $0.01 per 100k operations (1 Small)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="padding-top: 1em; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 16px; font-family: Helvetica, Arial, sans-serif; background-color: rgb(255, 255, 255); "&gt; Are my example values helpful?&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-7779035884217842464?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/NJcflsYT_WU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/7779035884217842464/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=7779035884217842464" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/7779035884217842464?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/7779035884217842464?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/NJcflsYT_WU/analysis-of-datastore-operation-cost.html" title="Analysis of datastore operation cost for Google AppEngine for the new pricing" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.xam.de/2011/11/analysis-of-datastore-operation-cost.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8DSHgyfip7ImA9WhZbFUU.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-980388830459820577</id><published>2011-06-20T17:14:00.001+02:00</published><updated>2011-06-20T17:14:39.696+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-20T17:14:39.696+02:00</app:edited><title>Notes from Google AppEngine User Meetup at Barcamp Karlsruhe</title><content type="html">&lt;div&gt;Notes from Session&lt;b&gt; Google AppEngine User Meetup &lt;/b&gt;&lt;/div&gt;&lt;div&gt;at &lt;a href="http://www.barcamp-karlsruhe.de/"&gt;Barcamp Karlsruhe&lt;/a&gt;&lt;/div&gt;&lt;div&gt;on 19.06.2011&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;b&gt;Attendants:&lt;/b&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Sebastian Helzle | &lt;a href="http://twitter.com/#!/sebobo" target="_blank"&gt;@sebobo&lt;/a&gt;, pyhton and java&lt;/li&gt; &lt;li&gt;Tobias Günther von &lt;a href="http://www.elaspix.de/" target="_blank"&gt;Elaspix&lt;/a&gt; , java&lt;/li&gt;&lt;li&gt;Tobias Müller, 1&amp;amp;1 &lt;a href="http://twitter.com/#!/tobiasmueller" target="_blank"&gt;@tobiasmueller&lt;/a&gt;, mostly python&lt;/li&gt;  &lt;li&gt;Max Völkel, Calpano (host) &lt;a href="http://twitter.com/#!/xamde" target="_blank"&gt;@xamde&lt;/a&gt; | &lt;a href="http://Calpano.com" target="_blank"&gt;Calpano.com&lt;/a&gt;, java&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Topics &amp;amp; Tips:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt; &lt;div&gt;Use the cookbook: &lt;a href="http://appengine-cookbook.appspot.com/"&gt;http://appengine-cookbook.appspot.com/&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Exception handling can be tuned nicely &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;to deliver errors over XMPP to GTalk&lt;/li&gt; &lt;li&gt;to include relevant details such as userId involved in error&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Nice frameworks:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Objectify (mature, small, fast)&lt;/li&gt;&lt;li&gt;&lt;a href="http://Xydra.org"&gt;Xydra.org&lt;/a&gt; - less mature, more features (versioning, access rights, synchronisation, ...)&lt;/li&gt; &lt;/ul&gt;&lt;div&gt;Common issues:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Privacy regulation in Germany make it hard/impossible to use GAE for German customers (depending on the kind of data to be stored)&lt;/li&gt;&lt;li&gt;Deadline exceeded error - Solutions:&lt;/li&gt; &lt;ul&gt;&lt;li&gt;TaskQueue, now easier to use with Deferred Task, also in Java&lt;/li&gt;&lt;li&gt;Caching (static variables, mem cache, datastore)&lt;/li&gt;&lt;li&gt;Asynch &amp;amp; batch operations (more concurrency, less datastore hits)&lt;/li&gt;&lt;li&gt;Report generation - commons solutions for this special case:&lt;/li&gt; &lt;ul&gt;&lt;li&gt;use bulk loader to download datastore, compute locally&lt;/li&gt;&lt;li&gt;use task queue to generate report cleverly in pieces, deliver in 30 seconds&lt;/li&gt;&lt;li&gt;use Backends (a new GAE feature) for this&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt; Nice tools:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;JRebel for debugging&lt;/li&gt;&lt;li&gt;A local embedded Jetty for debugging&lt;/li&gt;&lt;li&gt;AppStats!&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Hint: Go to Google developer days and talk to real people (some come form the US GAE team, some come from partner companies)&lt;/div&gt; &lt;/div&gt;&lt;br&gt;-- &lt;br&gt;&lt;a href="mailto:max@xam.de" target="_blank"&gt;max@xam.de&lt;/a&gt; | &lt;a href="http://Xam.de" target="_blank"&gt;http://Xam.de&lt;/a&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/5858414-980388830459820577?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/_g2brsZXlKg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/980388830459820577/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=980388830459820577" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/980388830459820577?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/980388830459820577?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/_g2brsZXlKg/notes-from-google-appengine-user-meetup.html" title="Notes from Google AppEngine User Meetup at Barcamp Karlsruhe" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2011/06/notes-from-google-appengine-user-meetup.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cMRHg7eip7ImA9Wx9bFk4.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-5255685692469247272</id><published>2011-02-25T14:04:00.001+01:00</published><updated>2011-02-25T14:04:45.602+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-25T14:04:45.602+01:00</app:edited><title>Was jeder SaaS-Unternehmer wissen muss</title><content type="html">&lt;div&gt;Beim Schreiben unseres Business Plans für &lt;a href="http://calpano.com"&gt;Calpano.com&lt;/a&gt; haben wir sehr viel Material zu Saas-Metriken, Preisgestaltung, Freemium-Modellen und viralem Marketing gelesen. Es gibt relativ wenige richtig gute Inhalte. Hier sind sie:&lt;/div&gt; &lt;div&gt;&lt;ul&gt;&lt;li&gt;Der Blog &lt;a href="http://www.forentrepreneurs.com/"&gt;http://www.forentrepreneurs.com/&lt;/a&gt; enthält alles, was man über SaaS-Metriken wissen muss&lt;/li&gt;&lt;li&gt;Unter &lt;a href="http://www.neildavidson.com/dontjustrollthedice.html"&gt;http://www.neildavidson.com/dontjustrollthedice.html&lt;/a&gt; findet sich ein gutes E-Book mit ca. 50 Seiten leicht verdaulichem und trotzdem sehr umfassendem Material zum Thema Preisgestaltung.&lt;/li&gt; &lt;li&gt;Unter &lt;a href="http://sixteenventures.com/blog/the-reality-of-freemium-in-saas.html"&gt;http://sixteenventures.com/blog/the-reality-of-freemium-in-saas.html&lt;/a&gt; wird das Freemium-Modell sehr kritisch beleuchtet. Sehr kompakt, sehr gehaltvoll.&lt;/li&gt; &lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Welches andere Material kennt Ihr? Bitte kommentieren.&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-5255685692469247272?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/t_CPScRdm6M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/5255685692469247272/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=5255685692469247272" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/5255685692469247272?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/5255685692469247272?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/t_CPScRdm6M/was-jeder-saas-unternehmer-wissen-muss.html" title="Was jeder SaaS-Unternehmer wissen muss" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2011/02/was-jeder-saas-unternehmer-wissen-muss.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UFSXY4eSp7ImA9Wx9WGUQ.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-3214079626486282915</id><published>2011-01-25T22:33:00.000+01:00</published><updated>2011-01-25T22:33:38.831+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-25T22:33:38.831+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="music" /><title>MediaMonkey rockt!</title><content type="html">&lt;div&gt;Nach langen Jahren des kostenlosen Nutzens habe ich es jetzt endlich gekauft. Nun kann ich noch bessere Auto-Listen anlegen mit denen ich Musik entdecken kann.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://show.onenetworkdirect.net/42/144939/7080" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://show.onenetworkdirect.net/42/144939/7080" /&gt;&lt;/a&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/5858414-3214079626486282915?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/6PiTcRZWvms" height="1" width="1"/&gt;</content><link rel="related" href="http://send.onenetworkdirect.net/z/7080/CD144939/" title="MediaMonkey rockt!" /><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/3214079626486282915/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=3214079626486282915" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/3214079626486282915?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/3214079626486282915?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/6PiTcRZWvms/mediamonkey-rockt.html" title="MediaMonkey rockt!" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2011/01/mediamonkey-rockt.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YHSH06eyp7ImA9Wx9XGU8.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-2276166842703030606</id><published>2011-01-13T15:32:00.001+01:00</published><updated>2011-01-13T15:32:19.313+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-13T15:32:19.313+01:00</app:edited><title>Studienarbeit oder Diplomarbeit: Was jeder Student wissen sollte</title><content type="html">In meine Karriere als Doktorand habe ich ca. 10 Studien- und Diplomarbeiten betreut. Dabei habe ich jede Betreuung damit angefangen, dass ich meinen Studenten das Buch &lt;a href="http://www.amazon.de/gp/product/3728130125?ie=UTF8&amp;amp;tag=xamde01-21&amp;amp;linkCode=as2&amp;amp;camp=1638&amp;amp;creative=19454&amp;amp;creativeASIN=3728130125"&gt;Studien-Arbeiten&lt;/a&gt; [Amazon-Link] in die Hand drückte. Meine Studenten waren sehr zufrieden und stellten die ganzen Anfänger-Fragen nicht mehr (Was ist eine Studienarbeit? Was ist wichtig? Wie kann ich die gliedern? Wie gehe ich mit Literatur um? ...).&lt;div&gt; &lt;br&gt;&lt;/div&gt;&lt;div&gt;Das Buch ist auf jeden Fall absolut gleichwertig für Diplomarbeiten zu empfehlen.&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-2276166842703030606?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/6Isth83Ug30" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/2276166842703030606/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=2276166842703030606" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/2276166842703030606?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/2276166842703030606?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/6Isth83Ug30/studienarbeit-oder-diplomarbeit-was.html" title="Studienarbeit oder Diplomarbeit: Was jeder Student wissen sollte" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.xam.de/2011/01/studienarbeit-oder-diplomarbeit-was.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QESXcyfyp7ImA9Wx9QF00.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-3348448770727123160</id><published>2010-12-30T10:28:00.001+01:00</published><updated>2010-12-30T10:28:28.997+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-30T10:28:28.997+01:00</app:edited><title>Is memory the new database?</title><content type="html">&lt;div&gt;The current episode of SE Radio (&lt;a href="http://www.se-radio.net/2010/11/episode-169-memory-grid-architecture-with-nati-shalom/"&gt;Episode 169: Memory Grid Architecture with Nati Shalom&lt;/a&gt;) made me think. Is this the end of databases? In so many uses cases, all data will fit easily into memory, so persistency can be achieved by simply sending the data also to a second and third location where it can also live in memory.&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-3348448770727123160?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/ytYdVIDuehg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/3348448770727123160/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=3348448770727123160" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/3348448770727123160?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/3348448770727123160?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/ytYdVIDuehg/is-memory-new-database.html" title="Is memory the new database?" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2010/12/is-memory-new-database.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AGR3k6fip7ImA9Wx5XEEo.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-6095606378841449826</id><published>2010-09-10T02:47:00.003+02:00</published><updated>2010-09-10T02:48:46.716+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-10T02:48:46.716+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="dev" /><category scheme="http://www.blogger.com/atom/ns#" term="gae/j" /><category scheme="http://www.blogger.com/atom/ns#" term="appengine" /><title>How to delete all data in the Google Appengine datastore with Java tools</title><content type="html">A nice subtitle would have been: "The power of frustration". But in the end, hey, I solved it. Click the title of the post to learn how.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-6095606378841449826?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/Lr6ydvhnX8s" height="1" width="1"/&gt;</content><link rel="related" href="http://code.google.com/p/xydra/wiki/GaeMyAdmin" title="How to delete all data in the Google Appengine datastore with Java tools" /><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/6095606378841449826/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=6095606378841449826" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/6095606378841449826?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/6095606378841449826?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/Lr6ydvhnX8s/how-to-delete-all-data-in-google.html" title="How to delete all data in the Google Appengine datastore with Java tools" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.xam.de/2010/09/how-to-delete-all-data-in-google.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYNRnc5fyp7ImA9Wx5SGEo.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-2516084055506279862</id><published>2010-08-15T13:01:00.001+02:00</published><updated>2010-08-15T13:03:17.927+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-15T13:03:17.927+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="photo" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="dev" /><category scheme="http://www.blogger.com/atom/ns#" term="procrastination" /><category scheme="http://www.blogger.com/atom/ns#" term="gps" /><title>Lumix DMC-TZ10</title><content type="html">Since some weeks I own a &lt;a href="http://www.amazon.de/dp/B0036GCSUK/xamde01-21"&gt;Lumix DMC-TZ10 (US name: DMC-ZS7)&lt;/a&gt;. The camera has a built-in GPS-module, &lt;b&gt;but&lt;/b&gt;...&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;The GPS is quite slow, it takes several minutes to get a fresh location info&lt;/li&gt;
&lt;li&gt;The GPS is weak, it takes a clear sky view to get any location info. It does not work indoors. It works sometimes close to a window.&lt;/li&gt;
&lt;li&gt;If the camera has now fresh location info, it just puts the last location info it got into the EXIF metadata headers in the pictures. &lt;/li&gt;
&lt;/ul&gt;I went to a hiking trip and took many pictures (ca. 600). How could I find out the pictures with correct GPS data and the wrong ones? How could I automatically fix the wrong ones?&lt;br /&gt;
&lt;br /&gt;
Algorithm:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Sort pictures by EXIF:DateTimeOriginal.&lt;/li&gt;
&lt;li&gt; Cluster pictures by EXIF:GPS-Latitude and EXIF:GPS-Longitude. The earliest picture (according to EXIF:DateTimeOriginal) is the only one with correct GPS info.&lt;/li&gt;
&lt;li&gt;Let A be the location of the first picture in a cluster. Let B be the location of the first picture in the following (by DateTimeOriginal) cluster. Move each picture C in the first cluster (except A) from A towards B on the line AB. How far to move? Compute the time difference between A and C and normalise by time difference A to B. This yields a factor between 0 and 1 and gives the percentage how far to move C. Moving is simple:&amp;nbsp; C.lat = A.lat + factor * (B.lat - A.lat), similar for longitude. Yes, this assumes a constant moving speed between two GPS located photos which in reality is not really true.&lt;/li&gt;
&lt;/ol&gt;If you are interesed in more details about the Java code or the resulting GPX files (original and fixed), just email me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-2516084055506279862?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/zb4gMtZg3Ug" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/2516084055506279862/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=2516084055506279862" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/2516084055506279862?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/2516084055506279862?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/zb4gMtZg3Ug/lumix-dmc-tz10.html" title="Lumix DMC-TZ10" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2010/08/lumix-dmc-tz10.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04MSXo7eCp7ImA9WxFUF0g.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-4788665666949985542</id><published>2010-06-28T22:13:00.000+02:00</published><updated>2010-06-28T22:13:08.400+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-28T22:13:08.400+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="tool" /><category scheme="http://www.blogger.com/atom/ns#" term="dev" /><category scheme="http://www.blogger.com/atom/ns#" term="backup" /><title>Java copies files 80 times fast than commercial backup software</title><content type="html">I cannot believe what I saw today. I bought a brand new hard drive, a 500 GB 2.5" USB hard disk. It's&amp;nbsp; a Western Digital My Passport Essential. It was about 15 Euros more expensive than a another 500 GB 2.5" USB drive from Western Digital - so it must be the software. I thought: Okay, let's try this backup software, I really need one.&lt;br /&gt;
So I installed everything and ran my first backup. After almost half an hour I took a look at the result. I was shocked. At this speed, the full backup would take days! I startet a self-written Java program called &lt;i&gt;syncr&lt;/i&gt; with the sole purpose to copy files fast.&lt;b&gt; Syncr was over 80 times faster&lt;/b&gt;. Of course, the comparison is not entirely fair. The software from Western Digital, called &lt;i&gt;WD SmartWare 1.2.0.8, Copyright 2009 by Western Digital&lt;/i&gt;, can do much more than my hand-written syncr. The table below lists all differences. Nevertheless, 80 times is really a lot.&lt;br /&gt;
&lt;br /&gt;
Syncr uses very few ticks to achieve this speed:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;It does not copy redundant information - However, the speedup was measured by those files that &lt;i&gt;were&lt;/i&gt; copied &lt;/li&gt;

&lt;ul&gt;&lt;li&gt;It skips redundant folders with these names Temp", "RECYCLER", "System Volume Information", "Google Desktop" &lt;/li&gt;
&lt;li&gt;It always skips files named "hiberfil.sys", "pagefile.sys", "Thumbs.db", "autorun.inf", "UsrClass.dat", "UsrClass.dat.LOG", "ntuser.dat.LOG","ntuser.dat", "parent.lock"&lt;/li&gt;
&lt;li&gt;It does not copy files that are already present at the target drive with the same name and change date&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;It writes some kind of directories directly into a zip file in the target drive - this is &lt;b&gt;much faster &lt;/b&gt;than copying first and zipping later and even faster than not zipping. Many small files cost a lot of file system operations. By default, only Eclipse projects and Eclipse workspaces are zipped.Overall, not many files are zipped.&lt;/li&gt;
&lt;li&gt;It uses Java NIO, which is faster than the old Java.io.&lt;/li&gt;
&lt;/ul&gt;All in all I cannot explain the slow speed of WD SmartWare nor the fast speed of Syncr. As a side remark: Syncr is also faster than the Windows Explorer (which is why Syncr has been written initially). &lt;br /&gt;
&lt;ul&gt;&lt;/ul&gt;Quick facts about Syncr:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Files: 1&lt;/li&gt;
&lt;li&gt;Lines of code: Less than 600, including comments&lt;/li&gt;
&lt;li&gt;License: BSD &lt;/li&gt;
&lt;li&gt;Dependencies: slf4j for logging&lt;/li&gt;
&lt;li&gt;Source code: &lt;a href="http://code.google.com/p/syncr/source/browse/trunk/de.xam.syncr/src/main/java/de/xam/syncr/Syncr.java"&gt;http://code.google.com/p/syncr/source/browse/trunk/de.xam.syncr/src/main/java/de/xam/syncr/Syncr.java&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;Because of all this, I released Syncr into the wild today. Enjoy.&lt;br /&gt;
&lt;br /&gt;
&lt;table border="1"&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;th style="font-family: Verdana,sans-serif;"&gt;Feature&lt;/th&gt; &lt;th style="font-family: Verdana,sans-serif;"&gt;WD SmartWare&lt;/th&gt; &lt;th style="font-family: Verdana,sans-serif;"&gt;Syncr&lt;/th&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Business model&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;Commercial&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;Open source (BSD)&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Front-end&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;graphical&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;Java source code, run from Eclipse&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Installer&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;Windows, Mac&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;None&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Languages&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;28&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;English only&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Usability&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;very easy&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;easy for Java developers of any level, impossible for non-developers&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Design&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;Aesthetic visualisation of current hard drive content&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;Accurate log messages&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Backup storage format&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;Special folder system that contains the original files plus additional  .dcm files&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;Original folder structure with original files. Some folders are automatically stores as .zip archives.&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Product URL&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;a href="http://www.wdc.com/en/products/wdsmartware/"&gt;http://www.wdc.com/en/products/wdsmartware/&lt;/a&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;a href="http://code.google.com/p/syncr/"&gt;http://code.google.com/p/syncr/&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Versioning (can get back an older version of a file)&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;Yes&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;No&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Incremental backup&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;Yes&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;Yes&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Constant incremental background backup&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;Yes&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;No&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;th style="font-family: Verdana,sans-serif;"&gt;Experimental results&lt;/th&gt;&lt;th style="font-family: Verdana,sans-serif;"&gt;Experimental results&lt;/th&gt;&lt;th style="font-family: Verdana,sans-serif;"&gt;Experimental results&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;CPU usage&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;20-40%&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;20-40%&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Files created to backup 100 files&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;ca. 200&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;100 or just one zip file&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Memory usage&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;164 MB&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;10-400 MB&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Files copied after first 25 minutes&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;4200 files&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;5152 files &lt;br /&gt;
(1 resulting zip file counting as 1 file)&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Data &lt;/b&gt;&lt;b&gt;copied after first 25 minutes&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;136 MB&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;11 GB&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Estimated time for a full backup (of my 88 GB)&lt;/b&gt;&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;11 days, 5.6 hours&lt;/td&gt; &lt;td style="font-family: Verdana,sans-serif;"&gt;3.4 hours&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-4788665666949985542?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/OlXiFcgczZ0" height="1" width="1"/&gt;</content><link rel="related" href="http://code.google.com/p/syncr/" title="Java copies files 80 times fast than commercial backup software" /><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/4788665666949985542/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=4788665666949985542" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/4788665666949985542?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/4788665666949985542?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/OlXiFcgczZ0/java-copies-files-80-times-fast-than.html" title="Java copies files 80 times fast than commercial backup software" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.xam.de/2010/06/java-copies-files-80-times-fast-than.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08CQH8-fip7ImA9WxFVGE0.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-6951867037032749972</id><published>2010-06-17T22:17:00.000+02:00</published><updated>2010-06-17T22:17:41.156+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-17T22:17:41.156+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="dev" /><category scheme="http://www.blogger.com/atom/ns#" term="gwt" /><category scheme="http://www.blogger.com/atom/ns#" term="logging" /><title>Unifying Slf4j, gwt-log, GWT, AppEngine, Part II</title><content type="html">After some attempts to GWTify the existing slf4j-api it runs out, the approach of using linking API and implementation will not work in GWT, because it relies on reflection.&lt;br /&gt;
&lt;br /&gt;
Hence, we use a primitive solution without any magic. The API provides the class LoggerFactory and a log implementation is required to register itself via a static method. &lt;br /&gt;
&lt;br /&gt;
Finally I managed to write a first working code base for this. A &lt;a href="http://code.google.com/p/xydra/wiki/XydraLog"&gt;description about how to use it can be found here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-6951867037032749972?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/IbFNRthxyic" height="1" width="1"/&gt;</content><link rel="related" href="http://code.google.com/p/xydra/wiki/XydraLog" title="Unifying Slf4j, gwt-log, GWT, AppEngine, Part II" /><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/6951867037032749972/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=6951867037032749972" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/6951867037032749972?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/6951867037032749972?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/IbFNRthxyic/unifying-slf4j-gwt-log-gwt-appengine_17.html" title="Unifying Slf4j, gwt-log, GWT, AppEngine, Part II" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2010/06/unifying-slf4j-gwt-log-gwt-appengine_17.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04MSXYyeCp7ImA9WxFVF0s.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-8293745687642966842</id><published>2010-06-17T11:13:00.000+02:00</published><updated>2010-06-17T11:13:08.890+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-17T11:13:08.890+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="dev" /><category scheme="http://www.blogger.com/atom/ns#" term="gwt" /><category scheme="http://www.blogger.com/atom/ns#" term="logging" /><title>Unifying Slf4j, gwt-log, GWT, AppEngine, Part I</title><content type="html">I like the API of SLF4J very much and used in all my code so far.&lt;br /&gt;
&lt;br /&gt;
Can I re-use the same API for code that runs via GWT in the browser?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Experiment:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Check out source code from &lt;a href="http://github.com/ceki/slf4j"&gt;http://github.com/ceki/slf4j&lt;/a&gt; from trunk on 2010-06-17&lt;/li&gt;
&lt;li&gt;Add GWT dependencies in Maven, add get-maven plugin in POM&lt;/li&gt;
&lt;li&gt;Create a dummy entry point and a get.xml file&lt;/li&gt;
&lt;li&gt;Run mvn gwt:compile&lt;/li&gt;
&lt;/ul&gt;Result:&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&lt;br /&gt;
[INFO] Compiling module org.slf4j.GWTTest&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp; Validating newly compiled units&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ERROR] Errors in 'file:/O:/2010/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java'&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ERROR] Line 28: The import java.net cannot be resolved&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ERROR] Line 207: The method getClassLoader() is undefined for the type Class&lt;loggerfactory&gt;&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ERROR] Line 217: URL cannot be resolved to a type&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ERROR] Line 217: URL cannot be resolved to a type&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ERROR] Errors in 'file:/O:/2010/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java'&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ERROR] Line 27: The import java.text cannot be resolved&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ERROR] Errors in 'file:/O:/2010/slf4j-api/src/main/java/org/slf4j/MDC.java'&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ERROR] Line 74: No source code is available for type java.lang.NoClassDefFoundError; did you forget to inherit a required module?&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ERROR] Errors in 'file:/O:/2010/slf4j-api/src/main/java/org/slf4j/MarkerFactory.java'&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ERROR] Line 53: No source code is available for type java.lang.NoClassDefFoundError; did you forget to inherit a required module?&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ERROR] Errors in 'file:/O:/2010/slf4j-api/src/main/java/org/slf4j/helpers/BasicMDCAdapter.java'&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ERROR] Line 47: No source code is available for type java.lang.InheritableThreadLocal&lt;t&gt;; did you forget to inherit a required module?&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ERROR] Errors in 'file:/O:/2010/slf4j-api/src/main/java/org/slf4j/helpers/NamedLoggerBase.java'&lt;br /&gt;
[INFO]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ERROR] Line 40: No source code is available for type java.io.ObjectStreamException; did you forget to inherit a required module?&lt;/t&gt;&lt;/loggerfactory&gt;&lt;/span&gt;&lt;br /&gt;
These errors show that SLF4j is not GWT-ready by itself. Now there are two options:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Create a drop-in replacement that implements some parts differently&lt;/li&gt;
&lt;li&gt;Create a new SLF4j-like API which IS GWT-ready&lt;/li&gt;
&lt;/ul&gt;The second option is probably less work, but the first option would be easier to use.I'll keep you updated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-8293745687642966842?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/U5CiUM3PHbc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/8293745687642966842/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=8293745687642966842" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/8293745687642966842?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/8293745687642966842?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/U5CiUM3PHbc/unifying-slf4j-gwt-log-gwt-appengine.html" title="Unifying Slf4j, gwt-log, GWT, AppEngine, Part I" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2010/06/unifying-slf4j-gwt-log-gwt-appengine.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQDQ3g-eyp7ImA9WxFXEU0.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-544618126150248459</id><published>2010-05-17T15:36:00.000+02:00</published><updated>2010-05-17T15:36:12.653+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-17T15:36:12.653+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="call for paper" /><category scheme="http://www.blogger.com/atom/ns#" term="pkm" /><title>2nd workshop on Personal Knowledge Management</title><content type="html">Call for papers: 2nd workshop on Personal Knowledge Management at Mensch und Computer 2010, September 12, Duisburg, Germany.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;June 13, 2010 (Sun.) Deadline for paper submission&lt;/li&gt;
&lt;li&gt;July 4, 2010 (Sun.) &amp;nbsp; &amp;nbsp;Notification to authors&lt;/li&gt;
&lt;li&gt;July 14, 2010 (Wed.) &amp;nbsp;Camera-ready copy due&lt;/li&gt;
&lt;li&gt;September 12, 2010 &amp;nbsp;Workshop &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/5858414-544618126150248459?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/_c6YdCdihFY" height="1" width="1"/&gt;</content><link rel="related" href="http://2010.personalknowledge.org/" title="2nd workshop on Personal Knowledge Management" /><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/544618126150248459/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=544618126150248459" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/544618126150248459?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/544618126150248459?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/_c6YdCdihFY/2nd-workshop-on-personal-knowledge.html" title="2nd workshop on Personal Knowledge Management" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2010/05/2nd-workshop-on-personal-knowledge.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08CR3YyfSp7ImA9WxFXEkU.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-4256747518790784379</id><published>2010-05-13T21:03:00.004+02:00</published><updated>2010-05-19T17:11:06.895+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-19T17:11:06.895+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="dev" /><category scheme="http://www.blogger.com/atom/ns#" term="optimisation" /><category scheme="http://www.blogger.com/atom/ns#" term="gae/j" /><category scheme="http://www.blogger.com/atom/ns#" term="appengine" /><title>Runtime optimisation on AppEngine for Java (GAE/J)</title><content type="html">1. Install AppStats from &lt;a href="http://code.google.com/appengine/docs/java/tools/appstats.html"&gt;http://code.google.com/appengine/docs/java/tools/appstats.html&lt;/a&gt;&lt;br /&gt;
Its basically a servlet provided by Google that intercepts GAE inner workings and logs it to your applications data store. It comes with a servlet that is able to display the data in nice ways. Leave all settings as described.&lt;br /&gt;
&lt;br /&gt;
2. Log into the appstats servlet and keep the browser open&lt;br /&gt;
&lt;br /&gt;
3. Open the Firebug network tab&lt;br /&gt;
&lt;br /&gt;
4. Make a request to your appengine application&lt;br /&gt;
&lt;br /&gt;
5.In the response headers: You see messages about the cost and CPU usage. The cost is for 1000 requests, the usage numbers are for this request. Sample:&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class=" " style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;tbody aria-label="Antwort-Header" class="netInfoResponseHeadersBody " role="list"&gt;
&lt;tr class=" " role="listitem"&gt;&lt;td class="netInfoParamName " role="presentation" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;X-AppEngine-Estimated-CPM-US-Dollars: $0.003959&lt;br /&gt;
X-AppEngine-Resource-Usage: ms=172 cpu_ms=156 api_cpu_ms=40&lt;/td&gt;&lt;td aria-label="X-AppEngine-Estimated-CPM-US-Dollars" class="netInfoParamValue " role="list"&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=" " role="listitem"&gt;&lt;td class="netInfoParamName " role="presentation"&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td aria-label="X-AppEngine-Resource-Usage" class="netInfoParamValue " role="list"&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;Google &lt;a href="http://code.google.com/appengine/docs/java/runtime.html#Responses"&gt;explains&lt;/a&gt;:&lt;br /&gt;
&lt;em&gt;If you access your site while signed in using an administrator  account, App Engine includes per-request statistics in the response  headers. The header &lt;code&gt;X-AppEngine-Estimated-CPM-US-Dollars&lt;/code&gt;  represents an estimate of what 1,000 requests similar to this request  would cost in US dollars.&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
6. Go into the Appstats and click to see your last request. You get a timeline diagram and each point you called the data store. Click on these points to see the stack trace that called them.&lt;br /&gt;
&lt;br /&gt;
7. Use Firebug to determine the page loading time from a users point of view.&lt;br /&gt;
&lt;br /&gt;
Our appengine application remains for ca. 20 seconds active before the next request causes another cold start (clearly distinguishable by page loading times; time measures with stop watch by hand). A cold start every 20 seconds is in the worst case 4320 cold starts per day. Given a cold start cost of $ 0,00377529 for 12 seconds startup time, we end up with ca. $ 49 per month. All other request hit certainly a warm JVM and are hence much cheaper.&lt;br /&gt;
&lt;br /&gt;
There is also a little &lt;a href="http://radomirml.com/2010/04/06/track-appengine-estimated-cost-with-firefox-add-on"&gt;Firefox plugin to display the costs in the Firefox error console&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-4256747518790784379?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/F6MkuHnx-KY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/4256747518790784379/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=4256747518790784379" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/4256747518790784379?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/4256747518790784379?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/F6MkuHnx-KY/runtime-optimisation-on-appengine-for.html" title="Runtime optimisation on AppEngine for Java (GAE/J)" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2010/05/runtime-optimisation-on-appengine-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEGQH04eCp7ImA9WxBaFkw.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-1831995442743950833</id><published>2010-03-21T12:31:00.003+01:00</published><updated>2010-03-26T14:37:01.330+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-26T14:37:01.330+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><category scheme="http://www.blogger.com/atom/ns#" term="semfs" /><category scheme="http://www.blogger.com/atom/ns#" term="oem" /><category scheme="http://www.blogger.com/atom/ns#" term="business" /><title>Open Letter to Alfresco [update 2]</title><content type="html">&lt;b&gt;Original Post (see updates at the end):&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Dear Alfresco,&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; I am trying to &lt;b&gt;buy &lt;/b&gt;something from you. I downloaded the source code from your site, an I am pleased with what I see. In order to embed JLAN in my product, I need to know the &lt;b&gt;price&amp;nbsp; &lt;/b&gt;of your product. I want to embed your JLAN prodcut [1]. On the product site you write:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Alfresco offers either an end user and developer license that allows companies to use Alfresco JLAN for  internal deployments, or an OEM license that allows you to add Alfresco JLAN features and  functionality to your products.&amp;nbsp; For more information please contact &lt;a href="mailto:jlan@alfresco.com"&gt;jlan@alfresco.com&lt;/a&gt;. &lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
Ok, so I wrote an email to that address, asking for a quote. No response.&lt;br /&gt;
I also asked the same question at the German sales email contact as listed at [2], twice. Additionally, I called the German hotline number, twice, but only got an answering machine at normal business hours. Also no reaction from the US sales email, twice.&lt;br /&gt;
&lt;br /&gt;
After these seven (!) attempts to just get a price quote from you, I feel lost.&lt;br /&gt;
But customer service can get even worse!&lt;br /&gt;
Now I get emails like these:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Besuchen Sie Alfresco auf der CeBIT&lt;/li&gt;
&lt;li&gt;Doing More with your Alfresco Trial. 30-Day Full Enterprise Download Trial.&lt;/li&gt;
&lt;li&gt;Webinar: Alfresco-SAP-Anbindung in der Praxis, 18 März 2010 um 16:00&lt;/li&gt;
&lt;li&gt;Upcoming Webinars: Alfresco Share Customization and SAP Integration&lt;/li&gt;
&lt;/ul&gt;Apparently you have neither an idea what language I speak, nor a clue what I want from you. I &lt;b&gt;do not care about SAP integration&lt;/b&gt;. &lt;br /&gt;
&lt;br /&gt;
Why do you spam your potential customers &lt;b&gt;instead of selling your software?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
[1] &lt;a href="http://www.alfresco.com/products/aifs/"&gt;http://www.alfresco.com/products/aifs/&lt;/a&gt;&lt;br /&gt;
[2] &lt;a href="http://www.alfresco.com/about/contact/"&gt;http://www.alfresco.com/about/contact/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Regards,&lt;br /&gt;
Max Völkel&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Update 1: &lt;/b&gt;&lt;br /&gt;
On 22.03.2010 at 10 am, I got an Email from  Alfresco with various contact details. Whatever caused their hickup, the  Web 2.0 seems to have worked better than their internal structure, this  time. Maybe more and more future communication will turn in Web 2.0  social network communication?&lt;br /&gt;
&lt;br /&gt;
Unfortunately, I cannot  predict my future sales numbers and had to learn that OEM business works  not as I expected it. I expected a simple price table for 1-10  licenses, 11-100, 101-1000 and another per-license-price for more than  1000. This is not the case. Alfresco wants to calculate my business  case, determine how much of the value is contributed by their software  and then come up with a quote. This makes sense for them to obtain a  fair price for their software. On the other hand, for smaller players  like me, this means I have no way to &lt;i&gt;start &lt;/i&gt;using Alfresco  software.&lt;br /&gt;
&lt;br /&gt;
As all the code is open source anyway, all  they would need to do is set up a contract valid for, let's say, up to  10.000 licenses and let me pay by credit card for the number of licenses  used at the end of each quarter.&lt;br /&gt;
&lt;br /&gt;
Right now I could  secretly take the source code, use it, and get sued (rightly so!). In  the future, I could pay for a number of licenses, and if I would not  have paid enough, get sued in the same way. So there is almost no  overhead for them to earn more money. They can just set up self-service  web-shop for licenses and continue to sue people without proper  licenses.&lt;br /&gt;
&lt;br /&gt;
Does anybody knows of another CIFS/Samba  server written in Java that can be embedded for a reasonable license fee  even for a small or unknown number of licenses? &lt;br /&gt;
&lt;br /&gt;
At  the end of the week, Alfresco will tell me more details about licensing  options with them, I'll keep you updated.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Update 2:&lt;/b&gt;&lt;br /&gt;
Today, 26.03.2010, we received our final verdict from Alfresco: &lt;b&gt;We are too small to talk too.&lt;/b&gt; Of course, they did not use these words. But they are definitely not interested in negotiating a deal with unknown results, most likely because their negotiation process is too costly. Their product is really nice, they have a SMB/CIFS+WebDav-server in Java called JLAN and fits our current APIs really well. But since its either GPL (killing all our potential business models) or a minimum deal of ca. 10.000 Euros, we'll now need to go ahead an continue to implement our own WebDAV server. So SemFS will not have CIFS support in the near future, but we will open-source (BSD license) our WebDAV server. We looked at Slide (project is dead), JackRabbits WebDAV (really complicated OO-architecture with way too many interfaces), and other.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-1831995442743950833?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/3OY3LhBO_q4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/1831995442743950833/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=1831995442743950833" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/1831995442743950833?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/1831995442743950833?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/3OY3LhBO_q4/open-letter-to-alfresco.html" title="Open Letter to Alfresco [update 2]" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2010/03/open-letter-to-alfresco.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08EQn0-eip7ImA9WxBUFk0.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-3038747878517534357</id><published>2010-03-03T10:50:00.001+01:00</published><updated>2010-03-03T10:50:03.352+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-03T10:50:03.352+01:00</app:edited><title>Logging in the Google AppEngine for Java (GAE/J) with slf4j, log4j  and jul - and using Maven</title><content type="html">Logging is an invaluable tool for debugging web applications, especially if you can&amp;#39;t run them in debug mode. Developping an application on Google AppEngine allows you to do these steps prior to uploading it to the real server&lt;br&gt; &lt;ul&gt;&lt;li&gt;Run local JUnit tests (alhough that has its own &lt;a href="http://stackoverflow.com/questions/2351293/google-appengine-local-junit-tests-jersey-framework-embedded-jetty"&gt;problems if you use Jersey framework and an embedded Jetty&lt;/a&gt;)&lt;/li&gt; &lt;li&gt;Run the application or the JUnit tests in debug mode (e.g. use &lt;span style="font-family: courier new,monospace;"&gt;mvn gae:debug&lt;/span&gt; and a remote debug session in Eclipse)&lt;br&gt;&lt;/li&gt;&lt;li&gt;Use logging&lt;/li&gt;&lt;/ul&gt;On the real appengine, you cannot run JUnit tests (at least I don&amp;#39;t know how. Maybe you can somehow.) and you cannot run a remote debug session. Therefore you &lt;i&gt;need logging&lt;/i&gt;. It&amp;#39;s your only way to debug things that are different on the real appengine compared to the local test stub environment. And there are differences.&lt;br&gt; &lt;br&gt;AppEngine uses java.utils.logging (also often called j.u.l. or just jul). As the &lt;a href="http://fredsa.allen-sauer.com/2009/04/getting-gwt-log-to-just-work-on-google.html"&gt;blog from Fred Sauer&lt;/a&gt; (the man behin gwt-log) &lt;a href="http://4.bp.blogspot.com/_p7YKf0jZLqQ/Sd-brCgWYDI/AAAAAAAAJjY/KSAR2bBLoVU/s1600-h/gwt-log+RemoteLogger+on+App+Engine.png"&gt;shows&lt;/a&gt;, the AppEngine web console nicely displays the differen log levels:&lt;br&gt; &lt;ul&gt;&lt;li&gt;DEBUG&lt;/li&gt;&lt;li&gt;INFO&lt;/li&gt;&lt;li&gt;WARN&lt;/li&gt;&lt;li&gt;ERROR&lt;/li&gt;&lt;li&gt;CRITICAL&lt;/li&gt;&lt;/ul&gt;AppEngine uses jul for logging, although ironically &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/logging/Level.html"&gt; jul defines different log-levels&lt;/a&gt;, namelly: &lt;br&gt; &lt;ul&gt;&lt;li&gt;FINEST  (lowest value)  &lt;/li&gt;&lt;li&gt;FINER&lt;/li&gt;&lt;li&gt;FINE&lt;br&gt;&lt;/li&gt;&lt;li&gt;CONFIG&lt;br&gt;&lt;/li&gt;&lt;li&gt;INFO  &lt;/li&gt;&lt;li&gt;WARNING&lt;/li&gt;&lt;li&gt;SEVERE (highest value) &lt;/li&gt;&lt;/ul&gt;The mapping to the GAE levels is not completely clear to me yet. &lt;br&gt;To add more confusion to the mix, most code projects that I start today use &lt;a href="http://www.slf4j.org/"&gt;slf4j&lt;/a&gt;, the Simple Logging Facade for Java. Slf4j allows to delegate to another logging framework and involves almost zero runtime overhead. Underneath I usually use &lt;a href="http://logging.apache.org/log4j/1.2/index.html"&gt;log4j&lt;/a&gt;, an old, mature logging framework.&lt;br&gt; &lt;br&gt;&lt;b&gt;Clickable hyperlinks in log output&lt;/b&gt;&lt;br&gt;Log4j has nice things such as a &lt;a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html"&gt;PatternFormatter&lt;/a&gt;. If you use &amp;quot;(%F:%L)&amp;quot; in your pattern, you get &amp;quot;(Customer.java:33)&amp;quot;, which your Eclipse console parses and turns it into a clickable link to the java file &amp;quot;Customer.java&amp;quot; in line 33. That is a very quick way from an unexpected log message to you fixing it: One click! &lt;br&gt; Be aware that line numbers in source code are rather expensive to generate, you should therefore not use this pattern in a production environment. However, you can simply use another confguration file, how nice.&lt;br&gt;There are other reasons for using framework such as log4j instead of just jul.&lt;br&gt; &lt;br&gt;&lt;b&gt;Situation&lt;/b&gt;&lt;br&gt;In my project I have this (not uncommon) situation:&lt;br&gt;&lt;ul&gt;&lt;li&gt;GAE uses jul&lt;/li&gt;&lt;li&gt;Jersey uses jul&lt;/li&gt;&lt;li&gt;Other bundled libraries and my code use slf4j&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Goals&lt;/b&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;Clickable hyperlinks for local testing&lt;/li&gt; &lt;li&gt;Nice mapping from log levels to GAE icons&lt;/li&gt;&lt;li&gt;Same dependencies for local testing and production deployment&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Failed Attempts&lt;br&gt;&lt;/b&gt;&lt;ul&gt;&lt;li&gt;Use slf4j-jdk14 to route all log output to jul. This works and nicely uses the five different categories on the AppEngine, but at the cost of getting a default ugly pattern. Jul has no PatternFormatter.&lt;/li&gt;&lt;li&gt;Write a &lt;a href="http://www.devx.com/tips/Tip/41156"&gt;custom formatter for jul&lt;/a&gt;.  This does not work, because a custom formatter can only be set to a known handler, such as the ConsoleHandler form jul. Unfortunately, the ConsoleHandler does not exist on AppEngine. Attemtps to get the existing handlers by creating a log and listing its handlers or parents failed: Its all emtpy on appengine.&lt;/li&gt; &lt;/ul&gt;&lt;b&gt;Chosen Solution&lt;/b&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;Use log4j with PatternFormatter&lt;/li&gt;&lt;li&gt;Log4j put log messages to Sysatem.out which in turn are rendered by AppEngine as INFO level.&lt;/li&gt;&lt;li&gt;Jersey and AppEngine still use all five levels and an ugly pattern.&lt;/li&gt; &lt;/ul&gt;&lt;font size="4"&gt;&lt;b&gt;Configuration&lt;/b&gt;&lt;/font&gt;&lt;br&gt;This is the main piece of this long post, because it didn&amp;#39;t get it right first.&lt;br&gt;&lt;br&gt;In  &lt;span style="font-family: courier new,monospace;"&gt;\src\main\webapp\WEB-INF\appengine-web.xml &lt;/span&gt;  you need to have&lt;br&gt; &lt;span style="font-family: courier new,monospace;"&gt;&lt;br&gt;    &amp;lt;!-- Configure java.util.logging --&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;"&gt;&lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;system-properties&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;"&gt; &lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;property name=&amp;quot;java.util.logging.config.file&amp;quot; value=&amp;quot;WEB-INF/java-util-logging.properties&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;"&gt; &lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;/system-properties&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;"&gt;&lt;br&gt;to tell GAE where jul is configured. &lt;br&gt;In  &lt;span style="font-family: courier new,monospace;"&gt;\src\main\webapp\WEB-INF\java-util-logging.properties&lt;/span&gt;  you need&lt;br&gt; &lt;span style="font-family: courier new,monospace;"&gt;&lt;br&gt;.level = ALL&lt;/span&gt;&lt;br&gt;&lt;br&gt;or another of the&lt;i&gt; jul level names, &lt;/i&gt;as you like (i.e. &lt;i&gt;&amp;#39;TRACE&amp;#39; does not work&lt;/i&gt;).&lt;br&gt;&lt;br&gt;In &lt;span style="font-family: courier new,monospace;"&gt;\src\main\resources\log4j.properties&lt;/span&gt;  (if you put the file as usual in &lt;span style="font-family: courier new,monospace;"&gt;\src\test\resources\log4j.properties&lt;/span&gt;, it won&amp;#39;t be deployed to the production server and hence you will have no logging there). In this file you will have&lt;br&gt; &lt;span style="font-family: courier new,monospace;"&gt;&lt;br&gt;log4j.rootLogger=ALL, console&lt;/span&gt;&lt;br style="font-family: courier new,monospace;"&gt;&lt;br&gt;or a lower log level such as DEBUG, INFO or WARN.&lt;br&gt;And you can customize your output like:&lt;br&gt; &lt;span style="font-family: courier new,monospace;"&gt;&lt;br&gt;log4j.appender.console=org.apache.log4j.ConsoleAppender&lt;/span&gt;&lt;br style="font-family: courier new,monospace;"&gt;&lt;span style="font-family: courier new,monospace;"&gt;log4j.appender.console.layout=org.apache.log4j.PatternLayout&lt;/span&gt;&lt;br style="font-family: courier new,monospace;"&gt; &lt;span style="font-family: courier new,monospace;"&gt;log4j.appender.console.layout.ConversionPattern=%-5p: %m  at %C.(%F:%L) on %d{ISO8601}%n&lt;/span&gt;&lt;br style="font-family: courier new,monospace;"&gt;&lt;br&gt;You may not use FileAppenders, as GAE does not allow to write files.&lt;br&gt; That&amp;#39;s it. here is an &lt;b&gt;overview how log messages will flow&lt;/b&gt;:&lt;br&gt;&lt;ul&gt;&lt;li&gt;GAE &lt;br&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;generates its own log messages and sends them to jul&lt;/li&gt;&lt;li&gt;GAE checks if this level should be displayed (java-util-logging.properties), if yes:&lt;/li&gt; &lt;li&gt;message appears at correct level with ugly pattern in GAE log&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Jersey &lt;br&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;generates log messages and sends them to jul&lt;/li&gt;&lt;li&gt;GAE checks if this level should be displayed (java-util-logging.properties), if yes:&lt;/li&gt; &lt;li&gt;message appears at correct level with ugly pattern in GAE log&lt;br&gt; &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Other libraries and your code &lt;br&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;sends log messages to slf4j&lt;/li&gt;&lt;li&gt;slf4j sends them to log4j&lt;/li&gt;&lt;li&gt;log4j checks if this package &amp;amp; level should log (log4.properties), if yes:&lt;/li&gt;&lt;li&gt;log message is formatted nicely&lt;/li&gt; &lt;li&gt;and sends to System.out which is interpreted as a jul-messages at INFO level in GAE&lt;br&gt;&lt;/li&gt;&lt;li&gt;GAE checks if INFO level should be displayed (java-util-logging.properties), if yes:&lt;/li&gt;&lt;li&gt;messages shown with nice pattern at INFO level in GAE log, real level represented as text. E.g. a complete log message then looks like this: &lt;br&gt; 03-02 02:05PM 23.948&lt;br&gt;[myappname/1.340252283834355681].&amp;lt;stdout&amp;gt;: DEBUG: this is debug  at org.example.app.Logtest.(Logtest.java:13) on 2010-03-02 22:05:23,947&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;So in the end you have 3 barriers for a log message until you see it:&lt;br&gt; &lt;ul&gt;&lt;li&gt;Log4j&lt;/li&gt;&lt;li&gt;GAE&amp;#39;s jul&lt;/li&gt;&lt;li&gt;The drop-down box in AppEngine manager app (&lt;i&gt;&lt;b&gt;Show only requests&lt;/b&gt;&lt;/i&gt; will show &lt;i&gt;everyhing including requests with no errors&lt;/i&gt;).&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;I hope this helps other people struggling with logging an maybe somebody has an even nicer solution.&lt;br&gt; &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-3038747878517534357?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/ajhRD49XsmY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/3038747878517534357/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=3038747878517534357" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/3038747878517534357?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/3038747878517534357?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/ajhRD49XsmY/logging-in-google-appengine-for-java.html" title="Logging in the Google AppEngine for Java (GAE/J) with slf4j, log4j  and jul - and using Maven" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://blog.xam.de/2010/03/logging-in-google-appengine-for-java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MFR3c4eyp7ImA9WxBUEk0.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-6914349308226318420</id><published>2010-02-26T17:23:00.002+01:00</published><updated>2010-02-26T17:23:36.933+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-26T17:23:36.933+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="semwiki" /><category scheme="http://www.blogger.com/atom/ns#" term="semantic web" /><title>Fifth Workshop on Semantic Wikis – Linking Data and People [SemWiki2010]</title><content type="html">Paper Submission: &lt;del&gt;26th February 2010&lt;/del&gt; &lt;b&gt;Extended:&lt;/b&gt; 7th March 2010.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-6914349308226318420?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/5f4ntLLFBBw" height="1" width="1"/&gt;</content><link rel="related" href="http://wiki.kiwi-project.eu/confluence/display/SEMWIKI10/SemWiki2010;jsessionid=AE2B98990747B081B8FE7B64FC459717" title="Fifth Workshop on Semantic Wikis – Linking Data and People [SemWiki2010]" /><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/6914349308226318420/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=6914349308226318420" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/6914349308226318420?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/6914349308226318420?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/5f4ntLLFBBw/fifth-workshop-on-semantic-wikis.html" title="Fifth Workshop on Semantic Wikis – Linking Data and People [SemWiki2010]" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2010/02/fifth-workshop-on-semantic-wikis.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQGQH06eip7ImA9WxBVFUQ.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-2501519420374442326</id><published>2010-02-17T17:30:00.003+01:00</published><updated>2010-02-19T16:45:21.312+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-19T16:45:21.312+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="dev" /><category scheme="http://www.blogger.com/atom/ns#" term="gae/j" /><category scheme="http://www.blogger.com/atom/ns#" term="appengine" /><title>Google AppEngine Java - The Essential Links</title><content type="html">I keep searching for the same websites over and over again. This is my collection &lt;b&gt;essential &lt;/b&gt;links for Google AppEngine for Java. Using maven and low-level data-access only. &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Provided by Google &lt;/li&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/googleappengine/"&gt;http://code.google.com/p/googleappengine/&lt;/a&gt;&amp;nbsp; - on googlecode&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://code.google.com/p/googleappengine/downloads/list"&gt;Early access downloads&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/appengine/docs/java/javadoc/index.html?com/google/appengine/api/datastore/Entity.html"&gt;Entity JavaDocs&lt;/a&gt;&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;http://code.google.com/appengine - product homepage &lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/intl/de/appengine"&gt;http://code.google.com/intl/de/appengine&lt;/a&gt; - product homepage, too&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Low-level data access&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/intl/de/appengine/articles/storage_breakdown.html"&gt;How Entities and Indexes are Stored&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/intl/de/appengine/docs/java/datastore/overview.html"&gt;Datastore Java API Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/appengine/docs/java/datastore/dataclasses.html#Core_Value_Types"&gt;Datastore value types&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/google-appengine-java"&gt;GAE/J Google Group&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Provided by third parties &lt;/li&gt;

&lt;ul&gt;&lt;li&gt;The &lt;a href="http://code.google.com/p/maven-gae-plugin/"&gt;maven-gae-plugin&lt;/a&gt; - it works great. Use version 0.5.3 or higher.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.stringbuffer.com/2009/04/available-classes-in-google-app-enginej.html"&gt;GAE/J more complete class whitelist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;Getting started with maven-gae-plugin and GAE/J 1.3.1:&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;1) Installing&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Download early access, e.g. to C:\&lt;/li&gt;
&lt;li&gt;Go to the download directory and type in a command prompt (as a single line):&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mvn install:install-file -DgroupId=com.google.appengine -DartifactId=appengine-java-sdk -Dversion=1.3.1 -Dpackaging=zip -Dfile=appengine-java-sdk-1.3.1.zip &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Use a local pom like the one linked &lt;a href="http://code.google.com/p/maven-gae-plugin/issues/detail?id=31#c23"&gt;here&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Go to your projects root dir and call "mvn gae:unpack"&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;2) Using&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Just execute the maven goals listed at the &lt;a href="http://code.google.com/p/maven-gae-plugin/"&gt;maven-gae-plugin&lt;/a&gt; page&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;e.g., mvn gae:run&amp;nbsp;&amp;nbsp; runs the local appengine. It runs now, but I still have issues to find my local servlets...&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;ul&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/5858414-2501519420374442326?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/u75W9Jekj_Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/2501519420374442326/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=2501519420374442326" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/2501519420374442326?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/2501519420374442326?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/u75W9Jekj_Q/google-appengine-java-essential-links.html" title="Google AppEngine Java - The Essential Links" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2010/02/google-appengine-java-essential-links.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UMQX0_fSp7ImA9WxBVFE8.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-5423680800726527448</id><published>2010-02-17T16:41:00.000+01:00</published><updated>2010-02-17T16:41:20.345+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-17T16:41:20.345+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="iphone" /><title>iPhone gegen Kratzer schützen</title><content type="html">Es gibt viele Display-Schutzfolien und iPhone-Hüllen. Die meisten iPhone-Hüllen sind unnötig klobig. Eine relativ gute Lösung ist die Folie von "&lt;a href="http://www.zagg.com/invisibleshield/apple-iphone-3g-cases-screen-protectors-covers-skins-shields.php"&gt;invisibleSHIELD&lt;/a&gt;" die man in Deutschland am günstigsten, schnellsten und bequemsten über Amazon bekommt: &lt;a href="http://www.amazon.de/gp/product/B002EIOD4U?ie=UTF8&amp;amp;tag=xamde01-21&amp;amp;linkCode=as2&amp;amp;camp=1638&amp;amp;creative=19454&amp;amp;creativeASIN=B002EIOD4U"&gt;invisibleSHIELD Apple iPhone 3G / 3Gs (Full Body)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.de/e/ir?t=xamde01-21&amp;amp;l=as2&amp;amp;o=3&amp;amp;a=B002EIOD4U" style="border: medium none ! important; margin: 0px ! important;" width="1" /&gt;&lt;br /&gt;
&lt;br /&gt;
Die Folie schützt dabei das Display gegen Kratzer, klebt aber auch auf der Rückseite und macht so insgesamt das iPhone griffiger und kratzgeschützt.&lt;br /&gt;
&lt;br /&gt;
Das Auftragen der Folie ist allerdings eine ganz schöne Friemelei. Vorher unbedingt Hände und Telefon 100% fettfrei machen, das ist am wichtigsten. Dauer eine knappe Stunde, bis alles so klebt wie es soll. Aber danach hält es auch richtig gut.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-5423680800726527448?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/dTO3SjYrOg4" height="1" width="1"/&gt;</content><link rel="related" href="http://www.amazon.de/gp/product/B002EIOD4U?ie=UTF8&amp;tag=xamde01-21&amp;linkCode=as2&amp;camp=1638&amp;creative=19454&amp;creativeASIN=B002EIOD4U" title="iPhone gegen Kratzer schützen" /><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/5423680800726527448/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=5423680800726527448" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/5423680800726527448?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/5423680800726527448?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/dTO3SjYrOg4/iphone-gegen-kratzer-schutzen.html" title="iPhone gegen Kratzer schützen" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.xam.de/2010/02/iphone-gegen-kratzer-schutzen.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIDRHczfCp7ImA9WxBVE0s.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-7825575340457003562</id><published>2010-02-17T00:39:00.000+01:00</published><updated>2010-02-17T00:39:35.984+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-17T00:39:35.984+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ski" /><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><category scheme="http://www.blogger.com/atom/ns#" term="sport" /><category scheme="http://www.blogger.com/atom/ns#" term="iphone" /><title>Fernskiwanderweg Schonach-Belchen (100km) in 3 Tagen</title><content type="html">Letztes Wochenende sind wir drei Tage im Schwarzwald unterwegs gewesen. Jeden Tag habne wir zwei Etappen gemacht. Da sich Mittags auch das iPhone stets laden durfte, konnte ich den Track komplett aufzeichnen. Das Ergebnis ist zu sehen auf&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.everytrail.com/view_trip.php?trip_id=501421"&gt;EveryTrail&lt;/a&gt; (mit Höhenprofil und Google Earth .kml download)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hikr.org/tour/post20878.html"&gt;Hik&lt;/a&gt; (mit Fotos)&lt;/li&gt;
&lt;li&gt;und hier ist die &lt;a href="http://www.fernskiwanderweg.de/fernskiwanderweg/"&gt;offizielle Karte&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&amp;nbsp;Alles in allem eine wunderbare Tour, man braucht drei Tage lang nur den orangenen Schildern zu folgen, sehr angenehm und perfekt gespurt. Also los, solange es noch genug Schnee gibt...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-7825575340457003562?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/XGCHLXj_epk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/7825575340457003562/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=7825575340457003562" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/7825575340457003562?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/7825575340457003562?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/XGCHLXj_epk/fernskiwanderweg-schonach-belchen-100km.html" title="Fernskiwanderweg Schonach-Belchen (100km) in 3 Tagen" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2010/02/fernskiwanderweg-schonach-belchen-100km.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8GSXozeyp7ImA9WxBVE0g.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-7441561863863880915</id><published>2010-02-16T22:47:00.000+01:00</published><updated>2010-02-16T22:47:08.483+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-16T22:47:08.483+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="dev" /><category scheme="http://www.blogger.com/atom/ns#" term="semfs" /><title>SemFS making progress</title><content type="html">Today I refactored &lt;a href="http://semfs.semweb4j.org/"&gt;SemFS (our semantic file system)&lt;/a&gt; heavily. Now at least the VirtualFileSystem API is beautifully &lt;a href="http://mavenrepo.fzi.de/semweb4j.org/site/semfs/apidocs/index.html"&gt;documented&lt;/a&gt; with nice clickable dependency graphs and stuff. WebDAV server implementations are really nasty.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;The one in &lt;a href="http://jakarta.apache.org/slide/"&gt;Jakarta slide&lt;/a&gt; is weird and discontinued.&lt;/li&gt;
&lt;li&gt;The &lt;a href="http://jackrabbit.apache.org/jackrabbit-webdav-library.html"&gt;implementation from JackRabbit&lt;/a&gt; is full of funky factories, providers and workspaces.&lt;/li&gt;
&lt;li&gt;The &lt;a href="http://www.alfresco.com/products/aifs/"&gt;server in Alfresco&lt;/a&gt; is LGPL and &lt;i&gt;huge&lt;/i&gt;.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Do you know another decent WebDAV server in Java where we can hook our own semantics underneath? &lt;/li&gt;
&lt;/ul&gt;For WebDAV clients, there is the nice &lt;a href="http://code.google.com/p/sardine/"&gt;sardine &lt;/a&gt;project which has everything you want (besides a pom - inside joke).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-7441561863863880915?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/ZME4DBYsWAw" height="1" width="1"/&gt;</content><link rel="related" href="http://semfs.semweb4j.org" title="SemFS making progress" /><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/7441561863863880915/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=7441561863863880915" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/7441561863863880915?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/7441561863863880915?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/ZME4DBYsWAw/semfs-making-progress.html" title="SemFS making progress" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.xam.de/2010/02/semfs-making-progress.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UNQX44eip7ImA9WxBVE0w.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-2769276662198140432</id><published>2010-02-16T12:21:00.000+01:00</published><updated>2010-02-16T12:21:30.032+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-16T12:21:30.032+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="dev" /><category scheme="http://www.blogger.com/atom/ns#" term="podcast" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>SoftwareArchitekTOUR (Podcast)</title><content type="html">Eine schöne deutsche Einführung zu REST gibt es in &lt;a href="http://www.heise.de/developer/artikel/Episode-17-Einstieg-in-REST-921652.html"&gt;Folge 17&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-2769276662198140432?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/KRdACi8fqzY" height="1" width="1"/&gt;</content><link rel="related" href="http://www.heise.de/developer/podcast/" title="SoftwareArchitekTOUR (Podcast)" /><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/2769276662198140432/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=2769276662198140432" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/2769276662198140432?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/2769276662198140432?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/KRdACi8fqzY/softwarearchitektour-podcast.html" title="SoftwareArchitekTOUR (Podcast)" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.xam.de/2010/02/softwarearchitektour-podcast.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08BSX49fyp7ImA9WxBXGEg.&quot;"><id>tag:blogger.com,1999:blog-5858414.post-4418399022893653690</id><published>2010-01-30T14:57:00.000+01:00</published><updated>2010-01-30T14:57:38.067+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-30T14:57:38.067+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="usability" /><category scheme="http://www.blogger.com/atom/ns#" term="wiki" /><category scheme="http://www.blogger.com/atom/ns#" term="iphone" /><title>iPhone Wiki Usability</title><content type="html">This week I started to experiment with the Trunk Notes wiki for iPhone. The wiki engine on the iPhone is impressive, it has many features that makes a power user happy. I really like the clever use of the application badge, which can show the number of wiki pages tagged with a certain tag, e.g. with 'ToDo".&lt;br /&gt;
&lt;br /&gt;
As mentioned in my last post, I want sync. I looked at Trunk Notes export format, and it looks nice. It uses clean UTF-8 encoding, and a simple syntax. The basic syntax is:&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Header: Data&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Header: Date&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Wiki text ...&lt;/div&gt;&lt;br /&gt;
So the headers look just like HTTP headers, separated by colon and terminated by new lines.&lt;br /&gt;
However, I am not entriely sure how the engine know where the real content starts, i.e., what happens if I start a page with:&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Today: Big goals ahead&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Tomorrow: The world :-)&lt;/div&gt;&lt;br /&gt;
Next I looked into ways of creating an online wiki with Markdown syntax. Finally I stumbled over this sentence on the &lt;a href="http://daringfireball.net/projects/markdown/"&gt;markdown page&lt;/a&gt;: "&lt;i&gt;The overriding design goal for Markdown’s formatting syntax is to make it as readable as possible.&lt;/i&gt;" That is certainly a nice design goal and markdown syntax reads &lt;i&gt;really &lt;/i&gt;nice in a text editor, &lt;b&gt;but &lt;/b&gt;I don't want to have to type this on my iPhone.&lt;br /&gt;
&lt;br /&gt;
So, what would be a good wiki syntax for the iPhone? Having researched &lt;a href="http://semanticweb.org/wiki/WikiPipes"&gt;many wiki syntaxes and written many converters&lt;/a&gt;, I have settled for STIF. &lt;a href="http://semanticweb.org/wiki/Structured_Text_Interchange_Format"&gt;STIF is a subset of HTML that contains only the essential elements&lt;/a&gt;. No wiki syntax needs to support more, but most wiki syntax should at least support STIF. That is my opinion after having looked into many wiki syntax.&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Ok, so here are the next two steps that should be taken for an iPhone wiki syntax:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Analyse the iPhone text entry capabilities&lt;/li&gt;
&lt;li&gt;Map them to STIF&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;iPhone Text Entry Analysis&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Reachable with 1 click: &lt;b&gt;A-Z&lt;/b&gt; (at the begin of a sentence), &lt;b&gt;a-z&lt;/b&gt; within a word. Equally easy: " " (space).&lt;/li&gt;
&lt;li&gt;With 2 clicks: 0-9, "-", "/", ":", ";", "(", ")", "€", "&amp;amp;", "@" '"', ".", ",", "?", "!", "'"&lt;/li&gt;
&lt;li&gt;With 3 clicks:&amp;nbsp; "[]{}#%^*+=_\|~&amp;lt;&amp;gt;$",(pound sign), (yen sign), (bullet), ".,?!'"&lt;/li&gt;
&lt;/ul&gt;Best characters to mix with letters &lt;i&gt;and &lt;/i&gt;numbers are obviusly ".,?!'", as they are reachable in both cases with 1 or 2 clicks.&lt;br /&gt;
&lt;br /&gt;
The fastest way would be to create a wiki syntax from letters only, e.g., write&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;XXX my headline&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;here we list fruits&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;o Apple&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;o Banana&lt;/div&gt;&lt;br /&gt;
to mean&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;h1&gt;my headline&lt;/h1&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;here we list fruits&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;li&gt;Apple&lt;/li&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;li&gt;Banana&lt;/li&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;/ul&gt;&lt;br /&gt;
However, we see already that using "XXX" (or "Xxx", or "xxx") might (a) conflict with other syntax and (b) already requires to tap three times. Obviously we need to find out what the most frequently used formatting instructions are. For me, they are in order of appearance:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Bulleted lists (also nested ones)&lt;/li&gt;
&lt;li&gt;WikiLinks -- are perfectly handled by the iPhone keyboard&lt;/li&gt;
&lt;li&gt;http:// links (usually created by copy and paste)&lt;/li&gt;
&lt;li&gt;Strong (to find stuff easier in long wiki pages)&lt;/li&gt;
&lt;li&gt;Headlines (one or two types suffice for me)&lt;/li&gt;
&lt;/ul&gt;Let me know your preferences from the &lt;a href="http://semanticweb.org/wiki/Structured_Text_Interchange_Format#Specification"&gt;STIF specification&lt;/a&gt; before I will actually create an iPhone wiki syntax and try to convince the Trunke Notes developer to implement it as an option ;-)&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5858414-4418399022893653690?l=blog.xam.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MaxVlkel/~4/C4JicSgO_6Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.xam.de/feeds/4418399022893653690/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5858414&amp;postID=4418399022893653690" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/4418399022893653690?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5858414/posts/default/4418399022893653690?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaxVlkel/~3/C4JicSgO_6Y/iphone-wiki-usability.html" title="iPhone Wiki Usability" /><author><name>Max Völkel</name><uri>http://www.blogger.com/profile/04168131948263827812</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_vlq_h3spDco/SPdST6Cy0MI/AAAAAAAACCQ/pNIgMD0m1AQ/S220/max30.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.xam.de/2010/01/iphone-wiki-usability.html</feedburner:origLink></entry></feed>

