<link rel="canonical" href="http://blog1.vorburger.ch/" />
<meta http-equiv="refresh" content="30;url=http://blog1.vorburger.ch/" />
<?xml version='1.0' encoding='windows-1252'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2467619</id><updated>2012-07-14T03:25:58.202+02:00</updated><category term='java'/><title type='text'>Michael Vorburger's Blog</title><subtitle type='html'></subtitle><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default?start-index=26&amp;max-results=25'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.vorburger.ch/blog1/atom.xml'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>43</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2467619.post-5233174751389810615</id><published>2012-07-14T03:25:00.001+02:00</published><updated>2012-07-14T03:25:55.931+02:00</updated><title type='text'>This blog has moved</title><content type='html'>&lt;br /&gt;       This blog is now located at http://blog1.vorburger.ch/.&lt;br /&gt;       You will be automatically redirected in 30 seconds or you may click &lt;a href='http://blog1.vorburger.ch/'&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;       For feed subscribers, please update your feed subscriptions to&lt;br /&gt;       http://blog1.vorburger.ch/feeds/posts/default.&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-5233174751389810615?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/5233174751389810615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=5233174751389810615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/5233174751389810615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/5233174751389810615'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2012/07/this-blog-has-moved_14.html' title='This blog has moved'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-7591918531393946531</id><published>2012-07-14T03:21:00.001+02:00</published><updated>2012-07-14T03:21:12.817+02:00</updated><title type='text'>This blog has moved</title><content type='html'>&lt;br /&gt;       This blog is now located at http://blog1.vorburger.ch/.&lt;br /&gt;       You will be automatically redirected in 30 seconds or you may click &lt;a href='http://blog1.vorburger.ch/'&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;       For feed subscribers, please update your feed subscriptions to&lt;br /&gt;       http://blog1.vorburger.ch/feeds/posts/default.&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-7591918531393946531?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/7591918531393946531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=7591918531393946531' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/7591918531393946531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/7591918531393946531'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2012/07/this-blog-has-moved.html' title='This blog has moved'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-7444160238729108578</id><published>2010-03-07T01:56:00.001+01:00</published><updated>2010-03-07T02:00:59.886+01:00</updated><title type='text'>Pranav Mistry's SixthSense - on an Android-based wearable projector+webcam platform?</title><content type='html'>A visiting family friend of ours pointed me to &lt;a href="http://www.pranavmistry.com/projects/sixthsense/"&gt;Pranav Mistry's SixthSense&lt;/a&gt;.  If you haven't seen this already, do watch the Videos - it's really Pretty Cool Stuff.&lt;br /&gt;&lt;br /&gt;A few days later I still can't stop thinking about this.  I've started pondering about how far out in the future this amazing concept may be (in a commercialized consumer available variant) - or how close actually?  What you need to make this happen is, probably:  1. a "reasonably powerful" portable computing platform,  2. wearable projector,  3. wearable capturing thing (something which senses where your finger / foot whatever points to / moves around on the projected image),  4. software with touch interface, and more.&lt;br /&gt;&lt;br /&gt;The 1. portable computing platform could be e.g. an Android-powered device. It occurred to me to Google for "android projector", and doing that you'll discover e.g. the upcoming &lt;a href="http://www.google.com/search?q=Samsung+Beam"&gt;Samsung Beam&lt;/a&gt;, a small Android-based device from Samsung with a built-in projector/beamer (using a "DLP pico projector", whatever that is).  I doubt it has capturing of what it projects.&lt;br /&gt;&lt;br /&gt;Pranav's "current prototype system" which "costs approximate $350 to build" seems to be using a standard off-the-shelve webcam (and some "magic" software, or is this easier to do than I realize?).  Hook that up to an Android... isn't quite possible yet, from what I found in &lt;br /&gt;&lt;a href="http://code.google.com/p/android/issues/detail?id=738"&gt;Android's Issue 738 about "missing support for the USB host feature"&lt;/a&gt;, but that's surely just a question of a little bit more time?  (Or directly using an Android's device built-in camera? But wouldn't the projector and the cam have to be calibrated together so the capturing works?)&lt;br /&gt;&lt;br /&gt;And then some smart software, certainly.  A touch-based platform seems a good foundation?&lt;br /&gt;&lt;br /&gt;So this could actually be made possible in a closer future than some may think.&lt;br /&gt;&lt;br /&gt;Wouldn't this be... "neat", or what?  I would love to be able to look more into this...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-7444160238729108578?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.pranavmistry.com/projects/sixthsense/' title='Pranav Mistry&apos;s SixthSense - on an Android-based wearable projector+webcam platform?'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/7444160238729108578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=7444160238729108578' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/7444160238729108578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/7444160238729108578'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2010/03/pranav-mistrys-sixthsense-on-android.html' title='Pranav Mistry&apos;s SixthSense - on an Android-based wearable projector+webcam platform?'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-4243808342130825873</id><published>2009-11-26T22:02:00.000+01:00</published><updated>2009-11-26T22:02:41.443+01:00</updated><title type='text'>JPA Id/Object References always, with Null Objects, a Pattern?</title><content type='html'>An object has references to other objects. A row in a relational database table has foreign keys (FK) to rows in other tables.&lt;br /&gt;&lt;br /&gt;While this basic "impedence mismatch" between the model used in the relational datastores prevalent in the enterprise today (RDBMS) and an object model (OO) is well understood and addressed by today's Object Relational Mapping (ORM) technologies, there is a specific use case which (AFAIK) is typically not easily addressed by how today's ORMs are used: What if, sometimes, you need that FK directly?&lt;br /&gt;&lt;br /&gt;Imagine, in pseudo code (you get the idea) : class A { long id; B b; ... } &amp;amp; class B { long id; ... }. In certain situations, it would be handy, and feel natural from the OO point of view, if you could just ask for a.b.id. Alas this typically leads to "lazy loading", a delayed access with a SELECT FROM b ... in an ORM. If you really just want the b.id, this deferred RDBMS access makes no sense of course.&lt;br /&gt;&lt;br /&gt;The "problem" why normally this doesn't work when using e.g. a Java Persistence API (JPA) implementation ORM is that relation fields in entity instances returned by a query (or an EM's "get one" find() method) are normally either fully initialized because the field was actually annotated as &lt;a href="http://www.j2ee.me/javaee/5/docs/api/javax/persistence/FetchType.html" target="_blank"&gt;FetchType.EAGER&lt;/a&gt;, or because a &lt;a href="http://openjpa.apache.org/builds/latest/docs/manual/jpa_overview_query.html#jpa_overview_join_fetch" target="_blank"&gt;JOIN FETCH in a JPQL Query&lt;/a&gt; (standardized by the specification, not implementation specific) requested it to be, or due to some JPA implementation specific API such as the &lt;a href="http://openjpa.apache.org/builds/latest/docs/manual/ref_guide_fetch.html" target="_blank"&gt;OpenJPA FetchPlan API&lt;/a&gt; which asked for that (all of which leads to table JOINs and/or additional SELECT queries), or null if none of that is used.&lt;br /&gt;&lt;br /&gt;The JPA specification must have had use cases like these in mind, and offers a concept of interest in this context, namely the probably less well known &lt;a href="http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html#getReference%28java.lang.Class,%20java.lang.Object%29" target="_blank"&gt;T getReference(Class&amp;lt;T&amp;gt; entityClass, Object primaryKey) method of an EntityManager&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Furthermore, it turns out that e.g. B's id is in fact typically already available to the ORM internally after it read an A, even if the A's b field is still null. This makes sense, and is how the lazy loading stuff normally works behind the scenes in all ORMs AFAIK (that's how they do one and not two SELECT statements when lazy loading).&lt;br /&gt;&lt;br /&gt;It occurred to me that it would be really handy if all relationship fields of an Entity were always initialized, either with a full blown real object if the field really was eagerly fetched, or with whatever kind of "hollow" object getReference() created efficiently (typically only the object's id fields composing the oid). This would make the a.b.id example from above work for both the "eager" and the "lazy" scenario homogeneously, efficiently &amp;amp; very naturally!&lt;br /&gt;&lt;br /&gt;With a little bit of unfortunately unavoidable hacking to access one JPA implementation's internals (OpenJPA in my example), needed because the JPA public API (both v1 and v2) does not allow direct access to that internal A's B id, the loaded state, and a getReference() from within a @PostLoad without access to an EntityManager, this idea does work indeed, as demonstrated in &lt;a href="http://www.vorburger.ch/files/openJPA_CallbackIdea_Pattern.zip"&gt;my example project's test case&lt;/a&gt;. (Other JPA implementations likely would allow similar direct access to its data structures? The only thing in the example that would need to be "ported" to another ORM such as e.g. EclipseLink and Hibernate is factored in the JPAHelper class... if anybody is interested in trying this out?)&lt;br /&gt;&lt;br /&gt;One interesting side effect I ran into while looking at this and trying to get a running sample was the case of e.g. A's b really having to be null - because the say b_id FK in the A table IS actually NULL in the DB (if it's optional / nullable). I thought it would be good if you could STILL do a.b.id (always), with that expression (access path) simply returning null (or 0 if the id field is of an e.g. primitive int or long type instead of a Integer or Long object) in that case, but never causing a NullPointerException.&lt;br /&gt;&lt;br /&gt;The initial inspiration for that was how the new &lt;a href="http://www.scala-lang.org/"  target="_blank"&gt;Scala programming language&lt;/a&gt; appears to (normally? from what I understood so far; I'm only half way through &lt;a href="http://oreilly.com/catalog/9780596155957/index.html" target="_blank"&gt;my Scala book&lt;/a&gt;!) prevent NullPointerExceptions altogether. Then a good colleague pointed out that conceptually this is of course nothing new, and not specific to Scala - it's the &lt;a href="http://en.wikipedia.org/wiki/Null_Object_pattern" target="_blank"&gt;Null Object pattern&lt;/a&gt; at work. So I threw in a bit of Null JPA Entity objects, and the interplay of my Reference object idea above with the application of the null object pattern here seems really neat.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.vorburger.ch/files/openJPA_CallbackIdea_Pattern.zip"&gt;Download the "JPA Id/Object References always, with Null Objects" example project&lt;/a&gt; to have a closer look at running code demonstrating this idea. - Do you like this approach? Is this a "pattern"? Could &amp;amp; should future JPA specification standardize support for such a usage?&lt;br /&gt;&lt;br /&gt;Acknowledgments: Thanks to Yann Andenmatten for always inspiring feedback &amp;amp; discussions, and the dynamic/runtime AOP-ish NullEntityFactory contribution to the example project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-4243808342130825873?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.vorburger.ch/files/openJPA_CallbackIdea_Pattern.zip' title='JPA Id/Object References always, with Null Objects, a Pattern?'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/4243808342130825873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=4243808342130825873' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/4243808342130825873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/4243808342130825873'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2009/11/jpa-idobject-references-always-with.html' title='JPA Id/Object References always, with Null Objects, a Pattern?'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-6838375176939968345</id><published>2009-10-21T22:17:00.006+02:00</published><updated>2009-10-29T20:09:09.944+01:00</updated><title type='text'>Customer Loyalty (KISSfp)</title><content type='html'>Recently I received one of the more fascinating emails in quite a while. Quite an experience, really. With Bill's permission, here it is:&lt;br /&gt;&lt;blockquote&gt;Hi, Mike,&lt;br /&gt;&lt;br /&gt;Sorry to bother you at this email, but I keep getting rejection notices from sending this to your KISSfp email address.&lt;br /&gt;&lt;br /&gt;I have a dying PC with KISSfp installed on it and I need to reinstall it on another computer.&lt;br /&gt;&lt;br /&gt;Unfortunately, the only copy of an install program I have is the trial version (2MB). Can I download the live version somewhere? The link from my original order confirmation is no longer valid.&lt;br /&gt;&lt;br /&gt;Thanks!&lt;br /&gt;Bill&lt;br /&gt;&lt;br /&gt;Here's a copy of my order confirmation:&lt;br /&gt;&lt;br /&gt;&amp;gt; Subject: Order #1234567 Purchase Information&lt;br /&gt;&amp;gt; Date: 23 Sep 2000&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; Your order has been approved - thank you for your purchase!&lt;br /&gt;&lt;br /&gt;&amp;gt; Order SUMMARY&lt;br /&gt;&amp;gt; =============&lt;br /&gt;&amp;gt; Order #:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1234567&lt;br /&gt;&amp;gt; Purchase Date:&amp;nbsp;&amp;nbsp;&amp;nbsp; 9/23/00&lt;br /&gt;&amp;gt; Purchase Amount:&amp;nbsp; USD 49.95&lt;br /&gt;&amp;gt; Last Name:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XXX&lt;br /&gt;&amp;gt; Nighttime Phone:&amp;nbsp; 123.123.1234&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt;&amp;nbsp;&amp;nbsp; (1)&amp;nbsp;&amp;nbsp; KISSfp Microsoft FrontPage FTP Add-On - Business Edition for Commercial Webs&lt;br /&gt;&lt;/blockquote&gt;Now, if you don't understand why "fascinating experience", just check out the dates... Bill purchased a KISSfp license in 2000, and is contacting me today (October 2009) asking for support - 9 years on! Quite a lesson in Customer Loyalty, isn't it? Nine years is an eternity... since I created my &lt;a href="http://www.vorburger.ch/kissfp/"&gt;KISSfp "Microsoft FrontPage FTP Add-On" tool&lt;/a&gt;.  So many things have happened since: I have moved from Switzerland to Italy to Switzerland to California/USA to Switzerland... got married to an amazing wife... had two wonderful kids... &lt;a href="http://www.vorburger.ch/corejdo/"&gt;wrote a book&lt;/a&gt;... not to speak about four great day jobs, .. and much more of course.  Man. Man!&lt;br /&gt;&lt;br /&gt;As I just got quite nostalgic, I dug into my "rummaging old, moldy files" (Bill in our email exchange following his request), and here is the full disclosure history of KISSfp: It all started in April 1998 (the pure C/CLI version), with some work done during my exchange year in Torino (thank you, Massimo, and Daniele!). Around Summer/September 1998, I appear to have started with the Borland C++ Builder-based GUI, coding away at least partly during the nights while interning during the day &lt;a href="http://ipb.org/"&gt;at the IPB in Geneva&lt;/a&gt; (thank you Jo &amp;amp; Adam for proof-reading the help!), with what eventually became the 2.0 (initially "professionally" packaged &amp;amp; released in February 1999; see also &lt;a href="http://www.vorburger.ch/kissfp/version-history.html"&gt;KISSfp Version History&lt;/a&gt;).  Further developments during the summer of 1999, and if I recall right from then on more time spent on stuff like online marketing, the whole Digital River / NetSales story, my referral program, the MenuPlus partnership with Jeff (where are you, Jeff?), the inclusion in the &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=5f3b1157-051d-4b7f-a1b8-a7ca223ea157"&gt;Microsoft Office Update Vendor Program&lt;/a&gt; in April/May 1999 (yeah!), at least one FrontPage book ("Master Visually FrontPage 2002") but probably others with CDs including KISSfp, that PreviewSystems VBox thing (now apparently Aladdin.com HASP; how ridiculous all that seems in retrospect from today's day and age where I live daily using open source Java enterprise components), with increasingly fairly intensive daily technical support (thank you, Divvya!), well into 2000... and ultimately priorities in life starting to shift significantly about 2001 I think, with rapidly less time available for KISSfp.&lt;br /&gt;&lt;br /&gt;For Bill and anybody else who may still be out there, I have finally made available &lt;a href="http://www.vorburger.ch/files/KISSfp21-Free-2009.zip"&gt;a free/non-VBoxed/unlocked version of KISSfp&lt;/a&gt; publicly ... To use it, first run the KISSFP21.EXE which is that classic setup installer, and then run kissfp20-pvtkey.exe or kissfp20-buskey.exe once and it will be "registered" - you'll have the same app that you could purchase in the those golden days, and it seems to still run just fine on XP today! - PS: The installer EXE doesn't seem to quit and hand around (I think it always was like that), so you should may be log out and re-login to be clean.&lt;br /&gt;&lt;br /&gt;Hey, ya all out there, loyal KISSfp users (if there are any others than Bill left?!), starting with the &lt;a href="http://www.vorburger.ch/kissfp/feedback.html"&gt; enthusiastic early ones&lt;/a&gt; and the at least many hundreds if not (probably) few thousands total along the road - it was a great time!  Thank you.&lt;br /&gt;&lt;br /&gt;KISSfp, forever!&lt;br /&gt;&lt;br /&gt;Take care.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-6838375176939968345?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.vorburger.ch/kissfp/' title='Customer Loyalty (KISSfp)'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/6838375176939968345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=6838375176939968345' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/6838375176939968345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/6838375176939968345'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2009/10/customer-loyalty-kissfp.html' title='Customer Loyalty (KISSfp)'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-6881237801411428856</id><published>2009-10-20T00:05:00.003+02:00</published><updated>2009-10-20T00:38:27.228+02:00</updated><title type='text'>Privacy, Firefox Geolocation, Google Location Service</title><content type='html'>I vaguely knew there was something like a &lt;a href="http://www.w3.org/TR/geolocation-API/"&gt;W3C Geolocation API&lt;/a&gt;, had earlier read about the &lt;a href="http://code.google.com/p/gears/wiki/GeolocationAPI"&gt;Google Gears Geolocation API&lt;/a&gt;, figured &lt;a href="http://developer.yahoo.com/geo/"&gt;Yahoo had some Geo Technologies&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I had heard this works on recent mobile devices with built-in GPS, or exploiting cellphone network antenna/network  triangulation, with the built-in browsers hooking into the mobile OS and exposing this information, but had always assumed that at home on a lapotp with a classic browser this wouldn't apply - how could it?&lt;br /&gt;&lt;br /&gt;Then I stumbled upon the &lt;a href="http://www.mozilla.com/en-US/firefox/geolocation/"&gt;Geolocation support built-into &lt;/a&gt;&lt;a href="http://www.mozilla.com/en-US/firefox/geolocation/"&gt;Firefox 3.5&lt;/a&gt;, and unsuspectingly clicked "Give it a try!" on the Mozilla.com test page, and... WTF, HOW DO THEY KNOW MY EXACT ADDRESS?? I live on a small street, and just looking at the map there is no doubt that "they" know the exact street - not just the area. (They being Google here, as &lt;i&gt;"Firefox gathers information about nearby wireless access points and your computer’s IP address. Then Firefox sends this information to the default geolocation service provider, Google Location Services, to get an estimate of your location.")&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Now, IP-based Geolocation is old news, you could figure out "geolocation" years ago by looking at the DNS names of the router hops shown by a traceroute, but unless my ISP in Switzerland shares details about their network topology with Google, how did this now get to street-level granularity?!&lt;br /&gt;&lt;br /&gt;I know more recently there is this WiFi and cellphone tower triangulation stuff, but unless I'm totally not getting it, Firefox could only know my home WiFi SSID, so what? Or I guess may be it can ask the OS for the names of all access points currently being picked up, but still, it's a residential area, they're just neighbors, "they" couldn't have geolocation data on all of them?! And even so, WiFi SSIDs aren't exactly GUIDs..&lt;br /&gt;&lt;br /&gt;Now generally speaking I am not a privacy maniac (e.g. I didn't quite "get" the surprising reactions in Switzerland when Google Street View came online recently; that's all already in public anyways!), but here I got... I don't know. Yeah yeah, Firefox respects my privacy and there is this toolbar thingie asking every time if I really do want to share my location... but isn't it still a bit... you know, scary?&lt;br /&gt;&lt;br /&gt;PS: Curiously, the &lt;a href="http://de.www.mozilla.com/de/firefox/geolocation/"&gt;German version of that same Mozilla page&lt;/a&gt; thinks I'm in "Zurich" (I'm actually about 200km away from it!), and once I visited that even the English page forgot what it first knew, and also said Zurich. But a browser restart and visiting the English page again returns its 007 insight I first noticed. For a moment I suspected that may be Google is simply exploiting my account cookie (which wouldn't be very "location" aware at all), but a test where I logged out of Google and then went to the Mozilla page showed that probably it's got nothing to do with that.&lt;br /&gt;&lt;br /&gt;PPS: After having already posted the above, a test/idea occurred to me: I completely switched off the WiFi on the laptop that I'm trying/writing all this from, and got a good old ethernet cable out of the drawer and plugged that into the ADSL router at home. Interestingly, it thought I was in Zurich again! (I noticed you have to best restart the browser for such tests, but then it's definitely repeatable.) So apparently this IS based on WiFi names then (really just SSID names, or do "they" have any other more GUID-like info available??), not simple IP-based location tracking. So "somebody" presumably drove by here, detected/measured and mapped out my and our neighbours access points, and recorded all this in one fr%*#ing global DB?? This is crazy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-6881237801411428856?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.mozilla.com/en-US/firefox/geolocation/' title='Privacy, Firefox Geolocation, Google Location Service'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/6881237801411428856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=6881237801411428856' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/6881237801411428856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/6881237801411428856'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2009/10/privacy-firefox-geolocation-google.html' title='Privacy, Firefox Geolocation, Google Location Service'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-6332849102111296586</id><published>2009-10-12T10:31:00.004+02:00</published><updated>2009-10-29T23:34:54.749+01:00</updated><title type='text'>Links for kids, learning websites &amp; software</title><content type='html'>&lt;div&gt;Here is a list of some links to learning websites &amp;amp; software for kids which others may find useful, from my &lt;a href="http://delicious.com/vorburger/learning"&gt;delicious.com bookmarks&lt;/a&gt;. Most I've them I have myself used with my son Dév:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li style="font-weight: bold;"&gt;&lt;a href="http://www.starfall.com/"&gt;http://www.starfall.com&lt;/a&gt; - Great Spelling site (English)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.literacycenter.net/"&gt;http://www.literacycenter.net&lt;/a&gt; - Spelling (English, French, German, Spanish), but not as cool as Starfall&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.home-2009.com/"&gt;http://www.home-2009.com&lt;/a&gt; - Movie Nature&lt;/li&gt;&lt;li&gt;&lt;a href="http://fr.vikidia.org/"&gt;http://fr.vikidia.org&lt;/a&gt; - Wikipedia pour Enfants (French)&lt;/li&gt;&lt;li&gt;&lt;a href="http://fr.wikimini.org/"&gt;http://fr.wikimini.org&lt;/a&gt; - Wikipedia pour Enfants (French)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.bbc.co.uk/cbeebies/"&gt;http://www.bbc.co.uk/cbeebies/&lt;/a&gt; - BBC CBeebies (great also for smaller kids)&lt;/li&gt;&lt;li&gt;&lt;a href="http://pbskids.org/caillou/"&gt;http://pbskids.org/caillou/&lt;/a&gt; - Caillou Dinos from &lt;a href="http://pbskids.org/"&gt;http://pbskids.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sdnhm.org/kids/dinosaur/"&gt;http://www.sdnhm.org/kids/dinosaur/&lt;/a&gt; - Dinos&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cotf.edu/ete/modules/msese/dinosaur.html"&gt;http://www.cotf.edu/ete/modules/msese/dinosaur.html&lt;/a&gt; - Dinos&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;And the following are some great (free) learning software to download, not websites:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li style="font-weight: bold;"&gt;&lt;a href="http://scratch.mit.edu/"&gt;http://scratch.mit.edu&lt;/a&gt; - Great! (I teach Scratch classes in the local community myself)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.phunland.com/"&gt;http://www.phunland.com&lt;/a&gt; - A cool physics simulator which is quite easy&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.planet-plopp.com/en/download.html"&gt;http://www.planet-plopp.com&lt;/a&gt; - Plopp, easy 3d painting&lt;/li&gt;&lt;li&gt;&lt;a href="http://gcompris.net/"&gt;http://gcompris.net&lt;/a&gt; - GCompris various Fun Games&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.schoolsplay.org/"&gt;http://www.schoolsplay.org&lt;/a&gt; - Childsplay and others various games&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.bbc.co.uk/sn/prehistoric_life/"&gt;http://www.bbc.co.uk/sn/prehistoric_life/&lt;/a&gt; - Dinosaur World&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Lastly here are some thing that look interesting but that we haven't looked much at yet, and which are probably of interest for slightly older kids than the above:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.alice.org/"&gt;http://www.alice.org&lt;/a&gt; - Looks VERY interesting, hoping to look at this more later, with the idea to build a post-Scratch courses?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.laptop.org/go/DrGeo"&gt;http://wiki.laptop.org/go/DrGeo&lt;/a&gt; - Dr. Geo, Geometry&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.geogebra.org/"&gt;http://www.geogebra.org&lt;/a&gt; - Geometry as well&lt;br /&gt;&lt;/li&gt;&lt;li style="font-style: italic;"&gt;&lt;a href="http://www.greenfoot.org"&gt;http://www.greenfoot.org&lt;/a&gt; - Programming, another one&lt;br /&gt;&lt;/li&gt;&lt;li style="font-style: italic;"&gt;&lt;a href="http://mia.openworldlearning.org/"&gt;http://www.microworlds.com&lt;/a&gt; &amp;amp; &lt;a href="http://mia.openworldlearning.org/"&gt;http://mia.openworldlearning.org&lt;/a&gt; - More programming&lt;/li&gt;&lt;li&gt;&lt;a style="font-style: italic;" href="http://www.simplecodeworks.com/"&gt;http://www.simplecodeworks.com&lt;/a&gt;&lt;span style="font-style: italic;"&gt; - More programming&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-6332849102111296586?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://delicious.com/vorburger/learning' title='Links for kids, learning websites &amp; software'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/6332849102111296586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=6332849102111296586' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/6332849102111296586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/6332849102111296586'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2009/10/links-for-kids-learning-websites.html' title='Links for kids, learning websites &amp; software'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-8078361630369889390</id><published>2009-08-24T10:34:00.004+02:00</published><updated>2009-08-24T11:24:34.898+02:00</updated><title type='text'>xText Standalone Setup Parsing a DSL from a String without EMF Resource</title><content type='html'>I have been playing with &lt;a href="http://www.eclipse.org/Xtext/"&gt;xText&lt;/a&gt;, a very interesting framework for development of textual domain specific languages (DSLs).&lt;br /&gt;&lt;br /&gt;My interest is around an (existing, legacy) expression language, and twofold: a) build a  strong Eclipse editor, b) build an interpreter for a non-Eclipse application runtime. XText is really great for the first. Here is how to use the xText generated parser in a "standalone" non-Eclipse application, based on their generated Google Guice setup infrastructure, without having to go through the EMF ECore Resource XtextResource:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;String t = "...";&lt;br /&gt;Injector guiceInjector = new MyDSLStandaloneSetup().createInjectorAndDoEMFRegistration();&lt;br /&gt;IParser parser = guiceInjector.getInstance(IAntlrParser.class);&lt;br /&gt;IParseResult result = parser.parse(new StringInputStream(t));&lt;br /&gt;List&amp;lt;SyntaxError&amp;gt; errors = result.getParseErrors();&lt;br /&gt;Assert.assertTrue(errors.size() == 0);&lt;br /&gt;EObject eRoot = result.getRootASTElement();&lt;br /&gt;MyDSLRoot root = (MyDSLRoot) eRoot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Filed a minor item on https://bugs.eclipse.org/bugs/show_bug.cgi?id=287413 to may be have them include something like this in the official xText documentation.&lt;br /&gt;&lt;br /&gt;PS: I am not entirely sure that StringInputStream properly always converts all (Unicode) characters into bytes for an InputStream?  (But that's another topic... the whole StringBufferInputStream deprecated story, the StringReader alternative which I guess would require that xText can feed the the Antlr Lexer a Reader instead of an InputStream... could it?  That org.eclipse.xtext.util.StringInputStream is just a String.getBytes(), which "uses the platform's default encoding", is that safe?)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-8078361630369889390?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.eclipse.org/Xtext/documentation/latest/xtext.html#RuntimesetupISetup' title='xText Standalone Setup Parsing a DSL from a String without EMF Resource'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/8078361630369889390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=8078361630369889390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/8078361630369889390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/8078361630369889390'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2009/08/xtext-standalone-setup-parsing-dsl-from.html' title='xText Standalone Setup Parsing a DSL from a String without EMF Resource'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-7598335263245775329</id><published>2009-05-14T20:18:00.002+02:00</published><updated>2009-05-14T20:22:12.269+02:00</updated><title type='text'>GetterMethodsReflectionToStringBuilder</title><content type='html'>&lt;a href="http://commons.apache.org/lang/"&gt;Apache &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Commons&lt;/span&gt; Lang&lt;/a&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;has&lt;/span&gt; a &lt;a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/builder/ToStringBuilder.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;ToStringBuilder&lt;/span&gt;&lt;/a&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;which&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;is&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;sometimes&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;handy&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The other day I needed something like this which  "reflects" on public getters() instead of on private fields, so I hacked one; I call it the GetterMethodsReflectionToStringBuilder.&lt;br /&gt;&lt;br /&gt;Uploaded to &lt;a href="https://issues.apache.org/jira/browse/LANG-503"&gt;https://issues.apache.org/jira/browse/LANG-503&lt;/a&gt; as suggestion for Commons Lang 3.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-7598335263245775329?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='https://issues.apache.org/jira/browse/LANG-503' title='GetterMethodsReflectionToStringBuilder'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/7598335263245775329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=7598335263245775329' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/7598335263245775329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/7598335263245775329'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2009/05/gettermethodsreflectiontostringbuilder.html' title='GetterMethodsReflectionToStringBuilder'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-8849336505363569652</id><published>2008-08-07T01:24:00.002+02:00</published><updated>2008-08-07T02:39:37.639+02:00</updated><title type='text'>Testing OpenJPA SQL statements using a JDBCListener</title><content type='html'>I am currently designing something around &lt;a href="http://openjpa.apache.org/docs/latest/manual/ref_guide_fetch.html"&gt;FetchGroups in OpenJPA&lt;/a&gt;, and being a good Agile / Test Driven architect, I wanted to write a JUnit which asserts the actual SQL statement generated by this ORM (the purpose is to test the FROM/WHERE, the SQL should not include unncessary JOIN and columns, if that framework I'm building around FetchGroups works).&lt;br /&gt;&lt;br /&gt;Initially I went off looking into e.g. good ol' &lt;a href="http://www.p6spy.com/"&gt;P6spy&lt;/a&gt; (that's STILL around?). Then I mused around some (Spring?) AOP Interceptor for a JDBC Connection, &lt;a href="http://www.ibm.com/developerworks/java/library/j-aopwork10/#N1029D"&gt;this article on DW&lt;/a&gt; seemed a good starting point... But finally I realized that the following (OpenJPA specific; this is obviously not standard JPA) does the job perfectly (and may be useful to others, so posted here):&lt;br /&gt;&lt;pre&gt;public class RememberingLastStatementJDBCListener extends AbstractJDBCListener {&lt;br /&gt;&lt;br /&gt;private String lastSQL;&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void eventOccurred(JDBCEvent event) {&lt;br /&gt;  if (event.getSQL() != null) {&lt;br /&gt;      // Note: This will be called several times, for different event.getType(); but it doesn't matter for this use.&lt;br /&gt;      this.lastSQL = event.getSQL();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getLastSQL() {&lt;br /&gt;  return this.lastSQL;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and then in the JUnit you can do like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;RememberingLastStatementJDBCListener rememberingLastStatementJDBCListener;&lt;br /&gt;&lt;br /&gt;openJPAConnectionProperties.setProperty("openjpa.jdbc.JDBCListeners", RememberingLastStatementJDBCListener.class.getName());&lt;br /&gt;&lt;br /&gt;OpenJPAEntityManager oem = OpenJPAPersistence.cast(em);&lt;br /&gt;OpenJPAEntityManagerSPI oems = (OpenJPAEntityManagerSPI) oem;&lt;br /&gt;OpenJPAConfiguration configuration = oems.getConfiguration();&lt;br /&gt;JDBCConfiguration jdbcConfiguration = (JDBCConfiguration)configuration;&lt;br /&gt;JDBCListener[] jdbcListeners = jdbcConfiguration.getJDBCListenerInstances();&lt;br /&gt;for (JDBCListener listener : jdbcListeners) {&lt;br /&gt;if (listener instanceof RememberingLastStatementJDBCListener) {&lt;br /&gt;      rememberingLastStatementJDBCListener = (RememberingLastStatementJDBCListener) listener;          &lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;SomeEntity e = new SomeEntity();&lt;br /&gt;e.setName("Hallo World!");&lt;br /&gt;em.persist(e);&lt;br /&gt;&lt;br /&gt;// We *HAVE* to flush() at this point, otherwise the Listener won't (yet) have seen the Statement(s)&lt;br /&gt;em.flush();&lt;br /&gt;&lt;br /&gt;Assert.assertEquals("INSERT INTO APP.SOMEENTITY (ID, NAME) VALUES (?, ?)",&lt;br /&gt;rememberingLastStatementJDBCListener.getLastSQL());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Don't you love Open Source frameworks, where you can dig into the code and figure this kind of stuff out? ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-8849336505363569652?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/8849336505363569652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=8849336505363569652' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/8849336505363569652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/8849336505363569652'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2008/08/testing-openjpa-sql-statements-using.html' title='Testing OpenJPA SQL statements using a JDBCListener'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-5755294681417752119</id><published>2008-02-06T19:40:00.001+01:00</published><updated>2008-05-28T16:32:41.633+02:00</updated><title type='text'>liftConference Venture Night</title><content type='html'>I am at the &lt;a href="http://www.liftconference.com/venture-night-winners-announced"&gt;Venture Night&lt;/a&gt; of the &lt;a href="http://www.liftconference.com/"&gt;lift conference&lt;/a&gt; in Geneva this evening. It's an interesting change from the sort of things I think about in my current day job. Some thoughts about the companies that are presenting their startups on stage while I write this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;cocomment, UK: Bof. Some negative comments from audience and panel. Claims to be "leading web commenting platform". Can stuff that requires an IE/FF plug-in really make it truly big? Doesn't it overlap too much with existing blogging platforms?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Holistis: Track-your-sites-visitors. Haven't we seen this before? But, uhm - I came late, didn't look closely enough. Maybe interesting... I probably missed where the innovation lies.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;iO naturalinteraction.org, Italy: Something else, not yet another Web 2.0. Very cool video of like a kiosk for a shopping mall where you can look at e.g. product catalog like in ... that SciFi movie, with the police that can see the future? Where they move stuff with fingers on a table. Looks neat. Wasn't Microsoft showing off stuff very much like this about a year or so ago? It somehow looks very familiar. Maybe it's actually the same.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Mixin, Switzerland: Calendaring for Web2.0... match up free slots with your friends for fixing up time for a movie or something. People mention doppler and twitter. I wouldn't use it - but I don't use (nor at a personal level really "get") e.g. Facebook either... Still: Thumbs up!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Pixelux, Geneva: Innovative gaming graphics engine, something about new algorithms for simulating material physics or something. More f*# stupid war games. Oh well. Will be used in next StarWars game. Made it!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Viewdle: &lt;a href="http://www.vorburger.ch/projects/faces/index.html"&gt;Face recognition&lt;/a&gt; for Videos! Can I get this for Flickr and as an iPhoto plug-in, to tag family photos with who is on it? (I know it exists, saw some other Flickr-like online photo sharing thingie with face recognition stuff a while ago.) Kewl.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Wuala, Zurich: Interesting! Online disk stuff, with a P2P twist. From Zurich, out of ETHZ guys. Maybe I just like it because it actually responds to a need I currently have - I really need to start backing up my files somewhere online. Idea: You share local disk space for others against getting the same space from their P2P network.  You seem to know what your doing, I liked the speed of the guy's presentation. Classical business model - advertising and paying power users. - "We want to become the Skype of online storage". Well, good luck, guys!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Clipperz, Italy: Nah. Mixes basically interesting underlying "encryption for Web2.0" technology (something like this should be available in lower-level toolkits?) with not-so-exciting "password manager for all your Web acounts" - tried before, too niche.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-5755294681417752119?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.liftconference.com/venture-night-winners-announced' title='liftConference Venture Night'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/5755294681417752119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=5755294681417752119' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/5755294681417752119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/5755294681417752119'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2008/02/liftconference-venture-night.html' title='liftConference Venture Night'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-8417650624955404385</id><published>2007-06-23T02:07:00.000+02:00</published><updated>2007-06-23T04:18:47.014+02:00</updated><title type='text'>Google Maps Street View</title><content type='html'>I had heard about the new "Street View" in Google Maps earlier but just tried it for real tonight...&lt;br /&gt;&lt;br /&gt;To "walk" from my previous life office on 11 John Street over to Ground Zero and Battery Park, then zoom over to the west coast and drive around Sunnyvale (less pics) and Stanford's Palm drive -- it's freak' cool! Try it.&lt;br /&gt;&lt;br /&gt;Now let's mash this up with SecondLife somehow... (BTW, off-topic but still: &lt;a href="http://www.opencroquet.org/" target="_blank"&gt;OpenCroquet&lt;/a&gt; and maybe more so &lt;a href="https://lg3d-wonderland.dev.java.net/"&gt;lg3d-wonderland&lt;/a&gt; are kind of interesting; it's not about SL, it's the big picture behind of what is emerging with these...)&lt;br /&gt;&lt;br /&gt;PS, added after initial post of the above: &lt;a href="http://www.technologyreview.com/Infotech/18911/"&gt;Second Earth&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-8417650624955404385?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/8417650624955404385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=8417650624955404385' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/8417650624955404385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/8417650624955404385'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2007/06/google-maps-street-view.html' title='Google Maps Street View'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-116743488231299699</id><published>2006-12-30T00:18:00.000+01:00</published><updated>2007-01-17T12:11:13.484+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>JUnit in Ant Classpath Hell</title><content type='html'>&lt;p&gt;Running JUnit tests from an Ant build script - piece of cake?  Welcome to Classpath Hell.  Read &lt;a href="http://ant.apache.org/faq.html#delegating-classloader"&gt;the Ant FAQ &lt;/a&gt; for a taste of what to expect... (NOTE: Ant 1.7, which just came up, finally "solves" this, but most project are on Ant v1.6.5 not 1.7 yet.)&lt;/p&gt;Essentially, you have to either add the junit.jar to your global CLASSPATH system environment variable (very bad) or copy junit.jar to your %ANT_HOME%/lib or remove ant-junit.jar from %ANT_HOME%/lib (and have both ant-junit.jar and junit.jar in your project and then use an ant taskdef with classpath) - bad too.&lt;br /&gt;&lt;p&gt;The best I could think of to make this less painful is at least have a build script semi-transparently take care of this, by itself automatically copying a junit.jar to your %HOME%/.ant/lib (slightly better than %ANT_HOME%/lib probably) if it is not there yet... not perfect, as the build of a project thus "pollutes" a globally installed application - but apparently the best you can do?&lt;/p&gt;&lt;p&gt;Such an ant build script would look like this:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;target name="copyJUnitToAntClasspathIfNeeded" unless="isJUnitInAntClasspath"&amp;gt;&lt;br /&gt;  &amp;lt;fail unless="ant.library.dir" message="The ant variable ant.library.dir is not available... that's weired.  Please manually copy lib/junit.jar into the lib directory of where you installed ant"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;copy file="lib/junit-3.8.1.jar" todir="${user.home}/.ant/lib" verbose="true" /&amp;gt; &amp;lt;!-- Or ${ant.library.dir}, but user.home is probably better? --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;echo message="JUnit.jar had to be copied into the lib directory of your ant" /&amp;gt;&lt;br /&gt;&amp;lt;echo message="installation.  Please manually restart the build now." /&amp;gt;&lt;br /&gt;&amp;lt;echo message="(There is unfortunately no cleaner way to do this prior to Ant 1.7; see: " /&amp;gt;&lt;br /&gt;&amp;lt;echo message="http://ant.apache.org/faq.html#delegating-classloader)" /&amp;gt;&lt;br /&gt;&amp;lt;fail message="Please just launch this build once again, this is a one-time only behaviour." /&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="testIfJUnitInAntClasspath"&amp;gt;&lt;br /&gt;&amp;lt;available property="isJUnitInAntClasspath" classname="junit.framework.Test" /&amp;gt;&lt;br /&gt;&amp;lt;antcall target="copyJUnitToAntClasspathIfNeeded"/&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="test" depends="testIfJUnitInAntClasspath"&amp;gt;&lt;br /&gt;&amp;lt;junit ... /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-116743488231299699?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://ant.apache.org/faq.html#delegating-classloader' title='JUnit in Ant Classpath Hell'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/116743488231299699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=116743488231299699' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/116743488231299699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/116743488231299699'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2006/12/junit-in-ant-classpath-hell.html' title='JUnit in Ant Classpath Hell'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-116233053740115240</id><published>2006-10-31T22:25:00.000+01:00</published><updated>2006-11-02T19:42:44.856+01:00</updated><title type='text'>Propagating Acegi's Security Context in a WSS UsernameToken SOAP Header via XFire using wss4j</title><content type='html'>&lt;a href="http://xfire.codehaus.org/"&gt;XFire&lt;/a&gt; includes a &lt;a href="http://xfire.codehaus.org/WS-Security"&gt;ws-security example&lt;/a&gt;, which demonstrates how a SOAP Header with a Web Service Security (WSS) UsernameToken can be inserted into an outgoing request message, using Apache's wss4j library.  (The XFire ws-security example also demonstrates how to sign and/or encrypt a SOAP message, and how to use the WSS timestamp mechanism.)&lt;br /&gt;&lt;br /&gt;I needed this functionality to be available more easily for Java service consumers, in the sense of an implicit security context passing transparent to the programmer when invoking a service.  As Java API to set up a security context, Acegi from the Spring Framework should be used.&lt;br /&gt;&lt;br /&gt;Maybe first some brief background on WSS: A WSS UsernameToken is really just a username and password, in principle similar to HTTP BASIC authentication.  However HTTP BASIC delivers the credential at the transport level, whereas a WSS Header has the advantage of propagating a credential at the (SOAP) message level, thus allowing it to travel forward through several intermediaries.  For example, a message could move from a service consumer to a XML security gateway, to an ESB and then into a message queue, out of which it would go into another ESB, which would route it to a service provider.  With transport-level instead of message level propagation each intermediary would have to ensure forwarding, or out-of-message storage (queue) of the credential.&lt;br /&gt;&lt;br /&gt;The WSS standard standardizes the SOAP headers used for such message level credentials; in addition to a UsernameToken, it could also be a X.509 certificate or a Kerberos ticket or a SAML token.&lt;br /&gt;&lt;br /&gt;As a UsernameToken contains a cleartext password, the message would typically be protected either through transport level point-to-point encryption via SSL, just as would be advisable when using HTTP BASIC.  Additionally, the SOAP message could also be protected through message level XML encryption.&lt;br /&gt;&lt;br /&gt;So, back Java/Acegi/XFire:  What I really wanted was to be able to do the following at the service consumer (client):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; import org.acegisecurity.context.SecurityContextHolder;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; import org.acegisecurity.providers.UsernamePasswordAuthenticationToken;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; SecurityContextHolder.getContext().setAuthentication(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         new UsernamePasswordAuthenticationToken("uid", "pwd"));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; myServiceStub.myOperation(myRequest);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; SecurityContextHolder.clearContext();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and have the uid/pwd end up "transparently" in the outgoing message produced by XFire.  The actual service provider (server) might or might not receive that header, e.g. if an intermediary (actual SOAP intermediary or just an in-process incoming message filter) authenticated and authorized the message, potentially stripping the WSS header.  If however it did receive the SOAP header, it might have a need to get the credential back, again easily and using the same Acegi API, without having to deal with SOAP headers etc. directly, by doing:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; Authentication auth = SecurityContextHolder.getContext().getAuthentication();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; assert auth != null;  // Is null if no WSS Header present in SOAP message!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; String uid = auth.getName();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; String pwd = auth.getCredentials();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.vorburger.ch/files/acegi-xfire-ws-security.zip"&gt;acegi-ws-security-xfire-example&lt;/a&gt; contains a working example implementing just that.  (I built it by extending the XFire jaxws-spring example I have contributed earlier to the project; but the Acegi/WSS integration itself is unrelated to that, and the Handler etc. infrastructure should be easily reusable in other uses of XFire, e.g. POJO without WSDL).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-116233053740115240?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.vorburger.ch/files/acegi-xfire-ws-security.zip' title='Propagating Acegi&apos;s Security Context in a WSS UsernameToken SOAP Header via XFire using wss4j'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/116233053740115240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=116233053740115240' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/116233053740115240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/116233053740115240'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2006/10/propagating-acegis-security-context-in.html' title='Propagating Acegi&apos;s Security Context in a WSS UsernameToken SOAP Header via XFire using wss4j'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-116095223084335982</id><published>2006-10-15T23:51:00.000+02:00</published><updated>2006-10-16T00:43:51.613+02:00</updated><title type='text'>SWSDL - Simple WSDL format, and my swsdl2wsdl</title><content type='html'>Hand writing WSDL (Web Service Description Language, stop reading here if that doesn't mean much to you?) is a pain. The GUIs I have seen (whether XML Spy or Eclipse WTP or...) don't really change the fact that typing (or clicking, same thing) type and message and then a portType and then binding again and then finally a service... jeez!&lt;br /&gt;&lt;br /&gt;Let's not go into the Contract First (writing WSDL and XSD) versus Code First (e.g. Java first and then generating WSDL and XSD from it) debate here. Let's assume you think doing SOA with Contract First makes sense, describing a service interface in XML Schema is sensible, but what bothers you too is having to write that WSDL, because you are lazy, and like me you think that might be a Good Thing.&lt;br /&gt;&lt;br /&gt;Now, of course, there is &lt;a href="http://www.w3.org/TR/wsdl20-primer"&gt;WSDL 2.0&lt;/a&gt; which promises some (!) simplification on the horizon, or maybe not (on the horizon even, or simplification)... whatever, it's not here today. Other ideas and tools which float around include e.g. &lt;a href="http://www.thinktecture.com/WSCF/"&gt;WSCF&lt;/a&gt; (and &lt;a href="http://weblogs.asp.net/cweyer/archive/2005/08/06/421755.aspx"&gt;jWSCF&lt;/a&gt;), but all I really wanted is a simple, platform/language-neutral form to describe a "service", referencing an XSD file for the Schema -like how hard is that? If "extensibility" is really needed, that "form" could allow extensions, but the normal most common use case should be simple.&lt;br /&gt;&lt;br /&gt;So I designed SWSDL - Simple WSDL, a swsdl.xsd and a little converter (swsdl2wsdl) that generates WSDL 1.1 from my SWSDL. Here is a &lt;a href="http://docs.google.com/View?docid=dcpf2j3r_5ckvxjv"&gt;page where I compare hand-written SWSDL (Simple-WSDL) and the auto-generated standard WSDL by wsdl2swdl&lt;/a&gt;. Interested? &lt;a href="http://www.vorburger.ch/files/swsdl-distribution-0.5.zip"&gt;Download swsdl-distribution-0.5.zip&lt;/a&gt; and give it a shot!&lt;br /&gt;&lt;br /&gt;If you find this useful, let me know (post a comment on the blog) what you think. I might put this thingie on Sourceforge or Java.net or somewhere. For now, the src is in the &lt;a href="http://www.vorburger.ch/files/swsdl-project-0.5.zip"&gt;swsdl-project-0.5.zip&lt;/a&gt;, but do try the &lt;a href="http://www.vorburger.ch/files/swsdl-distribution-0.5.zip"&gt;swsdl-distribution-0.5.zip&lt;/a&gt; first as it has an example and launch script.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-116095223084335982?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.vorburger.ch/files/swsdl-distribution-0.5.zip' title='SWSDL - Simple WSDL format, and my swsdl2wsdl'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/116095223084335982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=116095223084335982' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/116095223084335982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/116095223084335982'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2006/10/swsdl-simple-wsdl-format-and-my.html' title='SWSDL - Simple WSDL format, and my swsdl2wsdl'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-116049641974561686</id><published>2006-10-10T15:16:00.000+02:00</published><updated>2006-10-10T18:14:20.130+02:00</updated><title type='text'>soapUI</title><content type='html'>If you develop SOAP-based Web Services, there is a tool that you will not want to miss once you have tried it. It's &lt;a href="http://www.soapui.org"&gt;soapUI&lt;/a&gt;, an open-source GUI for easily and very quickly creating and firing off SOAP requests. (So basically, you feed it WSDL, it creates sample SOAP requests for you, you edit those in a simple but functional XML editor, and Send it to see the response.)&lt;br /&gt;&lt;br /&gt;This is one of the advantages of an SOA using XML as platform neutral lingua franca of message exchange for integration purposes:  A machine readable representation (XML schema and WSDL) to describe services and make them discoverable and easily invokable by tools, such as soapUI. And no JAR files like for RMI services, no IDL compilers... it's a data format, there is a commonly agreed description of it, and tools can construct and consume messages - easily, and even "simple" tools.&lt;br /&gt;&lt;br /&gt;Even technical business analysts can perform functional testing of services, as suggested and successfully happened in one project I was coaching. (SOAPui also has performance and stress testing features, I haven't actually used those yet, but recently recommend it to somebody who was looking for a tool to model such test scenarios on a few web services.)&lt;br /&gt;&lt;br /&gt;Of course, some commercial tools offer similiar features (e.g. XMLSpy, Mindreef SOAPscope; probably others) but soapUI is free, simple - and works really well, something is just "right" about it.&lt;br /&gt;&lt;br /&gt;BTW: SOAPui just got better (what will probably end up being v1.7), with added support for automatic forced validation of request/response messages in editors - an additional new useful SOAPui feature suggested and discussed with the SOAPui team by your humble author of this blog! ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-116049641974561686?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.soapui.org/' title='soapUI'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/116049641974561686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=116049641974561686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/116049641974561686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/116049641974561686'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2006/10/soapui.html' title='soapUI'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-116013471493671380</id><published>2006-10-06T13:38:00.000+02:00</published><updated>2006-10-06T13:42:32.376+02:00</updated><title type='text'>Machine translation progress</title><content type='html'>&lt;p class="mobile-post"&gt;Machine translation seems to have made impressive progress in the last few years.  Running e.g. a &lt;a href="http://en.wikipedia.org/wiki/Machine_translation"&gt;Wikipedia Article&lt;/a&gt; article through Google Language Tools or Systranbox.com (which produces the almost identical translation) actually creates a more than just rough translation (as I think they did maybe 5-6 years ago); it's not really "correct" of course (as a &lt;a href="http://de.wikipedia.org/wiki/Maschinelle_%C3%9Cbersetzung"&gt;human written equivalent article&lt;/a&gt;), but... "reasonably understandable" definitely, I'd say.&lt;/p&gt;&lt;p class="mobile-post"&gt;Now, I always thought of MT as an end-user tool; one would consciously use it, knowing fully well that it's a machine translation.  Apparently not everybody agrees though... For example, I came across an &lt;a href="http://www.microsoft.com/germany/msdn/library/xmlwebservices/EntwerfenDesVertrags.mspx"&gt;article on Microsoft MSDN &lt;/a&gt;&lt;a href="http://www.microsoft.com/germany/msdn/library/xmlwebservices/EntwerfenDesVertrags.mspx"&gt;in German&lt;/a&gt;, which at first glance got me thinking, wow, these guys translate MSDN content?  Very kind.  Then I read more carefully... and somehow it didn't sound right (we don't say "seit wir uns Ihnen in der ...-Kolumne MITGETEILT haben" -- do we??).  Hey, wouldn't some statement like "This is machine translated content.  We hope the content is of interest and use to you in this form.  (And maybe also:)  Click here to order a high-quality human translation of this page" - using some Service Façade to a translation services company.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-116013471493671380?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/116013471493671380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=116013471493671380' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/116013471493671380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/116013471493671380'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2006/10/machine-translation-progress.html' title='Machine translation progress'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-115700757723051609</id><published>2006-08-31T08:59:00.000+02:00</published><updated>2006-08-31T09:29:31.670+02:00</updated><title type='text'>GMail offline - via Google Desktop</title><content type='html'>I just realized that you CAN read Gmail offline... via Google Desktop! (You have to enable that "Search Gmail [X] Index and search email in my Gmail account" thingie; if you do, full copies of all Gmail Messages appear to be stored locally.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-115700757723051609?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/115700757723051609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=115700757723051609' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/115700757723051609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/115700757723051609'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2006/08/gmail-offline-via-google-desktop.html' title='GMail offline - via Google Desktop'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-115651142528277039</id><published>2006-08-25T15:03:00.000+02:00</published><updated>2006-08-25T15:11:24.780+02:00</updated><title type='text'>XFire Example: Contract First &amp; Spring</title><content type='html'>From: Michael Vorburger&lt;br /&gt;Subject: Proposed new XFire example: Use of wsgen/xfire (contract first), and Spring&lt;br /&gt;To: user@xfire.codehaus.org&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hello,&lt;br /&gt;&lt;br /&gt;The XFire distribution includes only one simple example of a "contract first" design (write WSDL/XSD and generate Java from it), the 'geoip-client'. There is also a simple 'spring' example in the current distribution.&lt;br /&gt;&lt;br /&gt;I put together another, more complete such example, which runs wsgen with the JAXWSProfile. In addition, my example also ties the former together with Spring, showing both the XFireExporter as well as the XFireClientFactoryBean (which the 'spring' example does not).&lt;br /&gt;&lt;br /&gt;ZIP is on &lt;a href="http://www.vorburger.ch/blog1/xfire-examples-wsgen-jaxws-spring12.zip"&gt;http://www.vorburger.ch/blog1/xfire-examples-wsgen-jaxws-spring12.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Regards.&lt;br /&gt;&lt;br /&gt;PS: If the ZIP does not work for you, you might have to follow the instructions that mvn prints, to locally install the the modules/xfire-jaxws-1.2-RC.jar found in the xfire-1.2-RC distribution, as that does not appear to be on the Codehaus repository today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-115651142528277039?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.vorburger.ch/blog1/xfire-examples-wsgen-jaxws-spring12.zip' title='XFire Example: Contract First &amp; Spring'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/115651142528277039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=115651142528277039' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/115651142528277039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/115651142528277039'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2006/08/xfire-example-contract-first-spring.html' title='XFire Example: Contract First &amp; Spring'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-115504912445777645</id><published>2006-08-08T16:08:00.000+02:00</published><updated>2006-08-08T16:58:44.503+02:00</updated><title type='text'>Electronic Passports - done all wrong?</title><content type='html'>Yesterday the morning newspaper carried a (very short) article about new Electronic Passports being hacked or something like that. I wanted to know what that was about, and some Googling revealed that the article must have been talking about a &lt;a href="http://www.schneier.com/blog/archives/2006/08/hackers_clone_r.html"&gt;demonstration at the BlackHat conference, as e.g. mentioned on Bruce Schneier's blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;After having read up on this, I am a bit perplexed - what are they actually trying to achieve with this electronic passport?? More "throughput" at border controls because of contactless machine reading? Nice, but the OCR readable text at the bottom of new passports should already achieve that, doesn't it? More "security" - like what? Just prevent changing data in a passport (what's the scenario)? Granted, that appears to be achieved by digitally signing the data in an RFID chip on the passport. But prevent forging passports? Not really... in fact, after having read up on the architecture, it appears terribly EASY to read the digital information (contactless, from a distance!!) in one passport and copy it into another (stolen or not) one, electronically not distinguishable. This is little better than the rechargable card for the washing machine!&lt;br /&gt;&lt;br /&gt;If you do want to have a reliable system to track and prevent abuse, why not do it right, with a hardware PKI chip thing, that securely stores a private key (ideally generated on the chip HW itself; NOT generated externally and transferred into it)? Probably not impossible to read &amp; copy from either, but certainly much much more secure, from what I understand.  A HW chip like in the SmartCard I now to carry to work for one client, or like my ThinkPad laptop has built-in (BTW: I didn't get that working with Thunderbrid/Firefox; do I need a special PKCS#11 module or something - somebody knows where to find that??).&lt;br /&gt;&lt;br /&gt;Or is there picture or some properly reliably biometric information in the RFID chip data that could used to match the person presenting the passport to the person it was originally meant to be issued to? That would be an idea I guess... would that work &amp; help? Haven't read anything in that direction though.&lt;br /&gt;&lt;br /&gt;Or is it a cost problem? I can't imagine a small proper HW crypto chip to be that expensive, certainly not if purchased in volumes as this would be about.&lt;br /&gt;&lt;br /&gt;PS: The actual form factor, i.e. whether it really is a credit-card size SmartCard, or that kind of chip embedded in the cover of a plastic passport, seems like an orthogonal issue to me; although it may be interesting to note that many countries in Europe have credit-card size "identity cards" that we use to travel within Europe, instead of the full-blown passports. Equally orthogonal to the chip itself is the access technology - although I admit being equally or even more stunned on that aspect.. contactless and remotely readable... the practical reasons are (somewhat) plausible, but imagine the implications - what are they thinking?? If at least it had a big red on/off button or something like that! This is off course just the tip of "non-technical" aspect of this entire topic... I won't go into that here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-115504912445777645?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.schneier.com/blog/archives/2006/08/hackers_clone_r.html' title='Electronic Passports - done all wrong?'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/115504912445777645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=115504912445777645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/115504912445777645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/115504912445777645'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2006/08/electronic-passports-done-all-wrong.html' title='Electronic Passports - done all wrong?'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-115504593390627545</id><published>2006-08-08T15:13:00.000+02:00</published><updated>2006-08-22T10:41:16.496+02:00</updated><title type='text'>Setting up two-way (mutual) SSL with Tomcat on Java5 is easy!</title><content type='html'>I recently wanted to set up Tomcat for two-way (mutual) SSL. It turns out this is fairly easy, particularly with Java5 since it now provides writes, and not just reads, of PKCS#12 keystores directly, so you don't actually need to use openssl anymore, as most of the instructions I found online about this suggest. I needed this for a test of something, and wasn't interested in using a Certificate Authority (CA) etc. All I wanted was an easy set up with Tomcat (v5.5.15/17 used) for testing; other people were going to worry about CA and issuing procedures and all later. Here is how:&lt;br /&gt;&lt;br /&gt;1) Create the key &amp; cert for the Tomcat server:&lt;br /&gt;&lt;br /&gt;%JAVA_HOME%\bin\keytool -genkey -v -alias tomcat -keyalg RSA -validity 3650 -keystore /path/to/my/tomcat.keystore -dname "CN=localhost, OU=MYOU, O=MYORG, L=MYCITY, ST=MYSTATE, C=MY" -storepass=password -keypass=password&lt;br /&gt;&lt;br /&gt;Note that the storepass and keypass &lt;span style="font-weight: bold;"&gt;*HAS*&lt;/span&gt; to be the same here.  The CN should be the host/machine name that will appear in the HTTPS URL when accessing this Tomcat, so e.g. localhost, or also *.domain.com I believe.&lt;br /&gt;&lt;br /&gt;2)  Enable the SSL connector in Tomcat's conf/server.xml:&lt;br /&gt;&lt;br /&gt;&amp;lt;connector port="8443" maxhttpheadersize="8192" maxthreads="150" minsparethreads="25" maxsparethreads="75" enablelookups="false" disableuploadtimeout="true" acceptcount="100" scheme="https" secure="true" sslprotocol="TLS" clientauth="true" keystorefile="path/to/my/tomcat.keystore" keystorepass="password" truststorefile="path/to/my/tomcat.keystore" truststorepass="password"&amp;gt;&lt;br /&gt;&lt;br /&gt;In keystoreFile you can specify an absolute pathname, or a relative pathname that is resolved against the Tomcat root installation directory. You also &lt;span style="font-weight: bold;"&gt;have &lt;/span&gt;to specify the truststore. (The stores don't have to be in a user home directory.)&lt;br /&gt;&lt;br /&gt;If all you wanted is well-known one-way SSL with no client certificate, you would have to change the above to clientAuth="false" and stop here, else do as above and keep reading for the interesting part.&lt;br /&gt;&lt;br /&gt;3) Create the client (yours, or a machine's) key &amp; cert:&lt;br /&gt;&lt;br /&gt;    keytool -genkey -v -alias vorburgerKey -keyalg RSA -storetype PKCS12 -keystore vorburger.p12 -dname "CN=Michael Vorburger NEU, OU=DerTest, O=DieOrg, L=Lausanne, ST=VD, C=CH" -storepass mypassword -keypass mypassword&lt;br /&gt;&lt;br /&gt;This looks and is similar to 1) above, but we are storing this into a different keystore (because the server/Tomcat doesn't have your private key) of storetype PKCS12. On Windows, you can double-click and import this *.p12 file  into IE, or add it to Firefox via Tools / Options, Security, Certificates, View Certificates, Import. You'll have to type in the mypassword (above). BTW, again the storepass and keypass &lt;span style="font-weight: bold;"&gt;*HAS*&lt;/span&gt; to be the same here, else Windows/IE or Mozilla Certificate importing will fail.&lt;br /&gt;&lt;br /&gt;4) Now we need to add the certificate (containing the public key) to the Tomcat keystore so that it recognizes this client certificate, by first exporting it from the keystore from step 3 and then importing it into the keystore from step 1: (Typically you probably would not import each client cert but a CA root cert and then sign each client cert with that one, but as said, I am showing a simple setup for tests here.)&lt;br /&gt;&lt;br /&gt;keytool -export -alias vorburgerCert -keystore vorburger.p12 -storetype PKCS12 -storepass mypassword -rfc -file vorburger.cer&lt;br /&gt;&lt;br /&gt;keytool -import -v -file vorburger.cer -keystore tomcat.keystore -storepass password&lt;br /&gt;&lt;br /&gt;On Windows, you can double-click and see the vorburger.cer. You may also would like to list the contents of the tomcat.keystore via this command, and notice how the entry for the 'tomcat' alias is a keyEntry, but the entry for the 'vorburgerCert' is a trustedCertEntry here - makes sense?&lt;br /&gt;&lt;br /&gt;keytool  -list -keystore ..\tomcat-server.keystore -storepass password&lt;br /&gt;&lt;br /&gt;5) Just like with BASIC authentication, you still have to add this user to the usual conf/tomcat-users.xml, by specifying that dname from step 3) as username, and any password (will be ignored) and the roles you'd like that user to have:&lt;br /&gt;&lt;br /&gt;&amp;lt;user username="CN=Michael Vorburger NEU, OU=DerTest, O=DieOrg, L=Lausanne, ST=VD, C=CH" password="null" roles="admin"&amp;gt;&lt;br /&gt;&lt;br /&gt;That's it! You should now be able to access e.g. https://localhost:8443, the browser should ask you for, or automatically send, the client certificate which the server used to 'strongly' authenticate you - done!&lt;br /&gt;&lt;br /&gt;Some instructions also suggest to set &amp;lt;login-config&amp;gt;&amp;lt;auth-method&amp;gt;CLIENT-CERT&amp;lt;/auth-method&amp;gt; in web.xml, but apparently that's not actually needed on Tomcat with clientAuth="true" in server.xml.&lt;br /&gt;&lt;br /&gt;Some notes for testing/debugging/trying that may be useful if you would like to try this too: IE just says "Cannot find server" if the server does not accept the client cert - not very helpful!  Firefox says "Could not establish an encrypted connection because your certificate was rejected by localhost.", better.  Also, if for test you remove a cert from IE again, you have to close it, all windows, shut it down - else it's still in memory although it does not appear in respective dialog anymore.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS: Some copy/pasted background information that may be of interest... "The PKCS#12 (Personal Information Exchange Syntax Standard, specifies a portable format for storage and/or transport of a user's private keys, certificates, miscellaneous secrets, and other items. The SunJSSE provider supplies a complete implementation of the PKCS12 java.security.KeyStore format for reading and write pkcs12 files. This format is also supported by other toolkits and applications for importing and exporting keys and certificates, such as Netscape/Mozilla, Microsoft's Internet Explorer, and OpenSSL. For example, these implementations can export client certificates and keys into a file using the ".p12" filename extension.&lt;br /&gt;&lt;br /&gt;J2SE 1.4.x provided read-only support for PKCS#12 keystores, and a small number of protection algorithms. The enhanced PKCS#12 keystore  in J2SE 5 supports reads and writes of PKCS#12 keystores, and provides more protection algorithms (such as those supported by popular browsers). This improves interoperability of PKCS#12 keystores imported/exported by J2SE, browsers, and other security applications."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-115504593390627545?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/115504593390627545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=115504593390627545' title='25 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/115504593390627545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/115504593390627545'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2006/08/setting-up-two-way-mutual-ssl-with.html' title='Setting up two-way (mutual) SSL with Tomcat on Java5 is easy!'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>25</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-115490137889838009</id><published>2006-08-06T23:55:00.000+02:00</published><updated>2006-08-06T23:56:18.906+02:00</updated><title type='text'>Lego</title><content type='html'>Posted &lt;a href="http://www.flickr.com/photos/vorburger/tags/lego/"&gt;snaps of some LEGO constructions&lt;/a&gt; I made with Dév...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-115490137889838009?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.flickr.com/photos/vorburger/tags/lego/' title='Lego'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/115490137889838009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=115490137889838009' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/115490137889838009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/115490137889838009'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2006/08/lego.html' title='Lego'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-115314586984162497</id><published>2006-07-17T16:09:00.000+02:00</published><updated>2006-07-17T16:29:16.126+02:00</updated><title type='text'>WSDL Validation with wsdl4j</title><content type='html'>Imagine a set up where a team A provides Web Services to Team B.  The service team A uses a "contract first" SOA approach, so they hand-write WSDL (more on that another time) and generate Java from it (not the other way around).  Team A then implements these services using XFire as their SOAP stack.  Now Team B takes these WSDL documents and generates client code from it, using Axis1.&lt;br /&gt;&lt;br /&gt;Now WSDL being a standard format, this is a painless no-brainer, right?  Right.  Turns out Axis1 has a small but annoying bug which leads to it generating invalid Java code, which does not compile, from technically perfectly valid WSDL (if the 'name' of a &amp;lt;wsdl:message&amp;gt; used for a Fault has the same name as the actual &amp;lt;xsd:element&amp;gt; referenced by the &amp;lt;wsdl:part&amp;gt; in the &amp;lt;wsdl:message&amp;gt;).  Easy to slightly adapt the original WSDL - once you have figured this out.&lt;br /&gt;&lt;br /&gt;Of course, being "agile", I don't want this problem to come back haunting the team every so often, and thought about how to enforce/test the hand-written WSDL, which is perfectly valid technically, for this specific condition, during the automated build.&lt;br /&gt;&lt;br /&gt;Turns out that thanks to &lt;a href="http://www.jcp.org/en/jsr/detail?id=110"&gt;JSR 110&lt;/a&gt; &amp; &lt;a href="http://sourceforge.net/projects/wsdl4j"&gt;wsdl4j&lt;/a&gt;, this is pretty painless! The little WSDLValidationTask for ant (&lt;a href="http://www.vorburger.ch/files/WSDLValidationTask.java"&gt;download WSDLValidationTask.java source&lt;/a&gt;) that I ended up hacking together is used like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;&amp;lt;taskdef name="wsdl-validation" classname="wsdlvalidation.wsdl.WSDLValidationTask" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;lt;wsdl-validation&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  &amp;lt;wsdl dir="wsdldir" includes="my.wsdl" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;lt;/wsdl-validation&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-115314586984162497?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.vorburger.ch/files/WSDLValidationTask.java' title='WSDL Validation with wsdl4j'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/115314586984162497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=115314586984162497' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/115314586984162497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/115314586984162497'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2006/07/wsdl-validation-with-wsdl4j.html' title='WSDL Validation with wsdl4j'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-114963591673792887</id><published>2006-06-07T01:15:00.000+02:00</published><updated>2006-06-07T01:18:36.736+02:00</updated><title type='text'>Making Movies</title><content type='html'>The other week-end Dév and I made an &lt;a href="http://video.google.com/videoplay?docid=-3314191891474433067"&gt;animated movie of his current favourite toys&lt;/a&gt;, including soundtrack.  He loved it - almost as much as "real" Thomas the Engine episodes.&lt;br /&gt;&lt;br /&gt;PS: Thanks Google Video for hosting; neat!  I wonder if the link above will still work in a few years?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-114963591673792887?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://video.google.com/videoplay?docid=-3314191891474433067' title='Making Movies'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/114963591673792887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=114963591673792887' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/114963591673792887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/114963591673792887'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2006/06/making-movies.html' title='Making Movies'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2467619.post-114963555979917555</id><published>2006-06-07T00:47:00.000+02:00</published><updated>2006-06-07T01:12:39.890+02:00</updated><title type='text'>Simple HTTP Server in Java</title><content type='html'>Just for fun (well, almost), I wrote my very own simple HTTP server in Java (&lt;a href="http://www.vorburger.ch/files/vorburger-simple-javaHTTPd.zip"&gt;download 100 KB ZIP&lt;/a&gt;) the other night.  It uses Java5 features, and requires no external libraries.  While it certainly does work and can serve a static website HTML+image site, it is of course NOT meant as a "real" web server, so do NOT use it - it's instructional, and it sure was fun to code!&lt;br /&gt;&lt;br /&gt;PS: Almost eight years ago, I put online a &lt;a href="http://www.vorburger.ch/projects/proxy/"&gt;Proxy Server written in C&lt;/a&gt; on my website, and to my big surprise, during all the years since, every now and then a CS student (presumably asked to write one for class, just like I had at the time), emails some questions...  So just in case folks, if you found this page because you are looking for a cheap way out for your homework, by all means download and look at it - but then fix/improve it, and quoting the source and explaining your enhancements!  And put a quick comment to this post below.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2467619-114963555979917555?l=www.vorburger.ch/blog1' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.vorburger.ch/files/vorburger-simple-javaHTTPd.zip' title='Simple HTTP Server in Java'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/114963555979917555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2467619&amp;postID=114963555979917555' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/114963555979917555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2467619/posts/default/114963555979917555'/><link rel='alternate' type='text/html' href='http://www.vorburger.ch/blog1/2006/06/simple-http-server-in-java.html' title='Simple HTTP Server in Java'/><author><name>Michael Vorburger</name><uri>https://profiles.google.com/115735029147378885166</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ScB_lKKRsy0/AAAAAAAAAAI/AAAAAAAAAAA/JhaM2VNK4mg/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry></feed>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                