Generated by All in One SEO v4.9.10, this is an llms.txt file, used by LLMs to index the site. # Jens Arps Javascript Developer ## Sitemaps - [XML Sitemap](https://jensarps.de/sitemap.xml): Contains all public & indexable URLs for this website. ## Posts - [Blog](https://jensarps.de/blog/) - This is where I write about my various experiments, open source projects and other web related findings. Most of the code from the posts can be found on GitHub. - [Room-Scale WebVR with Cardboard: Definitely Possible](https://jensarps.de/2016/06/08/room-scale-web-vr-with-cardboard-definitely-possible/) - This is something I wanted to see happening for a long time: Put your smartphone in a cardboard-style HMD, and have a VR experience that allows you to turn, kneel and stand, walk around… without being bound by cables. That kind of experience that is now called “room-scale VR”. That means having a VR experience - [WebAR: Combining Cardboard Style VR and the Phone's Camera](https://jensarps.de/2016/02/22/webar-combining-cardboard-style-vr-and-the-phones-camera/) - Creating an in-browser augmented reality experience with a smartphone and cardboard – sounds awesome, doesn't it? Here's my thoughts along the bumpy road I traveled so far: The Idea A smartphone is capable of delivering VR experiences using a browser, WebGL, and a cardboard. If you add a stream from the back-facing camera to it, - [How to detect buggy IndexedDB implementations](https://jensarps.de/2015/12/16/how-to-detect-buggy-indexeddb-implementations/) - After years of struggling with persistent client side storage, IndexedDB is finally available on all major browsers nowadays. All good, right? Well, almost. There are some implementations out there that are either buggy (Safari) or are lacking features (IE). It's not a show-stopper if you're just looking for a simple key-value store, but if you - [Mouse-Picking Collada Models with three.js, Part II](https://jensarps.de/2013/10/29/mouse-picking-collada-models-with-three-js-part-ii/) - Roughly a year ago, I wrote about detecting COLLADA models with a three.js ray caster. That code was written for three.js revision 49 – whereas the current revision is 62. A lot of things changed since then, and the code no longer works. So, here is an update of that post for revision 62. If you - [Fetch API Code Completion and Type Hinting](https://jensarps.de/2015/12/01/fetch-api-code-completion-and-type-hinting/) - Are you using the Fetch API yet? If no, then head over to the MDN to find out why you definitely should – and don't forget to come right back! Ok, now that we're all using the Fetch API whenever we can (oh, great!), you'll find that your editor/IDE of choice probably doesn't know about fetch - [Safari and window.open](https://jensarps.de/2009/08/21/safari-and-window-open/) - Update: If you are interested in how to make window.open work you might want to also read the follow-up: Safari and window.open – How to do it Working on a project these days, I noticed that the only call to window.open in that app did not work in Safari. Looking into it, I found that - [IndexedDB Code Completion and Type Hinting](https://jensarps.de/2013/06/21/indexeddb-code-completion-and-type-hinting/) - IndexedDB isn't really a new API, but most (maybe even all) Editors don't provide code completion for it. This is a little annoying, but there's a quick fix available: You just need to port the relevant IDL definitions to JavaScript, and tell your IDE to include the resulting .js file as a library. I already - [HTML Elements in WebGL: Recursion](https://jensarps.de/2013/07/02/html-elements-in-webgl-recursion/) - - Or: Navigate a Website on a Computer Screen in a Website on a Computer Screen - Jerome Etienne's post on HTML Elements in a WebGL surrounding really caught my interest. What I wanted to do was slightly different, though: I wanted a fully accessible website displayed on the screen of a computer 3D model - [Creating dynamic builds with Grunt and Closure Compiler](https://jensarps.de/2013/07/23/creating-dynamic-builds-with-grunt-and-closure-compiler/) - There's a build scenario I happen to run into quite frequently: I have multiple AMD modules and I want to define during build time which modules should be included in the build. That means, I want a build to be dynamic during build time, not during runtime (one could also call this a configurable build). - [Storehouse - Client Side Object Storage for the Dojo Store API](https://jensarps.de/2013/04/10/storehouse-client-side-object-storage-for-the-dojo-store-api/) - It's been some time since dojox/storage, and a lot of things changed since then. Most notably: Browsers now have IndexedDB, and Dojo now has the dojo/store API that widgets can directly work with. The dojo/store API was built with IndexedDB and offline in mind, has a nice API and allows asynchronism, meaning that it can - [Using Voice Commands to control your game](https://jensarps.de/2013/03/07/using-voice-commands-to-control-your-game/) - Just recently I learned about the Web Speech API which it's already available in Chrome 25. It takes input from the computer's microphone, does a speech recognition and returns you the results – without needing you to do anything. You just start the service, say "Hello" and get a result returned that contains the string "hello". - [Working with IDBWrapper, Part 2](https://jensarps.de/2012/11/13/working-with-idbwrapper-part-2/) - Note: This is a tutorial about working with IDBWrapper, a wrapper for the IndexedDB client side storage. Creating indexes and running queries only works with the new version of IDBWrapper, so if already have IDBWrapper, make sure you fetch a new version from GitHub. All examples in this tutorial follow along the "Basic Index Example", - [Decoupled Input](https://jensarps.de/2012/08/28/decoupled-input/) - The Ascent project had a bunch of upgrades these days, including better loading logic, a radar, pointer lock support and others. But the most important one certainly was decoupled input. I found it important enough to extract and polish it and create a separate GitHub repo for it. So, let me introduce you to decoupled-input! - [Mouse-Picking Collada Models with THREE.js](https://jensarps.de/2012/08/10/mouse-picking-collada-models-with-three-js/) - UPDATE: This post was written for three.js revision 49. An updated post for newer revisions of three.js is here: Mouse-Picking Collada Models with three.js, Part II. Finding a Collada model that has been "clicked on" in a scene seems to be a common issue, and I'm getting quite some emails asking me about details. So - [Optimizing the THREE.js Ray Casting Class](https://jensarps.de/2012/08/07/optimizing-the-three-js-ray-casting-class/) - As I mentioned before, the THREE.js Ray class is not very optimized regarding memory usage. Of course, you should avoid expensive operations like ray casting, but it seems to be the cheapest way to detect if a given point is inside of a mesh. So you will eventually do a lot of ray casting in - [Leaving Las Vegas](https://jensarps.de/2012/07/31/leaving-las-vegas/) - Today is my last day at uxebu, so I want to take the opportunity to thank my fellow coworkers for an amazing time. We've been building crazy things. Things no one believed to be doable. Things so crazy that I had to sign contracts that did forbid me to even talk about signing those. And - [Ascent Update: Shooting at Things with three.js](https://jensarps.de/2012/07/02/ascent-update-shooting-at-things-with-three-js/) - One of the main missing things in Ascent is "Being able to shoot at things". To solve this, the first question is "What to shoot?". Ok, there are rockets. But what about the almost-unlimited-basic-weaponry? Many space games feature laser guns. But, lasers, if implemented they way they'd actually look like and work, are boring. Just - [Ascent update: Skybox](https://jensarps.de/2012/06/29/ascent-update-skybox/) - During the last month, I didn't have much time to work on Ascent, mainly because of an awesome three week vacation in Italy. But there's one tiny update I made that I find pretty important: moving from particles as scene "background" to a skybox. Although the change is minimal regarding LOC, it has major impact - [Ascent - A WebGL Space Simulator Framework](https://jensarps.de/2012/04/21/ascent-a-webgl-space-simulator-framework/) - Quite a while ago, I started RavenJS. It was awesome fun. Seeing it grow, and in the end, being able to walk the landscape, was an amazing experience. It triggered sweet memories from the past, and also showed what was possible today. But the whole project sadly has many downsides, the biggest being the fact - [How to make three.js Ray caster detect Collada objects](https://jensarps.de/2012/04/10/how-to-make-three-js-ray-caster-detect-collada-objects/) - Unfortunately, three.js' Ray class currently doesn't detect intersections with imported Collada objects. Unfortunately, because I heavily rely on imported models and I'm too lazy to do the detection manually. But, the good new is, the collada objects carry all information needed for the ray caster to work properly; you just need to do some manual - [Working with IDBWrapper, Part 1](https://jensarps.de/2011/11/25/working-with-idbwrapper-part-1/) - A while ago I released IDBWrapper. If you don't know it, it's a wrapper for IndexedDB, a current specification (in draft status) for an in-browser object store. It's implemented in Firefox and Chrome, and somehow (as a plugin of sorts) also in IE, but, honestly, I don't care about that too much. Update: IE10 has - [Porting a 3D RPG to WebGL, Part 1](https://jensarps.de/2011/11/07/porting-a-3d-rpg-to-webgl-part-1/) - It all began half a year ago when I sat down with a friend and fellow crew member, Stephan, and we agreed that Gothic was indeed one the best RPGs of all times (seriously, if you don't know it and are into RPGs, you should get it). We also soon agreed that it would be - [EmbedJS 0.2 and AMD](https://jensarps.de/2011/10/17/embedjs-0-2-and-amd/) - During JSConf.eu, we released EmbedJS 0.2. That release was mainly about a fundamental architectural change: the move to the AMD pattern for our features. Let me explain why we decided to do this, why we think this is a big step forward and what this means for the user. Modules AMD stands for “Asynchronous Module - [Creating a persistent Dojo Object Store](https://jensarps.de/2011/04/27/creating-a-persistent-dojo-object-store/) - As of version 1.6, dojo comes with the new Dojo Object Store API. This is an awesome thing, as it greatly simplifies the work with data stores in Dojo. Everybody who had to do with the traditional dojo.data API felt it was overly complex and hard to use – this has finally changed now. There - [Using IndexedDB on Firefox](https://jensarps.de/2011/03/30/using-indexeddb-on-firefox/) - As Firefox 4 is now stable, chances are that the async IDB (IndexedDB) API is not going to change anymore. But IDB is not localStorage – it can be a major pain to work with. So, here is a guide on how to use IDB in Firefox as a key-value store. TL;DR There is example code - [Explaining EmbedJS](https://jensarps.de/2011/01/31/explaining-embedjs/) - Last week, we tagged the current state of EmbedJS 0.1. This is a large step for us, and something we have been waiting for and wanting to do for a long time. And with doing so, the need arises to answer a lot of questions – and we better start sooner than later. So, here - [indexedDB Updates – FF4.09b](https://jensarps.de/2011/01/17/indexeddb-updates-ff4-09b/) - IndexedDB is all the buzz right now, but it is pretty hard to find information about it’s implementations. In addition to that, the impls change on a weekly basis. So I figured it would be nice to summarize every now and then what has been happening around IDB in the last time. And as Mozilla - [Storage Research - Your Help is Needed!](https://jensarps.de/2010/09/07/storage-research-your-help-is-needed/) - Right now, I'm doing some research regarding client-side storage on mobile devices. But for that, I need your help! Please grab all phones you have and navigate to https://jensarps.de/tests/storage-tests/. There are four tiny tests there. Please do them all and report your results for each phone. If you like, include your twitter handle so I - [localStorage Performance Test Results](https://jensarps.de/2010/09/07/localstorage-performance-test-results/) - It's been some time since I last updated this blog, mostly because there's plenty going on these days. However, there's something I've been wanting to publish for quite some time now: The results of the localStorage performance tests I ran several weeks ago. As I am currently working on performance tests for Mozilla's IndexedDB implementation, - [Encrypted client-side storage with dojo](https://jensarps.de/2010/04/15/encrypted-client-side-storage-with-dojo/) - A couple of days ago, Nicholas Zakas wrote an article about secure client side storage. I think the scenario he mentioned (working from a cyber cafe) is not unsafe by nature, and could be well handled by an application. Nonetheless, client side storage such as localStorage still is subject to DNS spoofing attacks (which is - [Don't use Cookies](https://jensarps.de/2010/04/10/dont-use-cookies-use-localstorage/) - – or: How to persist data in the 21st century. The common way to persist data on the client side – application state, offline data, whatever – still is to use cookies. But times have changed, and so have browsers, and there are better ways to do it today. But why are cookies that bad? - [Promises with dojo - a lightweight alternative to dojo.Deferred](https://jensarps.de/2010/02/03/promises-with-dojo-a-lightweight-alternative-to-dojo-deferred/) - Update: Micheil Smith had a cool idea to improve this and posted it in the comments. I have updated the test page and the code examples to reflect his idea. Thanks Micheil! Update II: Ben Hockey proposed to do the whole thing without using the pub/sub system. I for one think its a good idea, - [Working with the Curve - Advanced Animation with Dojo](https://jensarps.de/2010/01/22/working-with-the-curve-advanced-animation-with-dojo/) - If you use animations, you probably use them to animate CSS properties. But this post is about some real bareknuckle animation – using the dojo toolkit. We'll have a look into dojo.Animation and talk about the curve, the line, easing and rate, and we'll check out (the somehow undocumented) dojox.fx._core – and see how to - [persistent local storage with dojo](https://jensarps.de/2010/01/04/persistent-local-storage-with-dojo/) - Update: The providers attached to this post are part of dojox.storage now – no need to download them, just get a copy of dojo, and everything is there. Update II: dojox.storage won't make it into dojo 2.0 and is not compatible with the new dojo/store API. For future-safe persistent client-side storage, see Storehouse – Client - [More fun with strings: dojo.string.contains()](https://jensarps.de/2009/11/29/more-fun-with-strings-dojo-string-contains/) - In the series "convenience wrappers for small tasks that increase code readability", today contains() is starring. Having a contains() method could also serve another purpose: to maybe prevent people from using match() to find out if a string contains a given substring (what is still proposed in some JS tutorials out there…). So, I want - [Keyboard accessibility for dojox.layout.FloatingPane](https://jensarps.de/2009/11/02/keyboard-accessibility-for-dojox-layout-floatingpane/) - Well, I don't really see a use for FloatingPane, except as a windowing system for projects like LucidDesktop, but I got the impression that many people just love the FloatingPane. However, it caught my attention these days. One of its major drawbacks – and the one that keeps it pretty far from becoming a joyful - [dojo.string.beginsWith()](https://jensarps.de/2009/10/27/dojo-string-beginswith/) - Most cases where you find String.substr() in the wild are to check if a given string begins with a certain other string. Be it checking for a prefix or sorting out zipcodes that begin with certain numbers. And because code readability is a good thing (really, it is important), it would be nice to have - [A collapsible fieldset as dojo widget](https://jensarps.de/2009/10/16/a-collapsible-fieldset-as-dojo-widget/) - Though many people would disagree, I for one like to use fieldsets to structure complex forms. Even better do I like fieldsets that are collapsible. As there is no such fieldset with dojo, I decided to write my own widget. While doing so, I learnt an interesting lesson… First, I wrote it pretty simple, inheriting - [Safari and window.open – How to do it](https://jensarps.de/2009/10/08/safari-and-window-open-how-to-do-it/) - There is still some traffic coming in from people who are searching for how to deal with the safari popup blocker. So I thought it might be nice to also tell what you can do about it – as most people want solutions, not backgrounds… So, here you go: It's pretty simple, really. What to - [dojox.analytics.Urchin for jQuery](https://jensarps.de/2009/10/03/dojox-analytics-urchin-for-jquery/) - Or: Still ending the ga.js wait… It has become quiet here the last weeks – due to an awesome trip to Italy. Returning home, I decided to put Google Analytics on this page. As I always hate waiting for the ga.js to load while visiting websites, I wanted a mechanism to delay the load of - [Static data handling in PHP](https://jensarps.de/2009/09/03/static-data-handling-in-php/) - Every now and then I stumble upon PHP Code dealing with config files. Besides being happy that people use config files (uh, yes, it happens too often that people don't…), I am often unhappy with how they're dealing with config files. You can find the ugliest things out there, like arrays in .php files (my - [3D Canvas Walker revisited](https://jensarps.de/2009/08/27/3d-canvas-walker-revisited/) - One of the things that fascinated me most about computers since I was a teen, was their ability to simulate a three-dimensional space where one could move around in. That's why I was so intrigued when I read Jacob Seidelin's post about “Creating pseudo 3D Games“. I had to play around with it, as I ## Pages - [Home](https://jensarps.de/) - I am a JavaScript and HTML5 professional and work as an independent contractor - [Entwicklung](https://jensarps.de/entwicklung/) - Ich helfe Ihnen, hochfunktionale Webapplications pünktlich fertigzustellen. Jedes Projekt stellt Ansprüche an die Qualität der Ergebnisse. Jedes Projekt hat eine Deadline. Während die Qualität vor allem im Focus des Vertriebs liegt, hat das Management oft nur die Deadline im Auge. Deswegen ist es wichtig, dass zur effizienten Fertigstellung komplexer Projekte jemand beide Seiten der Waagschale im - [Consulting](https://jensarps.de/consulting/) - I can help you deliver high quality web applications on time. Every project has a deployment schedule. And every project has quality expectations to meet. The first is visible to the client's management, the latter is visible to the client's sales team. However, project management needs to ensure both are fulfilled. If your project is - [Kontakt](https://jensarps.de/kontakt/) - Sie sind auf der Suche nach einem kompetenten Partner für Ihr JavaScript-Projekt? Ich helfe Ihnen gern! Nutzen Sie einfach das Kontaktformular. - [Contact](https://jensarps.de/contact/) - If you need professional support for your JavaScript project, I'd love to help you out! To get in touch, please use the contact form below and I will get back to you. - [Workshops](https://jensarps.de/workshops/) - Ich gebe mein Wissen an Ihr JavaScript-Team weiter. Als Programmierer ist es extrem wichtig und nicht immer einfach, immer up-to-date zu sein. Innovative Neuentwicklungen und unerwartete Trendwenden sind in unserem Beruf schließlich an der Tagesordnung. Festangestellten Programmierern fällt es neben dem anfallenden Tagesgeschäft verständlicherweise oft schwer, sich ausreichend weiterzubilden und auf der Höhe der Zeit - [Training](https://jensarps.de/training/) - I can help you sharpen the skills of your JavaScript and FrontEnd teams. Increasing the knowledge and coding quality of your own teams is a sensible thing to do – but often it’s a mere lack of time for team members to catch up on current ongoings and improve their own coding skills. This is - [Über mich](https://jensarps.de/uber-mich/) - Warum ich Javascript liebe Javascript hat zwar in den letzten Jahren enorm an Bedeutung gewonnen, trotzdem ist es noch nicht an seiner Leistungsgrenze angekommen. Es ist die einzige Sprache, die auf jedem modernen Computer, Telefon oder Smart TV einsatzfähig ist - und teilweise sogar in Robotern oder Autos. Als Javascript in der Webentwicklung noch hauptsächlich - [Projects](https://jensarps.de/projects/) - This a list of selected projects and experiments. Click on an item to see a description and further links. - [Projekte](https://jensarps.de/projekte/) - Dies ist eine Liste ausgewählter Projekte und Experimente. Klicken Sie auf einen Eintrag um weitere Details und Links zu sehen. - [Home](https://jensarps.de/home-2/) - Entwicklung Funktionale Webapplications: Ich helfe Ihrem Team, pünktlich abzuliefern. Mit zehn Jahren Erfahrung als JavaScript-Programmierer bringe ich neuen Schwung, weitreichendes Fachwissen und innovative Ideen in Ihr Projektteam. Mehr erfahren über JavaScript-Entwicklung… Workshops Mehr Kompetenz für Ihr JavaScript-Team: Ich bringe es auf den neuesten Stand! Ob Anfänger oder Profis – in meinen maßgeschneiderten Schulungen lernt ihr Team, - [About](https://jensarps.de/about/) - I am a freelance JavaScript developer with more than 10 years of professional experience in Front-End-Development, during which I have built web applications for world’s leading businesses in varying industries, ranging from the IT sector over network carriers to content publishers and mobile device manufacturers. I love cutting edge technologies and challenges – I’ve built - [Blog](https://jensarps.de/blog/) ## Categories - [Uncategorized](https://jensarps.de/category/uncategorized/) - [Browser Struggle](https://jensarps.de/category/browser-struggle/) - [Experiments in Web](https://jensarps.de/category/experiments-in-web/) - [Goodies to go](https://jensarps.de/category/goodies-to-go/) - [Framework Peace](https://jensarps.de/category/framework-peace/) - [Dojo Love](https://jensarps.de/category/dojo-love/) - [Storage](https://jensarps.de/category/storage/) - [How to](https://jensarps.de/category/how-to/) - [EmbedJS](https://jensarps.de/category/embedjs/) ## Tags - [dojo](https://jensarps.de/tag/dojo/) - [js](https://jensarps.de/tag/js/) - [safari](https://jensarps.de/tag/safari/) - [canvas](https://jensarps.de/tag/canvas/) - [fun](https://jensarps.de/tag/fun/) - [configuration](https://jensarps.de/tag/configuration/) - [doctrine](https://jensarps.de/tag/doctrine/) - [php](https://jensarps.de/tag/php/) - [google](https://jensarps.de/tag/google/) - [jquery](https://jensarps.de/tag/jquery/) - [tracking](https://jensarps.de/tag/tracking/) - [dijit](https://jensarps.de/tag/dijit/) - [widget](https://jensarps.de/tag/widget/) - [string](https://jensarps.de/tag/string/) - [dojox](https://jensarps.de/tag/dojox/) - [client-side storage](https://jensarps.de/tag/client-side-storage/) - [local](https://jensarps.de/tag/local/) - [localStorage](https://jensarps.de/tag/localstorage/) - [persistence](https://jensarps.de/tag/persistence/) - [animation](https://jensarps.de/tag/animation/) - [CommonJS](https://jensarps.de/tag/commonjs/) - [cookies](https://jensarps.de/tag/cookies/) - [mobile](https://jensarps.de/tag/mobile/) - [sqlite](https://jensarps.de/tag/sqlite/) - [Ascent](https://jensarps.de/tag/ascent/) - [three.js](https://jensarps.de/tag/three-js/) - [WebGL](https://jensarps.de/tag/webgl/) - [StorageJS](https://jensarps.de/tag/storagejs/) - [embedjs](https://jensarps.de/tag/embedjs-2/) - [uxebu](https://jensarps.de/tag/uxebu/) - [IDB](https://jensarps.de/tag/idb/) - [Indexed Database](https://jensarps.de/tag/indexed-database/) - [AMD](https://jensarps.de/tag/amd/) - [modules](https://jensarps.de/tag/modules/) - [HTML5](https://jensarps.de/tag/html5/) - [IndexedDB](https://jensarps.de/tag/indexeddb/) - [Gaming](https://jensarps.de/tag/gaming/) - [memory](https://jensarps.de/tag/memory/) - [optimization](https://jensarps.de/tag/optimization/) - [performance](https://jensarps.de/tag/performance/) - [Collada](https://jensarps.de/tag/collada/) - [raycasting](https://jensarps.de/tag/raycasting/) - [decoupled-input](https://jensarps.de/tag/decoupled-input/) - [Speech API](https://jensarps.de/tag/speech-api/) - [offline](https://jensarps.de/tag/offline/) - [build](https://jensarps.de/tag/build/) - [closure-compiler](https://jensarps.de/tag/closure-compiler/) - [grunt](https://jensarps.de/tag/grunt/) - [Storage](https://jensarps.de/tag/storage/) - [WebVR](https://jensarps.de/tag/webvr/) - [WebAR](https://jensarps.de/tag/webar/)