From 88ab656328f2e51b44156a188dc6e447304b416c Mon Sep 17 00:00:00 2001 From: Ruben van de Ven Date: Tue, 24 Mar 2020 21:27:14 +0100 Subject: [PATCH] PageRanking in gulpfile and hasCredential instead of attendee --- .htaccess | 12 + assets/css/portfolio.css | 7 +- assets/js/portfolio.js | 38 +- assets/js/portfolio.min.js | 2 +- assets/js/portfolio.min.js.map | 2 +- assets/js/ranking.json | 1 + assets/js/rubenvandeven.jsonld | 2 +- gulpfile.js | 23 +- index.html | 1 - ranking/jsonld_ranking.py | 23 +- rubenvandeven.jsonld | 2932 ++++++++++++++++---------------- src/js/portfolio.js | 36 +- src/scss/portfolio.scss | 7 +- 13 files changed, 1624 insertions(+), 1462 deletions(-) create mode 100644 assets/js/ranking.json diff --git a/.htaccess b/.htaccess index 8e65ff5..d54bf5b 100644 --- a/.htaccess +++ b/.htaccess @@ -2,11 +2,18 @@ RewriteEngine On RewriteRule "^2018/data-flaneur$" "index.html" RewriteRule "^2018/digital-cultures$" "index.html" +RewriteRule "^2020/acts-of-collection-and-omission$" "index.html" RewriteRule "^article/choose-how-you-feel-you-have-seven-options$" "index.html" RewriteRule "^assets/video/guerilla_project.mp4$" "index.html" +RewriteRule "^choose-how-you-feel-you-have-seven-options$" "index.html" +RewriteRule "^degree/avm$" "index.html" +RewriteRule "^degree/cddc$" "index.html" +RewriteRule "^degree/mechanical-engineering$" "index.html" +RewriteRule "^degree/media-design$" "index.html" RewriteRule "^emotionhero$" "index.html" RewriteRule "^event/2018/yama-ichi$" "index.html" RewriteRule "^event/2019/ccu-presentation$" "index.html" +RewriteRule "^event/cqrrelations$" "index.html" RewriteRule "^event/creativity-and-cognition$" "index.html" RewriteRule "^exercises-in-overfitting$" "index.html" RewriteRule "^exercises-in-overfitting/image/1$" "index.html" @@ -43,6 +50,7 @@ RewriteRule "^mvp3$" "index.html" RewriteRule "^mvp3/image/1$" "index.html" RewriteRule "^mvps$" "index.html" RewriteRule "^organisation/ccu$" "index.html" +RewriteRule "^organisation/constant$" "index.html" RewriteRule "^organisation/nsvp$" "index.html" RewriteRule "^organisation/setup$" "index.html" RewriteRule "^organisation/v2_$" "index.html" @@ -53,9 +61,11 @@ RewriteRule "^person/joseph-huot$" "index.html" RewriteRule "^person/merijn-van-moll$" "index.html" RewriteRule "^person/mikel-folgerts$" "index.html" RewriteRule "^person/ward-goes$" "index.html" +RewriteRule "^pillow-talk$" "index.html" RewriteRule "^place/in4art$" "index.html" RewriteRule "^place/q21$" "index.html" RewriteRule "^plottingdata$" "index.html" +RewriteRule "^residency/q21$" "index.html" RewriteRule "^residency/summer-sessions$" "index.html" RewriteRule "^samawati/video$" "index.html" RewriteRule "^spectacular-spectator-mood-meter$" "index.html" @@ -73,6 +83,7 @@ RewriteRule "^@type/Event$" "index.html" RewriteRule "^@type/Report$" "index.html" RewriteRule "^@type/VideoObject$" "index.html" RewriteRule "^@type/MediaObject$" "index.html" +RewriteRule "^@type/EducationalOccupationalCredential$" "index.html" RewriteRule "^@type/ExhibitionEvent$" "index.html" RewriteRule "^@type/ImageObject$" "index.html" RewriteRule "^@type/Festival$" "index.html" @@ -83,5 +94,6 @@ RewriteRule "^@type/Person$" "index.html" RewriteRule "^@type/EventVenue$" "index.html" RewriteRule "^@type/Museum$" "index.html" RewriteRule "^@type/PerformingGroup$" "index.html" +RewriteRule "^@type/VisualArtsEvent$" "index.html" RewriteRule "^@type/CollegeOrUniversity$" "index.html" RewriteRule "^@type/WebSite$" "index.html" diff --git a/assets/css/portfolio.css b/assets/css/portfolio.css index f63ec40..d518b48 100644 --- a/assets/css/portfolio.css +++ b/assets/css/portfolio.css @@ -6,7 +6,7 @@ body { font-family: "DDINRegular", helvetica, sans-serif; font-weight: light; height: 100vh; - background: black; + background: #222; font-size: 12pt; } a, a:link, a:visited { @@ -162,7 +162,7 @@ text { width: 0; } #nodeDetails .nodeType { font-size: 80%; - text-transform: uppercase; + font-variant-caps: small-caps; color: #999; margin-left: 10px; } #nodeDetails .nodeType:hover { @@ -201,7 +201,8 @@ text { width: 170px; font-weight: bold; min-height: 25px; - clear: both; } + clear: both; + word-wrap: anywhere; } #nodeDetails dd { min-height: 30px; margin-top: 5px; } diff --git a/assets/js/portfolio.js b/assets/js/portfolio.js index 10ddba3..29e1be7 100644 --- a/assets/js/portfolio.js +++ b/assets/js/portfolio.js @@ -45,7 +45,7 @@ function getNodeYear(n) { return n['https://schema.org/datePublished'].substr(0, 4); } if (typeof n['https://schema.org/startDate'] !== 'undefined') { - console.log(n['https://schema.org/startDate']); + // console.log(n['https://schema.org/startDate']); return n['https://schema.org/startDate'].substr(0, 4); } if (typeof n['https://schema.org/endDate'] !== 'undefined') { @@ -125,10 +125,24 @@ var graph; var nodeMap = {}; var linkMap = {}; var breadcrumbs = {}; +var weights = {}; + // load the flattened jsonld file var requestPromise = fetch('/assets/js/rubenvandeven.jsonld').then(function (r) { return r.json(); -}).then(function (data) { +}); +var rankingPromise = fetch('/assets/js/ranking.json').then(function (r) { + return r.json(); +}); + +Promise.all([requestPromise, rankingPromise]).then(function (values) { + if (values[0].hasOwnProperty('@graph')) { + data = values[0]; + weights = values[1]; + } else { + data = values[1]; + weights = values[0]; + } graph = jsonLdToGraph(data['@graph']); // create a map of nodes by id. for (var i in graph.nodes) { @@ -199,8 +213,7 @@ var firstNodeId = "https://rubenvandeven.com/"; function getSizeForNode(node) { if (node.hasOwnProperty('https://schema.org/thumbnailUrl')) return nodeSize; - //if(weights[node['@id']]) - // return nodeSize * weights[node['@id']]; + if (weights[node['@id']]) return nodeSize * weights[node['@id']]; if (node['@id'] == firstNodeId) return nodeSize * 1.2; // everynode has at least one link. these should equal 1 return nodeSize * (.7 + Math.min(20, linkMap[node['@id']].length) / 40); @@ -534,7 +547,7 @@ function startGraph(graph) { deselectNode(); if (updateHistory) { // TODO: working - console.log(types[0], getDisplayAttr(types[0]), types.map(getDisplayAttr)); + // console.log(types[0], getDisplayAttr(types[0]),types.map(getDisplayAttr)); history.pushState({ types: types }, "", "/@type/" + types.map(getDisplayAttr).join("+")); } else { history.replaceState({ types: types }, "", "/@type/" + types.map(getDisplayAttr).join("+")); @@ -729,11 +742,17 @@ function startGraph(graph) { } } - // relationships / links in
+ // relationships / links incomming
for (var _attr in relDown) { var attrEl = document.createElement("dt"); attrEl.innerHTML = getDisplayAttr(_attr); relsEl.appendChild(attrEl); + + // highest pagerank first: + relDown[_attr].sort(function (a, b) { + return weights[b['@id']] - weights[a['@id']]; + }); + for (var _i2 in relDown[_attr]) { var rel = relDown[_attr][_i2]; relsEl.appendChild(createRelationshipEl(rel)); @@ -752,10 +771,17 @@ function startGraph(graph) { } } + // relationships / links outgoing
for (var _attr2 in relUp) { var _attrEl = document.createElement("dt"); _attrEl.innerHTML = getDisplayAttr(_attr2); relsEl.appendChild(_attrEl); + + // highest pagerank first: + relUp[_attr2].sort(function (a, b) { + return weights[b['@id']] - weights[a['@id']]; + }); + for (var _i3 in relUp[_attr2]) { var _rel = relUp[_attr2][_i3]; relsEl.appendChild(createRelationshipEl(_rel, _i3)); diff --git a/assets/js/portfolio.min.js b/assets/js/portfolio.min.js index 8469a42..c5e5013 100644 --- a/assets/js/portfolio.min.js +++ b/assets/js/portfolio.min.js @@ -1,2 +1,2 @@ -"use strict";var data,graph,_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function getLabelAttribute(e){if(void 0!==e["https://schema.org/name"])return"https://schema.org/name";switch(e["@type"]){case"https://schema.org/WebSite":if(void 0!==e["https://schema.org/url"])return"https://schema.org/url";break;case"https://schema.org/ImageObject":if(void 0!==e["https://schema.org/caption"])return"https://schema.org/caption";if(void 0!==e["https://schema.org/contentUrl"])return"https://schema.org/contentUrl";break;case"https://schema.org/PostalAddress":if(void 0!==e["https://schema.org/addressLocality"])return"https://schema.org/addressLocality"}return"@id"}function getNodeLabel(e){var t=e[getLabelAttribute(e)];return void 0===t&&(t=e["@id"]),void 0===t&&(t=""),t}function getNodeYear(e){return void 0!==e["https://schema.org/dateCreated"]?e["https://schema.org/dateCreated"].substr(0,4):void 0!==e["https://schema.org/datePublished"]?e["https://schema.org/datePublished"].substr(0,4):void 0!==e["https://schema.org/startDate"]?(console.log(e["https://schema.org/startDate"]),e["https://schema.org/startDate"].substr(0,4)):void 0!==e["https://schema.org/endDate"]?e["https://schema.org/endDate"].substr(0,4):void 0!==e["https://schema.org/foundingDate"]?e["https://schema.org/foundingDate"].substr(0,4):void 0!==e["https://schema.org/temporalCoverage"]&&e["https://schema.org/temporalCoverage"].match(/\d{4}-\d{4}/)?e["https://schema.org/temporalCoverage"].substr(5,4):null}function getDisplayAttr(e){return e.replace(/.*[#|\/]/,"")}function jsonLdToGraph(e){var t={},r=[];for(var n in e)t[e[n]["@id"]]=e[n];for(var a in e){var o=e[a],i=o["@id"];for(var s in o){var d=Array.isArray(o[s])?o[s]:[o[s]];for(var c in d)"@id"!==s&&"string"==typeof d[c]&&t[d[c]]?r[r.length]={source:i,target:d[c],name:s}:void 0!==d[c]["@id"]&&(1==Object.keys(d[c]).length&&void 0===t[d[c]["@id"]]||(r[r.length]={source:i,target:d[c]["@id"],name:s}))}}return{nodes:Object.values(t),links:r}}var nodeMap={},linkMap={},breadcrumbs={},requestPromise=fetch("/assets/js/rubenvandeven.jsonld").then(function(e){return e.json()}).then(function(e){for(var t in(graph=jsonLdToGraph(e["@graph"])).nodes)nodeMap[graph.nodes[t]["@id"]]=graph.nodes[t];startGraph(graph)});function inCircle(e,t,r){var n=Math.abs(e),a=Math.abs(t);return!(r"+getNodeYear(r)+""),n.classList.add("nodeTitle"),n.classList.add("nodeTitleNr"+e),n.addEventListener("click",function(e){var t=z.nodes.indexOf(r);q(t)});var a=document.createElement("a");return a.classList.add("nodeType"),a.innerHTML=getDisplayAttr(r["@type"]),a.title=r["@type"],a.addEventListener("click",function(e){U(r["@type"])}),t.appendChild(n),t.appendChild(a),t},q=function(n,e){void 0===e&&(e=!0);var a=null,i=null;if(B.each(function(e,t,r){t==n&&(a=r[n],i=e)}),a){var t=null;t=i["@id"].startsWith("https://rubenvandeven.com/")?i["@id"].substr(26):"?id="+i["@id"],e?history.pushState({node:n},getNodeLabel(i),"/"+t):history.replaceState({node:n},getNodeLabel(i),"/"+t),L(n);var s=breadcrumbs[i["@id"]].slice();s[s.length]=i["@id"];var d=[];g.each(function(n,e,t,r){n.source==i||n.target==i?(t[e].classList.add("activeLink","visibleLink"),t[e].getElementsByTagName("line")[0].setAttribute("marker-end","url(#arrowHeadSelected)"),B.filter(function(e,t){var r=e["@id"]==n.source["@id"]||e["@id"]==n.target["@id"];return r&&-1===d.indexOf(t)&&(d[d.length]=t),r}).classed("visibleNode",!0)):(t[e].classList.remove("activeLink"),t[e].getElementsByTagName("line")[0].setAttribute("marker-end","url(#arrowHead)"));var a=s.indexOf(n.source["@id"]),o=s.indexOf(n.target["@id"]);-1"+n+""),e.appendChild(t),i.appendChild(e),a.push(getNodeLabel(nodeMap[r]))},d=!0,c=!1,l=void 0;try{for(var u,h=breadcrumbs[t["@id"]][Symbol.iterator]();!(d=(u=h.next()).done);d=!0)s(u.value)}catch(e){c=!0,l=e}finally{try{!d&&h.return&&h.return()}finally{if(c)throw l}}Y.appendChild(i),a.push(getNodeLabel(t));var m=getLabelAttribute(t),p=document.createElement("h2");p.innerHTML=getNodeLabel(t);var f=document.createElement("span");f.classList.add("nodeType"),f.innerHTML=getDisplayAttr(t["@type"]),f.title=t["@type"],f.addEventListener("click",function(e){U(t["@type"])}),p.appendChild(f),Y.appendChild(p);var g=document.createElement("dl"),v=["@id","x","y","index","@type","vy","vx","fx","fy","leftX","rightX"];for(var y in"https://schema.org/contentUrl"!==m&&(v[v.length]=m),t)if(-1==v.indexOf(y)){var b=Array.isArray(t[y])?t[y]:[t[y]];for(var L in b)if(("string"!=typeof b[L]||!nodeMap[b[L]])&&void 0===b[L]["@id"])if("https://schema.org/url"==y||"http://www.w3.org/2000/01/rdf-schema#seeAlso"==y)g.innerHTML+="
"+getDisplayAttr(y)+"
"+b[L]+"
";else if("https://schema.org/embedUrl"==y)g.innerHTML+="
"+getDisplayAttr(y)+"
"+b[L]+"
",g.innerHTML+="
";else if("https://schema.org/contentUrl"==y)if(g.innerHTML+="
"+getDisplayAttr(y)+"
"+b[L]+"
","https://schema.org/VideoObject"==t["@type"]){var x=b["https://schema.org/encodingFormat"]?"type='"+b["https://schema.org/encodingFormat"]+"'":"",M=b["https://schema.org/thumbnailUrl"]?"poster='"+b["https://schema.org/thumbnailUrl"]+"'":"";g.innerHTML+="
"}else g.innerHTML+="
";else{var w=b[L].replace(/\n/g,"
");g.innerHTML+="
"+getDisplayAttr(y)+"
"+w+"
"}}Y.appendChild(g);for(var A=document.createElement("dl"),N=0;N"}else D.innerHTML="";A.appendChild(D)}}}for(var H in e){var j=document.createElement("dt");for(var X in j.innerHTML=getDisplayAttr(H),A.appendChild(j),e[H]){var I=e[H][X];if(A.appendChild(R(I,X)),void 0!==I["https://schema.org/contentUrl"]){var P=document.createElement("dd");P.classList.add("dd-contentobject"),P.innerHTML="",A.appendChild(P)}}}Y.appendChild(A),B.each(function(e,t,r){t==n?r[t].classList.add("selectedNode"):r[t].classList.remove("selectedNode")}),document.title=a.join(" :: ")}(i,n)}},M=function(){L(null),g.each(function(e,t,r,n){r[t].classList.remove("activeLink"),r[t].classList.remove("breadcrumbLink"),r[t].getElementsByTagName("line")[0].setAttribute("marker-end","url(#arrowHead)")}),document.body.classList.remove("detailsOpen"),scrollToY(0,4e3)};window.addEventListener("popstate",function(e){if(e.state.hasOwnProperty("node"))q(e.state.node,!1);else{var t=z.nodes.find(function(e){return e["@id"]===firstNodeId});q(z.nodes.indexOf(t),!1)}});var w=function(){var e=b(),t=A();u=e[0]+e[2]/2-t.dx,h=e[1]+e[3]/2-t.dy},A=function(){var e=document.getElementById("container"),t=0,r=0,n=1;if(02*getSizeForNode(e)&&n.attr("transform","scale("+2*getSizeForNode(e)/r/1.05+")")}),B.each(function(e){e["https://schema.org/thumbnailUrl"]&&d3.select(this).append("svg:image").attr("xlink:href",e["https://schema.org/thumbnailUrl"]).attr("width",function(e){return 2*getSizeForNode(e)}).attr("height",function(e){return 2*getSizeForNode(e)}).attr("transform",function(e){return"translate(-"+getSizeForNode(e)+" -"+getSizeForNode(e)+")"}).attr("clip-path","url(#clipNodeImage)").attr("preserveAspectRatio","xMidYMid slice")}),f.nodes(z.nodes).on("tick",function(){z.nodes.forEach(function(e,t){e.leftX=e.rightX=e.x}),v.each(function(e){var t,r,n,a,o,i;e.source.rightXe.target.rightX?n=e.target.rightX:n>e.source.rightX?n=e.source.rightX:n"+getNodeYear(r)+""),n.classList.add("nodeTitle"),n.classList.add("nodeTitleNr"+e),n.addEventListener("click",function(e){var t=z.nodes.indexOf(r);q(t)});var a=document.createElement("a");return a.classList.add("nodeType"),a.innerHTML=getDisplayAttr(r["@type"]),a.title=r["@type"],a.addEventListener("click",function(e){U(r["@type"])}),t.appendChild(n),t.appendChild(a),t},q=function(n,e){void 0===e&&(e=!0);var a=null,i=null;if(B.each(function(e,t,r){t==n&&(a=r[n],i=e)}),a){var t=null;t=i["@id"].startsWith("https://rubenvandeven.com/")?i["@id"].substr(26):"?id="+i["@id"],e?history.pushState({node:n},getNodeLabel(i),"/"+t):history.replaceState({node:n},getNodeLabel(i),"/"+t),L(n);var s=breadcrumbs[i["@id"]].slice();s[s.length]=i["@id"];var d=[];g.each(function(n,e,t,r){n.source==i||n.target==i?(t[e].classList.add("activeLink","visibleLink"),t[e].getElementsByTagName("line")[0].setAttribute("marker-end","url(#arrowHeadSelected)"),B.filter(function(e,t){var r=e["@id"]==n.source["@id"]||e["@id"]==n.target["@id"];return r&&-1===d.indexOf(t)&&(d[d.length]=t),r}).classed("visibleNode",!0)):(t[e].classList.remove("activeLink"),t[e].getElementsByTagName("line")[0].setAttribute("marker-end","url(#arrowHead)"));var a=s.indexOf(n.source["@id"]),o=s.indexOf(n.target["@id"]);-1"+n+""),e.appendChild(t),i.appendChild(e),a.push(getNodeLabel(nodeMap[r]))},d=!0,c=!1,l=void 0;try{for(var u,h=breadcrumbs[t["@id"]][Symbol.iterator]();!(d=(u=h.next()).done);d=!0)s(u.value)}catch(e){c=!0,l=e}finally{try{!d&&h.return&&h.return()}finally{if(c)throw l}}Y.appendChild(i),a.push(getNodeLabel(t));var m=getLabelAttribute(t),p=document.createElement("h2");p.innerHTML=getNodeLabel(t);var f=document.createElement("span");f.classList.add("nodeType"),f.innerHTML=getDisplayAttr(t["@type"]),f.title=t["@type"],f.addEventListener("click",function(e){U(t["@type"])}),p.appendChild(f),Y.appendChild(p);var g=document.createElement("dl"),v=["@id","x","y","index","@type","vy","vx","fx","fy","leftX","rightX"];for(var y in"https://schema.org/contentUrl"!==m&&(v[v.length]=m),t)if(-1==v.indexOf(y)){var b=Array.isArray(t[y])?t[y]:[t[y]];for(var L in b)if(("string"!=typeof b[L]||!nodeMap[b[L]])&&void 0===b[L]["@id"])if("https://schema.org/url"==y||"http://www.w3.org/2000/01/rdf-schema#seeAlso"==y)g.innerHTML+="
"+getDisplayAttr(y)+"
"+b[L]+"
";else if("https://schema.org/embedUrl"==y)g.innerHTML+="
"+getDisplayAttr(y)+"
"+b[L]+"
",g.innerHTML+="
";else if("https://schema.org/contentUrl"==y)if(g.innerHTML+="
"+getDisplayAttr(y)+"
"+b[L]+"
","https://schema.org/VideoObject"==t["@type"]){var x=b["https://schema.org/encodingFormat"]?"type='"+b["https://schema.org/encodingFormat"]+"'":"",M=b["https://schema.org/thumbnailUrl"]?"poster='"+b["https://schema.org/thumbnailUrl"]+"'":"";g.innerHTML+="
"}else g.innerHTML+="
";else{var w=b[L].replace(/\n/g,"
");g.innerHTML+="
"+getDisplayAttr(y)+"
"+w+"
"}}Y.appendChild(g);for(var k=document.createElement("dl"),N=0;N"}else D.innerHTML="";k.appendChild(D)}}}for(var P in e){var F=document.createElement("dt");for(var H in F.innerHTML=getDisplayAttr(P),k.appendChild(F),e[P].sort(function(e,t){return weights[t["@id"]]-weights[e["@id"]]}),e[P]){var X=e[P][H];if(k.appendChild(R(X,H)),void 0!==X["https://schema.org/contentUrl"]){var I=document.createElement("dd");I.classList.add("dd-contentobject"),I.innerHTML="",k.appendChild(I)}}}Y.appendChild(k),B.each(function(e,t,r){t==n?r[t].classList.add("selectedNode"):r[t].classList.remove("selectedNode")}),document.title=a.join(" :: ")}(i,n)}},M=function(){L(null),g.each(function(e,t,r,n){r[t].classList.remove("activeLink"),r[t].classList.remove("breadcrumbLink"),r[t].getElementsByTagName("line")[0].setAttribute("marker-end","url(#arrowHead)")}),document.body.classList.remove("detailsOpen"),scrollToY(0,4e3)};window.addEventListener("popstate",function(e){if(e.state.hasOwnProperty("node"))q(e.state.node,!1);else{var t=z.nodes.find(function(e){return e["@id"]===firstNodeId});q(z.nodes.indexOf(t),!1)}});var w=function(){var e=b(),t=k();u=e[0]+e[2]/2-t.dx,h=e[1]+e[3]/2-t.dy},k=function(){var e=document.getElementById("container"),t=0,r=0,n=1;if(02*getSizeForNode(e)&&n.attr("transform","scale("+2*getSizeForNode(e)/r/1.05+")")}),B.each(function(e){e["https://schema.org/thumbnailUrl"]&&d3.select(this).append("svg:image").attr("xlink:href",e["https://schema.org/thumbnailUrl"]).attr("width",function(e){return 2*getSizeForNode(e)}).attr("height",function(e){return 2*getSizeForNode(e)}).attr("transform",function(e){return"translate(-"+getSizeForNode(e)+" -"+getSizeForNode(e)+")"}).attr("clip-path","url(#clipNodeImage)").attr("preserveAspectRatio","xMidYMid slice")}),f.nodes(z.nodes).on("tick",function(){z.nodes.forEach(function(e,t){e.leftX=e.rightX=e.x}),v.each(function(e){var t,r,n,a,o,i;e.source.rightXe.target.rightX?n=e.target.rightX:n>e.source.rightX?n=e.source.rightX:n r.json())\n .then(data => {\n graph = jsonLdToGraph(data['@graph']);\n // create a map of nodes by id.\n for(let i in graph.nodes) {\n nodeMap[graph.nodes[i]['@id']] = graph.nodes[i];\n }\n startGraph(graph);\n });\n\nfunction inCircle(dx, dy, r) {\n // fastest check if in circle: https://stackoverflow.com/a/7227057\n let dxAbs = Math.abs(dx);\n let dyAbs = Math.abs(dy);\n\n if(dxAbs > r || dyAbs > r) {\n return false;\n } else if(dxAbs + dyAbs <= r){\n return true;\n } else if( Math.pow(dx,2) + Math.pow(dy, 2) <= Math.pow(r,2)){\n return true;\n } else {\n return false;\n }\n}\n\nfunction createLinkMap(graph) {\n let linkMap = {};\n for(let link of graph['links']){\n if(typeof linkMap[link['source']] == 'undefined') {\n linkMap[link['source']] = [];\n }\n linkMap[link['source']][linkMap[link['source']].length] = {'id': link['target'], 'name': link['name']};\n\n\n if(typeof linkMap[link['target']] == 'undefined') {\n linkMap[link['target']] = [];\n }\n\n linkMap[link['target']][linkMap[link['target']].length] = {'id': link['source'], 'name': link['name']};\n }\n return linkMap;\n}\n\n\n // config\nvar nodeSize = 40;\nvar selectedNodeSize = 140;\nvar firstNodeId = \"https://rubenvandeven.com/\";\n\nfunction getSizeForNode(node) {\n if(node.hasOwnProperty('https://schema.org/thumbnailUrl'))\n return nodeSize;\n //if(weights[node['@id']])\n // return nodeSize * weights[node['@id']];\n if(node['@id'] == firstNodeId)\n return nodeSize*1.2;\n // everynode has at least one link. these should equal 1\n return nodeSize * (.7 + Math.min(20, linkMap[node['@id']].length) / 40)\n return nodeSize;\n}\n\n// TODO: make sure, 'shortest' path is favoured.\nfunction createBreadcrumbs(linkMap, srcId) {\n let crumbs = {};\n\n let createBreadcrumbLayer = function(srcId) {\n let path = crumbs[srcId];\n let newPath = path.slice();\n newPath.push(srcId);\n\n let nextSrcIds = [];\n for (let link of linkMap[srcId]) {\n if(typeof crumbs[link['id']] !== 'undefined') continue;\n crumbs[link['id']] = newPath;\n nextSrcIds.push(link['id']);\n }\n\n return nextSrcIds;\n }\n crumbs[srcId] = [];\n let nextIds = [srcId];\n while(nextIds.length > 0) {\n let newNextIds = [];\n for (let nextId of nextIds) {\n let r = createBreadcrumbLayer(nextId);\n newNextIds = newNextIds.concat(r);\n }\n nextIds = newNextIds;\n }\n return crumbs;\n}\n\nvar nodePositions = {};\nfunction startGraph(graph){\n\n\n// set some vars\nvar currentNodeIdx = 0;\nvar currentNodePositionRadius = 0;\nvar types = {};\n\nlinkMap = createLinkMap(graph);\nbreadcrumbs = createBreadcrumbs(linkMap, firstNodeId);\n\nfor (let nodeIdx in graph['nodes']) {\n let type = graph['nodes'][nodeIdx][\"@type\"];\n if(typeof types[type] == 'undefined') {\n types[type] = [];\n }\n types[type].push(nodeIdx);\n}\nvar graphControlsEl = document.getElementById('graphControls');\nvar typeLinksEl = document.getElementById('typeLinks');\nvar showMoreTypeLinksEl = document.getElementById('showMoreTypeLinks');\nvar moreTypeLinksEl = document.getElementById('moreTypeLinks');\nvar relLinksEl = document.getElementById('relLinks');\n\n// sort types by count:\nvar typeCounts = Object.keys(types).map(function(key) {\n return [key, types[key].length];\n});\ntypeCounts.sort(function(first, second) {\n return second[1] - first[1];\n});\n\n// make controls\nlet i = 0;\nfor (let typeCountIdx in typeCounts) {\n let typeName = typeCounts[typeCountIdx][0];\n let typeLinkEl = document.createElement(\"li\");\n let typeLinkAEl = document.createElement(\"a\");\n let typeLinkCountEl = document.createElement(\"span\");\n typeLinkCountEl.innerHTML = typeCounts[typeCountIdx][1];\n typeLinkCountEl.classList.add('typeCount');\n typeLinkAEl.innerHTML = getDisplayAttr(typeName);\n typeLinkAEl.title = typeName;\n typeLinkAEl.addEventListener('click', function(){\n centerByType(typeName);\n // positionNodesInCenter(types[typeName]);\n });\n typeLinkAEl.addEventListener('mouseover', function() {\n let typeNodeEls = document.getElementsByClassName(typeName);\n for(let typeNodeEl of typeNodeEls) {\n typeNodeEl.classList.add('typeHighlight');\n }\n });\n typeLinkAEl.addEventListener('mouseout', function() {\n let typeNodeEls = document.getElementsByClassName(typeName);\n for(let typeNodeEl of typeNodeEls) {\n typeNodeEl.classList.remove('typeHighlight');\n }\n });\n typeLinkEl.append(typeLinkAEl);\n typeLinkEl.append(typeLinkCountEl);\n (i < 5 ? typeLinksEl: moreTypeLinksEl).appendChild(typeLinkEl);\n i++;\n // typeLinksEl.appendChild(typeLinkEl);\n}\n\nshowMoreTypeLinksEl.addEventListener('click', function () {\n document.body.classList.add('showMoreLinks');\n var hideMoreTypeLinks = function(e) {\n e.preventDefault();\n e.stopPropagation();\n document.body.removeEventListener('mouseup', hideMoreTypeLinks, true);\n document.body.classList.remove('showMoreLinks');\n }\n document.body.addEventListener('mouseup', hideMoreTypeLinks, true);\n}, false)\n\n\n// make svg\nvar svg = d3.select(\"svg\"),\n width = +svg.attr(\"width\"),\n height = +svg.attr(\"height\");\nvar container = svg.append(\"g\")\n .attr(\"id\", \"container\")\n ;\n\nvar simulation = d3.forceSimulation()\n .force(\"link\", d3.forceLink().id(function(d) { return d[\"@id\"]; }).strength(.005))\n .force(\"charge\", d3.forceManyBody()) // doesn't seem necessary?\n .force(\"collision\", d3.forceCollide(function(d){\n return getSizeForNode(d) * 1.1; // avoid overlapping nodes\n }))\n // .force(\"center\", d3.forceCenter(width / 2, height / 2)) // position around center\n\n // .force(\"x\", d3.forceX())\n // .force(\"y\", d3.forceY())\n // .force(\"y\", d3.forceY())\n ;\n\n\nvar link = container.append(\"g\")\n .attr(\"class\", \"links\")\n .selectAll(\".relationship\")\n .data(graph['links'])\n .enter().append(\"g\")\n .attr(\"class\", function(l){return \"relationship \"+l.name;})\n ;\nvar linkLine = link\n // .append(\"line\");\n .append(\"line\").attr(\"marker-end\", \"url(#arrowHead)\")\n ;\nvar linkText = link\n .append(\"text\")\n .text(function(l){\n // l == Object { source: \"https://rubenvandeven.com/#codesandmodes\", target: \"_:b34\", name: \"https://schema.org/location\" }\n return getDisplayAttr(l.name);\n })\n ;\n\n var node = container.append(\"g\")\n .attr(\"class\", \"nodes\")\n .selectAll(\".node\")\n .data(graph.nodes)\n .enter().append(\"g\")\n .attr(\"class\", function(d) {\n let baseClasses = 'node ' + d['@type'];\n if(d['@type']) {\n let slashpos = d['@type'].lastIndexOf('/');\n if(slashpos > -1) {\n baseClasses += ' ' + d['@type'].substr(slashpos + 1);\n }\n }\n return baseClasses;\n })\n ;\nvar getViewbox = function() {\n return svg.attr(\"viewBox\").split(\" \").map(parseFloat);\n}\nvar positionNodesInCenter = function(idxs) {\n setViewboxForceCenter(); // sets forceCx & forceCy\n if(typeof idxs == \"object\" && idxs !== null && idxs.length == 1) {\n idxs = idxs[0];\n }\n\n nodePositions = {}; // reset\n if(idxs === null) {\n return;\n }\n else if(typeof idxs == \"object\") {\n // array or object -> each\n // calculate grid:\n // let itemsX = 4;\n // let itemsY = Math.ceil(idxs.length/itemsX);\n // console.log(itemsX,itemsY);\n // let rowDiffX = viewBox[3] * (1/(itemsX+1));\n // let rowDiffY = viewBox[2] * (1/(itemsY+1));\n // console.log(rowDiffX, rowDiffY);\n // for (var i = 0; i < idxs.length; i++) {\n // nodePositions[idxs[i]] = [\n // cx - itemsX/2*rowDiffX + rowDiffX * ((i % itemsX)),\n // cy - itemsY/2*rowDiffY + rowDiffY * (Math.floor(i / itemsX))\n // ];\n // }\n positionNodesInCircle(idxs);\n // console.log(nodePositions);\n }\n else{\n nodePositions[idxs] = [\n forceCx,\n forceCy\n ];\n // console.log(\"singleNode\", idxs, nodePositions);\n }\n\n node.each(function(d,nIdx,nodeEls){\n if(typeof nodePositions[nIdx] != 'undefined') {\n nodeEls[nIdx].classList.add('centeredNode');\n nodeEls[nIdx].classList.add('visibleNode');\n } else {\n nodeEls[nIdx].classList.remove('centeredNode');\n nodeEls[nIdx].classList.remove('visibleNode');\n }\n });\n\n // restart animation (they call that 'alpha' in d3 force)\n simulation.alpha(1);\n simulation.restart();\n}\nvar positionNodesInCircle = function(idxs, r) {\n let viewBox = getViewbox();\n let zoom = getZoomValues();\n setViewboxForceCenter(); // sets forceCx & forceCy\n if(typeof r == 'undefined') {\n if(idxs.length == 1) {\n r = viewBox[2] / 6;\n } else {\n r = viewBox[2] / (4 + Math.max(0, 2.5 - idxs.length));\n }\n }\n currentNodePositionRadius = r;\n let forceCx = viewBox[0] + viewBox[2]/2 - zoom['dx'];\n let forceCy = viewBox[1] + viewBox[3]/2 - zoom['dy'];\n\n let stepSize = 2*Math.PI / idxs.length;\n\n for (var i = 0; i < idxs.length; i++) {\n nodePositions[idxs[i]] = [\n forceCx + Math.sin(stepSize * i) * r,\n forceCy + Math.cos(stepSize * i) * r\n ];\n }\n\n // restart animation (they call that 'alpha' in d3 force)\n simulation.alpha(1);\n simulation.restart();\n}\nvar centerByType = function(types, updateHistory) {\n if(typeof updateHistory == 'undefined') {\n updateHistory = true;\n }\n if(!Array.isArray(types)) {\n types = [types];\n }\n let idxs = [];\n for(let idx in graph.nodes) {\n if(types.indexOf(graph.nodes[idx]['@type']) > -1) {\n idxs[idxs.length] = idx;\n }\n }\n deselectNode();\n if(updateHistory) {\n // TODO: working\n console.log(types[0], getDisplayAttr(types[0]),types.map(getDisplayAttr));\n history.pushState({types: types}, \"\", \"/@type/\"+(types.map(getDisplayAttr).join(\"+\")));\n } else {\n history.replaceState({types: types}, \"\", \"/@type/\"+(types.map(getDisplayAttr).join(\"+\")));\n }\n positionNodesInCenter(idxs.length ? idxs : null);\n}\n\nvar selectedNodeTransition = d3.transition()\n .duration(750)\n .ease(d3.easeLinear);\n\nvar nodeDetailEl = document.getElementById(\"nodeDetails\");\n\nvar createRelationshipEl = function(relNode, i) {\n let el = document.createElement(\"dd\");\n el.classList.add('relLink');\n let titleEl = document.createElement('a');\n titleEl.innerHTML = getNodeLabel(relNode)\n let year = getNodeYear(relNode);\n if(year !== null) {\n titleEl.innerHTML += `${getNodeYear(relNode)}`;\n }\n titleEl.classList.add('nodeTitle');\n titleEl.classList.add('nodeTitleNr'+i);\n titleEl.addEventListener('click',function(e){\n let idx = graph.nodes.indexOf(relNode);\n selectNode(idx);\n });\n let typeEl = document.createElement('a');\n typeEl.classList.add('nodeType');\n typeEl.innerHTML = getDisplayAttr(relNode['@type']);\n typeEl.title = relNode['@type'];\n typeEl.addEventListener('click',function(e){\n centerByType(relNode['@type']);\n });\n el.appendChild(titleEl);\n el.appendChild(typeEl);\n return el;\n}\n\nvar setDetails = function(nodeDatum, nodeIdx) {\n document.body.classList.add(\"detailsOpen\");\n scrollToY(0, 4000);\n while (nodeDetailEl.hasChildNodes()) {\n nodeDetailEl.removeChild(nodeDetailEl.lastChild);\n }\n\n // TODO: replace relUp & relDown with linkMap\n let relUp = [];\n let relDown = [];\n let pageTitles = [];\n let nodeDetailScalerEl = document.createElement('div');\n // nodeDetailScalerEl.innerHTML = `
`;\n nodeDetailScalerEl.id = 'nodeDetailsScaler';\n nodeDetailScalerEl.addEventListener('mousedown', function(e){\n // console.log('go');\n let drag = function(e) {\n // 5px for padding\n nodeDetailEl.style.width = (window.innerWidth - e.clientX + 5) +'px';\n }\n document.body.addEventListener('mousemove', drag);\n document.body.addEventListener('mouseup', function(){\n document.body.removeEventListener('mousemove', drag);\n });\n });\n nodeDetails.appendChild(nodeDetailScalerEl);\n\n let breadcrumbsEl = document.createElement('ul');\n breadcrumbsEl.classList.add('breadcrumbs');\n for(let crumbNodeId of breadcrumbs[nodeDatum['@id']]) {\n let crumbWrapEl = document.createElement('li');\n let crumbEl = document.createElement('span');\n crumbEl.classList.add('crumb');\n crumbEl.addEventListener('click', function(e){\n let idx = graph.nodes.indexOf(nodeMap[crumbNodeId]);\n selectNode(idx);\n });\n crumbEl.innerHTML = `${getNodeLabel(nodeMap[crumbNodeId])}`;\n let nodeYear = getNodeYear(nodeMap[crumbNodeId]);\n if(nodeYear !== null) {\n crumbEl.innerHTML += `${nodeYear}`;\n }\n crumbWrapEl.appendChild(crumbEl);\n breadcrumbsEl.appendChild(crumbWrapEl);\n pageTitles.push(getNodeLabel(nodeMap[crumbNodeId]));\n }\n nodeDetailEl.appendChild(breadcrumbsEl);\n pageTitles.push(getNodeLabel(nodeDatum));\n\n let titleAttr = getLabelAttribute(nodeDatum);\n let titleEl = document.createElement('h2');\n titleEl.innerHTML = getNodeLabel(nodeDatum);\n\n let typeEl = document.createElement('span');\n typeEl.classList.add('nodeType')\n typeEl.innerHTML = getDisplayAttr(nodeDatum['@type']);\n typeEl.title = nodeDatum['@type']\n typeEl.addEventListener('click',function(e){\n centerByType(nodeDatum['@type']);\n });\n titleEl.appendChild(typeEl);\n nodeDetailEl.appendChild(titleEl);\n\n let listEl = document.createElement(\"dl\");\n // listEl.innerHTML += `
type
${nodeDatum['@type']}
`;\n\n let skipNodeAttributes = [\n '@id','x','y','index','@type','vy','vx','fx','fy','leftX','rightX'\n ];\n if(titleAttr !== 'https://schema.org/contentUrl') {\n skipNodeAttributes[skipNodeAttributes.length] = titleAttr;\n }\n for (let attr in nodeDatum) {\n if(skipNodeAttributes.indexOf(attr) != -1) {\n continue;\n }\n\n // approach all as array\n let nodeAttr = Array.isArray(nodeDatum[attr]) ? nodeDatum[attr] : [nodeDatum[attr]];\n for (let i in nodeAttr) {\n // check if relationship:\n if(typeof nodeAttr[i] === \"string\" && nodeMap[nodeAttr[i]]) {\n continue;\n } else if(typeof nodeAttr[i]['@id'] !== 'undefined') {\n continue;\n }\n if(attr == 'https://schema.org/url' || attr == 'http://www.w3.org/2000/01/rdf-schema#seeAlso') {\n listEl.innerHTML += `
${getDisplayAttr(attr)}
${nodeAttr[i]}
`;\n } else if(attr == 'https://schema.org/embedUrl') {\n listEl.innerHTML += `
${getDisplayAttr(attr)}
${nodeAttr[i]}
`;\n listEl.innerHTML += `
`;\n } else if(attr == 'https://schema.org/contentUrl') {\n listEl.innerHTML += `
${getDisplayAttr(attr)}
${nodeAttr[i]}
`;\n if(nodeDatum['@type'] == 'https://schema.org/VideoObject') {\n let videoType = nodeAttr['https://schema.org/encodingFormat'] ? `type='${nodeAttr['https://schema.org/encodingFormat']}'`: \"\";\n let poster = nodeAttr['https://schema.org/thumbnailUrl'] ? `poster='${nodeAttr['https://schema.org/thumbnailUrl']}'`: \"\";\n listEl.innerHTML += `
`;\n } else{\n listEl.innerHTML += `
`;\n }\n } else {\n let valueHtml = nodeAttr[i].replace(/\\n/g,\"
\");\n listEl.innerHTML += `
${getDisplayAttr(attr)}
${valueHtml}
`;\n }\n }\n }\n nodeDetailEl.appendChild(listEl);\n\n // let relTitleEl = document.createElement(\"h4\");\n // relTitleEl.classList.add('linkTitle');\n // relTitleEl.innerHTML = \"links\";\n // nodeDetailEl.appendChild(relTitleEl);\n\n let relsEl = document.createElement(\"dl\");\n // collect relationships\n for (var i = 0; i < graph.links.length; i++) {\n let link = graph.links[i];\n if(link['source']['@id'] == nodeDatum['@id']) {\n if(typeof relDown[link['name']] == \"undefined\") {\n relDown[link['name']] = [];\n }\n relDown[link['name']][relDown[link['name']].length] = link['target'];\n }\n if(link['target']['@id'] == nodeDatum['@id']) {\n if(typeof relUp[link['name']] == \"undefined\") {\n relUp[link['name']] = [];\n }\n relUp[link['name']][relUp[link['name']].length] = link['source'];\n }\n }\n\n // relationships / links in
\n for(let attr in relDown) {\n let attrEl = document.createElement(\"dt\");\n attrEl.innerHTML = getDisplayAttr(attr);\n relsEl.appendChild(attrEl);\n for(let i in relDown[attr]) {\n let rel = relDown[attr][i];\n relsEl.appendChild(createRelationshipEl(rel));\n if(typeof rel['https://schema.org/contentUrl'] != 'undefined') {\n let ddEl = document.createElement('dd')\n ddEl.classList.add('dd-contentobject');\n if(rel['@type'] == 'https://schema.org/VideoObject') {\n let videoType = rel['https://schema.org/encodingFormat'] ? `type='${rel['https://schema.org/encodingFormat']}'`: \"\";\n let poster = rel['https://schema.org/thumbnailUrl'] ? `poster='${rel['https://schema.org/thumbnailUrl']}'`: \"\";\n ddEl.innerHTML += ``;\n } else{\n ddEl.innerHTML = ``\n }\n relsEl.appendChild(ddEl);\n }\n }\n }\n\n for(let attr in relUp) {\n let attrEl = document.createElement(\"dt\");\n attrEl.innerHTML = getDisplayAttr(attr);\n relsEl.appendChild(attrEl);\n for(let i in relUp[attr]) {\n let rel = relUp[attr][i];\n relsEl.appendChild(createRelationshipEl(rel, i));\n if(typeof rel['https://schema.org/contentUrl'] != 'undefined') {\n let ddEl = document.createElement('dd')\n ddEl.classList.add('dd-contentobject');\n ddEl.innerHTML = ``\n relsEl.appendChild(ddEl);\n }\n }\n }\n\n nodeDetailEl.appendChild(relsEl);\n\n node.each(function(d,nIdx,nodeEls){\n if(nIdx == nodeIdx) {\n nodeEls[nIdx].classList.add('selectedNode');\n } else {\n nodeEls[nIdx].classList.remove('selectedNode');\n }\n });\n\n // TODO: update history & title\n document.title = pageTitles.join(\" :: \");\n};\nvar closeDetails = function() {\n document.body.classList.remove(\"detailsOpen\");\n scrollToY(0, 4000); // for mobile\n}\n\n/**\n * Select a node, and center it + show details\n * @param int idx The index of the node in the graph.nodes array\n * @param Element|null nodeEl Optional, provide node element, so loop doesn't have to be used to change the Element\n * @return void\n */\nvar selectNode = function(idx, updateHistory){\n if(typeof updateHistory == 'undefined') {\n updateHistory = true;\n }\n\n let nodeEl = null;\n let nodeDatum = null;\n\n node.each(function(d,nIdx,nodeEls){\n if(nIdx == idx) {\n nodeEl = nodeEls[idx];\n nodeDatum = d;\n }\n });\n if(!nodeEl) {\n return;\n }\n\n\n if(true) { // always set history state, but replace instead of update on 'updatehistory'\n let id = null;\n if(nodeDatum['@id'].startsWith(/*location.origin*/'https://rubenvandeven.com/')){\n id = nodeDatum['@id'].substr(26);\n } else {\n id = '?id=' + nodeDatum['@id'];\n }\n\n if(updateHistory) {\n history.pushState({node: idx}, getNodeLabel(nodeDatum), \"/\"+id);\n } else {\n history.replaceState({node: idx}, getNodeLabel(nodeDatum), \"/\"+id);\n }\n }\n\n // set global var\n positionNodesInCenter(idx);\n\n let currentCrumbs = breadcrumbs[nodeDatum['@id']].slice();\n currentCrumbs[currentCrumbs.length] = nodeDatum['@id'];\n\n // set active links.\n let linkedIdxs = [];\n link.each(function(d,idx,linkEls,q){\n // set nodes 'visible'/highlighted when linked to active node\n if(d.source == nodeDatum || d.target == nodeDatum) {\n linkEls[idx].classList.add('activeLink','visibleLink');\n linkEls[idx].getElementsByTagName(\"line\")[0].setAttribute(\"marker-end\", \"url(#arrowHeadSelected)\");\n node.filter(function(a, fnodeIdx){\n let r = a['@id'] == d.source['@id'] || a['@id'] == d.target['@id']; //connected node: true/false\n if(r && linkedIdxs.indexOf(fnodeIdx) === -1){\n linkedIdxs[linkedIdxs.length] = fnodeIdx;\n }\n return r;\n }).classed('visibleNode', true);\n } else {\n linkEls[idx].classList.remove('activeLink');\n linkEls[idx].getElementsByTagName(\"line\")[0].setAttribute(\"marker-end\", \"url(#arrowHead)\");\n }\n // check if link is part of breadcrumb trail\n let posSrc = currentCrumbs.indexOf(d.source['@id']);\n let posTrg = currentCrumbs.indexOf(d.target['@id']);\n if(posSrc > -1 && posTrg > -1 && Math.abs(posSrc - posTrg) == 1) {\n linkEls[idx].classList.add('breadcrumbLink');\n linkEls[idx].getElementsByTagName(\"line\")[0].setAttribute(\"marker-end\", \"url(#arrowHeadCrumbTrail)\");\n } else {\n linkEls[idx].classList.remove('breadcrumbLink');\n }\n });\n\n let i = linkedIdxs.indexOf(idx);\n\n if(i !== -1) {\n linkedIdxs.splice(i, 1);\n }\n\n positionNodesInCircle(linkedIdxs);\n\n setDetails(nodeDatum ,idx);\n}\nvar deselectNode = function() {\n positionNodesInCenter(null);\n link.each(function(d,idx,linkEls,q){\n linkEls[idx].classList.remove('activeLink');\n linkEls[idx].classList.remove('breadcrumbLink');\n linkEls[idx].getElementsByTagName(\"line\")[0].setAttribute(\"marker-end\", \"url(#arrowHead)\")\n });\n closeDetails();\n}\n\n\nwindow.addEventListener('popstate', function(event) {\n if(event.state.hasOwnProperty('node')) {\n selectNode(event.state['node'], false);\n }\n else {\n // if not sure what to do, fall back to first node (also used to return to opening page)\n let firstNode = graph['nodes'].find(n => n['@id'] === firstNodeId);\n selectNode(graph['nodes'].indexOf(firstNode), false);\n }\n});\n\nvar forceCx, forceCy;\nvar setViewboxForceCenter = function() {\n let viewBox = getViewbox();\n let zoom = getZoomValues();\n forceCx = viewBox[0] + viewBox[2]/2 - zoom['dx'];\n forceCy = viewBox[1] + viewBox[3]/2 - zoom['dy'];\n}\n\nvar getZoomValues = function(){\n let zoomContainer = document.getElementById(\"container\");\n let dx = 0, dy = 0, scale = 1;\n if(zoomContainer.transform.baseVal.length > 0) {\n for(let transform of zoomContainer.transform.baseVal) {\n if(transform.type == SVGTransform.SVG_TRANSFORM_TRANSLATE) {\n dx += transform.matrix.e;\n dy += transform.matrix.f;\n }\n else if (transform.type == SVGTransform.SVG_TRANSFORM_SCALE) {\n scale *= transform.matrix.a; // assume simple scale\n }\n }\n }\n\n return {'dx': dx, 'dy': dy, 'scale': scale};\n}\n\nsetViewboxForceCenter(); // sets forceCx & forceCy\n\nvar graphInitialised = false;\nsimulation.force('centerActive', function force(alpha) {\n // let currentNode = node.selectAll('.detail');\n // console.log(currentNode);\n // console.log(forceCx, forceCy);\n node.each(function(d, idx, nodes){\n let n = d;\n let k = alpha * 0.1;\n n.fx = null;\n n.fy = null;\n if(typeof nodePositions[idx] != 'undefined') {\n if(graphInitialised == false) {\n n.x = nodePositions[idx][0];\n n.y = nodePositions[idx][1];\n n.vx = 0;\n n.vy = 0;\n } else {\n n.vx -= (n.x - nodePositions[idx][0]) * k * 5;\n n.vy -= (n.y - nodePositions[idx][1]) * k * 5;\n }\n } else {\n // if it's not positioned, move it out of the circle\n if(currentNodePositionRadius < 1) {\n return;\n }\n\n let dx = n.x - forceCx;\n let dy = n.y - forceCy;\n if(!inCircle(dx, dy, currentNodePositionRadius)) {\n return;\n }\n\n if(graphInitialised == false) {\n // on init, fixate items outside of circle\n n.fx = n.x + dx * (2+Math.random());\n n.fy = n.y + dy * (2+Math.random());\n } else {\n // if initialised, gradually move them outwards\n n.vx += dx * k*4;\n n.vy += dy * k*4;\n }\n }\n });\n});\n\n//path to curve the tile\nvar nodePath = node.append(\"path\")\n .attr(\"id\", function(d,idx){return \"nodePath\"+idx;})\n .attr(\"d\", function(d){\n var r = getSizeForNode(d) * 0.9;\n var startX = getSizeForNode(d);\n // M cx cy\n // m -r, 0\n // a r,r 0 1,0 (r * 2),0\n // a r,r 0 1,0 -(r * 2),0\n // return 'M' + nodeSize/2 + ' ' + nodeSize/2 + ' ' +\n return 'M' + 0 + ' ' + 0 + ' ' +\n 'm -' + r + ', 0'+' ' +\n 'a ' + r +','+r+' 0 1,0 '+ (r*2) +',0 '+\n 'a ' + r +','+r+' 0 1,0 -'+ (r*2) +',0'\n ;\n // return 'm' + startX + ',' + nodeSize + ' ' +\n // 'a' + r + ',' + r + ' 0 0 0 ' + (2*r) + ',0';\n })\n ;\n\nnode.call(d3.drag()\n .on(\"start\", dragstarted)\n .on(\"drag\", dragged)\n .on(\"end\", dragended))\n .on(\"click\", function(d, idx, nodes){\n let node = nodes[idx];\n selectNode(idx, node, d);\n })\n .on('mouseover', function(n, nIdx){\n link.each(function(l,idx,linkEls,q){\n // set nodes 'visible'/highlighted when linked to active node\n if(l.source == n || l.target == n) {\n linkEls[idx].classList.add('hoverLink');\n }\n });\n })\n .on('mouseout', function(){\n let hoverLinkEls = document.getElementsByClassName('hoverLink');\n while(hoverLinkEls.length > 0){\n hoverLinkEls[0].classList.remove('hoverLink');\n }\n });\n\n// svg.call(d3.drag()\n// .on(\"start\", function(d){\n// if(d3.event.sourceEvent.type == 'touchstart' && d3.event.sourceEvent.touches.length > 1) {\n// } else {\n// d3.event.sourceEvent.stopPropagation();\n// svg.node().classList.add(\"dragging\");\n// }\n// })\n// .on(\"drag\", function(){\n// moveViewboxPx(d3.event.dx, d3.event.dy);\n// })\n// .on(\"end\", function(){\n// svg.node().classList.remove(\"dragging\");\n// }));\nsvg.call(d3.zoom()\n .scaleExtent([0.3,3])\n .on(\"start\", function(){\n svg.node().classList.add(\"dragging\");\n })\n .on(\"end\", function(){\n svg.node().classList.remove(\"dragging\");\n })\n .on(\"zoom\", function(a,b,c){\n container.attr(\"transform\", d3.event.transform);\n })\n);\n\n// svg.call(d3.zoom.transform, d3.zoomIdentity);\n\nnode.append('circle')\n .attr(\"r\", (d) => getSizeForNode(d))\n .attr(\"class\", \"nodeBg\")\n ;\nnode.append('circle')\n .attr(\"r\", (d) => getSizeForNode(d) * 1.08) // nodeSize + margin\n .attr(\"class\", \"highlightCircle\")\n ;\n\nnode.append('text')\n .attr(\"class\", \"nodeType\")\n .text(function(n){\n return n['@type'];\n })\n\nnode.append('text')\n .attr(\"class\", \"nodeYear\")\n .attr(\"y\", \"22\")\n .text(function(n){\n return getNodeYear(n);\n })\n ;\nlet splitText = function(text){\n let characters = [\" \",\"-\",\"\\u00AD\"];\n let charSplitPos = {};\n let mid = Math.floor(text.length / 2);\n let splitPos = false;\n let splitPosChar = false;\n // split sentences\n for(let char of characters) {\n if(text.indexOf(char) < 0) {\n continue;\n }\n let tmid = text.substr(0,mid).lastIndexOf(char);\n if(tmid === -1) {\n tmid = text.indexOf(char);\n }\n tmid += 1; // we want to cut _after_ the character\n // console.log(\"Char\", char, tmid);\n if(splitPos === false || Math.abs(tmid-mid) < Math.abs(splitPos - mid)){\n // console.log(\"least!\");\n splitPos = tmid;\n splitPosChar = char;\n }\n }\n // console.log(\"pos\",splitPos)\n\n\n if(splitPos === false) {\n return false;\n }\n\n let text1 = text.substr(0, splitPos).trim();\n let text2 = text.substr(splitPos).trim();\n\n if(splitPosChar == \"\\u00AD\") {\n text1 += \"-\";\n }\n\n // find most equal split\n return [text1, text2];\n}\nlet nodeTitle = node.append('text')\n .attr(\"class\", \"nodeTitle\")\n .attr(\"y\", \"5\")\n ;\nnodeTitle\n // .append(\"textPath\")\n // .attr( \"xlink:href\",function(d, idx){return '#nodePath'+idx;})\n // .text(getNodeLabel)\n .each(function(node, nodes){\n let textLength;\n let self = d3.select(this);\n let titleText = getNodeLabel(node);\n let titleTexts = false;\n if(titleText.length > 20) {\n titleTexts = splitText(titleText);\n }\n if(titleTexts !== false) {\n let tspan1 = self.append(\"tspan\")\n .text(titleTexts[0])\n .attr(\"y\", \"-10\")\n .attr(\"x\", \"0\")\n ;\n let tspan = self.append(\"tspan\")\n .text(titleTexts[1])\n .attr(\"y\", \"10\")\n .attr(\"x\", \"0\")\n ;\n let textLength1 = tspan.node().getComputedTextLength();\n let textLength2 = tspan.node().getComputedTextLength();\n textLength = Math.max(textLength1, textLength2);\n } else {\n self.text(titleText);\n textLength = self.node().getComputedTextLength();\n }\n\n // scale according to text length:\n if(textLength > getSizeForNode(node) * 2) {\n self.attr('transform', `scale(${(getSizeForNode(node) * 2) / textLength / 1.05})`);\n }\n })\n ;\n\nnode.each(function(d) {\n if(!d['https://schema.org/thumbnailUrl']) {\n return;\n }\n d3.select(this).append('svg:image')\n .attr(\"xlink:href\", d['https://schema.org/thumbnailUrl'])\n .attr(\"width\", (d) => getSizeForNode(d)*2)\n .attr(\"height\", (d) => getSizeForNode(d)* 2)\n .attr(\"transform\",(d) => \"translate(-\"+getSizeForNode(d)+\" -\"+getSizeForNode(d)+\")\")\n .attr(\"clip-path\",\"url(#clipNodeImage)\")\n .attr(\"preserveAspectRatio\",\"xMidYMid slice\")\n ;\n });\n\nsimulation\n .nodes(graph.nodes)\n .on(\"tick\", ticked);\n\nsimulation.force(\"link\")\n .links(graph.links)\n .distance(function(l){\n switch (l.name) {\n // case 'publishedAt':\n // return 200;\n // case 'image':\n // return 200;\n default:\n return 300;\n }\n }) // distance between the nodes / link length\n // .charge(-100)\n;\n\n// run on each draw\nfunction ticked() {\n graph.nodes.forEach(function (d, idx) {\n d.leftX = d.rightX = d.x;\n\n // fix first node on center\n // if(idx === 0) {\n // d.fx = width/2;\n // d.fy = height/2;\n // return;\n // }\n });\n\n linkLine.each(function (d) {\n var sourceX, targetX, midX, dx, dy, angle;\n\n // This mess makes the arrows exactly perfect.\n // thanks to http://bl.ocks.org/curran/9b73eb564c1c8a3d8f3ab207de364bf4\n if( d.source.rightX < d.target.leftX ){\n sourceX = d.source.rightX;\n targetX = d.target.leftX;\n } else if( d.target.rightX < d.source.leftX ){\n targetX = d.target.rightX;\n sourceX = d.source.leftX;\n } else if (d.target.isCircle) {\n targetX = sourceX = d.target.x;\n } else if (d.source.isCircle) {\n targetX = sourceX = d.source.x;\n } else {\n midX = (d.source.x + d.target.x) / 2;\n if(midX > d.target.rightX){\n midX = d.target.rightX;\n } else if(midX > d.source.rightX){\n midX = d.source.rightX;\n } else if(midX < d.target.leftX){\n midX = d.target.leftX;\n } else if(midX < d.source.leftX){\n midX = d.source.leftX;\n }\n targetX = sourceX = midX;\n }\n\n dx = targetX - sourceX;\n dy = d.target.y - d.source.y;\n angle = Math.atan2(dx, dy);\n\n /* DISABLED\n srcSize = (typeof nodePositions[d.source.index] != 'undefined') ? selectedNodeSize : nodeSize;\n tgtSize = (typeof nodePositions[d.target.index] != 'undefined') ? selectedNodeSize : nodeSize;\n */\n let srcSize = getSizeForNode(d.source)+3.2;\n let tgtSize = getSizeForNode(d.target)+3.2;\n\n // Compute the line endpoint such that the arrow\n // is touching the edge of the node rectangle perfectly.\n d.sourceX = sourceX + Math.sin(angle) * srcSize;\n d.targetX = targetX - Math.sin(angle) * tgtSize;\n d.sourceY = d.source.y + Math.cos(angle) * srcSize;\n d.targetY = d.target.y - Math.cos(angle) * tgtSize;\n })\n .attr(\"x1\", function(d) { return d.sourceX; })\n .attr(\"y1\", function(d) { return d.sourceY; })\n .attr(\"x2\", function(d) { return d.targetX; })\n .attr(\"y2\", function(d) { return d.targetY; });\n linkText.attr(\"transform\", function(d){\n let dx = (d.target.x - d.source.x) /2;\n let dy = (d.target.y - d.source.y) /2;\n let x = d.source.x + dx;\n let y = d.source.y + dy;\n let deg = Math.atan(dy / dx) * 180 / Math.PI;\n // if dx/dy == 0/0 -> deg == NaN\n if(isNaN(deg)) {\n return \"\";\n }\n return \"translate(\"+x+\" \"+y+\") rotate(\"+deg+\") translate(0, -10)\";\n });\n\n node.attr(\"transform\", function(d) { return \"translate(\" + d.x + \",\" + d.y + \")\"; });\n}\n\nfunction dragstarted(d,idx,nodes) {\n if (!d3.event.active) simulation.alphaTarget(0.3).restart();\n let nodeEl = nodes[idx];\n d.fx = d.x;\n d.fy = d.y;\n // nodeEl.style.fill = '#00f';\n nodeEl.classList.add('drag');\n}\n\n// use to validate drag\n// function validate(x, a, b) {\n// if (x =< a) return a;\n// return b;\n// }\n\nfunction dragged(d, idx) {\n d.fx = d3.event.x;\n d.fy = d3.event.y;\n}\n\nfunction dragended(d, idx, nodes) {\n if (!d3.event.active) simulation.alphaTarget(0);\n let nodeEl = nodes[idx];\n d.fx = null;\n d.fy = null;\n nodeEl.classList.remove('drag');\n}\n\nfunction moveViewboxPx(dx, dy){\n let viewBox = svg.attr(\"viewBox\").split(\" \").map(parseFloat);\n viewBox[0] -= dx * 1;\n viewBox[1] -= dy * 1;\n svg.attr(\"viewBox\", viewBox.join(\" \"));\n}\n\n// start by selecting the first node :-)\n// selectNode(currentNodeIdx+1);\n// positionNodesInCenter(currentNodeIdx);\n\nif(location.pathname.startsWith('/@type/')) {\n for(let t in types) {\n if(getDisplayAttr(t) == location.pathname.substr(7)) {\n centerByType(t, false);\n }\n }\n} else{\n let startNodeId = location.search.startsWith(\"?id=\") ? location.search.substr(4) : 'https://rubenvandeven.com'+location.pathname;\n let firstNode = graph['nodes'].find(n => n['@id'] === startNodeId);\n selectNode(graph['nodes'].indexOf(firstNode), false);\n}\n\n\n\n// closeDetails(); // hide details at first\n// positionNodesInCenter(currentNodeIdx+1);\n\n// setTimeout(function(){\n // document.body.classList.add('graphInitialised');\n// }, 10);\n\nlet initPlaceholder = document.getElementById('initPlaceholder');\nsvg.node().removeChild(initPlaceholder);\nsetTimeout(function(){\n graphInitialised = true;\n document.body.classList.add('graphInitialised');\n }, 500);\n}\n\n\n// Detect request animation frame\nvar reqAnimFrame = window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n // IE Fallback, you can even fallback to onscroll\n function(callback){ window.setTimeout(callback, 1000/60) };\n// all credits go to https://stackoverflow.com/a/26798337\nfunction scrollToY(scrollTargetY, speed, easing, finishFunction) {\n // scrollTargetY: the target scrollY property of the window\n // speed: time in pixels per second\n // easing: easing equation to use\n\n var scrollY = window.scrollY,\n scrollTargetY = scrollTargetY || 0,\n speed = speed || 2000,\n easing = easing || 'easeOutSine',\n currentTime = 0,\n finishFunction = finishFunction || false;\n\n // min time .1, max time .8 seconds\n let time = Math.max(.1, Math.min(Math.abs(scrollY - scrollTargetY) / speed, .8));\n\n // easing equations from https://github.com/danro/easing-js/blob/master/easing.js\n let PI_D2 = Math.PI / 2,\n easingEquations = {\n easeOutSine: function (pos) {\n return Math.sin(pos * (Math.PI / 2));\n },\n easeInOutSine: function (pos) {\n return (-0.5 * (Math.cos(Math.PI * pos) - 1));\n },\n easeInOutQuint: function (pos) {\n if ((pos /= 0.5) < 1) {\n return 0.5 * Math.pow(pos, 5);\n }\n return 0.5 * (Math.pow((pos - 2), 5) + 2);\n }\n };\n\n // add animation loop\n function tick() {\n currentTime += 1 / 60;\n\n var p = currentTime / time;\n var t = easingEquations[easing](p);\n\n if (p < 1) {\n reqAnimFrame(tick);\n\n window.scrollTo(0, scrollY + ((scrollTargetY - scrollY) * t));\n } else {\n window.scrollTo(0, scrollTargetY);\n if(finishFunction) {\n finishFunction();\n }\n }\n }\n\n // call it once to get started\n tick();\n}\n"]} \ No newline at end of file +{"version":3,"sources":["portfolio.js"],"names":["data","graph","getLabelAttribute","node","getNodeLabel","label","getNodeYear","n","substr","match","getDisplayAttr","attr","replace","jsonLdToGraph","nodes","links","nodeId","nodeAttr","Array","isArray","key","i","currentId","name","Object","keys","length","source","target","nodeMap","linkMap","breadcrumbs","weights","requestPromise","fetch","then","r","json","rankingPromise","dx","dy","dxAbs","Math","abs","values","dyAbs","pow","_iteratorNormalCompletion","_didIteratorError","_iteratorError","undefined","_step","_iterator","Symbol","iterator","next","done","link","value","id","err","return","Promise","hasOwnProperty","startGraph","nodeSize","selectedNodeSize","firstNodeId","getSizeForNode","min","createBreadcrumbs","srcId","crumbs","createBreadcrumbLayer","newPath","slice","push","nextSrcIds","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","newNextIds","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","nextIds","concat","nodePositions","currentNodePositionRadius","nodeIdx","type","types","document","showMoreTypeLinksEl","getElementById","moreTypeLinksEl","typeCounts","map","sort","first","second","_loop","typeCountIdx","typeName","typeLinkEl","createElement","typeLinkAEl","typeLinkCountEl","add","title","addEventListener","centerByType","typeNodeEls","getElementsByClassName","_iteratorNormalCompletion7","_didIteratorError7","_iteratorError7","_step7","_iterator7","_iteratorNormalCompletion8","_didIteratorError8","_iteratorError8","_step8","_iterator8","classList","remove","append","typeLinksEl","appendChild","body","e","preventDefault","stopPropagation","removeEventListener","hideMoreTypeLinks","nodeEls","svg","createLinkMap","simulation","d3","forceLink","d","strength","force","forceManyBody","container","selectAll","enter","l","linkLine","linkText","innerHTML","baseClasses","slashpos","lastIndexOf","typeNodeEl","getViewbox","split","parseFloat","positionNodesInCenter","idxs","setViewboxForceCenter","_typeof","positionNodesInCircle","forceCx","forceCy","each","nIdx","alpha","viewBox","max","height","zoom","forceSimulation","forceCollide","cos","stepSize","restart","updateHistory","idx","indexOf","deselectNode","history","pushState","join","nodeDetailEl","transition","ease","easeLinear","relNode","el","titleEl","selectNode","typeEl","listEl","nodeEl","videoType","nodeDatum","startsWith","relDown","currentCrumbs","relUp","linkEls","q","getElementsByTagName","setAttribute","attrEl","a","relsEl","fnodeIdx","linkedIdxs","classed","posSrc","posTrg","ddEl","rel","splice","scrollToY","lastChild","nodeDetailScalerEl","getZoomValues","drag","width","window","innerWidth","clientX","nodeDetails","breadcrumbsEl","_loop2","crumbNodeId","crumbEl","nodeYear","crumbWrapEl","pageTitles","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","titleAttr","replaceState","selectedNodeTransition","skipNodeAttributes","setDetails","hasChildNodes","poster","valueHtml","b","createRelationshipEl","event","firstNode","find","closeDetails","transform","baseVal","_iteratorNormalCompletion5","_didIteratorError5","_iteratorError5","_step5","_iterator5","zoomContainer","SVGTransform","SVG_TRANSFORM_TRANSLATE","matrix","f","SVG_TRANSFORM_SCALE","scale","k","fx","fy","graphInitialised","vy","vx","x","y","inCircle","random","filter","call","self","tspan","alphaTarget","titleTexts","textLength1","textLength2","textLength","titleText","on","state","hoverLinkEls","scaleExtent","c","text","nodePath","select","this","startX","splitPosChar","_iteratorNormalCompletion6","_didIteratorError6","_iteratorError6","_step6","_iterator6","char","mid","tmid","splitPos","text1","trim","splitText","getComputedTextLength","forEach","rightX","sourceX","targetX","midX","angle","leftX","isCircle","atan2","srcSize","tgtSize","sin","text2","targetY","sourceY","nodeTitle","deg","atan","PI","isNaN","distance","location","pathname","t","search","startNodeId","initPlaceholder","removeChild","setTimeout","reqAnimFrame","mozRequestAnimationFrame","callback","speed","easing","finishFunction","scrollTargetY","time","scrollY","easingEquations","easeOutSine","pos","tick","p","scrollTo"],"mappings":"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","file":"portfolio.min.js","sourcesContent":["var data;\n\nfunction getLabelAttribute(node) {\n if(typeof node['https://schema.org/name'] !== \"undefined\"){\n return 'https://schema.org/name';\n }\n switch (node['@type']) {\n case \"https://schema.org/WebSite\":\n if(typeof node['https://schema.org/url'] !== \"undefined\") {return 'https://schema.org/url';}\n break;\n case \"https://schema.org/ImageObject\":\n if(typeof node['https://schema.org/caption'] !== \"undefined\") {return 'https://schema.org/caption';}\n if(typeof node['https://schema.org/contentUrl'] !== \"undefined\") {return 'https://schema.org/contentUrl';}\n break;\n case \"https://schema.org/PostalAddress\":\n if(typeof node['https://schema.org/addressLocality'] !== \"undefined\") {return 'https://schema.org/addressLocality';}\n break;\n }\n return '@id';\n}\nfunction getNodeLabel(node){\n let labelAttr = getLabelAttribute(node);\n let label = node[labelAttr];\n if(typeof label == \"undefined\") label = node[\"@id\"];\n if(typeof label == \"undefined\") label = \"\";\n return label;\n}\nfunction getNodeYear(n){\n if(typeof n['https://schema.org/dateCreated'] !== 'undefined') {\n return n['https://schema.org/dateCreated'].substr(0,4);\n }\n if(typeof n['https://schema.org/datePublished'] !== 'undefined') {\n return n['https://schema.org/datePublished'].substr(0,4);\n }\n if(typeof n['https://schema.org/startDate'] !== 'undefined') {\n // console.log(n['https://schema.org/startDate']);\n return n['https://schema.org/startDate'].substr(0,4);\n }\n if(typeof n['https://schema.org/endDate'] !== 'undefined') {\n return n['https://schema.org/endDate'].substr(0,4);\n }\n if(typeof n['https://schema.org/foundingDate'] !== 'undefined') {\n return n['https://schema.org/foundingDate'].substr(0,4);\n }\n if(typeof n['https://schema.org/temporalCoverage'] !== 'undefined') {\n if(n['https://schema.org/temporalCoverage'].match(/\\d{4}-\\d{4}/)) {\n return n['https://schema.org/temporalCoverage'].substr(5,4);\n }\n }\n return null;\n}\nfunction getDisplayAttr(attr) {\n return attr.replace(/.*[#|\\/]/, \"\");\n}\n/**\nTransform a flattened jsonld into a d3 compatible graph\n@param Object data flattened jsonld data\n@return Object graph has keys \"nodes\" and \"links\"\n*/\nfunction jsonLdToGraph(data){\n let nodes = {};\n let links = [];\n\n // collect all nodes\n for(let nodeId in data){\n // data[nodeId][\"@type\"][0] = data[nodeId][\"@type\"][0];\n nodes[data[nodeId][\"@id\"]] = data[nodeId];\n }\n\n // collect all links (separate loop as we need to check nodes)\n for(let nodeId in data) {\n let node = data[nodeId];\n let currentId = node[\"@id\"];\n for(let key in node){\n let nodeAttr = Array.isArray(node[key]) ? node[key] : [node[key]];\n // // relations should always be lists (eases assumptions)\n // if(typeof node[key] !== \"Array\" && typeof node[key]['id'] !== \"undefined\") {\n // node[key] = [node[key]];\n // }\n // every attribute is an Array after flatten(), loop them\n for(let i in nodeAttr) {\n if(key !== \"@id\" && typeof nodeAttr[i] === \"string\" && nodes[nodeAttr[i]]) {\n links[links.length] = {\n \"source\": currentId,\n \"target\": nodeAttr[i],\n \"name\": key\n };\n }\n else if(typeof nodeAttr[i][\"@id\"] !== \"undefined\") {\n // if there is just one item, flatten/expand has turned urls in objects with just an id\n // reverse this, as we don't want these separate for this project\n if (Object.keys(nodeAttr[i]).length == 1 && typeof nodes[nodeAttr[i][\"@id\"]] === \"undefined\") {\n // skip\n // nodeAttr = nodeAttr[i][\"id\"];\n } else {\n links[links.length] = {\n \"source\": currentId,\n \"target\": nodeAttr[i][\"@id\"],\n \"name\": key\n };\n }\n }\n }\n }\n }\n return {\n \"nodes\": Object.values(nodes),\n \"links\": links\n };\n}\n\nvar graph;\n// map nodes to their ID\nvar nodeMap = {};\nvar linkMap = {};\nvar breadcrumbs = {};\nvar weights = {};\n\n// load the flattened jsonld file\nconst requestPromise = fetch('/assets/js/rubenvandeven.jsonld').then(r => r.json());\nconst rankingPromise = fetch('/assets/js/ranking.json').then(r => r.json());\n\nPromise.all([requestPromise, rankingPromise])\n .then(values => {\n if(values[0].hasOwnProperty('@graph')) {\n data = values[0];\n weights = values[1];\n } else {\n data = values[1];\n weights = values[0];\n }\n graph = jsonLdToGraph(data['@graph']);\n // create a map of nodes by id.\n for(let i in graph.nodes) {\n nodeMap[graph.nodes[i]['@id']] = graph.nodes[i];\n }\n startGraph(graph);\n });\n\nfunction inCircle(dx, dy, r) {\n // fastest check if in circle: https://stackoverflow.com/a/7227057\n let dxAbs = Math.abs(dx);\n let dyAbs = Math.abs(dy);\n\n if(dxAbs > r || dyAbs > r) {\n return false;\n } else if(dxAbs + dyAbs <= r){\n return true;\n } else if( Math.pow(dx,2) + Math.pow(dy, 2) <= Math.pow(r,2)){\n return true;\n } else {\n return false;\n }\n}\n\nfunction createLinkMap(graph) {\n let linkMap = {};\n for(let link of graph['links']){\n if(typeof linkMap[link['source']] == 'undefined') {\n linkMap[link['source']] = [];\n }\n linkMap[link['source']][linkMap[link['source']].length] = {'id': link['target'], 'name': link['name']};\n\n\n if(typeof linkMap[link['target']] == 'undefined') {\n linkMap[link['target']] = [];\n }\n\n linkMap[link['target']][linkMap[link['target']].length] = {'id': link['source'], 'name': link['name']};\n }\n return linkMap;\n}\n\n\n // config\nvar nodeSize = 40;\nvar selectedNodeSize = 140;\nvar firstNodeId = \"https://rubenvandeven.com/\";\n\nfunction getSizeForNode(node) {\n if(node.hasOwnProperty('https://schema.org/thumbnailUrl'))\n return nodeSize;\n if(weights[node['@id']])\n return nodeSize * weights[node['@id']];\n if(node['@id'] == firstNodeId)\n return nodeSize*1.2;\n // everynode has at least one link. these should equal 1\n return nodeSize * (.7 + Math.min(20, linkMap[node['@id']].length) / 40)\n return nodeSize;\n}\n\n// TODO: make sure, 'shortest' path is favoured.\nfunction createBreadcrumbs(linkMap, srcId) {\n let crumbs = {};\n\n let createBreadcrumbLayer = function(srcId) {\n let path = crumbs[srcId];\n let newPath = path.slice();\n newPath.push(srcId);\n\n let nextSrcIds = [];\n for (let link of linkMap[srcId]) {\n if(typeof crumbs[link['id']] !== 'undefined') continue;\n crumbs[link['id']] = newPath;\n nextSrcIds.push(link['id']);\n }\n\n return nextSrcIds;\n }\n crumbs[srcId] = [];\n let nextIds = [srcId];\n while(nextIds.length > 0) {\n let newNextIds = [];\n for (let nextId of nextIds) {\n let r = createBreadcrumbLayer(nextId);\n newNextIds = newNextIds.concat(r);\n }\n nextIds = newNextIds;\n }\n return crumbs;\n}\n\nvar nodePositions = {};\nfunction startGraph(graph){\n\n\n// set some vars\nvar currentNodeIdx = 0;\nvar currentNodePositionRadius = 0;\nvar types = {};\n\nlinkMap = createLinkMap(graph);\nbreadcrumbs = createBreadcrumbs(linkMap, firstNodeId);\n\nfor (let nodeIdx in graph['nodes']) {\n let type = graph['nodes'][nodeIdx][\"@type\"];\n if(typeof types[type] == 'undefined') {\n types[type] = [];\n }\n types[type].push(nodeIdx);\n}\nvar graphControlsEl = document.getElementById('graphControls');\nvar typeLinksEl = document.getElementById('typeLinks');\nvar showMoreTypeLinksEl = document.getElementById('showMoreTypeLinks');\nvar moreTypeLinksEl = document.getElementById('moreTypeLinks');\nvar relLinksEl = document.getElementById('relLinks');\n\n// sort types by count:\nvar typeCounts = Object.keys(types).map(function(key) {\n return [key, types[key].length];\n});\ntypeCounts.sort(function(first, second) {\n return second[1] - first[1];\n});\n\n// make controls\nlet i = 0;\nfor (let typeCountIdx in typeCounts) {\n let typeName = typeCounts[typeCountIdx][0];\n let typeLinkEl = document.createElement(\"li\");\n let typeLinkAEl = document.createElement(\"a\");\n let typeLinkCountEl = document.createElement(\"span\");\n typeLinkCountEl.innerHTML = typeCounts[typeCountIdx][1];\n typeLinkCountEl.classList.add('typeCount');\n typeLinkAEl.innerHTML = getDisplayAttr(typeName);\n typeLinkAEl.title = typeName;\n typeLinkAEl.addEventListener('click', function(){\n centerByType(typeName);\n // positionNodesInCenter(types[typeName]);\n });\n typeLinkAEl.addEventListener('mouseover', function() {\n let typeNodeEls = document.getElementsByClassName(typeName);\n for(let typeNodeEl of typeNodeEls) {\n typeNodeEl.classList.add('typeHighlight');\n }\n });\n typeLinkAEl.addEventListener('mouseout', function() {\n let typeNodeEls = document.getElementsByClassName(typeName);\n for(let typeNodeEl of typeNodeEls) {\n typeNodeEl.classList.remove('typeHighlight');\n }\n });\n typeLinkEl.append(typeLinkAEl);\n typeLinkEl.append(typeLinkCountEl);\n (i < 5 ? typeLinksEl: moreTypeLinksEl).appendChild(typeLinkEl);\n i++;\n // typeLinksEl.appendChild(typeLinkEl);\n}\n\nshowMoreTypeLinksEl.addEventListener('click', function () {\n document.body.classList.add('showMoreLinks');\n var hideMoreTypeLinks = function(e) {\n e.preventDefault();\n e.stopPropagation();\n document.body.removeEventListener('mouseup', hideMoreTypeLinks, true);\n document.body.classList.remove('showMoreLinks');\n }\n document.body.addEventListener('mouseup', hideMoreTypeLinks, true);\n}, false)\n\n\n// make svg\nvar svg = d3.select(\"svg\"),\n width = +svg.attr(\"width\"),\n height = +svg.attr(\"height\");\nvar container = svg.append(\"g\")\n .attr(\"id\", \"container\")\n ;\n\nvar simulation = d3.forceSimulation()\n .force(\"link\", d3.forceLink().id(function(d) { return d[\"@id\"]; }).strength(.005))\n .force(\"charge\", d3.forceManyBody()) // doesn't seem necessary?\n .force(\"collision\", d3.forceCollide(function(d){\n return getSizeForNode(d) * 1.1; // avoid overlapping nodes\n }))\n // .force(\"center\", d3.forceCenter(width / 2, height / 2)) // position around center\n\n // .force(\"x\", d3.forceX())\n // .force(\"y\", d3.forceY())\n // .force(\"y\", d3.forceY())\n ;\n\n\nvar link = container.append(\"g\")\n .attr(\"class\", \"links\")\n .selectAll(\".relationship\")\n .data(graph['links'])\n .enter().append(\"g\")\n .attr(\"class\", function(l){return \"relationship \"+l.name;})\n ;\nvar linkLine = link\n // .append(\"line\");\n .append(\"line\").attr(\"marker-end\", \"url(#arrowHead)\")\n ;\nvar linkText = link\n .append(\"text\")\n .text(function(l){\n // l == Object { source: \"https://rubenvandeven.com/#codesandmodes\", target: \"_:b34\", name: \"https://schema.org/location\" }\n return getDisplayAttr(l.name);\n })\n ;\n\n var node = container.append(\"g\")\n .attr(\"class\", \"nodes\")\n .selectAll(\".node\")\n .data(graph.nodes)\n .enter().append(\"g\")\n .attr(\"class\", function(d) {\n let baseClasses = 'node ' + d['@type'];\n if(d['@type']) {\n let slashpos = d['@type'].lastIndexOf('/');\n if(slashpos > -1) {\n baseClasses += ' ' + d['@type'].substr(slashpos + 1);\n }\n }\n return baseClasses;\n })\n ;\nvar getViewbox = function() {\n return svg.attr(\"viewBox\").split(\" \").map(parseFloat);\n}\nvar positionNodesInCenter = function(idxs) {\n setViewboxForceCenter(); // sets forceCx & forceCy\n if(typeof idxs == \"object\" && idxs !== null && idxs.length == 1) {\n idxs = idxs[0];\n }\n\n nodePositions = {}; // reset\n if(idxs === null) {\n return;\n }\n else if(typeof idxs == \"object\") {\n // array or object -> each\n // calculate grid:\n // let itemsX = 4;\n // let itemsY = Math.ceil(idxs.length/itemsX);\n // console.log(itemsX,itemsY);\n // let rowDiffX = viewBox[3] * (1/(itemsX+1));\n // let rowDiffY = viewBox[2] * (1/(itemsY+1));\n // console.log(rowDiffX, rowDiffY);\n // for (var i = 0; i < idxs.length; i++) {\n // nodePositions[idxs[i]] = [\n // cx - itemsX/2*rowDiffX + rowDiffX * ((i % itemsX)),\n // cy - itemsY/2*rowDiffY + rowDiffY * (Math.floor(i / itemsX))\n // ];\n // }\n positionNodesInCircle(idxs);\n // console.log(nodePositions);\n }\n else{\n nodePositions[idxs] = [\n forceCx,\n forceCy\n ];\n // console.log(\"singleNode\", idxs, nodePositions);\n }\n\n node.each(function(d,nIdx,nodeEls){\n if(typeof nodePositions[nIdx] != 'undefined') {\n nodeEls[nIdx].classList.add('centeredNode');\n nodeEls[nIdx].classList.add('visibleNode');\n } else {\n nodeEls[nIdx].classList.remove('centeredNode');\n nodeEls[nIdx].classList.remove('visibleNode');\n }\n });\n\n // restart animation (they call that 'alpha' in d3 force)\n simulation.alpha(1);\n simulation.restart();\n}\nvar positionNodesInCircle = function(idxs, r) {\n let viewBox = getViewbox();\n let zoom = getZoomValues();\n setViewboxForceCenter(); // sets forceCx & forceCy\n if(typeof r == 'undefined') {\n if(idxs.length == 1) {\n r = viewBox[2] / 6;\n } else {\n r = viewBox[2] / (4 + Math.max(0, 2.5 - idxs.length));\n }\n }\n currentNodePositionRadius = r;\n let forceCx = viewBox[0] + viewBox[2]/2 - zoom['dx'];\n let forceCy = viewBox[1] + viewBox[3]/2 - zoom['dy'];\n\n let stepSize = 2*Math.PI / idxs.length;\n\n for (var i = 0; i < idxs.length; i++) {\n nodePositions[idxs[i]] = [\n forceCx + Math.sin(stepSize * i) * r,\n forceCy + Math.cos(stepSize * i) * r\n ];\n }\n\n // restart animation (they call that 'alpha' in d3 force)\n simulation.alpha(1);\n simulation.restart();\n}\nvar centerByType = function(types, updateHistory) {\n if(typeof updateHistory == 'undefined') {\n updateHistory = true;\n }\n if(!Array.isArray(types)) {\n types = [types];\n }\n let idxs = [];\n for(let idx in graph.nodes) {\n if(types.indexOf(graph.nodes[idx]['@type']) > -1) {\n idxs[idxs.length] = idx;\n }\n }\n deselectNode();\n if(updateHistory) {\n // TODO: working\n // console.log(types[0], getDisplayAttr(types[0]),types.map(getDisplayAttr));\n history.pushState({types: types}, \"\", \"/@type/\"+(types.map(getDisplayAttr).join(\"+\")));\n } else {\n history.replaceState({types: types}, \"\", \"/@type/\"+(types.map(getDisplayAttr).join(\"+\")));\n }\n positionNodesInCenter(idxs.length ? idxs : null);\n}\n\nvar selectedNodeTransition = d3.transition()\n .duration(750)\n .ease(d3.easeLinear);\n\nvar nodeDetailEl = document.getElementById(\"nodeDetails\");\n\nvar createRelationshipEl = function(relNode, i) {\n let el = document.createElement(\"dd\");\n el.classList.add('relLink');\n let titleEl = document.createElement('a');\n titleEl.innerHTML = getNodeLabel(relNode)\n let year = getNodeYear(relNode);\n if(year !== null) {\n titleEl.innerHTML += `${getNodeYear(relNode)}`;\n }\n titleEl.classList.add('nodeTitle');\n titleEl.classList.add('nodeTitleNr'+i);\n titleEl.addEventListener('click',function(e){\n let idx = graph.nodes.indexOf(relNode);\n selectNode(idx);\n });\n let typeEl = document.createElement('a');\n typeEl.classList.add('nodeType');\n typeEl.innerHTML = getDisplayAttr(relNode['@type']);\n typeEl.title = relNode['@type'];\n typeEl.addEventListener('click',function(e){\n centerByType(relNode['@type']);\n });\n el.appendChild(titleEl);\n el.appendChild(typeEl);\n return el;\n}\n\nvar setDetails = function(nodeDatum, nodeIdx) {\n document.body.classList.add(\"detailsOpen\");\n scrollToY(0, 4000);\n while (nodeDetailEl.hasChildNodes()) {\n nodeDetailEl.removeChild(nodeDetailEl.lastChild);\n }\n\n // TODO: replace relUp & relDown with linkMap\n let relUp = [];\n let relDown = [];\n let pageTitles = [];\n let nodeDetailScalerEl = document.createElement('div');\n // nodeDetailScalerEl.innerHTML = `
`;\n nodeDetailScalerEl.id = 'nodeDetailsScaler';\n nodeDetailScalerEl.addEventListener('mousedown', function(e){\n // console.log('go');\n let drag = function(e) {\n // 5px for padding\n nodeDetailEl.style.width = (window.innerWidth - e.clientX + 5) +'px';\n }\n document.body.addEventListener('mousemove', drag);\n document.body.addEventListener('mouseup', function(){\n document.body.removeEventListener('mousemove', drag);\n });\n });\n nodeDetails.appendChild(nodeDetailScalerEl);\n\n let breadcrumbsEl = document.createElement('ul');\n breadcrumbsEl.classList.add('breadcrumbs');\n for(let crumbNodeId of breadcrumbs[nodeDatum['@id']]) {\n let crumbWrapEl = document.createElement('li');\n let crumbEl = document.createElement('span');\n crumbEl.classList.add('crumb');\n crumbEl.addEventListener('click', function(e){\n let idx = graph.nodes.indexOf(nodeMap[crumbNodeId]);\n selectNode(idx);\n });\n crumbEl.innerHTML = `${getNodeLabel(nodeMap[crumbNodeId])}`;\n let nodeYear = getNodeYear(nodeMap[crumbNodeId]);\n if(nodeYear !== null) {\n crumbEl.innerHTML += `${nodeYear}`;\n }\n crumbWrapEl.appendChild(crumbEl);\n breadcrumbsEl.appendChild(crumbWrapEl);\n pageTitles.push(getNodeLabel(nodeMap[crumbNodeId]));\n }\n nodeDetailEl.appendChild(breadcrumbsEl);\n pageTitles.push(getNodeLabel(nodeDatum));\n\n let titleAttr = getLabelAttribute(nodeDatum);\n let titleEl = document.createElement('h2');\n titleEl.innerHTML = getNodeLabel(nodeDatum);\n\n let typeEl = document.createElement('span');\n typeEl.classList.add('nodeType')\n typeEl.innerHTML = getDisplayAttr(nodeDatum['@type']);\n typeEl.title = nodeDatum['@type']\n typeEl.addEventListener('click',function(e){\n centerByType(nodeDatum['@type']);\n });\n titleEl.appendChild(typeEl);\n nodeDetailEl.appendChild(titleEl);\n\n let listEl = document.createElement(\"dl\");\n // listEl.innerHTML += `
type
${nodeDatum['@type']}
`;\n\n let skipNodeAttributes = [\n '@id','x','y','index','@type','vy','vx','fx','fy','leftX','rightX'\n ];\n if(titleAttr !== 'https://schema.org/contentUrl') {\n skipNodeAttributes[skipNodeAttributes.length] = titleAttr;\n }\n for (let attr in nodeDatum) {\n if(skipNodeAttributes.indexOf(attr) != -1) {\n continue;\n }\n\n // approach all as array\n let nodeAttr = Array.isArray(nodeDatum[attr]) ? nodeDatum[attr] : [nodeDatum[attr]];\n for (let i in nodeAttr) {\n // check if relationship:\n if(typeof nodeAttr[i] === \"string\" && nodeMap[nodeAttr[i]]) {\n continue;\n } else if(typeof nodeAttr[i]['@id'] !== 'undefined') {\n continue;\n }\n if(attr == 'https://schema.org/url' || attr == 'http://www.w3.org/2000/01/rdf-schema#seeAlso') {\n listEl.innerHTML += `
${getDisplayAttr(attr)}
${nodeAttr[i]}
`;\n } else if(attr == 'https://schema.org/embedUrl') {\n listEl.innerHTML += `
${getDisplayAttr(attr)}
${nodeAttr[i]}
`;\n listEl.innerHTML += `
`;\n } else if(attr == 'https://schema.org/contentUrl') {\n listEl.innerHTML += `
${getDisplayAttr(attr)}
${nodeAttr[i]}
`;\n if(nodeDatum['@type'] == 'https://schema.org/VideoObject') {\n let videoType = nodeAttr['https://schema.org/encodingFormat'] ? `type='${nodeAttr['https://schema.org/encodingFormat']}'`: \"\";\n let poster = nodeAttr['https://schema.org/thumbnailUrl'] ? `poster='${nodeAttr['https://schema.org/thumbnailUrl']}'`: \"\";\n listEl.innerHTML += `
`;\n } else{\n listEl.innerHTML += `
`;\n }\n } else {\n let valueHtml = nodeAttr[i].replace(/\\n/g,\"
\");\n listEl.innerHTML += `
${getDisplayAttr(attr)}
${valueHtml}
`;\n }\n }\n }\n nodeDetailEl.appendChild(listEl);\n\n // let relTitleEl = document.createElement(\"h4\");\n // relTitleEl.classList.add('linkTitle');\n // relTitleEl.innerHTML = \"links\";\n // nodeDetailEl.appendChild(relTitleEl);\n\n let relsEl = document.createElement(\"dl\");\n // collect relationships\n for (var i = 0; i < graph.links.length; i++) {\n let link = graph.links[i];\n if(link['source']['@id'] == nodeDatum['@id']) {\n if(typeof relDown[link['name']] == \"undefined\") {\n relDown[link['name']] = [];\n }\n relDown[link['name']][relDown[link['name']].length] = link['target'];\n }\n if(link['target']['@id'] == nodeDatum['@id']) {\n if(typeof relUp[link['name']] == \"undefined\") {\n relUp[link['name']] = [];\n }\n relUp[link['name']][relUp[link['name']].length] = link['source'];\n }\n }\n\n // relationships / links incomming
\n for(let attr in relDown) {\n let attrEl = document.createElement(\"dt\");\n attrEl.innerHTML = getDisplayAttr(attr);\n relsEl.appendChild(attrEl);\n\n // highest pagerank first:\n relDown[attr].sort((a,b) => weights[b['@id']] - weights[a['@id']]);\n\n for(let i in relDown[attr]) {\n let rel = relDown[attr][i];\n relsEl.appendChild(createRelationshipEl(rel));\n if(typeof rel['https://schema.org/contentUrl'] != 'undefined') {\n let ddEl = document.createElement('dd')\n ddEl.classList.add('dd-contentobject');\n if(rel['@type'] == 'https://schema.org/VideoObject') {\n let videoType = rel['https://schema.org/encodingFormat'] ? `type='${rel['https://schema.org/encodingFormat']}'`: \"\";\n let poster = rel['https://schema.org/thumbnailUrl'] ? `poster='${rel['https://schema.org/thumbnailUrl']}'`: \"\";\n ddEl.innerHTML += ``;\n } else{\n ddEl.innerHTML = ``\n }\n relsEl.appendChild(ddEl);\n }\n }\n }\n\n // relationships / links outgoing
\n for(let attr in relUp) {\n let attrEl = document.createElement(\"dt\");\n attrEl.innerHTML = getDisplayAttr(attr);\n relsEl.appendChild(attrEl);\n\n // highest pagerank first:\n relUp[attr].sort((a,b) => weights[b['@id']] - weights[a['@id']]);\n\n for(let i in relUp[attr]) {\n let rel = relUp[attr][i];\n relsEl.appendChild(createRelationshipEl(rel, i));\n if(typeof rel['https://schema.org/contentUrl'] != 'undefined') {\n let ddEl = document.createElement('dd')\n ddEl.classList.add('dd-contentobject');\n ddEl.innerHTML = ``\n relsEl.appendChild(ddEl);\n }\n }\n }\n\n nodeDetailEl.appendChild(relsEl);\n\n node.each(function(d,nIdx,nodeEls){\n if(nIdx == nodeIdx) {\n nodeEls[nIdx].classList.add('selectedNode');\n } else {\n nodeEls[nIdx].classList.remove('selectedNode');\n }\n });\n\n // TODO: update history & title\n document.title = pageTitles.join(\" :: \");\n};\nvar closeDetails = function() {\n document.body.classList.remove(\"detailsOpen\");\n scrollToY(0, 4000); // for mobile\n}\n\n/**\n * Select a node, and center it + show details\n * @param int idx The index of the node in the graph.nodes array\n * @param Element|null nodeEl Optional, provide node element, so loop doesn't have to be used to change the Element\n * @return void\n */\nvar selectNode = function(idx, updateHistory){\n if(typeof updateHistory == 'undefined') {\n updateHistory = true;\n }\n\n let nodeEl = null;\n let nodeDatum = null;\n\n node.each(function(d,nIdx,nodeEls){\n if(nIdx == idx) {\n nodeEl = nodeEls[idx];\n nodeDatum = d;\n }\n });\n if(!nodeEl) {\n return;\n }\n\n\n if(true) { // always set history state, but replace instead of update on 'updatehistory'\n let id = null;\n if(nodeDatum['@id'].startsWith(/*location.origin*/'https://rubenvandeven.com/')){\n id = nodeDatum['@id'].substr(26);\n } else {\n id = '?id=' + nodeDatum['@id'];\n }\n\n if(updateHistory) {\n history.pushState({node: idx}, getNodeLabel(nodeDatum), \"/\"+id);\n } else {\n history.replaceState({node: idx}, getNodeLabel(nodeDatum), \"/\"+id);\n }\n }\n\n // set global var\n positionNodesInCenter(idx);\n\n let currentCrumbs = breadcrumbs[nodeDatum['@id']].slice();\n currentCrumbs[currentCrumbs.length] = nodeDatum['@id'];\n\n // set active links.\n let linkedIdxs = [];\n link.each(function(d,idx,linkEls,q){\n // set nodes 'visible'/highlighted when linked to active node\n if(d.source == nodeDatum || d.target == nodeDatum) {\n linkEls[idx].classList.add('activeLink','visibleLink');\n linkEls[idx].getElementsByTagName(\"line\")[0].setAttribute(\"marker-end\", \"url(#arrowHeadSelected)\");\n node.filter(function(a, fnodeIdx){\n let r = a['@id'] == d.source['@id'] || a['@id'] == d.target['@id']; //connected node: true/false\n if(r && linkedIdxs.indexOf(fnodeIdx) === -1){\n linkedIdxs[linkedIdxs.length] = fnodeIdx;\n }\n return r;\n }).classed('visibleNode', true);\n } else {\n linkEls[idx].classList.remove('activeLink');\n linkEls[idx].getElementsByTagName(\"line\")[0].setAttribute(\"marker-end\", \"url(#arrowHead)\");\n }\n // check if link is part of breadcrumb trail\n let posSrc = currentCrumbs.indexOf(d.source['@id']);\n let posTrg = currentCrumbs.indexOf(d.target['@id']);\n if(posSrc > -1 && posTrg > -1 && Math.abs(posSrc - posTrg) == 1) {\n linkEls[idx].classList.add('breadcrumbLink');\n linkEls[idx].getElementsByTagName(\"line\")[0].setAttribute(\"marker-end\", \"url(#arrowHeadCrumbTrail)\");\n } else {\n linkEls[idx].classList.remove('breadcrumbLink');\n }\n });\n\n let i = linkedIdxs.indexOf(idx);\n\n if(i !== -1) {\n linkedIdxs.splice(i, 1);\n }\n\n positionNodesInCircle(linkedIdxs);\n\n setDetails(nodeDatum ,idx);\n}\nvar deselectNode = function() {\n positionNodesInCenter(null);\n link.each(function(d,idx,linkEls,q){\n linkEls[idx].classList.remove('activeLink');\n linkEls[idx].classList.remove('breadcrumbLink');\n linkEls[idx].getElementsByTagName(\"line\")[0].setAttribute(\"marker-end\", \"url(#arrowHead)\")\n });\n closeDetails();\n}\n\n\nwindow.addEventListener('popstate', function(event) {\n if(event.state.hasOwnProperty('node')) {\n selectNode(event.state['node'], false);\n }\n else {\n // if not sure what to do, fall back to first node (also used to return to opening page)\n let firstNode = graph['nodes'].find(n => n['@id'] === firstNodeId);\n selectNode(graph['nodes'].indexOf(firstNode), false);\n }\n});\n\nvar forceCx, forceCy;\nvar setViewboxForceCenter = function() {\n let viewBox = getViewbox();\n let zoom = getZoomValues();\n forceCx = viewBox[0] + viewBox[2]/2 - zoom['dx'];\n forceCy = viewBox[1] + viewBox[3]/2 - zoom['dy'];\n}\n\nvar getZoomValues = function(){\n let zoomContainer = document.getElementById(\"container\");\n let dx = 0, dy = 0, scale = 1;\n if(zoomContainer.transform.baseVal.length > 0) {\n for(let transform of zoomContainer.transform.baseVal) {\n if(transform.type == SVGTransform.SVG_TRANSFORM_TRANSLATE) {\n dx += transform.matrix.e;\n dy += transform.matrix.f;\n }\n else if (transform.type == SVGTransform.SVG_TRANSFORM_SCALE) {\n scale *= transform.matrix.a; // assume simple scale\n }\n }\n }\n\n return {'dx': dx, 'dy': dy, 'scale': scale};\n}\n\nsetViewboxForceCenter(); // sets forceCx & forceCy\n\nvar graphInitialised = false;\nsimulation.force('centerActive', function force(alpha) {\n // let currentNode = node.selectAll('.detail');\n // console.log(currentNode);\n // console.log(forceCx, forceCy);\n node.each(function(d, idx, nodes){\n let n = d;\n let k = alpha * 0.1;\n n.fx = null;\n n.fy = null;\n if(typeof nodePositions[idx] != 'undefined') {\n if(graphInitialised == false) {\n n.x = nodePositions[idx][0];\n n.y = nodePositions[idx][1];\n n.vx = 0;\n n.vy = 0;\n } else {\n n.vx -= (n.x - nodePositions[idx][0]) * k * 5;\n n.vy -= (n.y - nodePositions[idx][1]) * k * 5;\n }\n } else {\n // if it's not positioned, move it out of the circle\n if(currentNodePositionRadius < 1) {\n return;\n }\n\n let dx = n.x - forceCx;\n let dy = n.y - forceCy;\n if(!inCircle(dx, dy, currentNodePositionRadius)) {\n return;\n }\n\n if(graphInitialised == false) {\n // on init, fixate items outside of circle\n n.fx = n.x + dx * (2+Math.random());\n n.fy = n.y + dy * (2+Math.random());\n } else {\n // if initialised, gradually move them outwards\n n.vx += dx * k*4;\n n.vy += dy * k*4;\n }\n }\n });\n});\n\n//path to curve the tile\nvar nodePath = node.append(\"path\")\n .attr(\"id\", function(d,idx){return \"nodePath\"+idx;})\n .attr(\"d\", function(d){\n var r = getSizeForNode(d) * 0.9;\n var startX = getSizeForNode(d);\n // M cx cy\n // m -r, 0\n // a r,r 0 1,0 (r * 2),0\n // a r,r 0 1,0 -(r * 2),0\n // return 'M' + nodeSize/2 + ' ' + nodeSize/2 + ' ' +\n return 'M' + 0 + ' ' + 0 + ' ' +\n 'm -' + r + ', 0'+' ' +\n 'a ' + r +','+r+' 0 1,0 '+ (r*2) +',0 '+\n 'a ' + r +','+r+' 0 1,0 -'+ (r*2) +',0'\n ;\n // return 'm' + startX + ',' + nodeSize + ' ' +\n // 'a' + r + ',' + r + ' 0 0 0 ' + (2*r) + ',0';\n })\n ;\n\nnode.call(d3.drag()\n .on(\"start\", dragstarted)\n .on(\"drag\", dragged)\n .on(\"end\", dragended))\n .on(\"click\", function(d, idx, nodes){\n let node = nodes[idx];\n selectNode(idx, node, d);\n })\n .on('mouseover', function(n, nIdx){\n link.each(function(l,idx,linkEls,q){\n // set nodes 'visible'/highlighted when linked to active node\n if(l.source == n || l.target == n) {\n linkEls[idx].classList.add('hoverLink');\n }\n });\n })\n .on('mouseout', function(){\n let hoverLinkEls = document.getElementsByClassName('hoverLink');\n while(hoverLinkEls.length > 0){\n hoverLinkEls[0].classList.remove('hoverLink');\n }\n });\n\n// svg.call(d3.drag()\n// .on(\"start\", function(d){\n// if(d3.event.sourceEvent.type == 'touchstart' && d3.event.sourceEvent.touches.length > 1) {\n// } else {\n// d3.event.sourceEvent.stopPropagation();\n// svg.node().classList.add(\"dragging\");\n// }\n// })\n// .on(\"drag\", function(){\n// moveViewboxPx(d3.event.dx, d3.event.dy);\n// })\n// .on(\"end\", function(){\n// svg.node().classList.remove(\"dragging\");\n// }));\nsvg.call(d3.zoom()\n .scaleExtent([0.3,3])\n .on(\"start\", function(){\n svg.node().classList.add(\"dragging\");\n })\n .on(\"end\", function(){\n svg.node().classList.remove(\"dragging\");\n })\n .on(\"zoom\", function(a,b,c){\n container.attr(\"transform\", d3.event.transform);\n })\n);\n\n// svg.call(d3.zoom.transform, d3.zoomIdentity);\n\nnode.append('circle')\n .attr(\"r\", (d) => getSizeForNode(d))\n .attr(\"class\", \"nodeBg\")\n ;\nnode.append('circle')\n .attr(\"r\", (d) => getSizeForNode(d) * 1.08) // nodeSize + margin\n .attr(\"class\", \"highlightCircle\")\n ;\n\nnode.append('text')\n .attr(\"class\", \"nodeType\")\n .text(function(n){\n return n['@type'];\n })\n\nnode.append('text')\n .attr(\"class\", \"nodeYear\")\n .attr(\"y\", \"22\")\n .text(function(n){\n return getNodeYear(n);\n })\n ;\nlet splitText = function(text){\n let characters = [\" \",\"-\",\"\\u00AD\"];\n let charSplitPos = {};\n let mid = Math.floor(text.length / 2);\n let splitPos = false;\n let splitPosChar = false;\n // split sentences\n for(let char of characters) {\n if(text.indexOf(char) < 0) {\n continue;\n }\n let tmid = text.substr(0,mid).lastIndexOf(char);\n if(tmid === -1) {\n tmid = text.indexOf(char);\n }\n tmid += 1; // we want to cut _after_ the character\n // console.log(\"Char\", char, tmid);\n if(splitPos === false || Math.abs(tmid-mid) < Math.abs(splitPos - mid)){\n // console.log(\"least!\");\n splitPos = tmid;\n splitPosChar = char;\n }\n }\n // console.log(\"pos\",splitPos)\n\n\n if(splitPos === false) {\n return false;\n }\n\n let text1 = text.substr(0, splitPos).trim();\n let text2 = text.substr(splitPos).trim();\n\n if(splitPosChar == \"\\u00AD\") {\n text1 += \"-\";\n }\n\n // find most equal split\n return [text1, text2];\n}\nlet nodeTitle = node.append('text')\n .attr(\"class\", \"nodeTitle\")\n .attr(\"y\", \"5\")\n ;\nnodeTitle\n // .append(\"textPath\")\n // .attr( \"xlink:href\",function(d, idx){return '#nodePath'+idx;})\n // .text(getNodeLabel)\n .each(function(node, nodes){\n let textLength;\n let self = d3.select(this);\n let titleText = getNodeLabel(node);\n let titleTexts = false;\n if(titleText.length > 20) {\n titleTexts = splitText(titleText);\n }\n if(titleTexts !== false) {\n let tspan1 = self.append(\"tspan\")\n .text(titleTexts[0])\n .attr(\"y\", \"-10\")\n .attr(\"x\", \"0\")\n ;\n let tspan = self.append(\"tspan\")\n .text(titleTexts[1])\n .attr(\"y\", \"10\")\n .attr(\"x\", \"0\")\n ;\n let textLength1 = tspan.node().getComputedTextLength();\n let textLength2 = tspan.node().getComputedTextLength();\n textLength = Math.max(textLength1, textLength2);\n } else {\n self.text(titleText);\n textLength = self.node().getComputedTextLength();\n }\n\n // scale according to text length:\n if(textLength > getSizeForNode(node) * 2) {\n self.attr('transform', `scale(${(getSizeForNode(node) * 2) / textLength / 1.05})`);\n }\n })\n ;\n\nnode.each(function(d) {\n if(!d['https://schema.org/thumbnailUrl']) {\n return;\n }\n d3.select(this).append('svg:image')\n .attr(\"xlink:href\", d['https://schema.org/thumbnailUrl'])\n .attr(\"width\", (d) => getSizeForNode(d)*2)\n .attr(\"height\", (d) => getSizeForNode(d)* 2)\n .attr(\"transform\",(d) => \"translate(-\"+getSizeForNode(d)+\" -\"+getSizeForNode(d)+\")\")\n .attr(\"clip-path\",\"url(#clipNodeImage)\")\n .attr(\"preserveAspectRatio\",\"xMidYMid slice\")\n ;\n });\n\nsimulation\n .nodes(graph.nodes)\n .on(\"tick\", ticked);\n\nsimulation.force(\"link\")\n .links(graph.links)\n .distance(function(l){\n switch (l.name) {\n // case 'publishedAt':\n // return 200;\n // case 'image':\n // return 200;\n default:\n return 300;\n }\n }) // distance between the nodes / link length\n // .charge(-100)\n;\n\n// run on each draw\nfunction ticked() {\n graph.nodes.forEach(function (d, idx) {\n d.leftX = d.rightX = d.x;\n\n // fix first node on center\n // if(idx === 0) {\n // d.fx = width/2;\n // d.fy = height/2;\n // return;\n // }\n });\n\n linkLine.each(function (d) {\n var sourceX, targetX, midX, dx, dy, angle;\n\n // This mess makes the arrows exactly perfect.\n // thanks to http://bl.ocks.org/curran/9b73eb564c1c8a3d8f3ab207de364bf4\n if( d.source.rightX < d.target.leftX ){\n sourceX = d.source.rightX;\n targetX = d.target.leftX;\n } else if( d.target.rightX < d.source.leftX ){\n targetX = d.target.rightX;\n sourceX = d.source.leftX;\n } else if (d.target.isCircle) {\n targetX = sourceX = d.target.x;\n } else if (d.source.isCircle) {\n targetX = sourceX = d.source.x;\n } else {\n midX = (d.source.x + d.target.x) / 2;\n if(midX > d.target.rightX){\n midX = d.target.rightX;\n } else if(midX > d.source.rightX){\n midX = d.source.rightX;\n } else if(midX < d.target.leftX){\n midX = d.target.leftX;\n } else if(midX < d.source.leftX){\n midX = d.source.leftX;\n }\n targetX = sourceX = midX;\n }\n\n dx = targetX - sourceX;\n dy = d.target.y - d.source.y;\n angle = Math.atan2(dx, dy);\n\n /* DISABLED\n srcSize = (typeof nodePositions[d.source.index] != 'undefined') ? selectedNodeSize : nodeSize;\n tgtSize = (typeof nodePositions[d.target.index] != 'undefined') ? selectedNodeSize : nodeSize;\n */\n let srcSize = getSizeForNode(d.source)+3.2;\n let tgtSize = getSizeForNode(d.target)+3.2;\n\n // Compute the line endpoint such that the arrow\n // is touching the edge of the node rectangle perfectly.\n d.sourceX = sourceX + Math.sin(angle) * srcSize;\n d.targetX = targetX - Math.sin(angle) * tgtSize;\n d.sourceY = d.source.y + Math.cos(angle) * srcSize;\n d.targetY = d.target.y - Math.cos(angle) * tgtSize;\n })\n .attr(\"x1\", function(d) { return d.sourceX; })\n .attr(\"y1\", function(d) { return d.sourceY; })\n .attr(\"x2\", function(d) { return d.targetX; })\n .attr(\"y2\", function(d) { return d.targetY; });\n linkText.attr(\"transform\", function(d){\n let dx = (d.target.x - d.source.x) /2;\n let dy = (d.target.y - d.source.y) /2;\n let x = d.source.x + dx;\n let y = d.source.y + dy;\n let deg = Math.atan(dy / dx) * 180 / Math.PI;\n // if dx/dy == 0/0 -> deg == NaN\n if(isNaN(deg)) {\n return \"\";\n }\n return \"translate(\"+x+\" \"+y+\") rotate(\"+deg+\") translate(0, -10)\";\n });\n\n node.attr(\"transform\", function(d) { return \"translate(\" + d.x + \",\" + d.y + \")\"; });\n}\n\nfunction dragstarted(d,idx,nodes) {\n if (!d3.event.active) simulation.alphaTarget(0.3).restart();\n let nodeEl = nodes[idx];\n d.fx = d.x;\n d.fy = d.y;\n // nodeEl.style.fill = '#00f';\n nodeEl.classList.add('drag');\n}\n\n// use to validate drag\n// function validate(x, a, b) {\n// if (x =< a) return a;\n// return b;\n// }\n\nfunction dragged(d, idx) {\n d.fx = d3.event.x;\n d.fy = d3.event.y;\n}\n\nfunction dragended(d, idx, nodes) {\n if (!d3.event.active) simulation.alphaTarget(0);\n let nodeEl = nodes[idx];\n d.fx = null;\n d.fy = null;\n nodeEl.classList.remove('drag');\n}\n\nfunction moveViewboxPx(dx, dy){\n let viewBox = svg.attr(\"viewBox\").split(\" \").map(parseFloat);\n viewBox[0] -= dx * 1;\n viewBox[1] -= dy * 1;\n svg.attr(\"viewBox\", viewBox.join(\" \"));\n}\n\n// start by selecting the first node :-)\n// selectNode(currentNodeIdx+1);\n// positionNodesInCenter(currentNodeIdx);\n\nif(location.pathname.startsWith('/@type/')) {\n for(let t in types) {\n if(getDisplayAttr(t) == location.pathname.substr(7)) {\n centerByType(t, false);\n }\n }\n} else{\n let startNodeId = location.search.startsWith(\"?id=\") ? location.search.substr(4) : 'https://rubenvandeven.com'+location.pathname;\n let firstNode = graph['nodes'].find(n => n['@id'] === startNodeId);\n selectNode(graph['nodes'].indexOf(firstNode), false);\n}\n\n\n\n// closeDetails(); // hide details at first\n// positionNodesInCenter(currentNodeIdx+1);\n\n// setTimeout(function(){\n // document.body.classList.add('graphInitialised');\n// }, 10);\n\nlet initPlaceholder = document.getElementById('initPlaceholder');\nsvg.node().removeChild(initPlaceholder);\nsetTimeout(function(){\n graphInitialised = true;\n document.body.classList.add('graphInitialised');\n }, 500);\n}\n\n\n// Detect request animation frame\nvar reqAnimFrame = window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n // IE Fallback, you can even fallback to onscroll\n function(callback){ window.setTimeout(callback, 1000/60) };\n// all credits go to https://stackoverflow.com/a/26798337\nfunction scrollToY(scrollTargetY, speed, easing, finishFunction) {\n // scrollTargetY: the target scrollY property of the window\n // speed: time in pixels per second\n // easing: easing equation to use\n\n var scrollY = window.scrollY,\n scrollTargetY = scrollTargetY || 0,\n speed = speed || 2000,\n easing = easing || 'easeOutSine',\n currentTime = 0,\n finishFunction = finishFunction || false;\n\n // min time .1, max time .8 seconds\n let time = Math.max(.1, Math.min(Math.abs(scrollY - scrollTargetY) / speed, .8));\n\n // easing equations from https://github.com/danro/easing-js/blob/master/easing.js\n let PI_D2 = Math.PI / 2,\n easingEquations = {\n easeOutSine: function (pos) {\n return Math.sin(pos * (Math.PI / 2));\n },\n easeInOutSine: function (pos) {\n return (-0.5 * (Math.cos(Math.PI * pos) - 1));\n },\n easeInOutQuint: function (pos) {\n if ((pos /= 0.5) < 1) {\n return 0.5 * Math.pow(pos, 5);\n }\n return 0.5 * (Math.pow((pos - 2), 5) + 2);\n }\n };\n\n // add animation loop\n function tick() {\n currentTime += 1 / 60;\n\n var p = currentTime / time;\n var t = easingEquations[easing](p);\n\n if (p < 1) {\n reqAnimFrame(tick);\n\n window.scrollTo(0, scrollY + ((scrollTargetY - scrollY) * t));\n } else {\n window.scrollTo(0, scrollTargetY);\n if(finishFunction) {\n finishFunction();\n }\n }\n }\n\n // call it once to get started\n tick();\n}\n"]} \ No newline at end of file diff --git a/assets/js/ranking.json b/assets/js/ranking.json new file mode 100644 index 0000000..b75900b --- /dev/null +++ b/assets/js/ranking.json @@ -0,0 +1 @@ +{"_:b0": 0.7648335897554003, "https://rubenvandeven.com/organisation/setup": 0.7328088156971239, "https://rubenvandeven.com/organisation/nsvp": 0.7047659756738278, "https://rubenvandeven.com/guest-worker": 1.0628762431908816, "_:b1": 0.7312637498855309, "_:b10": 0.7346566959964851, "_:b11": 0.7060464822627006, "https://rubenvandeven.com/emotionhero": 1.0513295302346464, "_:b100": 0.7034163273050056, "https://rubenvandeven.com/plottingdata": 0.9180280804276437, "_:b101": 0.7692934285799655, "_:b102": 0.706033639158183, "_:b103": 0.706033639158183, "https://rubenvandeven.com/": 1.4652749558404767, "_:b12": 0.7346566959964851, "_:b13": 0.7060464822627006, "_:b14": 0.7346566959964851, "_:b15": 0.7060464822627005, "_:b16": 0.7, "_:b17": 0.7542315391520475, "_:b18": 0.7017638736919793, "https://rubenvandeven.com/organisation/v2_": 0.8018336348553626, "_:b2": 0.7386639856138637, "_:b3": 0.7077480914486693, "_:b21": 0.7548327952964425, "_:b22": 0.7019341885686126, "_:b25": 0.7347272455621856, "_:b26": 0.7060768437121182, "https://rubenvandeven.com/choose-how-you-feel-you-have-seven-options": 0.8586768210559457, "_:b27": 0.7232604561767718, "_:b28": 0.7465193854953556, "https://rubenvandeven.com/degree/media-design": 0.7706027085781381, "https://rubenvandeven.com/university/piet-zwart": 0.7219615935882214, "_:b31": 0.7409785689798586, "_:b32": 0.7087321601686111, "https://rubenvandeven.com/eye-without-a-face": 0.9561958593529387, "_:b33": 0.7409785689798586, "_:b34": 0.7087321601686111, "_:b35": 0.7409785689798586, "_:b36": 0.7087321601686111, "_:b4": 0.7315080673349805, "https://rubenvandeven.com/venue/tivoli": 0.733384344209239, "_:b40": 0.7262120156718018, "https://rubenvandeven.com/event/creativity-and-cognition": 0.7577674142035022, "_:b41": 0.704479355181872, "https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options": 1.2892900970044228, "_:b42": 0.704479355181872, "_:b43": 0.704479355181872, "_:b44": 0.704479355181872, "_:b45": 0.704479355181872, "_:b46": 0.704479355181872, "_:b47": 0.704479355181872, "_:b48": 0.704479355181872, "_:b49": 0.704479355181872, "_:b5": 0.7249396502858712, "https://rubenvandeven.com/spectacular-spectator-mood-meter": 0.8725048320440169, "_:b50": 0.7306502358496456, "https://rubenvandeven.com/organisation/ccu": 0.7576368020513199, "_:b51": 0.704479355181872, "_:b52": 0.704479355181872, "_:b53": 0.7653993791264505, "https://rubenvandeven.com/panel/stateofemotion/video": 0.7049262627182874, "_:b54": 0.704479355181872, "_:b55": 0.704479355181872, "_:b56": 0.704479355181872, "_:b57": 0.704479355181872, "_:b59": 0.8353961259856347, "_:b61": 0.7006618532293791, "_:b62": 0.7006618532293791, "_:b60": 0.7238771838882605, "_:b63": 0.8039016163369354, "_:b64": 0.7060199688461612, "_:b65": 0.7060199688461612, "_:b66": 0.7060199688461612, "_:b67": 0.8016084114038238, "_:b70": 0.7055327224431963, "_:b71": 0.7055327224431963, "_:b68": 0.7433187450173058, "_:b69": 0.7097269219347399, "_:b72": 0.7672903119006301, "_:b75": 0.7054661484964119, "_:b73": 0.7432145003008418, "_:b74": 0.709682686324247, "_:b76": 0.8039016163369355, "_:b77": 0.7060199688461612, "_:b78": 0.7060199688461612, "https://rubenvandeven.com/samawati/video": 0.7060199688461612, "_:b79": 0.7692934285799655, "_:b80": 0.706033639158183, "https://rubenvandeven.com/assets/video/guerilla_project.mp4#videoobject": 0.706033639158183, "_:b81": 0.7059747546530846, "https://rubenvandeven.com/pillow-talk": 1.1496928501092398, "_:b82": 0.7059747546530846, "_:b83": 0.7059747546530846, "_:b84": 0.7059747546530846, "_:b85": 0.7059747546530846, "_:b86": 0.7059747546530846, "_:b87": 0.7059747546530846, "_:b88": 0.7059747546530846, "_:b94": 0.8039016163369354, "https://rubenvandeven.com/person/ward-goes": 0.7060199688461612, "_:b95": 0.7060199688461612, "_:b96": 0.7060199688461612, "_:b97": 0.7060532680187768, "https://rubenvandeven.com/degree/cddc": 0.7346669263700589, "_:b98": 0.7060532680187768, "https://rubenvandeven.com/degree/avm": 0.7346669263700589, "_:b99": 0.7060532680187768, "https://rubenvandeven.com/degree/mechanical-engineering": 0.7346669263700589, "https://rubenvandeven.com/2018/data-flaneur": 0.7312512833523743, "https://rubenvandeven.com/exhibition/hello-world": 0.7307707372992461, "https://rubenvandeven.com/2018/digital-cultures": 0.7034163273050056, "https://rubenvandeven.com/2020/acts-of-collection-and-omission": 0.7034163273050056, "_:b58": 0.704479355181872, "_:b29": 0.7000451255178906, "_:b30": 0.7000451255178906, "_:b23": 0.7, "_:b24": 0.7, "https://rubenvandeven.com/event/2018/yama-ichi": 0.7327559338377571, "https://rubenvandeven.com/heartbeat": 0.7614349664088589, "https://rubenvandeven.com/event/2019/ccu-presentation": 0.7551388672135853, "https://rubenvandeven.com/exercises-in-overfitting": 0.7895421428910875, "https://rubenvandeven.com/event/cqrrelations": 0.7346669263700589, "https://rubenvandeven.com/organisation/constant": 0.7060532680187768, "_:b19": 0.7027652101741357, "https://rubenvandeven.com/exercises-in-overfitting/image/2": 0.7029687124211292, "https://rubenvandeven.com/exercises-in-overfitting/image/1": 0.7029687124211292, "https://rubenvandeven.com/exhibition/codesandmodes": 0.7874071196497155, "http://networkcultures.org/longform/2017/01/25/choose-how-you-feel-you-have-seven-options/": 0.7025121255387312, "_:b20": 0.7025121255387312, "https://rubenvandeven.com/exhibition/kickstart": 0.783616915297779, "https://rubenvandeven.com/place/in4art": 0.7291745472770381, "https://rubenvandeven.com/mvp1": 0.8809413008025607, "https://rubenvandeven.com/mvp2": 0.8565789726870743, "https://rubenvandeven.com/mvp3": 0.7904802266649948, "https://rubenvandeven.com/exhibition/mood_swings": 0.7483370885559711, "https://rubenvandeven.com/place/q21": 0.7236301542946473, "https://rubenvandeven.com/residency/q21": 0.7483415691935341, "https://rubenvandeven.com/exhibition/route-du-nord": 0.7428156783081395, "https://rubenvandeven.com/venue/zoho": 0.7095130404209266, "https://rubenvandeven.com/sustaining-gazes": 0.8338009819919237, "https://rubenvandeven.com/exhibition/stateofemotion": 0.7513156260146338, "https://rubenvandeven.com/exhibition/the-new-current": 0.7428156783081395, "https://rubenvandeven.com/venue/cruise-terminal": 0.7095130404209266, "https://rubenvandeven.com/person/cristina-cochior": 0.730894093209604, "_:b37": 0.704037897394115, "_:b38": 0.704037897394115, "_:b39": 0.704037897394115, "https://rubenvandeven.com/eye-without-a-face/video": 0.704037897394115, "https://rubenvandeven.com/festival/statefestival": 0.729303087095821, "https://rubenvandeven.com/person/merijn-van-moll": 0.7025594056141989, "https://rubenvandeven.com/guest-worker/image/1": 0.7025594056141989, "https://rubenvandeven.com/guest-worker/image/2": 0.7025594056141989, "https://rubenvandeven.com/guest-worker/image/3": 0.7025594056141989, "https://rubenvandeven.com/guest-worker/video/outcome": 0.7025594056141989, "https://rubenvandeven.com/guest-worker/video/process": 0.7025594056141989, "https://rubenvandeven.com/guest-worker/report": 0.7025594056141989, "https://rubenvandeven.com/heartbeat/image/1": 0.7038072721169755, "https://rubenvandeven.com/in4art-salon": 0.7299076519294967, "https://rubenvandeven.com/person/donald-schenkel": 0.7027492021840731, "https://rubenvandeven.com/mvp1/image/1": 0.7027492021840731, "https://rubenvandeven.com/mvp1/image/2": 0.7027492021840731, "https://rubenvandeven.com/mvp1/image/3": 0.7027492021840731, "https://rubenvandeven.com/person/joseph-huot": 0.7036624566766132, "https://rubenvandeven.com/mvp2/image/1": 0.7036624566766132, "https://rubenvandeven.com/mvp2/image/2": 0.7036624566766132, "https://rubenvandeven.com/mvp2/image/3": 0.7036624566766132, "https://rubenvandeven.com/person/mikel-folgerts": 0.7031670696707023, "https://rubenvandeven.com/mvp3/image/1": 0.7031670696707023, "https://rubenvandeven.com/mvps": 0.7799052710500215, "_:b89": 0.7059747546530846, "_:b90": 0.7059747546530846, "_:b91": 0.7059747546530846, "_:b92": 0.7059747546530846, "_:b93": 0.7059747546530846, "https://rubenvandeven.com/residency/summer-sessions": 0.7488208625767621, "_:b6": 0.7017243196269899, "_:b7": 0.7017243196269899, "_:b8": 0.7017243196269899, "_:b9": 0.7017243196269899, "https://rubenvandeven.com/sustaining-gazes/image/1": 0.7052113768169797, "https://rubenvandeven.com/sustaining-gazes/image/2": 0.7052113768169797, "https://rubenvandeven.com/workshop/plotting-data-das-theatre": 0.7034163273050056, "https://rubenvandeven.com/workshop/plotting-data-onomatopee": 0.7034163273050056, "https://rubenvandeven.com/www": 0.7000069369871826} \ No newline at end of file diff --git a/assets/js/rubenvandeven.jsonld b/assets/js/rubenvandeven.jsonld index aa80d21..e2cc287 100644 --- a/assets/js/rubenvandeven.jsonld +++ b/assets/js/rubenvandeven.jsonld @@ -1 +1 @@ -{"@graph":[{"@id":"_:b0","@type":"https://schema.org/Course","https://schema.org/addressLocality":"Rotterdam","https://schema.org/attendee":{"@id":"https://rubenvandeven.com/"},"https://schema.org/educationalCredentialAwarded":"Master of Arts","https://schema.org/name":"MA - Media Design and Communication","https://schema.org/provider":{"@id":"https://rubenvandeven.com/university/piet-zwart"},"https://schema.org/temporalCoverage":"2014-2016"},{"@id":"_:b1","@type":"https://schema.org/Course","https://schema.org/addressLocality":"London","https://schema.org/attendee":{"@id":"https://rubenvandeven.com/"},"https://schema.org/educationalCredentialAwarded":"Master of Arts","https://schema.org/name":"MA - Creative Design for Digital Cultures","https://schema.org/provider":"The Open University","https://schema.org/temporalCoverage":"2012-2013"},{"@id":"_:b10","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/moodmeter1-1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/moodmeter1-1.jpg"},{"@id":"_:b100","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/person/ward-goes"},"https://schema.org/contributor":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2013-12-04","https://schema.org/description":"Originally initiated as a graduation project (cum laude) by Ward Goes, The Spectacular Times is an ongoing visual inquiry into the presentation of news. It investigates how news, rather than being subjective, is representational of its social, cultural, (geo)political and ideological contexts. The project sets out to lay bare these representations in currently circulating news.\n\nBy layering and contrasting different news elements The Spectacular Times re-contextualises news and makes explicit the intangible notions that lie beyond an increasingly universal guise of news reporting. Not in an effort to tell apart true from false, left from right, or right from wrong, but in order to accentuate a variety of articulations of news.\n\nThis web based project uses user defined variables to animate news headers, texts and images, which are directly sourced from different news websites world wide. By adjusting these parameters (among which region, scope and speed) the spectator actively perceives how news content is de- and reformed through its aesthetics.","https://schema.org/image":[{"@id":"_:b101"},{"@id":"_:b102"}],"https://schema.org/name":"The Specta­cular Times","https://schema.org/url":"http://spectacularspectacular.news"},{"@id":"_:b101","@type":"https://schema.org/ImageObject","https://schema.org/caption":"The Spectacular Times","https://schema.org/contentUrl":"/assets/image/times1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/times1.jpg"},{"@id":"_:b102","@type":"https://schema.org/ImageObject","https://schema.org/caption":"The Spectacular Times","https://schema.org/contentUrl":"/assets/image/times2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/times2.jpg"},{"@id":"_:b103","@type":"https://schema.org/EducationEvent","https://schema.org/about":{"@id":"https://rubenvandeven.com/plottingdata"},"https://schema.org/alternateName":"Critical Making of Frictional Urban Interfaces","https://schema.org/endDate":"2018-03-06","https://schema.org/location":"Utrecht","https://schema.org/name":"Workshop: Urban Frictions","https://schema.org/organizer":"Urban Interfaces, Utrecht University","https://schema.org/startDate":"2018-03-06","https://schema.org/url":"https://urbaninterfaces.sites.uu.nl"},{"@id":"_:b104","@type":"https://schema.org/EducationEvent","https://schema.org/alternateName":"API-art & situated fictions","https://schema.org/description":"A presentation & workshop about working with APIs as an artist. In collaboration with Manetta Berends & Max Dovey","https://schema.org/endDate":"2017-03-14","https://schema.org/location":"AKV St. Joost, Breda","https://schema.org/name":"Workshop - API: Artistic Point Of Interferance","https://schema.org/organiser":[{"@id":"_:b105"},{"@id":"_:b106"},{"@id":"https://rubenvandeven.com/"}],"https://schema.org/startDate":"2017-03-13","https://schema.org/url":"https://caradt.com/2017/03/07/ekv-13-march-lecture-by-human-index/"},{"@id":"_:b105","@type":"https://schema.org/Person","https://schema.org/name":"Max Dovey","https://schema.org/url":"https://maxdovey.hashbase.io/"},{"@id":"_:b106","@type":"https://schema.org/Person","https://schema.org/name":"Manetta Berends","https://schema.org/url":"http://manettaberends.nl/"},{"@id":"_:b11","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/moodmeter2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/moodmeter2.jpg"},{"@id":"_:b12","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/moodmeter3.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/moodmeter3.jpg"},{"@id":"_:b13","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/moodmeter4.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/moodmeter4.jpg"},{"@id":"_:b14","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2018-11-15","https://schema.org/location":{"@id":"_:b15"},"https://schema.org/name":"ECP Conference","https://schema.org/startDate":"2018-11-15","https://schema.org/url":"https://ecp.nl/jaarcongres/kunst-expo-2018/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"_:b15","@type":"https://schema.org/EventVenue","https://schema.org/name":"Fokker Terminal"},{"@id":"_:b16","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2019-05","https://schema.org/image":{"@id":"_:b17"},"https://schema.org/location":"Pingshan Cultural Center Exhibition Gallery, Shenzen","https://schema.org/name":"Free Panorama - Shenzen MAF","https://schema.org/startDate":"2019-04-20","https://schema.org/url":"http://shenzhenmaf.cn/Portal/en-US/Exhibition/Detail/10f64524-be11-1985-bbfa-7dd7d27868de","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"_:b17","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/eh-shenzen.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/eh-shenzen.jpg"},{"@id":"_:b18","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2018-08-05","https://schema.org/location":{"@id":"_:b19"},"https://schema.org/name":"Open Codes","https://schema.org/startDate":"2017-10-20","https://schema.org/url":"https://open-codes.zkm.de/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"_:b19","@type":"https://schema.org/Museum","https://schema.org/address":"Karlsrue","https://schema.org/name":"ZKM"},{"@id":"_:b2","@type":"https://schema.org/Course","https://schema.org/addressLocality":"Utrecht","https://schema.org/attendee":{"@id":"https://rubenvandeven.com/"},"https://schema.org/educationalCredentialAwarded":"Bachelor of Arts","https://schema.org/name":"BA - Audio-visual Media","https://schema.org/provider":"Hogeschool voor de Kunsten Utrecht","https://schema.org/temporalCoverage":"2009-2013"},{"@id":"_:b20","@type":"https://schema.org/ExhibitionEvent","https://schema.org/awarded":"honorable mention","https://schema.org/endDate":"2018-10","https://schema.org/location":"Zagreb","https://schema.org/name":"Plan D","https://schema.org/startDate":"2017-10","https://schema.org/url":["http://2017.pland.hr/","http://2017.pland.hr/vijesti/dodijeljena-nagrada-i-pocasne-diplome-festivala-plan-d/"],"https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"_:b21","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2017-09","https://schema.org/funded":"Creative Industries Fund","https://schema.org/location":{"@id":"_:b22"},"https://schema.org/name":"Ars Electronica","https://schema.org/organiser":{"@id":"https://rubenvandeven.com/organisation/v2_"},"https://schema.org/startDate":"2017-09","https://schema.org/url":"http://v2.nl/events/summer-sessions-at-ars-electronica-festival-2017","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"_:b22","@type":"https://schema.org/Festival","https://schema.org/address":"Linz","https://schema.org/name":"Ars Electronica"},{"@id":"_:b23","@type":"https://schema.org/Museum","https://schema.org/address":"Singapore","https://schema.org/name":"Museum of Arts & Sciences"},{"@id":"_:b24","@type":"https://schema.org/CollegeOrUniversity","https://schema.org/address":"New York City","https://schema.org/name":"Hunter College"},{"@id":"_:b25","@type":"https://schema.org/ExhibitionEvent","https://schema.org/description":"I organised this exhibition as part of my Summer Sessions residency at Arquivo237. It was a modest exhibition covering my research on emotion recognition software.","https://schema.org/endDate":"2016-09","https://schema.org/location":{"@id":"_:b26"},"https://schema.org/name":"Manipulation: Emotion Hero","https://schema.org/startDate":"2016-09","https://schema.org/url":"https://www.facebook.com/events/589274264578244/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"_:b26","@type":"https://schema.org/EventVenue","https://schema.org/address":"Lisbon","https://schema.org/name":"Arquivo237"},{"@id":"_:b27","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/emotionhero1-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/emotionhero1-2.jpg"},{"@id":"_:b28","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/emotionhero2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/emotionhero2.jpg"},{"@id":"_:b29","@type":"https://schema.org/MediaObject","https://schema.org/artworkSurface":"3 projections","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2016","https://schema.org/description":"What does it mean to feel 47% happy and 21% surprised? Choose how you feel; you have seven options is a video work that revolves around this question as it looks at software that derives emotional parameters from facial expressions. It combines human accounts and algorithmic processing to examine the intersection of highly cognitive procedures and ambiguous experiences. Born from a fascination with the technological achievements, the work interrogates the discursive apparatus the software is embedded in.\n\nThis work builds on my research into the workings of expression analysis technologies and the assumptions that underlie it, scrutinising the claims that are made by the companies developing the software.","https://schema.org/duration":"9M9S (∞ loop)","https://schema.org/image":[{"@id":"_:b34"},{"@id":"_:b35"}],"https://schema.org/name":"Choose How You Feel; You Have Seven Options"},{"@id":"_:b3","@type":"https://schema.org/Course","https://schema.org/addressLocality":"Enschede","https://schema.org/attendee":{"@id":"https://rubenvandeven.com/"},"https://schema.org/educationalCredentialAwarded":"Propaedeutic degree","https://schema.org/name":"Propaedeutic - Mechanical Engineering","https://schema.org/provider":"Twente University","https://schema.org/temporalCoverage":"2007-2009"},{"@id":"_:b30","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2018-03-04","https://schema.org/location":{"@id":"_:b31"},"https://schema.org/name":"Big Stories Need Human Stakes","https://schema.org/startDate":"2018-02-02","https://schema.org/url":"https://nieuwevide.nl/programma/big-stories-need-human-stakes","https://schema.org/workFeatured":{"@id":"_:b29"}},{"@id":"_:b31","@type":"https://schema.org/Museum","https://schema.org/address":"Haarlem","https://schema.org/name":"Nieuwe Vide"},{"@id":"_:b32","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2016-07-07 23:00","https://schema.org/location":{"@id":"https://rubenvandeven.com/organisation/v2_"},"https://schema.org/name":"Test_Lab the Graduation Edition","https://schema.org/startDate":"2016-07-07 20:00","https://schema.org/url":"http://v2.nl/events/test_lab-the-graduation-edition-2015-1/","https://schema.org/workFeatured":{"@id":"_:b29"}},{"@id":"_:b33","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2016-06-26","https://schema.org/location":{"@id":"https://rubenvandeven.com/university/piet-zwart"},"https://schema.org/name":"Fuzzy Logic - Graduation Show","https://schema.org/startDate":"2016-06-17","https://schema.org/url":"https://pzimediadesign.nl/2016.html","https://schema.org/workFeatured":{"@id":"_:b29"}},{"@id":"_:b34","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/choosehowyoufeel2-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/choosehowyoufeel2-2.jpg"},{"@id":"_:b35","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/choosehowyoufeel.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/choosehowyoufeel.jpg"},{"@id":"_:b36","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2017-04-26","https://schema.org/location":{"@id":"_:b37"},"https://schema.org/name":"Video Vortex","https://schema.org/startDate":"2017-04-23","https://schema.org/url":"https://issuu.com/instituteofnetworkcultures/docs/catalouge_compiled_final__29-03_/29","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/eye-without-a-face"}},{"@id":"_:b37","@type":"https://schema.org/Place","https://schema.org/address":"Kochi (India)","https://schema.org/name":" Mill Hall / Kochi-Muzeris biennial"},{"@id":"_:b38","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2016-12","https://schema.org/location":{"@id":"_:b39"},"https://schema.org/name":"Grand Instant Fiction","https://schema.org/startDate":"2016-12","https://schema.org/url":"http://umakart.tumblr.com/post/169464483314/grand-instant-fiction-10-sakrowski-evil","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/eye-without-a-face"}},{"@id":"_:b39","@type":"https://schema.org/EventVenue","https://schema.org/address":"Brno","https://schema.org/name":"Umakart Gallery"},{"@id":"_:b4","@type":"https://schema.org/ExhibitionEvent","https://schema.org/description":"SETUP x NSVP: future scenarios for AI and the job market\nAlgorithms that assess application letters. Voice assistants who take over the job interview. Predicting the perfect candidate for a vacancy. The possibilities of AI for recruitment and selection of employees seem endless. What does the future of this development look like? And how does AI facilitate - or frustrate - diversity in the labor market? Eight selected makers worked on this theme in four teams. From programmer to writer of historical novels, and from costume designer to cultural anthropologist.\nWith installations, performances and other works they make the social consequences of AI in the HR sector tangible. Because reading about it is one thing, but the consequences can only be felt if you yourself undergo an algorithmic interview. Would you still be hired for your own job if you had to apply with these systems?","https://schema.org/endDate":"2019-11-06","https://schema.org/location":"Naturalis, Leiden","https://schema.org/name":"Beyond Human","https://schema.org/organizer":[{"@id":"https://rubenvandeven.com/organisation/setup"},{"@id":"https://rubenvandeven.com/organisation/nsvp"}],"https://schema.org/startDate":"2019-11-04","https://schema.org/url":"https://www.beyondhuman.nl/event/setup/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/guest-worker"}},{"@id":"_:b40","@type":"https://schema.org/ExhibitionEvent","https://schema.org/description":"The Piet Zwart Institute at the Eye Film Museum in Amsterdam as part of its ResearchLab series. The exhibition focussed on the boundaries of the archive. Studying the structures and cultural impacts of our media technologies, it concentrated on the intricate and usually hidden aspects of EYE's extensive archive","https://schema.org/endDate":"2014-04-24","https://schema.org/location":{"@id":"_:b41"},"https://schema.org/name":"Boundaries of the Archive","https://schema.org/startDate":"2016-04-12","https://schema.org/url":"https://www.eyefilm.nl/film/boundaries-of-the-archive-research-lab-piet-zwart-institute","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/eye-without-a-face"}},{"@id":"_:b41","@type":"https://schema.org/Museum","https://schema.org/address":"Amsterdam","https://schema.org/name":"EYE Film Museum"},{"@id":"_:b42","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/eye_0-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/eye_0-2.jpg"},{"@id":"_:b43","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/eye_3-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/eye_3-2.jpg"},{"@id":"_:b44","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/eye_6-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/eye_6-2.jpg"},{"@id":"_:b45","@type":"https://schema.org/ScholarlyArticle","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/datePublished":"2017-01-27","https://schema.org/description":"What does it mean to feel 62% joy, and 15% surprised? Over the past years the digitization of emotions is booming business: multimillion dollar investments are made in technologies of which is claimed that they give companies an objective view in their consumers' feelings. The video-game-artwork Emotion Hero challenges the user to investigate this claim and question the premise of the technology. Emotion Hero is a two-part artwork. On the one hand is a video-game that is freely downloadable for everybody with an Android device. Inspired by Guitar Hero, the user scores points by following given cues. It provides detailed feedback on the mechanics of the face. The second part is a projection that shows a grid with aggregated scores of the game, that updates live. In its design, the grid refers to 19th century positivist practices.","https://schema.org/isPartOf":["C&C '17 Proceedings of the 2017 ACM SIGCHI Conference on Creativity and Cognition",{"@id":"https://rubenvandeven.com/event/creativity-and-cognition"}],"https://schema.org/name":"Article - Emotion Hero","https://schema.org/pageEnd":"423","https://schema.org/pageStart":"422","https://schema.org/publisher":"ACM New York, NY, USA","https://schema.org/url":"https://doi.org/10.1145/3059454.3059490/"},{"@id":"_:b46","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2019-06-08","https://schema.org/location":"Doornroosje, Rotterdam","https://schema.org/name":"Presentation @ Act Natural 04","https://schema.org/organizer":"Jeisson Drenth","https://schema.org/startDate":"2019-06-08"},{"@id":"_:b47","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-10-26","https://schema.org/location":"Doornroosje, Rotterdam","https://schema.org/name":"Presentation @ BARTALK #12: Coded Gestures","https://schema.org/organizer":["Yun Ingrid Lee","Rae Parnell"],"https://schema.org/startDate":"2018-10-26","https://schema.org/url":"https://bartalkdh.wordpress.com/bartalk-12-coded-gestures/"},{"@id":"_:b48","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-05-25","https://schema.org/location":"Rio de Janeiro","https://schema.org/name":"Presentation @ Media Lab UFRJ","https://schema.org/organizer":"Media Lab UFRJ & Dutch Consulate","https://schema.org/startDate":"2018-05-25","https://schema.org/url":"http://medialabufrj.net/"},{"@id":"_:b49","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-05-22","https://schema.org/location":"São Paulo","https://schema.org/name":"Presentation @ Instituto Europeo di Design","https://schema.org/organizer":"Instituto Europeo di Design & Dutch Consulate","https://schema.org/startDate":"2018-05-22","https://schema.org/url":"https://www.ied.edu/ied-locations/sao-paulo"},{"@id":"_:b5","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2019-11-16","https://schema.org/location":"Janskerk, Utrecht","https://schema.org/name":"re:connect | Digital Art Expo","https://schema.org/organizer":{"@id":"https://rubenvandeven.com/organisation/setup"},"https://schema.org/startDate":"2019-11-16","https://schema.org/url":"https://www.setup.nl/reconnect","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/guest-worker"}},{"@id":"_:b50","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-05-21","https://schema.org/location":"São Paulo","https://schema.org/name":"Presentation @ Nuffic Neso","https://schema.org/organizer":"Nuffic Neso & Dutch Consulate","https://schema.org/startDate":"2018-05-21","https://schema.org/url":"https://www.nuffic.nl/onderwerpen/kantoren-het-buitenland/"},{"@id":"_:b51","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-05-19","https://schema.org/location":"São Paulo","https://schema.org/name":"Presentation @ Festival PATH","https://schema.org/organizer":"Dutch Consulate","https://schema.org/startDate":"2018-05-19","https://schema.org/url":"https://www.festivalpath.com.br/palestras/#palestrante-ruben-van-de-ven"},{"@id":"_:b52","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-03-28","https://schema.org/location":"Baut, Amsterdam","https://schema.org/name":"Presentation @ The Hmm","https://schema.org/organizer":"The Hmm","https://schema.org/startDate":"2018-03-28","https://schema.org/url":"https://thehmm.nl/the-hmm-x-baut/"},{"@id":"_:b53","@type":"https://schema.org/EducationEvent","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-03-06","https://schema.org/location":"TU Delft","https://schema.org/name":"Presentation @ Industrial Design","https://schema.org/organizer":"Felienne Hermans, TU Delft","https://schema.org/startDate":"2018-03-06"},{"@id":"_:b54","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2017-11-04","https://schema.org/location":"CREA, Amsterdam","https://schema.org/name":"Presentation @ Worlding the Brain II","https://schema.org/organizer":"ASCA Research Group Neuroaesthetics and Neurocultures, University of Amsterdam","https://schema.org/startDate":"2017-11-02","https://schema.org/url":"https://worldingthebrain2017.com"},{"@id":"_:b55","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/location":"Stadstuin, Utrecht","https://schema.org/name":"Presentation @ Creative Coding Utrecht","https://schema.org/organizer":{"@id":"https://rubenvandeven.com/organisation/ccu"},"https://schema.org/startDate":"2017"},{"@id":"_:b56","@type":"https://schema.org/EducationEvent","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2017-03-14","https://schema.org/location":"Breda","https://schema.org/name":"Workshop: Artistic Point of Interference","https://schema.org/organizer":"St. Joost Academy","https://schema.org/startDate":"2017-03-13","https://schema.org/url":"https://caradt.com/2017/03/07/ekv-13-march-lecture-by-human-index/"},{"@id":"_:b57","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2016-06-11","https://schema.org/location":"FoAM, Brussels","https://schema.org/name":"Presentation @ Cqrrelations publication launch","https://schema.org/organizer":"Constant VZW.","https://schema.org/startDate":"2016-06-11","https://schema.org/url":"http://cqrrelations.constantvzw.org/0x0/"},{"@id":"_:b58","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-11-04","https://schema.org/name":"Panel: Tracking Emotions","https://schema.org/recordedIn":{"@id":"https://rubenvandeven.com/panel/stateofemotion/video"},"https://schema.org/startDate":"2018-11-04","https://schema.org/url":"https://state-studio.com/participant/2016/ruben-van-de-ven"},{"@id":"_:b59","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2016-11-19","https://schema.org/location":"Frankfurt am Main","https://schema.org/name":"Presentation @ Digitalorders","https://schema.org/organizer":"Goethe University","https://schema.org/startDate":"2016-11-17","https://schema.org/url":"https://www.normativeorders.net/en/events/young-researchers-conferences/34-veranstaltungen/nachwuchskonferenz/5114-seventh-international-young-researchers-conference"},{"@id":"_:b6","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2019-11-13","https://schema.org/location":{"@id":"_:b7"},"https://schema.org/name":"ECP Conference","https://schema.org/startDate":"2019-11-13","https://schema.org/url":"https://ecp.nl/jaarcongres/kunst-expo-2019/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/guest-worker"}},{"@id":"_:b60","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/alternateName":"What happens to the data in 'Big Data'?","https://schema.org/endDate":"016-02","https://schema.org/location":"University of Namur","https://schema.org/name":"Presentation @ Winter school","https://schema.org/organizer":"Workgroup: algorithmic governmentality","https://schema.org/startDate":"2016-02","https://schema.org/url":"www.bsts.be/wp-content/uploads/winter_school_2016-1.pdf"},{"@id":"_:b61","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-05-28","https://schema.org/location":"Linz","https://schema.org/name":"Presentation @ Art Meets Radical Openness","https://schema.org/startDate":"2018-05-25","https://schema.org/url":"https://www.radical-openness.org/en/festival/2016"},{"@id":"_:b62","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2016","https://schema.org/location":"University of Amsterdam","https://schema.org/name":"Presentation @ Digital Emotions Workgroup","https://schema.org/organizer":"Amsterdam School for Cultral Analysis","https://schema.org/startDate":"2016","https://schema.org/url":"http://asca.uva.nl/content/research-groups/digital-emotions/digital-emotions.html"},{"@id":"_:b63","@type":"https://schema.org/Organization","https://schema.org/name":"Institute of Network Cultures","https://schema.org/url":"http://networkcultures.org"},{"@id":"_:b64","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2015","https://schema.org/description":"A two-part artwork and my first work on software that derives emotional parameters from facial expressions. The first part displays the Mind Reading Emotions Library, an interactive collection of videos, audio fragments and scenes depicting 412 distinct emotions —ranging from `angry' to `unsure'— grouped in 24 categories. The second part of the project is a tablet with a modified demo app by Affectiva, a major player in the field of emotion analysis software. This app acts as an interactive mirror which displays the various parameters that the Affectiva software derives from someone's facial expression, while a voice over reads a text extracted from the Dutch classic Beyond Sleep by W.F. Hermans (1966), concerning the impact of the mirror, photography and video on the human self-image.","https://schema.org/image":[{"@id":"_:b66"},{"@id":"_:b67"}],"https://schema.org/name":"We know how you feel"},{"@id":"_:b65","@type":"https://schema.org/ExhibitionEvent","https://schema.org/description":"What is an encyclopedia? What are media? What is an object? Students of the Piet Zwart Institute Media Design Masters programme invite you to look at these issues. Twelve installations and one choreography present a taxonomy of disappearing, human and non-human, introvert and collected media objects.\n\nThis exhibition was developed in a 'Thematic Seminar' run in the summer trimester 2015 taught by Florian Cramer.\n\nArtists: Lucas Battich [IT], Manetta Berends [NL], Julie Boschat Thorez [FR], Cihad Caner [TR], Joana Chicau [PT], Cristina Cochior [RO], Solange Frankort [NL], Arantxa Gonlag [NL], Anne Lamb [US], Benjamin Li [NL], Yuzhen Tang [CN], Ruben van de Ven [NL] & Thomas Walskaar [NO]","https://schema.org/endDate":"2015-06-27","https://schema.org/location":{"@id":"https://rubenvandeven.com/organisation/v2_"},"https://schema.org/name":"An Encyclopedia of Media Objects","https://schema.org/startDate":"2015-06-26","https://schema.org/url":"http://v2.nl/events/an-encyclopedia-of-media-objects","https://schema.org/workFeatured":{"@id":"_:b64"}},{"@id":"_:b66","@type":"https://schema.org/ImageObject","https://schema.org/caption":"We know how you feel","https://schema.org/contentUrl":"/assets/image/we_know_how_you_feel.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/we_know_how_you_feel.jpg"},{"@id":"_:b67","@type":"https://schema.org/ImageObject","https://schema.org/caption":"Mind Reading Emotions Library","https://schema.org/contentUrl":"/assets/image/we_know_how_you_feel-3.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/we_know_how_you_feel-3.jpg"},{"@id":"_:b68","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2015-01-01","https://schema.org/description":"In western society, images are generally perceived as objective traces of events. As evidence that things happened as how they are captured in the frame.\n\nAs Susan Sontag elaborates, this counts for photographic images in particular. They are seen, not as subjective statements about the world, but rather as pieces of it —as fragments of a reality. Photographic images are often seen as unbiased; they carry in them the \"burden of truth\". We use them to give meaning, to asses and to judge. It exactly is in this passivity of the image, that its aggression lurks.\nFragments of Reality is a newspaper that assembles descriptions of five images of one event: a press conference with Jeroen Dijsselbloem and Yanis Varoufakis. Each interviewee was shown one of the images, in an attempt to highlight how we read events trough photographs.\n\nIt considers an event not as a single factual moment, but as the cumulative of subjective experiences, inherently proposing that an image is always lacking in its representation of that which it presents.","https://schema.org/image":[{"@id":"_:b69"},{"@id":"_:b70"},{"@id":"_:b71"}],"https://schema.org/name":"Fragments of reality"},{"@id":"_:b69","@type":"https://schema.org/ImageObject","https://schema.org/caption":"Fragments of reality","https://schema.org/contentUrl":"/assets/image/fragments-6-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/fragments-6-2.jpg"},{"@id":"_:b7","@type":"https://schema.org/EventVenue","https://schema.org/name":"Fokker Terminal"},{"@id":"_:b70","@type":"https://schema.org/ImageObject","https://schema.org/caption":"Fragments of reality","https://schema.org/contentUrl":"/assets/image/fragments-9-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/fragments-9-2.jpg"},{"@id":"_:b71","@type":"https://schema.org/ImageObject","https://schema.org/caption":"Fragments of reality","https://schema.org/contentUrl":"/assets/image/fragments-7-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/fragments-7-2.jpg"},{"@id":"_:b72","@type":"https://schema.org/Movie","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2013","https://schema.org/description":"Adam is security guard at a nursing home with comatose patients. During his night shifts he has unsettling visions of someone drowning. He seeks his comfort in the company of his pregnant girlfriend. Days of Water is a story on guilt and shame; and on a longing for hope.\nI wrote and directed this film for my graduation as film director for fiction at the Utrecht School of the Arts.\nIt was accompanied by my MA research on spectatorial emotion and the influence emotions on the spectator's sympathy for the protagonist.","https://schema.org/image":[{"@id":"_:b75"},{"@id":"_:b76"}],"https://schema.org/name":"Waterdagen"},{"@id":"_:b73","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2014-05","https://schema.org/location":{"@id":"_:b74"},"https://schema.org/name":"High Desert International Film Festival ","https://schema.org/startDate":"2014-05","https://schema.org/url":"http://routedunord.nl/portfolio-item/ruben-van-de-ven-2/","https://schema.org/workFeatured":{"@id":"_:b72"}},{"@id":"_:b74","@type":"https://schema.org/Festival","https://schema.org/address":"Pahrump, Nevada","https://schema.org/name":"High Desert International Film Festival "},{"@id":"_:b75","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/waterdagen-teaser.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/waterdagen-teaser.jpg"},{"@id":"_:b76","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/waterdagen1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/waterdagen1.jpg"},{"@id":"_:b77","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2012","https://schema.org/description":"For the visitors of the Crossing Border festival in The Hague we desgined an installation to collaboratively contribute to a poem.\nBased on the input of the user, a sentence is added to the poem, originating from digitalised texts of artists participating in the festival.\nThe text was combined with an audiovisual presentation that changed depending on the user's input.","https://schema.org/image":{"@id":"_:b80"},"https://schema.org/name":"Co-Poet","https://schema.org/url":"http://projectkaleido.nl/#copoet"},{"@id":"_:b78","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2012-11-17","https://schema.org/location":{"@id":"_:b79"},"https://schema.org/name":"Crossing Border","https://schema.org/startDate":"2012-11-14","https://schema.org/workFeatured":{"@id":"_:b77"}},{"@id":"_:b79","@type":"https://schema.org/PerformingArtsTheater","https://schema.org/address":"Leiden","https://schema.org/name":"Leidse Schouwburg"},{"@id":"_:b8","@type":"https://schema.org/ExhibitionEvent","https://schema.org/description":"(NL) Het internet is stuk. Hoe kunnen we het weer repareren? Daarover vertelt Marleen Stikker, auteur van Het internet is stuk, op 23 januari tijdens de Privacyrede 2020. Met de 50e verjaardag van het internet is dit hét moment om terug te blikken en vooruit te kijken.","https://schema.org/endDate":"2020-01-23","https://schema.org/location":{"@id":"https://rubenvandeven.com/venue/tivoli"},"https://schema.org/name":"Privacyrede 2020: the internet is broken","https://schema.org/startDate":"2020-01-23","https://schema.org/url":"https://www.tivolivredenburg.nl/agenda/privacyrede-2019-16-01-2019/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/guest-worker"}},{"@id":"_:b80","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/copoet1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/copoet1.jpg"},{"@id":"_:b81","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2012","https://schema.org/description":"The Colour of Blue. A diptych about two Tanzanians: a miner and a lobster fisher. How do they live, work and survive; and how do they see their own future? Each of the two men is in his own way depending on nature, everyday gambling for a good catch.\nThis documentary was shot complementary to our work at the Kilimanjaro Film Institute in Arusha.\nDocumentary, 14′42″. The full film is available on Youtube.","https://schema.org/image":[{"@id":"_:b82"},{"@id":"_:b83"}],"https://schema.org/name":"Rangi Ya Samawati","https://schema.org/video":{"@id":"https://rubenvandeven.com/samawati/video"}},{"@id":"_:b82","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/samawati-prev2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/samawati-prev2.jpg"},{"@id":"_:b83","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/samawati-prev1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/samawati-prev1.jpg"},{"@id":"_:b84","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2010","https://schema.org/description":"A short HKU project on the future of social media, when it was still an upcomming phenomenon. It is made in two weeks for a series of shorts with a given start and ending image.\nWe asked ourselves: what happens if our online identity lives on after we die? Do we still live on if a part of our online identity does? How can this virtual identity be shaped?\n2′10″","https://schema.org/image":{"@id":"_:b85"},"https://schema.org/name":"Virtual Afterlife","https://schema.org/video":{"@id":"https://rubenvandeven.com/assets/video/guerilla_project.mp4#videoobject"}},{"@id":"_:b85","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/guerilla2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/guerilla2.jpg"},{"@id":"_:b86","@type":"https://schema.org/MediaObject","https://schema.org/about":[{"@id":"_:b95"},{"@id":"_:b96"}],"https://schema.org/contributor":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2019","https://schema.org/description":"The voice is surely an uncanny phenomenon. In the digital age it leaves us constantly in doubt, if a person or a non-person is speaking. In this immersive performance, doubt and conviction change roles in the blink of an eye. Spread out on a hilly landscape, audience engages in a conversation with something that is there and not there at the same time. An artificial voice functions as a mediator, a partner and a mirror to one's own.\n\nWhile conversations are constructed word-by-word, impressions are shared, naps are taken, and time is passed, Pillow Talk is an invitation to suspend eye-to-eye relations and to reposition yourself in direct relation to the non-human.\n\nI developed the interface for the participants, as well as a custom story flow editor for the director/writer Begüm Erciyas.","https://schema.org/image":[{"@id":"_:b97"},{"@id":"_:b98"},{"@id":"_:b99"}],"https://schema.org/name":"Pillow Talk","https://schema.org/url":"https://www.begumerciyas.com/work/pillow-talk-2019/"},{"@id":"_:b87","@type":"https://schema.org/Person","https://schema.org/author":{"@id":"_:b86"},"https://schema.org/name":"Begüm Erciyas","https://schema.org/url":"https://www.begumerciyas.com"},{"@id":"_:b88","@type":"https://schema.org/TheaterEvent","https://schema.org/endDate":"2019-05-20","https://schema.org/location":"KVS, Brussels","https://schema.org/name":"Kunstenfestivaldesarts","https://schema.org/startDate":"2019-05-15","https://schema.org/url":"https://www.kfda.be/en/program/pillow-talk","https://schema.org/workFeatured":{"@id":"_:b86"}},{"@id":"_:b89","@type":"https://schema.org/TheaterEvent","https://schema.org/endDate":"2019-06-16","https://schema.org/location":"Münchner Kammerspiele","https://schema.org/name":"Festival Politics of Algorithms","https://schema.org/startDate":"2019-06-14","https://schema.org/workFeatured":{"@id":"_:b86"}},{"@id":"_:b9","@type":"https://schema.org/ExhibitionEvent","https://schema.org/location":{"@id":"https://rubenvandeven.com/organisation/v2_"},"https://schema.org/name":"Evening of the Black Box Concerns","https://schema.org/startDate":"2017-12-7","https://schema.org/url":"http://v2.nl/events/evening-of-the-black-box-concerns","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/spectacular-spectator-mood-meter"}},{"@id":"_:b90","@type":"https://schema.org/TheaterEvent","https://schema.org/endDate":"2019-08-31","https://schema.org/location":"Radialsystem, Berlin","https://schema.org/name":"New Empathies Program Series","https://schema.org/startDate":"2019-08-29","https://schema.org/workFeatured":{"@id":"_:b86"}},{"@id":"_:b91","@type":"https://schema.org/TheaterEvent","https://schema.org/endDate":"2019-11-16","https://schema.org/location":"Theatre Nanterre-Amandiers, Paris","https://schema.org/name":"New Settings/Fondation d'Enterprise Hermés","https://schema.org/startDate":"2019-11-13","https://schema.org/workFeatured":{"@id":"_:b86"}},{"@id":"_:b92","@type":"https://schema.org/TheaterEvent","https://schema.org/endDate":"2019-11-31","https://schema.org/location":"Kortrijk","https://schema.org/name":"NEXT Festival","https://schema.org/startDate":"2019-11-29","https://schema.org/workFeatured":{"@id":"_:b86"}},{"@id":"_:b93","@type":"https://schema.org/TheaterEvent","https://schema.org/endDate":"2020-02-28","https://schema.org/location":"Moscow","https://schema.org/name":"Winzavod Art Center","https://schema.org/startDate":"2020-02-14","https://schema.org/workFeatured":{"@id":"_:b86"}},{"@id":"_:b94","@type":"https://schema.org/TheaterEvent","https://schema.org/endDate":"2020-03-20","https://schema.org/location":"Leuven","https://schema.org/name":"STUK","https://schema.org/startDate":"2020-03-19","https://schema.org/workFeatured":{"@id":"_:b86"}},{"@id":"_:b95","@type":"https://schema.org/VisualArtsEvent","https://schema.org/name":"Residency: PACT Zollverein","https://schema.org/startDate":"2019","https://schema.org/url":"https://www.pact-zollverein.de/en"},{"@id":"_:b96","@type":"https://schema.org/VisualArtsEvent","https://schema.org/name":"Residency: Buda","https://schema.org/startDate":"2019","https://schema.org/url":"https://www.budakortrijk.be/en/residenties/beguem-erciyas-tr-hugvie"},{"@id":"_:b97","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/pillow_talk01.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/pillow_talk01.jpg"},{"@id":"_:b98","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/pillow_talk02.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/pillow_talk02.jpg"},{"@id":"_:b99","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/pillow_talk03.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/pillow_talk03.jpg"},{"@id":"https://rubenvandeven.com/","@type":"https://schema.org/Person","https://schema.org/email":"info@rubenvandeven.com","https://schema.org/jobTitle":"digital artist / researcher of software culture","https://schema.org/name":"Ruben van de Ven","https://schema.org/nationality":"The Netherlands"},{"@id":"https://rubenvandeven.com/2018/data-flaneur","@type":"https://schema.org/Event","https://schema.org/alternateName":"Data Flâneur - seeing and being seen in the data driven city","https://schema.org/description":"Inspired by Alison Powell’s ‘data walk’, the Flaneur twists her concept by not only making participants aware of data collection within the city, but also by making them experiment with data collection for their own purposes. By zooming in on the procedures of selection, classification and digitisation, participants experience the intricacies of data collection.","https://schema.org/endDate":"2018-11-04","https://schema.org/name":"Data Flâneur","https://schema.org/organizer":{"@id":"https://rubenvandeven.com/plottingdata"},"https://schema.org/startDate":"2018-11-04","https://schema.org/superEvent":{"@id":"https://rubenvandeven.com/exhibition/hello-world"},"https://schema.org/url":"https://creativecodingutrecht.nl/2018/10/20/the-data-flaneur-seen-and-being-seen-in-the-data-driven-city-tour/"},{"@id":"https://rubenvandeven.com/2018/digital-cultures","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/plottingdata"},"https://schema.org/description":"As Plotting Data, we gave a presentation at the Digital Cultures Conference","https://schema.org/endDate":"2018-09-22","https://schema.org/location":"Leuphana University, Lüneburg","https://schema.org/name":"Digital Cultures: Knowledge / Culture / Technology","https://schema.org/organizer":"Centre for Digital Cultures & Institute for Culture and Society","https://schema.org/startDate":"2018-09-19","https://schema.org/url":"https://digitalculturesconference.org/"},{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options","@type":"https://schema.org/Report","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/datePublished":"2017-01-27","https://schema.org/description":"What does it mean to feel 82% surprised or 93% joy? As part of their Longform series, the Institute of Network Cultures published my research into software that derives emotional scores from facial expressions.","https://schema.org/name":"Longform - Choose How You Feel; You Have Seven Options","https://schema.org/publisher":{"@id":"_:b63"},"https://schema.org/url":"http://networkcultures.org/longform/2017/01/25/choose-how-you-feel-you-have-seven-options/"},{"@id":"https://rubenvandeven.com/assets/video/guerilla_project.mp4#videoobject","@type":"https://schema.org/VideoObject","https://schema.org/contentUrl":"/assets/video/guerilla_project.mp4","https://schema.org/encodingFormat":"video/mp4","https://schema.org/thumbnailUrl":"/assets/thumb/guerilla_project.mp4.jpg","https://schema.org/videoFrameSize":"1280x1024"},{"@id":"https://rubenvandeven.com/emotionhero","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2016","https://schema.org/description":"Emotion recognition software is being used both as a tool for ‘objective’ measurements as well as a tool for training one’s facial expressions, eg. for job interviews. Emotion Hero is a literal translation of the paradoxical relation between these applications of the technology.\n\nEmotion Hero is a two-part artwork. On the one hand is a video-game that is freely downloadable for everybody with an Android device (see Google Play). Inspired by Guitar Hero, the user scores points by following given cues. It provides detailed feedback on the mechanics of the face (eg. “You showed on 10% Joy when you had to show 100%, smile 99.32% more.”), revealing that rather than being a window into the brain, the face is a controllable surface.\n\nThe second part is a projection that shows the aggregated scores of the game. In order to substantiate their discourse, companies in facial expression measurement employ a huge amount of data collection and processing. The results are displayed in a fixed grid, recalling historical practices that, trough extensive measurement and administration, also aimed to delineate something which is conceptually undelineated: think of Duchenne de Boulogne, Lombroso, and Charcot.\n\nEmotion Hero is a playful invitation to open up the box of expression analysis to reveal the assumptions that underlie this technology.\nThe game's emotional intelligence is powered by Affectiva (I was also interviewed by them).","https://schema.org/image":[{"@id":"_:b27"},{"@id":"_:b28"}],"https://schema.org/name":"Emotion Hero","https://schema.org/url":"https://emotionhero.com"},{"@id":"https://rubenvandeven.com/event/2018/yama-ichi","@type":"https://schema.org/ExhibitionEvent","https://schema.org/location":{"@id":"https://rubenvandeven.com/venue/tivoli"},"https://schema.org/name":"Yama Ichi Black Market","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/heartbeat"}},{"@id":"https://rubenvandeven.com/event/2019/ccu-presentation","@type":"https://schema.org/Event","https://schema.org/location":"Nijverheidsloods, Utrecht","https://schema.org/name":"Presentation @ Creative Coding Utrecht","https://schema.org/organizer":{"@id":"https://rubenvandeven.com/organisation/ccu"},"https://schema.org/startDate":"2019-10-31","https://schema.org/workFeatured":[{"@id":"https://rubenvandeven.com/guest-worker"},{"@id":"https://rubenvandeven.com/exercises-in-overfitting"}]},{"@id":"https://rubenvandeven.com/event/creativity-and-cognition","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2017-06","https://schema.org/location":{"@id":"_:b23"},"https://schema.org/name":"Microbites of Creativity","https://schema.org/organiser":"ACM Creativity & Cognition","https://schema.org/startDate":"2017-06","https://schema.org/url":["http://microbites.me/","http://cc.acm.org/2017/microbites/?ArtworksCC2017/"],"https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"https://rubenvandeven.com/exercises-in-overfitting","@type":"https://schema.org/MediaObject","http://www.w3.org/2000/01/rdf-schema#seeAlso":"https://gitlab.com/rubenvandeven/diede","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2019","https://schema.org/description":"I taught a computer how to write the name of my son. The progression of this machine learning processes is materialised with a pen plotter.","https://schema.org/image":[{"@id":"https://rubenvandeven.com/exercises-in-overfitting/image/2"},{"@id":"https://rubenvandeven.com/exercises-in-overfitting/image/1"}],"https://schema.org/name":"Exercises in overfitting"},{"@id":"https://rubenvandeven.com/exercises-in-overfitting/image/1","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/exercises-in-overfitting1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/exercises-in-overfitting1.jpg"},{"@id":"https://rubenvandeven.com/exercises-in-overfitting/image/2","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/exercises-in-overfitting2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/exercises-in-overfitting2.jpg"},{"@id":"https://rubenvandeven.com/exhibition/codesandmodes","@type":"https://schema.org/ExhibitionEvent","https://schema.org/about":{"@id":"http://networkcultures.org/longform/2017/01/25/choose-how-you-feel-you-have-seven-options/"},"https://schema.org/endDate":"2017-03-18","https://schema.org/location":{"@id":"_:b24"},"https://schema.org/name":"Codes & Modes II","https://schema.org/organiser":"Integrated Media Arts MFA","https://schema.org/startDate":"2017-03-16","https://schema.org/url":"https://www.hunterintegratedmedia.org/reframe/speaker-lineup/ruben-van-de-ven/","https://schema.org/workFeatured":[{"@id":"https://rubenvandeven.com/emotionhero"},{"@id":"_:b64"}]},{"@id":"https://rubenvandeven.com/exhibition/hello-world","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2018-11-04","https://schema.org/name":"Hello World!","https://schema.org/organizer":{"@id":"https://rubenvandeven.com/organisation/ccu"},"https://schema.org/startDate":"2018-11-02","https://schema.org/url":"https://www.creativecodingutrecht.nl/2018/10/30/hello-world-full-program-online/"},{"@id":"https://rubenvandeven.com/exhibition/kickstart","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2018-03-28","https://schema.org/location":{"@id":"https://rubenvandeven.com/place/in4art"},"https://schema.org/name":"KickstART II","https://schema.org/startDate":"2018-03-28","https://schema.org/url":"http://www.in4art.eu/kickstart/launching-kickstart-ii/","https://schema.org/workFeatured":[{"@id":"https://rubenvandeven.com/mvp1"},{"@id":"https://rubenvandeven.com/mvp2"},{"@id":"https://rubenvandeven.com/mvp3"}]},{"@id":"https://rubenvandeven.com/exhibition/mood_swings","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2017-05-28","https://schema.org/location":{"@id":"https://rubenvandeven.com/place/q21"},"https://schema.org/name":"Mood Swings","https://schema.org/startDate":"2017-03-28","https://schema.org/url":"https://www.mqw.at/en/institutions/q21/frei-raum-q21-exhibition-space/2017/03/mood-swings-on-mood-politics-sentiment-data-market-sentiments-and-other-sentiment-agencies/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"https://rubenvandeven.com/exhibition/route-du-nord","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2018-05","https://schema.org/location":{"@id":"https://rubenvandeven.com/venue/zoho"},"https://schema.org/name":"Route du Nord","https://schema.org/startDate":"2018-05","https://schema.org/url":"http://routedunord.nl/portfolio-item/ruben-van-de-ven-2/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/sustaining-gazes"}},{"@id":"https://rubenvandeven.com/exhibition/stateofemotion","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2016-11-05","https://schema.org/name":"STATE of Emotion","https://schema.org/startDate":"2016-11-04","https://schema.org/url":"https://www.statefestival.org/participant/2016/ruben-van-de-ven","https://schema.org/workFeatured":[{"@id":"https://rubenvandeven.com/emotionhero"},{"@id":"_:b64"}]},{"@id":"https://rubenvandeven.com/exhibition/the-new-current","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2019-02-10","https://schema.org/location":{"@id":"https://rubenvandeven.com/venue/cruise-terminal"},"https://schema.org/name":"The New Current","https://schema.org/startDate":"2019-02-06","https://schema.org/url":"https://www.thenewcurrent.org/artists-artweek","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/sustaining-gazes"}},{"@id":"https://rubenvandeven.com/eye-without-a-face","@type":"https://schema.org/MediaObject","https://schema.org/author":[{"@id":"https://rubenvandeven.com/person/cristina-cochior"},{"@id":"https://rubenvandeven.com/"}],"https://schema.org/dateCreated":"2016","https://schema.org/description":"Whether the video frames are ordered by time or by emotion will not make a difference to a computer. For it, both orderings are just as logical. However, for the human spectator the reordered display of frames becomes a disruptive process. The human is positioned as a required agent for meaning making in an algorithmic procedure.\n\nIn collaboration with Cristina Cochior I went manually through the Eye's public collection, and catalogued faces by surrendering them to an emotion detection algorithm. Cutting from one face to another,its uncritical selection produced a new portrait of emotional gradients moving in-between anger and happiness.","https://schema.org/duration":"11:32 (∞ loop)","https://schema.org/image":[{"@id":"_:b42"},{"@id":"_:b43"},{"@id":"_:b44"}],"https://schema.org/name":"EYE Without A Face","https://schema.org/video":{"@id":"https://rubenvandeven.com/eye-without-a-face/video"}},{"@id":"https://rubenvandeven.com/eye-without-a-face/video","@type":"https://schema.org/VideoObject","https://schema.org/contentUrl":"http://works.rubenvandeven.com/2016-eye_without_a_face/EyeWithoutAFace.mp4","https://schema.org/encodingFormat":"video/mp4","https://schema.org/thumbnailUrl":"/assets/thumb/eye_1.jpg","https://schema.org/videoFrameSize":"1920x1080"},{"@id":"https://rubenvandeven.com/festival/statefestival","@type":"https://schema.org/Festival","https://schema.org/address":"Berlin","https://schema.org/name":"STATE Festival","https://schema.org/subEvent":[{"@id":"https://rubenvandeven.com/exhibition/stateofemotion"},{"@id":"_:b58"}],"https://schema.org/url":"https://www.statefestival.org/"},{"@id":"https://rubenvandeven.com/guest-worker","@type":"https://schema.org/MediaObject","https://schema.org/author":[{"@id":"https://rubenvandeven.com/person/merijn-van-moll"},{"@id":"https://rubenvandeven.com/"}],"https://schema.org/dateCreated":"2019","https://schema.org/description":"Nowadays, we are not only increasingly delegating and automating tasks and processes, there also new forms of work that are being created for people. With the emergence of services such as Amazon's Mechanical Turk, specific parts of automatic processes are being outsourced to human workers. These Human Intelligence Tasks are tasks that a machine cannot execute, for example retyping a scanned receipt or entering a Captcha code. In this way machines selectively delegate tasks to humans, creating a human working class that remains largely invisible.Merijn van Moll and Ruben van de Ven want to make this feedback loop between man and machine visible. This creates a new ritual in which the spirit of the worker is invoked again and again.\n\nThis project was developed in light of Future scenarios for AI and the job market by Setup and the NSvP (Dutch Foundation for Psycho technology)","https://schema.org/image":[{"@id":"https://rubenvandeven.com/guest-worker/image/1"},{"@id":"https://rubenvandeven.com/guest-worker/image/2"},{"@id":"https://rubenvandeven.com/guest-worker/image/3"}],"https://schema.org/name":"Guest Worker","https://schema.org/video":[{"@id":"https://rubenvandeven.com/guest-worker/video/outcome"},{"@id":"https://rubenvandeven.com/guest-worker/video/process"}]},{"@id":"https://rubenvandeven.com/guest-worker/image/1","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/guest_worker01.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/guest_worker01.jpg"},{"@id":"https://rubenvandeven.com/guest-worker/image/2","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/guest_worker02.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/guest_worker02.jpg"},{"@id":"https://rubenvandeven.com/guest-worker/image/3","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/guest_worker03.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/guest_worker03.jpg"},{"@id":"https://rubenvandeven.com/guest-worker/report","@type":"https://schema.org/Report","https://schema.org/about":{"@id":"https://rubenvandeven.com/guest-worker"},"https://schema.org/datePublished":"2019-11-26","https://schema.org/description":"A brief report written in light of Guest Worker (2019). In Dutch.","https://schema.org/name":"Guest Worker Research Report","https://schema.org/url":"http://guest_worker.rubenvandeven.com/"},{"@id":"https://rubenvandeven.com/guest-worker/video/outcome","@type":"https://schema.org/VideoObject","https://schema.org/contentUrl":"http://works.rubenvandeven.com/2019-guest_worker/guestworker-without-credits.mp4","https://schema.org/encodingFormat":"video/mp4","https://schema.org/thumbnailUrl":"/assets/thumb/guest_worker04.jpg","https://schema.org/videoFrameSize":"1920x1080"},{"@id":"https://rubenvandeven.com/guest-worker/video/process","@type":"https://schema.org/VideoObject","https://schema.org/contentUrl":"http://works.rubenvandeven.com/2019-guest_worker/GuestWorker.mp4","https://schema.org/encodingFormat":"video/mp4","https://schema.org/thumbnailUrl":"/assets/thumb/guest_worker05.jpg","https://schema.org/videoFrameSize":"1920x1080"},{"@id":"https://rubenvandeven.com/heartbeat","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2018","https://schema.org/description":"Why buy live access to heartbeats?
  • Insurance companies give you discounts for monitoring a healthy lifestyle.
  • Because you can re-sell it to data hoarding companies.
  • To chill out with the soothing sound on your headphones.
  • Use it as input data for your amazing new media art installation.
  • Because it's cheap!
","https://schema.org/image":{"@id":"https://rubenvandeven.com/heartbeat/image/1"},"https://schema.org/name":"Data double black market"},{"@id":"https://rubenvandeven.com/heartbeat/image/1","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/data-double-black-market.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/data-double-black-market.jpg"},{"@id":"https://rubenvandeven.com/in4art-salon","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2018-05-27","https://schema.org/location":{"@id":"https://rubenvandeven.com/place/in4art"},"https://schema.org/name":"Salon VI - Innovatism","https://schema.org/startDate":"2018-05-18","https://schema.org/url":"http://www.in4art.eu/salon/salon-vi-innovatism/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/mvp1"}},{"@id":"https://rubenvandeven.com/mvp1","@type":"https://schema.org/MediaObject","https://schema.org/artworkSurface":"Oilpaint on wood + WiFi-connected RaspberryPi in ABS enclosure","https://schema.org/contributor":{"@id":"https://rubenvandeven.com/person/donald-schenkel"},"https://schema.org/dateCreated":"2018","https://schema.org/description":"The work of Donald Schenkel is augmented with a camera which keeps track of how long people look at the work. Like an electricity meter, the value increases the more the work is used. This data is then sent to a server, and provides the artist —in this case Donald Schenkel— with live statistics. But who owns this data generated by the work? The buyer, the artist, or the mediator — which is me?\n\nThis is the first augmentation that is part of the MVP series created for KickstART.","https://schema.org/height":"55cm + 8cm","https://schema.org/image":[{"@id":"https://rubenvandeven.com/mvp1/image/1"},{"@id":"https://rubenvandeven.com/mvp1/image/2"},{"@id":"https://rubenvandeven.com/mvp1/image/3"}],"https://schema.org/name":"MVP#1 Gathering viewing statistics for Donald Schenkel","https://schema.org/width":"45cm + 15cm"},{"@id":"https://rubenvandeven.com/mvp1/image/1","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/mvp1-1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/mvp1-1.jpg"},{"@id":"https://rubenvandeven.com/mvp1/image/2","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/mvp1-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/mvp1-2.jpg"},{"@id":"https://rubenvandeven.com/mvp1/image/3","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/mvp1-4.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/mvp1-4.jpg"},{"@id":"https://rubenvandeven.com/mvp2","@type":"https://schema.org/MediaObject","https://schema.org/artworkSurface":"Pencil drawing in metal LCD enclosure","https://schema.org/contributor":{"@id":"https://rubenvandeven.com/person/joseph-huot"},"https://schema.org/dateCreated":"2018","https://schema.org/description":"In September 2017, huricane Irma was racing towards Florida. Everybody tried to get away from there as quick as possible. Stuck were those with the electric Tesla Model S with the cheaper battery option (60kWh). Then, all of a sudden, Tesla send a software update to these cars. The cars could drive futher then ever before. Until 72 hours later, Tesla reversed the software update. Exactly the same car could drive shorter distances.\n\nThis is the business of software companies: just like Apple limits performance on old iPhones, Tesla used softare to limit the reach of its cars in order to make more money. While physically the exact same product, it can do less.\n\nMinimum Viable Product #2 brings this business model to the art world. It provides a limited edition of a drawing by Joseph Huot.","https://schema.org/height":"50cm","https://schema.org/image":[{"@id":"https://rubenvandeven.com/mvp2/image/1"},{"@id":"https://rubenvandeven.com/mvp2/image/2"},{"@id":"https://rubenvandeven.com/mvp2/image/3"}],"https://schema.org/name":"MVP#2 Joseph Huot's Limited Edition","https://schema.org/width":"32.5cm"},{"@id":"https://rubenvandeven.com/mvp2/image/1","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/mvp2-01.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/mvp2-01.jpg"},{"@id":"https://rubenvandeven.com/mvp2/image/2","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/mvp2-02.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/mvp2-02.jpg"},{"@id":"https://rubenvandeven.com/mvp2/image/3","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/mvp2-5.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/mvp2-5.jpg"},{"@id":"https://rubenvandeven.com/mvp3","@type":"https://schema.org/MediaObject","https://schema.org/artworkSurface":"Personalised print on perspex","https://schema.org/contributor":{"@id":"https://rubenvandeven.com/person/mikel-folgerts"},"https://schema.org/dateCreated":"2018","https://schema.org/description":"On YouTube, Instagram, and many other online platforms, celebrities get paid to place consumer products in their videos. Not prominently, but hidden in plain sight. Can precarious artists finance their work by employing this product placement?\n\nMinimum Viable Product #3 allows buyers to customise the work they bought —Rotterdam, by Mikel Folgerts—, linking the status of the artist to their product.","https://schema.org/height":"40cm","https://schema.org/image":{"@id":"https://rubenvandeven.com/mvp3/image/1"},"https://schema.org/name":"MVP#3 Customiseyour.art - Mikel Folgerts 1/3","https://schema.org/width":"40cm"},{"@id":"https://rubenvandeven.com/mvp3/image/1","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/mvp3-1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/mvp3-1.jpg"},{"@id":"https://rubenvandeven.com/mvps","@type":"https://schema.org/CreativeWorkSeries","https://schema.org/about":"November 2017 In4Art approached me to be part of their KickstART project. They commissioned three works to be part of their auction. The goal was to explicitly develop works that fitted the commercial art scene.\n\nRather than creating 'sellable' works myself, I took the start-up culture that forms the foundation of In4Art, as my object of my series. I augmented the works of three other participants with business models taken from the online/digital realm. This resulted in three Minimum Viable Products. Recontextualising these business models towards an arts context, results in new perspectives on both the arts as well as start-up culture.","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2018","https://schema.org/hasPart":[{"@id":"https://rubenvandeven.com/mvp1"},{"@id":"https://rubenvandeven.com/mvp2"},{"@id":"https://rubenvandeven.com/mvp3"}],"https://schema.org/name":"MVPs"},{"@id":"https://rubenvandeven.com/organisation/ccu","@type":"https://schema.org/Organization","https://schema.org/name":"Creative Coding Utrecht"},{"@id":"https://rubenvandeven.com/organisation/nsvp","@type":"https://schema.org/Organization","https://schema.org/name":"Nederlandse Stichting voor Psychotechniek","https://schema.org/url":"https://www.innovatiefinwerk.nl/"},{"@id":"https://rubenvandeven.com/organisation/setup","@type":"https://schema.org/Organization","https://schema.org/address":"Utrecht","https://schema.org/name":"Setup","https://schema.org/url":"https://www.setup.nl/"},{"@id":"https://rubenvandeven.com/organisation/v2_","@type":"https://schema.org/Place","https://schema.org/address":"Rotterdam","https://schema.org/name":"V2_"},{"@id":"https://rubenvandeven.com/panel/stateofemotion/video","@type":"https://schema.org/VideoObject","https://schema.org/embedUrl":"https://www.youtube.com/embed/L2O6ecO-8PM?start=2062","https://schema.org/thumbnailUrl":"https://i.ytimg.com/vi/L2O6ecO-8PM/maxresdefault.jpg"},{"@id":"https://rubenvandeven.com/person/cristina-cochior","@type":"https://schema.org/Person","https://schema.org/name":"Cristina Cochior","https://schema.org/url":"http://randomizer.info"},{"@id":"https://rubenvandeven.com/person/donald-schenkel","@type":"https://schema.org/Person","https://schema.org/name":"Donald Schenkel","https://schema.org/url":"http://www.donaldschenkel.nl/"},{"@id":"https://rubenvandeven.com/person/joseph-huot","@type":"https://schema.org/Person","https://schema.org/name":"Joseph Huot","https://schema.org/url":"http://www.joseph-huot.com/"},{"@id":"https://rubenvandeven.com/person/merijn-van-moll","@type":"https://schema.org/Person","https://schema.org/name":"Merijn van Moll","https://schema.org/url":"https://merijnvanmoll.nl/"},{"@id":"https://rubenvandeven.com/person/mikel-folgerts","@type":"https://schema.org/Person","https://schema.org/name":"Mikel Folgerts","https://schema.org/url":"https://www.instagram.com/mikelfolgerts/"},{"@id":"https://rubenvandeven.com/person/ward-goes","@type":"https://schema.org/Person","https://schema.org/name":"Ward Goes","https://schema.org/url":"http://www.wardgoes.nl"},{"@id":"https://rubenvandeven.com/place/in4art","@type":"https://schema.org/EventVenue","https://schema.org/address":"Amsterdam","https://schema.org/name":"In4Art Project Space"},{"@id":"https://rubenvandeven.com/place/q21","@type":"https://schema.org/Museum","https://schema.org/address":"MuseumsQuartier /Vienna","https://schema.org/name":"frei_raum / Q21"},{"@id":"https://rubenvandeven.com/plottingdata","@type":"https://schema.org/PerformingGroup","https://schema.org/description":"A research into Data Dramatisation as a tactic to make data visualisations more transparent in their underlying procedures of data collection. We advocate a form of data literacy that is not so much focussed on programming skill, but rather one that brings an understanding of data infrastructures: allowing for restistance against data driven governance.","https://schema.org/foundingDate":"2018","https://schema.org/member":[{"@id":"https://rubenvandeven.com/person/cristina-cochior"},{"@id":"https://rubenvandeven.com/"}],"https://schema.org/name":"Plotting Data: dramatisation as tactic","https://schema.org/url":"http://plottingd.at/a"},{"@id":"https://rubenvandeven.com/residency/summer-sessions","https://schema.org/subEvent":{"@id":"_:b25"}},{"@id":"https://rubenvandeven.com/samawati/video","@type":"https://schema.org/VideoObject","https://schema.org/contentUrl":"/assets/video/samawati.mp4","https://schema.org/encodingFormat":"video/mp4","https://schema.org/thumbnailUrl":"/assets/thumb/samawati.mp4.jpg","https://schema.org/videoFrameSize":"1280x1024"},{"@id":"https://rubenvandeven.com/spectacular-spectator-mood-meter","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2017","https://schema.org/description":"Commisioned by V2_ for Evening of the Black Box Concern. Researchers of digital culture often regard artificial intelligence as black boxes. However, developers of these systems often regard the humans that are analysed as black boxes.\n\nWhat happens when we use black boxes (AI) to analyse black boxes (humans) and present these back to black boxes (humans)?\n\nThis prototype used emotion recognition software by Affectiva to analyse the audience of the talks. It then highlighted the moments in the talks for which outliers in the data were found. Can we use this data to analyse either of the black boxes?","https://schema.org/image":[{"@id":"_:b10"},{"@id":"_:b11"},{"@id":"_:b12"},{"@id":"_:b13"}],"https://schema.org/name":"Spectacular Spectator Mood Meter","https://schema.org/producer":{"@id":"https://rubenvandeven.com/organisation/v2_"}},{"@id":"https://rubenvandeven.com/sustaining-gazes","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2018","https://schema.org/description":"In analytics and statistics, data visualisations, such as the heatmap, are used as tools bring forward patterns in data. These data visualisations, are often presented as objective tools of knowledge: data supposedly do not lie. What is often neglected however, are the subjective and political intricacies embedded within the datasets, and its method of visualisation. In collaboration with Cristina Cochior I am exploring the concept of data dramatisations, as an opposite to data visualisations. Rather than aiming for the objective, we explore the affective & performative aspects of data gathering and processing.\n\nSustaining Gazes is a data dramatisation which looks at the role between the visualisation and its subject. A heatmap is generated by looking at it, which directly influences the looking. Areas which are looked at turn into interesting shapes, inviting even more observation. The pattern of looking is reinforced though its visualisation. This cycle reveals both a hierarchy of power between algorithm and subject, as well as a point for intervention.","https://schema.org/image":[{"@id":"https://rubenvandeven.com/sustaining-gazes/image/1"},{"@id":"https://rubenvandeven.com/sustaining-gazes/image/2"}],"https://schema.org/name":"Sustaining Gazes"},{"@id":"https://rubenvandeven.com/sustaining-gazes/image/1","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/sustaining-gazes-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/sustaining-gazes-2.jpg"},{"@id":"https://rubenvandeven.com/sustaining-gazes/image/2","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/sustaining-gazes-1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/sustaining-gazes-1.jpg"},{"@id":"https://rubenvandeven.com/university/piet-zwart","@type":"https://schema.org/CollegeOrUniversity","https://schema.org/address":"Rotterdam","https://schema.org/name":"Piet Zwart Institute"},{"@id":"https://rubenvandeven.com/venue/cruise-terminal","@type":"https://schema.org/EventVenue","https://schema.org/address":"Rotterdam","https://schema.org/name":"Cruise Terminal"},{"@id":"https://rubenvandeven.com/venue/tivoli","@type":"https://schema.org/EventVenue","https://schema.org/name":"Tivoli Vredeburg"},{"@id":"https://rubenvandeven.com/venue/zoho","@type":"https://schema.org/EventVenue","https://schema.org/address":"Rotterdam","https://schema.org/name":"ZOHO"},{"@id":"https://rubenvandeven.com/workshop/plotting-data-das-theatre","@type":"https://schema.org/Event","https://schema.org/alternateName":"Plotting the Enron Corpus","https://schema.org/description":"As part of the series Broadcast from Babylon.","https://schema.org/endDate":"2018-02-21","https://schema.org/name":"Workshop @ DAS Theatre","https://schema.org/organizer":{"@id":"https://rubenvandeven.com/plottingdata"},"https://schema.org/startDate":"2019-02-21","https://schema.org/url":"https://netdem.nl/en/articles/bfb-cp-5-creative-coding-and-workshop-plotting-data/"},{"@id":"https://rubenvandeven.com/workshop/plotting-data-onomatopee","@type":"https://schema.org/Event","https://schema.org/alternateName":"Plotting Data: Function Creep in the Wild","https://schema.org/description":"Datasets form a basis on which a city is made readable and interpretable foralgorithms, such as the those that process the endless streams of information coming from the cameras and sensors that stand scattered throughoutEindhoven. In this workshop, we will get acquainted with various ways in which data is collected and imagined. Who is being collected and what are the (dis)advantages of being represented? After an introduction into the types of biases that are inherent to their creation, we will combine hands-on work with pre-made scripts and discuss ways in which fiction and performance play a role in seeing like a dataset.","https://schema.org/endDate":"2018-06-12 18:30","https://schema.org/location":"Onomatopee","https://schema.org/name":"Workshop @ Onomatopee","https://schema.org/organizer":{"@id":"https://rubenvandeven.com/plottingdata"},"https://schema.org/startDate":"2019-06-12 16:00","https://schema.org/url":"https://www.onomatopee.net/exhibition/eindhoven-footnotes/#agenda_9839"},{"@id":"https://rubenvandeven.com/www","@type":"https://schema.org/WebSite","http://www.w3.org/2000/01/rdf-schema#seeAlso":["https://rubenvandeven.com/rubenvandeven.jsonld","https://git.rubenvandeven.com/r/portfolio"],"https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/url":"https://rubenvandeven.com"}]} \ No newline at end of file +{"@graph":[{"@id":"_:b0","@type":"https://schema.org/ExhibitionEvent","https://schema.org/description":"SETUP x NSVP: future scenarios for AI and the job market\nAlgorithms that assess application letters. Voice assistants who take over the job interview. Predicting the perfect candidate for a vacancy. The possibilities of AI for recruitment and selection of employees seem endless. What does the future of this development look like? And how does AI facilitate - or frustrate - diversity in the labor market? Eight selected makers worked on this theme in four teams. From programmer to writer of historical novels, and from costume designer to cultural anthropologist.\nWith installations, performances and other works they make the social consequences of AI in the HR sector tangible. Because reading about it is one thing, but the consequences can only be felt if you yourself undergo an algorithmic interview. Would you still be hired for your own job if you had to apply with these systems?","https://schema.org/endDate":"2019-11-06","https://schema.org/location":"Naturalis, Leiden","https://schema.org/name":"Beyond Human","https://schema.org/organizer":[{"@id":"https://rubenvandeven.com/organisation/setup"},{"@id":"https://rubenvandeven.com/organisation/nsvp"}],"https://schema.org/startDate":"2019-11-04","https://schema.org/url":"https://www.beyondhuman.nl/event/setup/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/guest-worker"}},{"@id":"_:b1","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2019-11-16","https://schema.org/location":"Janskerk, Utrecht","https://schema.org/name":"re:connect | Digital Art Expo","https://schema.org/organizer":{"@id":"https://rubenvandeven.com/organisation/setup"},"https://schema.org/startDate":"2019-11-16","https://schema.org/url":"https://www.setup.nl/reconnect","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/guest-worker"}},{"@id":"_:b10","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2018-11-15","https://schema.org/location":{"@id":"_:b11"},"https://schema.org/name":"ECP Conference","https://schema.org/startDate":"2018-11-15","https://schema.org/url":"https://ecp.nl/jaarcongres/kunst-expo-2018/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"_:b100","@type":"https://schema.org/EducationEvent","https://schema.org/about":{"@id":"https://rubenvandeven.com/plottingdata"},"https://schema.org/alternateName":"Critical Making of Frictional Urban Interfaces","https://schema.org/endDate":"2018-03-06","https://schema.org/location":"Utrecht","https://schema.org/name":"Workshop: Urban Frictions","https://schema.org/organizer":"Urban Interfaces, Utrecht University","https://schema.org/startDate":"2018-03-06","https://schema.org/url":"https://urbaninterfaces.sites.uu.nl"},{"@id":"_:b101","@type":"https://schema.org/EducationEvent","https://schema.org/alternateName":"API-art & situated fictions","https://schema.org/description":"A presentation & workshop about working with APIs as an artist. In collaboration with Manetta Berends & Max Dovey","https://schema.org/endDate":"2017-03-14","https://schema.org/location":"AKV St. Joost, Breda","https://schema.org/name":"Workshop - API: Artistic Point Of Interferance","https://schema.org/organiser":[{"@id":"_:b102"},{"@id":"_:b103"},{"@id":"https://rubenvandeven.com/"}],"https://schema.org/startDate":"2017-03-13","https://schema.org/url":"https://caradt.com/2017/03/07/ekv-13-march-lecture-by-human-index/"},{"@id":"_:b102","@type":"https://schema.org/Person","https://schema.org/name":"Max Dovey","https://schema.org/url":"https://maxdovey.hashbase.io/"},{"@id":"_:b103","@type":"https://schema.org/Person","https://schema.org/name":"Manetta Berends","https://schema.org/url":"http://manettaberends.nl/"},{"@id":"_:b11","@type":"https://schema.org/EventVenue","https://schema.org/name":"Fokker Terminal"},{"@id":"_:b12","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2019-05","https://schema.org/image":{"@id":"_:b13"},"https://schema.org/location":"Pingshan Cultural Center Exhibition Gallery, Shenzen","https://schema.org/name":"Free Panorama - Shenzen MAF","https://schema.org/startDate":"2019-04-20","https://schema.org/url":"http://shenzhenmaf.cn/Portal/en-US/Exhibition/Detail/10f64524-be11-1985-bbfa-7dd7d27868de","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"_:b13","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/eh-shenzen.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/eh-shenzen.jpg"},{"@id":"_:b14","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2018-08-05","https://schema.org/location":{"@id":"_:b15"},"https://schema.org/name":"Open Codes","https://schema.org/startDate":"2017-10-20","https://schema.org/url":"https://open-codes.zkm.de/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"_:b15","@type":"https://schema.org/Museum","https://schema.org/address":"Karlsrue","https://schema.org/name":"ZKM"},{"@id":"_:b16","@type":"https://schema.org/ExhibitionEvent","https://schema.org/awarded":"honorable mention","https://schema.org/endDate":"2018-10","https://schema.org/location":"Zagreb","https://schema.org/name":"Plan D","https://schema.org/startDate":"2017-10","https://schema.org/url":["http://2017.pland.hr/","http://2017.pland.hr/vijesti/dodijeljena-nagrada-i-pocasne-diplome-festivala-plan-d/"],"https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"_:b17","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2017-09","https://schema.org/funded":"Creative Industries Fund","https://schema.org/location":{"@id":"_:b18"},"https://schema.org/name":"Ars Electronica","https://schema.org/organiser":{"@id":"https://rubenvandeven.com/organisation/v2_"},"https://schema.org/startDate":"2017-09","https://schema.org/url":"http://v2.nl/events/summer-sessions-at-ars-electronica-festival-2017","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"_:b18","@type":"https://schema.org/Festival","https://schema.org/address":"Linz","https://schema.org/name":"Ars Electronica"},{"@id":"_:b19","@type":"https://schema.org/Museum","https://schema.org/address":"Singapore","https://schema.org/name":"Museum of Arts & Sciences"},{"@id":"_:b2","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2019-11-13","https://schema.org/location":{"@id":"_:b3"},"https://schema.org/name":"ECP Conference","https://schema.org/startDate":"2019-11-13","https://schema.org/url":"https://ecp.nl/jaarcongres/kunst-expo-2019/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/guest-worker"}},{"@id":"_:b20","@type":"https://schema.org/CollegeOrUniversity","https://schema.org/address":"New York City","https://schema.org/name":"Hunter College"},{"@id":"_:b21","@type":"https://schema.org/ExhibitionEvent","https://schema.org/description":"I organised this exhibition as part of my Summer Sessions residency at Arquivo237. It was a modest exhibition covering my research on emotion recognition software.","https://schema.org/endDate":"2016-09","https://schema.org/location":{"@id":"_:b22"},"https://schema.org/name":"Manipulation: Emotion Hero","https://schema.org/startDate":"2016-09","https://schema.org/url":"https://www.facebook.com/events/589274264578244/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"_:b22","@type":"https://schema.org/EventVenue","https://schema.org/address":"Lisbon","https://schema.org/name":"Arquivo237"},{"@id":"_:b23","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/emotionhero1-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/emotionhero1-2.jpg"},{"@id":"_:b24","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/emotionhero2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/emotionhero2.jpg"},{"@id":"_:b25","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2018-03-04","https://schema.org/location":{"@id":"_:b26"},"https://schema.org/name":"Big Stories Need Human Stakes","https://schema.org/startDate":"2018-02-02","https://schema.org/url":"https://nieuwevide.nl/programma/big-stories-need-human-stakes","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/choose-how-you-feel-you-have-seven-options"}},{"@id":"_:b26","@type":"https://schema.org/Museum","https://schema.org/address":"Haarlem","https://schema.org/name":"Nieuwe Vide"},{"@id":"_:b27","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2016-07-07 23:00","https://schema.org/location":{"@id":"https://rubenvandeven.com/organisation/v2_"},"https://schema.org/name":"Test_Lab the Graduation Edition","https://schema.org/startDate":"2016-07-07 20:00","https://schema.org/url":"http://v2.nl/events/test_lab-the-graduation-edition-2015-1/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/choose-how-you-feel-you-have-seven-options"}},{"@id":"_:b28","@type":"https://schema.org/ExhibitionEvent","https://schema.org/about":{"@id":"https://rubenvandeven.com/degree/media-design"},"https://schema.org/endDate":"2016-06-26","https://schema.org/location":{"@id":"https://rubenvandeven.com/university/piet-zwart"},"https://schema.org/name":"Fuzzy Logic - Graduation Show","https://schema.org/startDate":"2016-06-17","https://schema.org/url":"https://pzimediadesign.nl/2016.html","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/choose-how-you-feel-you-have-seven-options"}},{"@id":"_:b29","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/choosehowyoufeel2-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/choosehowyoufeel2-2.jpg"},{"@id":"_:b3","@type":"https://schema.org/EventVenue","https://schema.org/name":"Fokker Terminal"},{"@id":"_:b30","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/choosehowyoufeel.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/choosehowyoufeel.jpg"},{"@id":"_:b31","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2017-04-26","https://schema.org/location":{"@id":"_:b32"},"https://schema.org/name":"Video Vortex","https://schema.org/startDate":"2017-04-23","https://schema.org/url":"https://issuu.com/instituteofnetworkcultures/docs/catalouge_compiled_final__29-03_/29","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/eye-without-a-face"}},{"@id":"_:b32","@type":"https://schema.org/Place","https://schema.org/address":"Kochi (India)","https://schema.org/name":" Mill Hall / Kochi-Muzeris biennial"},{"@id":"_:b33","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2016-12","https://schema.org/location":{"@id":"_:b34"},"https://schema.org/name":"Grand Instant Fiction","https://schema.org/startDate":"2016-12","https://schema.org/url":"http://umakart.tumblr.com/post/169464483314/grand-instant-fiction-10-sakrowski-evil","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/eye-without-a-face"}},{"@id":"_:b34","@type":"https://schema.org/EventVenue","https://schema.org/address":"Brno","https://schema.org/name":"Umakart Gallery"},{"@id":"_:b35","@type":"https://schema.org/ExhibitionEvent","https://schema.org/description":"The Piet Zwart Institute at the Eye Film Museum in Amsterdam as part of its ResearchLab series. The exhibition focussed on the boundaries of the archive. Studying the structures and cultural impacts of our media technologies, it concentrated on the intricate and usually hidden aspects of EYE's extensive archive","https://schema.org/endDate":"2014-04-24","https://schema.org/location":{"@id":"_:b36"},"https://schema.org/name":"Boundaries of the Archive","https://schema.org/startDate":"2016-04-12","https://schema.org/url":"https://www.eyefilm.nl/film/boundaries-of-the-archive-research-lab-piet-zwart-institute","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/eye-without-a-face"}},{"@id":"_:b36","@type":"https://schema.org/Museum","https://schema.org/address":"Amsterdam","https://schema.org/name":"EYE Film Museum"},{"@id":"_:b37","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/eye_0-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/eye_0-2.jpg"},{"@id":"_:b38","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/eye_3-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/eye_3-2.jpg"},{"@id":"_:b39","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/eye_6-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/eye_6-2.jpg"},{"@id":"_:b4","@type":"https://schema.org/ExhibitionEvent","https://schema.org/description":"(NL) Het internet is stuk. Hoe kunnen we het weer repareren? Daarover vertelt Marleen Stikker, auteur van Het internet is stuk, op 23 januari tijdens de Privacyrede 2020. Met de 50e verjaardag van het internet is dit hét moment om terug te blikken en vooruit te kijken.","https://schema.org/endDate":"2020-01-23","https://schema.org/location":{"@id":"https://rubenvandeven.com/venue/tivoli"},"https://schema.org/name":"Privacyrede 2020: the internet is broken","https://schema.org/startDate":"2020-01-23","https://schema.org/url":"https://www.tivolivredenburg.nl/agenda/privacyrede-2019-16-01-2019/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/guest-worker"}},{"@id":"_:b40","@type":"https://schema.org/ScholarlyArticle","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/datePublished":"2017-01-27","https://schema.org/description":"What does it mean to feel 62% joy, and 15% surprised? Over the past years the digitization of emotions is booming business: multimillion dollar investments are made in technologies of which is claimed that they give companies an objective view in their consumers' feelings. The video-game-artwork Emotion Hero challenges the user to investigate this claim and question the premise of the technology. Emotion Hero is a two-part artwork. On the one hand is a video-game that is freely downloadable for everybody with an Android device. Inspired by Guitar Hero, the user scores points by following given cues. It provides detailed feedback on the mechanics of the face. The second part is a projection that shows a grid with aggregated scores of the game, that updates live. In its design, the grid refers to 19th century positivist practices.","https://schema.org/isPartOf":["C&C '17 Proceedings of the 2017 ACM SIGCHI Conference on Creativity and Cognition",{"@id":"https://rubenvandeven.com/event/creativity-and-cognition"}],"https://schema.org/name":"Article - Emotion Hero","https://schema.org/pageEnd":"423","https://schema.org/pageStart":"422","https://schema.org/publisher":"ACM New York, NY, USA","https://schema.org/url":"https://doi.org/10.1145/3059454.3059490/"},{"@id":"_:b41","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2019-06-08","https://schema.org/location":"Doornroosje, Rotterdam","https://schema.org/name":"Presentation @ Act Natural 04","https://schema.org/organizer":"Jeisson Drenth","https://schema.org/startDate":"2019-06-08"},{"@id":"_:b42","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-10-26","https://schema.org/location":"Doornroosje, Rotterdam","https://schema.org/name":"Presentation @ BARTALK #12: Coded Gestures","https://schema.org/organizer":["Yun Ingrid Lee","Rae Parnell"],"https://schema.org/startDate":"2018-10-26","https://schema.org/url":"https://bartalkdh.wordpress.com/bartalk-12-coded-gestures/"},{"@id":"_:b43","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-05-25","https://schema.org/location":"Rio de Janeiro","https://schema.org/name":"Presentation @ Media Lab UFRJ","https://schema.org/organizer":"Media Lab UFRJ & Dutch Consulate","https://schema.org/startDate":"2018-05-25","https://schema.org/url":"http://medialabufrj.net/"},{"@id":"_:b44","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-05-22","https://schema.org/location":"São Paulo","https://schema.org/name":"Presentation @ Instituto Europeo di Design","https://schema.org/organizer":"Instituto Europeo di Design & Dutch Consulate","https://schema.org/startDate":"2018-05-22","https://schema.org/url":"https://www.ied.edu/ied-locations/sao-paulo"},{"@id":"_:b45","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-05-21","https://schema.org/location":"São Paulo","https://schema.org/name":"Presentation @ Nuffic Neso","https://schema.org/organizer":"Nuffic Neso & Dutch Consulate","https://schema.org/startDate":"2018-05-21","https://schema.org/url":"https://www.nuffic.nl/onderwerpen/kantoren-het-buitenland/"},{"@id":"_:b46","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-05-19","https://schema.org/location":"São Paulo","https://schema.org/name":"Presentation @ Festival PATH","https://schema.org/organizer":"Dutch Consulate","https://schema.org/startDate":"2018-05-19","https://schema.org/url":"https://www.festivalpath.com.br/palestras/#palestrante-ruben-van-de-ven"},{"@id":"_:b47","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-03-28","https://schema.org/location":"Baut, Amsterdam","https://schema.org/name":"Presentation @ The Hmm","https://schema.org/organizer":"The Hmm","https://schema.org/startDate":"2018-03-28","https://schema.org/url":"https://thehmm.nl/the-hmm-x-baut/"},{"@id":"_:b48","@type":"https://schema.org/EducationEvent","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-03-06","https://schema.org/location":"TU Delft","https://schema.org/name":"Presentation @ Industrial Design","https://schema.org/organizer":"Felienne Hermans, TU Delft","https://schema.org/startDate":"2018-03-06"},{"@id":"_:b49","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2017-11-04","https://schema.org/location":"CREA, Amsterdam","https://schema.org/name":"Presentation @ Worlding the Brain II","https://schema.org/organizer":"ASCA Research Group Neuroaesthetics and Neurocultures, University of Amsterdam","https://schema.org/startDate":"2017-11-02","https://schema.org/url":"https://worldingthebrain2017.com"},{"@id":"_:b5","@type":"https://schema.org/ExhibitionEvent","https://schema.org/location":{"@id":"https://rubenvandeven.com/organisation/v2_"},"https://schema.org/name":"Evening of the Black Box Concerns","https://schema.org/startDate":"2017-12-7","https://schema.org/url":"http://v2.nl/events/evening-of-the-black-box-concerns","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/spectacular-spectator-mood-meter"}},{"@id":"_:b50","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/location":"Stadstuin, Utrecht","https://schema.org/name":"Presentation @ Creative Coding Utrecht","https://schema.org/organizer":{"@id":"https://rubenvandeven.com/organisation/ccu"},"https://schema.org/startDate":"2017"},{"@id":"_:b51","@type":"https://schema.org/EducationEvent","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2017-03-14","https://schema.org/location":"Breda","https://schema.org/name":"Workshop: Artistic Point of Interference","https://schema.org/organizer":"St. Joost Academy","https://schema.org/startDate":"2017-03-13","https://schema.org/url":"https://caradt.com/2017/03/07/ekv-13-march-lecture-by-human-index/"},{"@id":"_:b52","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2016-06-11","https://schema.org/location":"FoAM, Brussels","https://schema.org/name":"Presentation @ Cqrrelations publication launch","https://schema.org/organizer":"Constant VZW.","https://schema.org/startDate":"2016-06-11","https://schema.org/url":"http://cqrrelations.constantvzw.org/0x0/"},{"@id":"_:b53","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-11-04","https://schema.org/name":"Panel: Tracking Emotions","https://schema.org/recordedIn":{"@id":"https://rubenvandeven.com/panel/stateofemotion/video"},"https://schema.org/startDate":"2018-11-04","https://schema.org/url":"https://state-studio.com/participant/2016/ruben-van-de-ven"},{"@id":"_:b54","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2016-11-19","https://schema.org/location":"Frankfurt am Main","https://schema.org/name":"Presentation @ Digitalorders","https://schema.org/organizer":"Goethe University","https://schema.org/startDate":"2016-11-17","https://schema.org/url":"https://www.normativeorders.net/en/events/young-researchers-conferences/34-veranstaltungen/nachwuchskonferenz/5114-seventh-international-young-researchers-conference"},{"@id":"_:b55","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/alternateName":"What happens to the data in 'Big Data'?","https://schema.org/endDate":"016-02","https://schema.org/location":"University of Namur","https://schema.org/name":"Presentation @ Winter school","https://schema.org/organizer":"Workgroup: algorithmic governmentality","https://schema.org/startDate":"2016-02","https://schema.org/url":"www.bsts.be/wp-content/uploads/winter_school_2016-1.pdf"},{"@id":"_:b56","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2018-05-28","https://schema.org/location":"Linz","https://schema.org/name":"Presentation @ Art Meets Radical Openness","https://schema.org/startDate":"2018-05-25","https://schema.org/url":"https://www.radical-openness.org/en/festival/2016"},{"@id":"_:b57","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options"},"https://schema.org/endDate":"2016","https://schema.org/location":"University of Amsterdam","https://schema.org/name":"Presentation @ Digital Emotions Workgroup","https://schema.org/organizer":"Amsterdam School for Cultral Analysis","https://schema.org/startDate":"2016","https://schema.org/url":"http://asca.uva.nl/content/research-groups/digital-emotions/digital-emotions.html"},{"@id":"_:b58","@type":"https://schema.org/Organization","https://schema.org/name":"Institute of Network Cultures","https://schema.org/url":"http://networkcultures.org"},{"@id":"_:b59","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2015","https://schema.org/description":"A two-part artwork and my first work on software that derives emotional parameters from facial expressions. The first part displays the Mind Reading Emotions Library, an interactive collection of videos, audio fragments and scenes depicting 412 distinct emotions —ranging from `angry' to `unsure'— grouped in 24 categories. The second part of the project is a tablet with a modified demo app by Affectiva, a major player in the field of emotion analysis software. This app acts as an interactive mirror which displays the various parameters that the Affectiva software derives from someone's facial expression, while a voice over reads a text extracted from the Dutch classic Beyond Sleep by W.F. Hermans (1966), concerning the impact of the mirror, photography and video on the human self-image.","https://schema.org/image":[{"@id":"_:b61"},{"@id":"_:b62"}],"https://schema.org/name":"We know how you feel"},{"@id":"_:b6","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/moodmeter1-1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/moodmeter1-1.jpg"},{"@id":"_:b60","@type":"https://schema.org/ExhibitionEvent","https://schema.org/description":"What is an encyclopedia? What are media? What is an object? Students of the Piet Zwart Institute Media Design Masters programme invite you to look at these issues. Twelve installations and one choreography present a taxonomy of disappearing, human and non-human, introvert and collected media objects.\n\nThis exhibition was developed in a 'Thematic Seminar' run in the summer trimester 2015 taught by Florian Cramer.\n\nArtists: Lucas Battich [IT], Manetta Berends [NL], Julie Boschat Thorez [FR], Cihad Caner [TR], Joana Chicau [PT], Cristina Cochior [RO], Solange Frankort [NL], Arantxa Gonlag [NL], Anne Lamb [US], Benjamin Li [NL], Yuzhen Tang [CN], Ruben van de Ven [NL] & Thomas Walskaar [NO]","https://schema.org/endDate":"2015-06-27","https://schema.org/location":{"@id":"https://rubenvandeven.com/organisation/v2_"},"https://schema.org/name":"An Encyclopedia of Media Objects","https://schema.org/startDate":"2015-06-26","https://schema.org/url":"http://v2.nl/events/an-encyclopedia-of-media-objects","https://schema.org/workFeatured":{"@id":"_:b59"}},{"@id":"_:b61","@type":"https://schema.org/ImageObject","https://schema.org/caption":"We know how you feel","https://schema.org/contentUrl":"/assets/image/we_know_how_you_feel.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/we_know_how_you_feel.jpg"},{"@id":"_:b62","@type":"https://schema.org/ImageObject","https://schema.org/caption":"Mind Reading Emotions Library","https://schema.org/contentUrl":"/assets/image/we_know_how_you_feel-3.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/we_know_how_you_feel-3.jpg"},{"@id":"_:b63","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2015-01-01","https://schema.org/description":"In western society, images are generally perceived as objective traces of events. As evidence that things happened as how they are captured in the frame.\n\nAs Susan Sontag elaborates, this counts for photographic images in particular. They are seen, not as subjective statements about the world, but rather as pieces of it —as fragments of a reality. Photographic images are often seen as unbiased; they carry in them the \"burden of truth\". We use them to give meaning, to asses and to judge. It exactly is in this passivity of the image, that its aggression lurks.\nFragments of Reality is a newspaper that assembles descriptions of five images of one event: a press conference with Jeroen Dijsselbloem and Yanis Varoufakis. Each interviewee was shown one of the images, in an attempt to highlight how we read events trough photographs.\n\nIt considers an event not as a single factual moment, but as the cumulative of subjective experiences, inherently proposing that an image is always lacking in its representation of that which it presents.","https://schema.org/image":[{"@id":"_:b64"},{"@id":"_:b65"},{"@id":"_:b66"}],"https://schema.org/name":"Fragments of reality"},{"@id":"_:b64","@type":"https://schema.org/ImageObject","https://schema.org/caption":"Fragments of reality","https://schema.org/contentUrl":"/assets/image/fragments-6-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/fragments-6-2.jpg"},{"@id":"_:b65","@type":"https://schema.org/ImageObject","https://schema.org/caption":"Fragments of reality","https://schema.org/contentUrl":"/assets/image/fragments-9-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/fragments-9-2.jpg"},{"@id":"_:b66","@type":"https://schema.org/ImageObject","https://schema.org/caption":"Fragments of reality","https://schema.org/contentUrl":"/assets/image/fragments-7-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/fragments-7-2.jpg"},{"@id":"_:b67","@type":"https://schema.org/Movie","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2013","https://schema.org/description":"Adam is security guard at a nursing home with comatose patients. During his night shifts he has unsettling visions of someone drowning. He seeks his comfort in the company of his pregnant girlfriend. Days of Water is a story on guilt and shame; and on a longing for hope.\nI wrote and directed this film for my graduation as film director for fiction at the Utrecht School of the Arts.\nIt was accompanied by my MA research on spectatorial emotion and the influence emotions on the spectator's sympathy for the protagonist.","https://schema.org/image":[{"@id":"_:b70"},{"@id":"_:b71"}],"https://schema.org/name":"Waterdagen"},{"@id":"_:b68","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2014-05","https://schema.org/location":{"@id":"_:b69"},"https://schema.org/name":"High Desert International Film Festival ","https://schema.org/startDate":"2014-05","https://schema.org/url":"http://routedunord.nl/portfolio-item/ruben-van-de-ven-2/","https://schema.org/workFeatured":{"@id":"_:b67"}},{"@id":"_:b69","@type":"https://schema.org/Festival","https://schema.org/address":"Pahrump, Nevada","https://schema.org/name":"High Desert International Film Festival "},{"@id":"_:b7","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/moodmeter2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/moodmeter2.jpg"},{"@id":"_:b70","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/waterdagen-teaser.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/waterdagen-teaser.jpg"},{"@id":"_:b71","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/waterdagen1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/waterdagen1.jpg"},{"@id":"_:b72","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2012","https://schema.org/description":"For the visitors of the Crossing Border festival in The Hague we desgined an installation to collaboratively contribute to a poem.\nBased on the input of the user, a sentence is added to the poem, originating from digitalised texts of artists participating in the festival.\nThe text was combined with an audiovisual presentation that changed depending on the user's input.","https://schema.org/image":{"@id":"_:b75"},"https://schema.org/name":"Co-Poet","https://schema.org/url":"http://projectkaleido.nl/#copoet"},{"@id":"_:b73","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2012-11-17","https://schema.org/location":{"@id":"_:b74"},"https://schema.org/name":"Crossing Border","https://schema.org/startDate":"2012-11-14","https://schema.org/workFeatured":{"@id":"_:b72"}},{"@id":"_:b74","@type":"https://schema.org/PerformingArtsTheater","https://schema.org/address":"Leiden","https://schema.org/name":"Leidse Schouwburg"},{"@id":"_:b75","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/copoet1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/copoet1.jpg"},{"@id":"_:b76","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2012","https://schema.org/description":"The Colour of Blue. A diptych about two Tanzanians: a miner and a lobster fisher. How do they live, work and survive; and how do they see their own future? Each of the two men is in his own way depending on nature, everyday gambling for a good catch.\nThis documentary was shot complementary to our work at the Kilimanjaro Film Institute in Arusha.\nDocumentary, 14′42″. The full film is available on Youtube.","https://schema.org/image":[{"@id":"_:b77"},{"@id":"_:b78"}],"https://schema.org/name":"Rangi Ya Samawati","https://schema.org/video":{"@id":"https://rubenvandeven.com/samawati/video"}},{"@id":"_:b77","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/samawati-prev2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/samawati-prev2.jpg"},{"@id":"_:b78","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/samawati-prev1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/samawati-prev1.jpg"},{"@id":"_:b79","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2010","https://schema.org/description":"A short HKU project on the future of social media, when it was still an upcomming phenomenon. It is made in two weeks for a series of shorts with a given start and ending image.\nWe asked ourselves: what happens if our online identity lives on after we die? Do we still live on if a part of our online identity does? How can this virtual identity be shaped?\n2′10″","https://schema.org/image":{"@id":"_:b80"},"https://schema.org/name":"Virtual Afterlife","https://schema.org/video":{"@id":"https://rubenvandeven.com/assets/video/guerilla_project.mp4#videoobject"}},{"@id":"_:b8","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/moodmeter3.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/moodmeter3.jpg"},{"@id":"_:b80","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/guerilla2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/guerilla2.jpg"},{"@id":"_:b81","@type":"https://schema.org/Person","https://schema.org/author":{"@id":"https://rubenvandeven.com/pillow-talk"},"https://schema.org/name":"Begüm Erciyas","https://schema.org/url":"https://www.begumerciyas.com"},{"@id":"_:b82","@type":"https://schema.org/TheaterEvent","https://schema.org/endDate":"2019-05-20","https://schema.org/location":"KVS, Brussels","https://schema.org/name":"Kunstenfestivaldesarts","https://schema.org/startDate":"2019-05-15","https://schema.org/url":"https://www.kfda.be/en/program/pillow-talk","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/pillow-talk"}},{"@id":"_:b83","@type":"https://schema.org/TheaterEvent","https://schema.org/endDate":"2019-06-16","https://schema.org/location":"Münchner Kammerspiele","https://schema.org/name":"Festival Politics of Algorithms","https://schema.org/startDate":"2019-06-14","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/pillow-talk"}},{"@id":"_:b84","@type":"https://schema.org/TheaterEvent","https://schema.org/endDate":"2019-08-31","https://schema.org/location":"Radialsystem, Berlin","https://schema.org/name":"New Empathies Program Series","https://schema.org/startDate":"2019-08-29","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/pillow-talk"}},{"@id":"_:b85","@type":"https://schema.org/TheaterEvent","https://schema.org/endDate":"2019-11-16","https://schema.org/location":"Theatre Nanterre-Amandiers, Paris","https://schema.org/name":"New Settings/Fondation d'Enterprise Hermés","https://schema.org/startDate":"2019-11-13","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/pillow-talk"}},{"@id":"_:b86","@type":"https://schema.org/TheaterEvent","https://schema.org/endDate":"2019-11-31","https://schema.org/location":"Kortrijk","https://schema.org/name":"NEXT Festival","https://schema.org/startDate":"2019-11-29","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/pillow-talk"}},{"@id":"_:b87","@type":"https://schema.org/TheaterEvent","https://schema.org/endDate":"2020-02-28","https://schema.org/location":"Moscow","https://schema.org/name":"Winzavod Art Center","https://schema.org/startDate":"2020-02-14","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/pillow-talk"}},{"@id":"_:b88","@type":"https://schema.org/TheaterEvent","https://schema.org/endDate":"2020-03-20","https://schema.org/location":"Leuven","https://schema.org/name":"STUK","https://schema.org/startDate":"2020-03-19","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/pillow-talk"}},{"@id":"_:b89","@type":"https://schema.org/VisualArtsEvent","https://schema.org/name":"Residency: PACT Zollverein","https://schema.org/startDate":"2019","https://schema.org/url":"https://www.pact-zollverein.de/en"},{"@id":"_:b9","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/moodmeter4.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/moodmeter4.jpg"},{"@id":"_:b90","@type":"https://schema.org/VisualArtsEvent","https://schema.org/name":"Residency: Buda","https://schema.org/startDate":"2019","https://schema.org/url":"https://www.budakortrijk.be/en/residenties/beguem-erciyas-tr-hugvie"},{"@id":"_:b91","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/pillow_talk01.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/pillow_talk01.jpg"},{"@id":"_:b92","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/pillow_talk02.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/pillow_talk02.jpg"},{"@id":"_:b93","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/pillow_talk03.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/pillow_talk03.jpg"},{"@id":"_:b94","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/person/ward-goes"},"https://schema.org/contributor":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2013-12-04","https://schema.org/description":"Originally initiated as a graduation project (cum laude) by Ward Goes, The Spectacular Times is an ongoing visual inquiry into the presentation of news. It investigates how news, rather than being subjective, is representational of its social, cultural, (geo)political and ideological contexts. The project sets out to lay bare these representations in currently circulating news.\n\nBy layering and contrasting different news elements The Spectacular Times re-contextualises news and makes explicit the intangible notions that lie beyond an increasingly universal guise of news reporting. Not in an effort to tell apart true from false, left from right, or right from wrong, but in order to accentuate a variety of articulations of news.\n\nThis web based project uses user defined variables to animate news headers, texts and images, which are directly sourced from different news websites world wide. By adjusting these parameters (among which region, scope and speed) the spectator actively perceives how news content is de- and reformed through its aesthetics.","https://schema.org/image":[{"@id":"_:b95"},{"@id":"_:b96"}],"https://schema.org/name":"The Specta­cular Times","https://schema.org/url":"http://spectacularspectacular.news"},{"@id":"_:b95","@type":"https://schema.org/ImageObject","https://schema.org/caption":"The Spectacular Times","https://schema.org/contentUrl":"/assets/image/times1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/times1.jpg"},{"@id":"_:b96","@type":"https://schema.org/ImageObject","https://schema.org/caption":"The Spectacular Times","https://schema.org/contentUrl":"/assets/image/times2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/times2.jpg"},{"@id":"_:b97","@type":"https://schema.org/CollegeOrUniversity","https://schema.org/addressLocality":"London","https://schema.org/educationalCredentialAwarded":{"@id":"https://rubenvandeven.com/degree/cddc"},"https://schema.org/name":"The Open University"},{"@id":"_:b98","@type":"https://schema.org/Hogeschool voor de Kunsten Utrecht","https://schema.org/addressLocality":"Utrecht","https://schema.org/educationalCredentialAwarded":{"@id":"https://rubenvandeven.com/degree/avm"}},{"@id":"_:b99","@type":"https://schema.org/Twente University","https://schema.org/addressLocality":"Enschede","https://schema.org/educationalCredentialAwarded":{"@id":"https://rubenvandeven.com/degree/mechanical-engineering"}},{"@id":"https://rubenvandeven.com/","@type":"https://schema.org/Person","https://schema.org/email":"info@rubenvandeven.com","https://schema.org/jobTitle":"digital artist / researcher of software culture","https://schema.org/name":"Ruben van de Ven","https://schema.org/nationality":"The Netherlands"},{"@id":"https://rubenvandeven.com/2018/data-flaneur","@type":"https://schema.org/Event","https://schema.org/alternateName":"Data Flâneur - seeing and being seen in the data driven city","https://schema.org/description":"Inspired by Alison Powell’s ‘data walk’, the Flaneur twists her concept by not only making participants aware of data collection within the city, but also by making them experiment with data collection for their own purposes. By zooming in on the procedures of selection, classification and digitisation, participants experience the intricacies of data collection.","https://schema.org/endDate":"2018-11-04","https://schema.org/name":"Data Flâneur","https://schema.org/organizer":{"@id":"https://rubenvandeven.com/plottingdata"},"https://schema.org/startDate":"2018-11-04","https://schema.org/superEvent":{"@id":"https://rubenvandeven.com/exhibition/hello-world"},"https://schema.org/url":"https://creativecodingutrecht.nl/2018/10/20/the-data-flaneur-seen-and-being-seen-in-the-data-driven-city-tour/"},{"@id":"https://rubenvandeven.com/2018/digital-cultures","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/plottingdata"},"https://schema.org/description":"As Plotting Data, we gave a presentation at the Digital Cultures Conference","https://schema.org/endDate":"2018-09-22","https://schema.org/location":"Leuphana University, Lüneburg","https://schema.org/name":"Digital Cultures: Knowledge / Culture / Technology","https://schema.org/organizer":"Centre for Digital Cultures & Institute for Culture and Society","https://schema.org/startDate":"2018-09-19","https://schema.org/url":"https://digitalculturesconference.org/"},{"@id":"https://rubenvandeven.com/2020/acts-of-collection-and-omission","@type":"https://schema.org/Event","https://schema.org/about":{"@id":"https://rubenvandeven.com/plottingdata"},"https://schema.org/description":"The event will host three rounds of conversations that will introduce various datasets and artistic ways of interfacing them.\n\nAlgorithmic models learn to distinguish patterns and make predictions by attempting to imitate existing structures in vast collections of data. In the process of creating these datasets, conflict and ambiguity are omitted in favour of turning the world into its computable double. How do we bring forth narratives that make other interpretations possible?\n\nPlotting Data was a series of workshops held by Cristina Cochior & Ruben van de Ven in 2019, which explored the biases and tensions within datasets that underlie systems for automated decision making. Discussions, presentations and performances fed into the creation of digital interfaces that emphasise the inherently performative characteristics of datasets.\n\nThis final event marks the end of this project and the release of the Acts of Collection and Omission digital publication. Two tables will be hosted by invited artists Julie Boschat Thorez & Sami Hammana and Nicolas Malevé, while the third table will give an overview of the publication.","https://schema.org/endDate":"2020-03-11 22:00","https://schema.org/location":"Framer Framed & Netwerk Democratie, Amsterdam","https://schema.org/name":"Acts of Collection and Omission","https://schema.org/organizer":"Centre for Digital Cultures & Institute for Culture and Society","https://schema.org/startDate":"2020-03-11 19:30","https://schema.org/url":"https://digitalculturesconference.org/"},{"@id":"https://rubenvandeven.com/article/choose-how-you-feel-you-have-seven-options","@type":"https://schema.org/Report","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/datePublished":"2017-01-27","https://schema.org/description":"What does it mean to feel 82% surprised or 93% joy? As part of their Longform series, the Institute of Network Cultures published my research into software that derives emotional scores from facial expressions.","https://schema.org/name":"Longform - Choose How You Feel; You Have Seven Options","https://schema.org/publisher":{"@id":"_:b58"},"https://schema.org/url":"http://networkcultures.org/longform/2017/01/25/choose-how-you-feel-you-have-seven-options/"},{"@id":"https://rubenvandeven.com/assets/video/guerilla_project.mp4#videoobject","@type":"https://schema.org/VideoObject","https://schema.org/contentUrl":"/assets/video/guerilla_project.mp4","https://schema.org/encodingFormat":"video/mp4","https://schema.org/thumbnailUrl":"/assets/thumb/guerilla_project.mp4.jpg","https://schema.org/videoFrameSize":"1280x1024"},{"@id":"https://rubenvandeven.com/choose-how-you-feel-you-have-seven-options","@type":"https://schema.org/MediaObject","https://schema.org/artworkSurface":"3 projections","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2016","https://schema.org/description":"What does it mean to feel 47% happy and 21% surprised? Choose how you feel; you have seven options is a video work that revolves around this question as it looks at software that derives emotional parameters from facial expressions. It combines human accounts and algorithmic processing to examine the intersection of highly cognitive procedures and ambiguous experiences. Born from a fascination with the technological achievements, the work interrogates the discursive apparatus the software is embedded in.\n\nThis work builds on my research into the workings of expression analysis technologies and the assumptions that underlie it, scrutinising the claims that are made by the companies developing the software.","https://schema.org/duration":"9M9S (∞ loop)","https://schema.org/image":[{"@id":"_:b29"},{"@id":"_:b30"}],"https://schema.org/name":"Choose How You Feel; You Have Seven Options"},{"@id":"https://rubenvandeven.com/degree/avm","@type":"https://schema.org/EducationalOccupationalCredential","https://schema.org/credentialCategory":"Bachelor of Arts","https://schema.org/hasCredential":{"@id":"https://rubenvandeven.com/"},"https://schema.org/name":"BA - Audio-visual Media","https://schema.org/temporalCoverage":"2009-2013"},{"@id":"https://rubenvandeven.com/degree/cddc","@type":"https://schema.org/EducationalOccupationalCredential","https://schema.org/credentialCategory":"Master of Arts","https://schema.org/hasCredential":{"@id":"https://rubenvandeven.com/"},"https://schema.org/name":"MA - Creative Design for Digital Cultures","https://schema.org/temporalCoverage":"2012-2013"},{"@id":"https://rubenvandeven.com/degree/mechanical-engineering","@type":"https://schema.org/EducationalOccupationalCredential","https://schema.org/credentialCategory":"Propaedeutic degree","https://schema.org/hasCredential":{"@id":"https://rubenvandeven.com/"},"https://schema.org/name":"Propaedeutic - Mechanical Engineering","https://schema.org/temporalCoverage":"2007-2009"},{"@id":"https://rubenvandeven.com/degree/media-design","@type":"https://schema.org/EducationalOccupationalCredential","https://schema.org/about":{"@id":"https://rubenvandeven.com/choose-how-you-feel-you-have-seven-options"},"https://schema.org/credentialCategory":"Master of Arts","https://schema.org/hasCredential":{"@id":"https://rubenvandeven.com/"},"https://schema.org/name":"MA - Media Design and Communication","https://schema.org/temporalCoverage":"2014-2016"},{"@id":"https://rubenvandeven.com/emotionhero","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2016","https://schema.org/description":"Emotion recognition software is being used both as a tool for ‘objective’ measurements as well as a tool for training one’s facial expressions, eg. for job interviews. Emotion Hero is a literal translation of the paradoxical relation between these applications of the technology.\n\nEmotion Hero is a two-part artwork. On the one hand is a video-game that is freely downloadable for everybody with an Android device (see Google Play). Inspired by Guitar Hero, the user scores points by following given cues. It provides detailed feedback on the mechanics of the face (eg. “You showed on 10% Joy when you had to show 100%, smile 99.32% more.”), revealing that rather than being a window into the brain, the face is a controllable surface.\n\nThe second part is a projection that shows the aggregated scores of the game. In order to substantiate their discourse, companies in facial expression measurement employ a huge amount of data collection and processing. The results are displayed in a fixed grid, recalling historical practices that, trough extensive measurement and administration, also aimed to delineate something which is conceptually undelineated: think of Duchenne de Boulogne, Lombroso, and Charcot.\n\nEmotion Hero is a playful invitation to open up the box of expression analysis to reveal the assumptions that underlie this technology.\nThe game's emotional intelligence is powered by Affectiva (I was also interviewed by them).","https://schema.org/image":[{"@id":"_:b23"},{"@id":"_:b24"}],"https://schema.org/name":"Emotion Hero","https://schema.org/url":"https://emotionhero.com"},{"@id":"https://rubenvandeven.com/event/2018/yama-ichi","@type":"https://schema.org/ExhibitionEvent","https://schema.org/location":{"@id":"https://rubenvandeven.com/venue/tivoli"},"https://schema.org/name":"Yama Ichi Black Market","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/heartbeat"}},{"@id":"https://rubenvandeven.com/event/2019/ccu-presentation","@type":"https://schema.org/Event","https://schema.org/location":"Nijverheidsloods, Utrecht","https://schema.org/name":"Presentation @ Creative Coding Utrecht","https://schema.org/organizer":{"@id":"https://rubenvandeven.com/organisation/ccu"},"https://schema.org/startDate":"2019-10-31","https://schema.org/workFeatured":[{"@id":"https://rubenvandeven.com/guest-worker"},{"@id":"https://rubenvandeven.com/exercises-in-overfitting"}]},{"@id":"https://rubenvandeven.com/event/cqrrelations","@type":"https://schema.org/Event","https://schema.org/attendee":{"@id":"https://rubenvandeven.com/"},"https://schema.org/endDate":"2015-01-23","https://schema.org/name":"Cqrrelations Worksession","https://schema.org/organizer":{"@id":"https://rubenvandeven.com/organisation/constant"},"https://schema.org/startDate":"2015-01-18","https://schema.org/url":"http://cqrrelations.constantvzw.org/"},{"@id":"https://rubenvandeven.com/event/creativity-and-cognition","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2017-06","https://schema.org/location":{"@id":"_:b19"},"https://schema.org/name":"Microbites of Creativity","https://schema.org/organiser":"ACM Creativity & Cognition","https://schema.org/startDate":"2017-06","https://schema.org/url":["http://microbites.me/","http://cc.acm.org/2017/microbites/?ArtworksCC2017/"],"https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"https://rubenvandeven.com/exercises-in-overfitting","@type":"https://schema.org/MediaObject","http://www.w3.org/2000/01/rdf-schema#seeAlso":"https://gitlab.com/rubenvandeven/diede","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2019","https://schema.org/description":"I taught a computer how to write the name of my son. The progression of this machine learning processes is materialised with a pen plotter.","https://schema.org/image":[{"@id":"https://rubenvandeven.com/exercises-in-overfitting/image/2"},{"@id":"https://rubenvandeven.com/exercises-in-overfitting/image/1"}],"https://schema.org/name":"Exercises in overfitting"},{"@id":"https://rubenvandeven.com/exercises-in-overfitting/image/1","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/exercises-in-overfitting1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/exercises-in-overfitting1.jpg"},{"@id":"https://rubenvandeven.com/exercises-in-overfitting/image/2","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/exercises-in-overfitting2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/exercises-in-overfitting2.jpg"},{"@id":"https://rubenvandeven.com/exhibition/codesandmodes","@type":"https://schema.org/ExhibitionEvent","https://schema.org/about":{"@id":"http://networkcultures.org/longform/2017/01/25/choose-how-you-feel-you-have-seven-options/"},"https://schema.org/endDate":"2017-03-18","https://schema.org/location":{"@id":"_:b20"},"https://schema.org/name":"Codes & Modes II","https://schema.org/organiser":"Integrated Media Arts MFA","https://schema.org/startDate":"2017-03-16","https://schema.org/url":"https://www.hunterintegratedmedia.org/reframe/speaker-lineup/ruben-van-de-ven/","https://schema.org/workFeatured":[{"@id":"https://rubenvandeven.com/emotionhero"},{"@id":"_:b59"}]},{"@id":"https://rubenvandeven.com/exhibition/hello-world","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2018-11-04","https://schema.org/name":"Hello World!","https://schema.org/organizer":{"@id":"https://rubenvandeven.com/organisation/ccu"},"https://schema.org/startDate":"2018-11-02","https://schema.org/url":"https://www.creativecodingutrecht.nl/2018/10/30/hello-world-full-program-online/"},{"@id":"https://rubenvandeven.com/exhibition/kickstart","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2018-03-28","https://schema.org/location":{"@id":"https://rubenvandeven.com/place/in4art"},"https://schema.org/name":"KickstART II","https://schema.org/startDate":"2018-03-28","https://schema.org/url":"http://www.in4art.eu/kickstart/launching-kickstart-ii/","https://schema.org/workFeatured":[{"@id":"https://rubenvandeven.com/mvp1"},{"@id":"https://rubenvandeven.com/mvp2"},{"@id":"https://rubenvandeven.com/mvp3"}]},{"@id":"https://rubenvandeven.com/exhibition/mood_swings","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2017-05-28","https://schema.org/location":{"@id":"https://rubenvandeven.com/place/q21"},"https://schema.org/name":"Mood Swings","https://schema.org/startDate":"2017-03-28","https://schema.org/subEvent":{"@id":"https://rubenvandeven.com/residency/q21"},"https://schema.org/url":"https://www.mqw.at/en/institutions/q21/frei-raum-q21-exhibition-space/2017/03/mood-swings-on-mood-politics-sentiment-data-market-sentiments-and-other-sentiment-agencies/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/emotionhero"}},{"@id":"https://rubenvandeven.com/exhibition/route-du-nord","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2018-05","https://schema.org/location":{"@id":"https://rubenvandeven.com/venue/zoho"},"https://schema.org/name":"Route du Nord","https://schema.org/startDate":"2018-05","https://schema.org/url":"http://routedunord.nl/portfolio-item/ruben-van-de-ven-2/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/sustaining-gazes"}},{"@id":"https://rubenvandeven.com/exhibition/stateofemotion","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2016-11-05","https://schema.org/name":"STATE of Emotion","https://schema.org/startDate":"2016-11-04","https://schema.org/url":"https://www.statefestival.org/participant/2016/ruben-van-de-ven","https://schema.org/workFeatured":[{"@id":"https://rubenvandeven.com/emotionhero"},{"@id":"_:b59"}]},{"@id":"https://rubenvandeven.com/exhibition/the-new-current","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2019-02-10","https://schema.org/location":{"@id":"https://rubenvandeven.com/venue/cruise-terminal"},"https://schema.org/name":"The New Current","https://schema.org/startDate":"2019-02-06","https://schema.org/url":"https://www.thenewcurrent.org/artists-artweek","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/sustaining-gazes"}},{"@id":"https://rubenvandeven.com/eye-without-a-face","@type":"https://schema.org/MediaObject","https://schema.org/author":[{"@id":"https://rubenvandeven.com/person/cristina-cochior"},{"@id":"https://rubenvandeven.com/"}],"https://schema.org/dateCreated":"2016","https://schema.org/description":"Whether the video frames are ordered by time or by emotion will not make a difference to a computer. For it, both orderings are just as logical. However, for the human spectator the reordered display of frames becomes a disruptive process. The human is positioned as a required agent for meaning making in an algorithmic procedure.\n\nIn collaboration with Cristina Cochior I went manually through the Eye's public collection, and catalogued faces by surrendering them to an emotion detection algorithm. Cutting from one face to another,its uncritical selection produced a new portrait of emotional gradients moving in-between anger and happiness.","https://schema.org/duration":"11:32 (∞ loop)","https://schema.org/image":[{"@id":"_:b37"},{"@id":"_:b38"},{"@id":"_:b39"}],"https://schema.org/name":"EYE Without A Face","https://schema.org/video":{"@id":"https://rubenvandeven.com/eye-without-a-face/video"}},{"@id":"https://rubenvandeven.com/eye-without-a-face/video","@type":"https://schema.org/VideoObject","https://schema.org/contentUrl":"http://works.rubenvandeven.com/2016-eye_without_a_face/EyeWithoutAFace.mp4","https://schema.org/encodingFormat":"video/mp4","https://schema.org/thumbnailUrl":"/assets/thumb/eye_1.jpg","https://schema.org/videoFrameSize":"1920x1080"},{"@id":"https://rubenvandeven.com/festival/statefestival","@type":"https://schema.org/Festival","https://schema.org/address":"Berlin","https://schema.org/name":"STATE Festival","https://schema.org/subEvent":[{"@id":"https://rubenvandeven.com/exhibition/stateofemotion"},{"@id":"_:b53"}],"https://schema.org/url":"https://www.statefestival.org/"},{"@id":"https://rubenvandeven.com/guest-worker","@type":"https://schema.org/MediaObject","https://schema.org/author":[{"@id":"https://rubenvandeven.com/person/merijn-van-moll"},{"@id":"https://rubenvandeven.com/"}],"https://schema.org/dateCreated":"2019","https://schema.org/description":"Nowadays, we are not only increasingly delegating and automating tasks and processes, there also new forms of work that are being created for people. With the emergence of services such as Amazon's Mechanical Turk, specific parts of automatic processes are being outsourced to human workers. These Human Intelligence Tasks are tasks that a machine cannot execute, for example retyping a scanned receipt or entering a Captcha code. In this way machines selectively delegate tasks to humans, creating a human working class that remains largely invisible.Merijn van Moll and Ruben van de Ven want to make this feedback loop between man and machine visible. This creates a new ritual in which the spirit of the worker is invoked again and again.\n\nThis project was developed in light of Future scenarios for AI and the job market by Setup and the NSvP (Dutch Foundation for Psycho technology)","https://schema.org/image":[{"@id":"https://rubenvandeven.com/guest-worker/image/1"},{"@id":"https://rubenvandeven.com/guest-worker/image/2"},{"@id":"https://rubenvandeven.com/guest-worker/image/3"}],"https://schema.org/name":"Guest Worker","https://schema.org/video":[{"@id":"https://rubenvandeven.com/guest-worker/video/outcome"},{"@id":"https://rubenvandeven.com/guest-worker/video/process"}]},{"@id":"https://rubenvandeven.com/guest-worker/image/1","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/guest_worker01.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/guest_worker01.jpg"},{"@id":"https://rubenvandeven.com/guest-worker/image/2","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/guest_worker02.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/guest_worker02.jpg"},{"@id":"https://rubenvandeven.com/guest-worker/image/3","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/guest_worker03.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/guest_worker03.jpg"},{"@id":"https://rubenvandeven.com/guest-worker/report","@type":"https://schema.org/Report","https://schema.org/about":{"@id":"https://rubenvandeven.com/guest-worker"},"https://schema.org/datePublished":"2019-11-26","https://schema.org/description":"A brief report written in light of Guest Worker (2019). In Dutch.","https://schema.org/name":"Guest Worker Research Report","https://schema.org/url":"http://guest_worker.rubenvandeven.com/"},{"@id":"https://rubenvandeven.com/guest-worker/video/outcome","@type":"https://schema.org/VideoObject","https://schema.org/contentUrl":"http://works.rubenvandeven.com/2019-guest_worker/guestworker-without-credits.mp4","https://schema.org/encodingFormat":"video/mp4","https://schema.org/thumbnailUrl":"/assets/thumb/guest_worker04.jpg","https://schema.org/videoFrameSize":"1920x1080"},{"@id":"https://rubenvandeven.com/guest-worker/video/process","@type":"https://schema.org/VideoObject","https://schema.org/contentUrl":"http://works.rubenvandeven.com/2019-guest_worker/GuestWorker.mp4","https://schema.org/encodingFormat":"video/mp4","https://schema.org/thumbnailUrl":"/assets/thumb/guest_worker05.jpg","https://schema.org/videoFrameSize":"1920x1080"},{"@id":"https://rubenvandeven.com/heartbeat","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2018","https://schema.org/description":"Why buy live access to heartbeats?
  • Insurance companies give you discounts for monitoring a healthy lifestyle.
  • Because you can re-sell it to data hoarding companies.
  • To chill out with the soothing sound on your headphones.
  • Use it as input data for your amazing new media art installation.
  • Because it's cheap!
","https://schema.org/image":{"@id":"https://rubenvandeven.com/heartbeat/image/1"},"https://schema.org/name":"Data double black market"},{"@id":"https://rubenvandeven.com/heartbeat/image/1","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/data-double-black-market.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/data-double-black-market.jpg"},{"@id":"https://rubenvandeven.com/in4art-salon","@type":"https://schema.org/ExhibitionEvent","https://schema.org/endDate":"2018-05-27","https://schema.org/location":{"@id":"https://rubenvandeven.com/place/in4art"},"https://schema.org/name":"Salon VI - Innovatism","https://schema.org/startDate":"2018-05-18","https://schema.org/url":"http://www.in4art.eu/salon/salon-vi-innovatism/","https://schema.org/workFeatured":{"@id":"https://rubenvandeven.com/mvp1"}},{"@id":"https://rubenvandeven.com/mvp1","@type":"https://schema.org/MediaObject","https://schema.org/artworkSurface":"Oilpaint on wood + WiFi-connected RaspberryPi in ABS enclosure","https://schema.org/contributor":{"@id":"https://rubenvandeven.com/person/donald-schenkel"},"https://schema.org/dateCreated":"2018","https://schema.org/description":"The work of Donald Schenkel is augmented with a camera which keeps track of how long people look at the work. Like an electricity meter, the value increases the more the work is used. This data is then sent to a server, and provides the artist —in this case Donald Schenkel— with live statistics. But who owns this data generated by the work? The buyer, the artist, or the mediator — which is me?\n\nThis is the first augmentation that is part of the MVP series created for KickstART.","https://schema.org/height":"55cm + 8cm","https://schema.org/image":[{"@id":"https://rubenvandeven.com/mvp1/image/1"},{"@id":"https://rubenvandeven.com/mvp1/image/2"},{"@id":"https://rubenvandeven.com/mvp1/image/3"}],"https://schema.org/name":"MVP#1 Gathering viewing statistics for Donald Schenkel","https://schema.org/width":"45cm + 15cm"},{"@id":"https://rubenvandeven.com/mvp1/image/1","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/mvp1-1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/mvp1-1.jpg"},{"@id":"https://rubenvandeven.com/mvp1/image/2","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/mvp1-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/mvp1-2.jpg"},{"@id":"https://rubenvandeven.com/mvp1/image/3","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/mvp1-4.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/mvp1-4.jpg"},{"@id":"https://rubenvandeven.com/mvp2","@type":"https://schema.org/MediaObject","https://schema.org/artworkSurface":"Pencil drawing in metal LCD enclosure","https://schema.org/contributor":{"@id":"https://rubenvandeven.com/person/joseph-huot"},"https://schema.org/dateCreated":"2018","https://schema.org/description":"In September 2017, huricane Irma was racing towards Florida. Everybody tried to get away from there as quick as possible. Stuck were those with the electric Tesla Model S with the cheaper battery option (60kWh). Then, all of a sudden, Tesla send a software update to these cars. The cars could drive futher then ever before. Until 72 hours later, Tesla reversed the software update. Exactly the same car could drive shorter distances.\n\nThis is the business of software companies: just like Apple limits performance on old iPhones, Tesla used softare to limit the reach of its cars in order to make more money. While physically the exact same product, it can do less.\n\nMinimum Viable Product #2 brings this business model to the art world. It provides a limited edition of a drawing by Joseph Huot.","https://schema.org/height":"50cm","https://schema.org/image":[{"@id":"https://rubenvandeven.com/mvp2/image/1"},{"@id":"https://rubenvandeven.com/mvp2/image/2"},{"@id":"https://rubenvandeven.com/mvp2/image/3"}],"https://schema.org/name":"MVP#2 Joseph Huot's Limited Edition","https://schema.org/width":"32.5cm"},{"@id":"https://rubenvandeven.com/mvp2/image/1","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/mvp2-01.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/mvp2-01.jpg"},{"@id":"https://rubenvandeven.com/mvp2/image/2","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/mvp2-02.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/mvp2-02.jpg"},{"@id":"https://rubenvandeven.com/mvp2/image/3","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/mvp2-5.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/mvp2-5.jpg"},{"@id":"https://rubenvandeven.com/mvp3","@type":"https://schema.org/MediaObject","https://schema.org/artworkSurface":"Personalised print on perspex","https://schema.org/contributor":{"@id":"https://rubenvandeven.com/person/mikel-folgerts"},"https://schema.org/dateCreated":"2018","https://schema.org/description":"On YouTube, Instagram, and many other online platforms, celebrities get paid to place consumer products in their videos. Not prominently, but hidden in plain sight. Can precarious artists finance their work by employing this product placement?\n\nMinimum Viable Product #3 allows buyers to customise the work they bought —Rotterdam, by Mikel Folgerts—, linking the status of the artist to their product.","https://schema.org/height":"40cm","https://schema.org/image":{"@id":"https://rubenvandeven.com/mvp3/image/1"},"https://schema.org/name":"MVP#3 Customiseyour.art - Mikel Folgerts 1/3","https://schema.org/width":"40cm"},{"@id":"https://rubenvandeven.com/mvp3/image/1","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/mvp3-1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/mvp3-1.jpg"},{"@id":"https://rubenvandeven.com/mvps","@type":"https://schema.org/CreativeWorkSeries","https://schema.org/about":"November 2017 In4Art approached me to be part of their KickstART project. They commissioned three works to be part of their auction. The goal was to explicitly develop works that fitted the commercial art scene.\n\nRather than creating 'sellable' works myself, I took the start-up culture that forms the foundation of In4Art, as my object of my series. I augmented the works of three other participants with business models taken from the online/digital realm. This resulted in three Minimum Viable Products. Recontextualising these business models towards an arts context, results in new perspectives on both the arts as well as start-up culture.","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2018","https://schema.org/hasPart":[{"@id":"https://rubenvandeven.com/mvp1"},{"@id":"https://rubenvandeven.com/mvp2"},{"@id":"https://rubenvandeven.com/mvp3"}],"https://schema.org/name":"MVPs"},{"@id":"https://rubenvandeven.com/organisation/ccu","@type":"https://schema.org/Organization","https://schema.org/name":"Creative Coding Utrecht"},{"@id":"https://rubenvandeven.com/organisation/constant","@type":"https://schema.org/Organization","https://schema.org/name":"Constant","https://schema.org/url":"http://constantvzw.org"},{"@id":"https://rubenvandeven.com/organisation/nsvp","@type":"https://schema.org/Organization","https://schema.org/name":"Nederlandse Stichting voor Psychotechniek","https://schema.org/url":"https://www.innovatiefinwerk.nl/"},{"@id":"https://rubenvandeven.com/organisation/setup","@type":"https://schema.org/Organization","https://schema.org/address":"Utrecht","https://schema.org/name":"Setup","https://schema.org/url":"https://www.setup.nl/"},{"@id":"https://rubenvandeven.com/organisation/v2_","@type":"https://schema.org/Place","https://schema.org/address":"Rotterdam","https://schema.org/name":"V2_"},{"@id":"https://rubenvandeven.com/panel/stateofemotion/video","@type":"https://schema.org/VideoObject","https://schema.org/embedUrl":"https://www.youtube.com/embed/L2O6ecO-8PM?start=2062","https://schema.org/thumbnailUrl":"https://i.ytimg.com/vi/L2O6ecO-8PM/maxresdefault.jpg"},{"@id":"https://rubenvandeven.com/person/cristina-cochior","@type":"https://schema.org/Person","https://schema.org/name":"Cristina Cochior","https://schema.org/url":"http://randomizer.info"},{"@id":"https://rubenvandeven.com/person/donald-schenkel","@type":"https://schema.org/Person","https://schema.org/name":"Donald Schenkel","https://schema.org/url":"http://www.donaldschenkel.nl/"},{"@id":"https://rubenvandeven.com/person/joseph-huot","@type":"https://schema.org/Person","https://schema.org/name":"Joseph Huot","https://schema.org/url":"http://www.joseph-huot.com/"},{"@id":"https://rubenvandeven.com/person/merijn-van-moll","@type":"https://schema.org/Person","https://schema.org/name":"Merijn van Moll","https://schema.org/url":"https://merijnvanmoll.nl/"},{"@id":"https://rubenvandeven.com/person/mikel-folgerts","@type":"https://schema.org/Person","https://schema.org/name":"Mikel Folgerts","https://schema.org/url":"https://www.instagram.com/mikelfolgerts/"},{"@id":"https://rubenvandeven.com/person/ward-goes","@type":"https://schema.org/Person","https://schema.org/name":"Ward Goes","https://schema.org/url":"http://www.wardgoes.nl"},{"@id":"https://rubenvandeven.com/pillow-talk","@type":"https://schema.org/MediaObject","https://schema.org/about":[{"@id":"_:b89"},{"@id":"_:b90"}],"https://schema.org/contributor":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2019","https://schema.org/description":"The voice is surely an uncanny phenomenon. In the digital age it leaves us constantly in doubt, if a person or a non-person is speaking. In this immersive performance, doubt and conviction change roles in the blink of an eye. Spread out on a hilly landscape, audience engages in a conversation with something that is there and not there at the same time. An artificial voice functions as a mediator, a partner and a mirror to one's own.\n\nWhile conversations are constructed word-by-word, impressions are shared, naps are taken, and time is passed, Pillow Talk is an invitation to suspend eye-to-eye relations and to reposition yourself in direct relation to the non-human.\n\nI developed the interface for the participants, as well as a custom story flow editor for the director/writer Begüm Erciyas.","https://schema.org/image":[{"@id":"_:b91"},{"@id":"_:b92"},{"@id":"_:b93"}],"https://schema.org/name":"Pillow Talk","https://schema.org/url":"https://www.begumerciyas.com/work/pillow-talk-2019/"},{"@id":"https://rubenvandeven.com/place/in4art","@type":"https://schema.org/EventVenue","https://schema.org/address":"Amsterdam","https://schema.org/name":"In4Art Project Space"},{"@id":"https://rubenvandeven.com/place/q21","@type":"https://schema.org/Museum","https://schema.org/address":"MuseumsQuartier /Vienna","https://schema.org/name":"frei_raum / Q21"},{"@id":"https://rubenvandeven.com/plottingdata","@type":"https://schema.org/PerformingGroup","https://schema.org/description":"A research into Data Dramatisation as a tactic to make data visualisations more transparent in their underlying procedures of data collection. We advocate a form of data literacy that is not so much focussed on programming skill, but rather one that brings an understanding of data infrastructures: allowing for restistance against data driven governance.\n\nWith support of the Creative Industries Fund NL.","https://schema.org/member":[{"@id":"https://rubenvandeven.com/person/cristina-cochior"},{"@id":"https://rubenvandeven.com/"}],"https://schema.org/name":"Plotting Data: dramatisation as tactic","https://schema.org/temporalCoverage":"2018-2020","https://schema.org/url":"http://plottingd.at/a"},{"@id":"https://rubenvandeven.com/residency/q21","@type":"https://schema.org/VisualArtsEvent","https://schema.org/attendee":{"@id":"https://rubenvandeven.com/"},"https://schema.org/endDate":"2017-02","https://schema.org/location":{"@id":"https://rubenvandeven.com/place/q21"},"https://schema.org/name":"Residency: Q21","https://schema.org/startDate":"2017-01","https://schema.org/url":"https://www.mqw.at/institutionen/q21/artists-in-residence/2016/ruben-van-de-ven/"},{"@id":"https://rubenvandeven.com/residency/summer-sessions","@type":"https://schema.org/VisualArtsEvent","https://schema.org/about":{"@id":"https://rubenvandeven.com/emotionhero"},"https://schema.org/attendee":{"@id":"https://rubenvandeven.com/"},"https://schema.org/description":"I was part of the Summer Sessions Network for Talent Development in a co-production of Arquivo 237 and V2_ Lab for the Unstable Media, with support of the Creative Industries Fund NL.","https://schema.org/endDate":"2016-10","https://schema.org/name":"Residency: Summer Sessions 2016","https://schema.org/startDate":"2016-09","https://schema.org/subEvent":{"@id":"_:b21"},"https://schema.org/url":["http://summersessions.net/17-projects/projects-2016/55-emotion-hero","http://www.arquivo237.com/en/Passado/manipulation-emotion-hero-2/"]},{"@id":"https://rubenvandeven.com/samawati/video","@type":"https://schema.org/VideoObject","https://schema.org/contentUrl":"/assets/video/samawati.mp4","https://schema.org/encodingFormat":"video/mp4","https://schema.org/thumbnailUrl":"/assets/thumb/samawati.mp4.jpg","https://schema.org/videoFrameSize":"1280x1024"},{"@id":"https://rubenvandeven.com/spectacular-spectator-mood-meter","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2017","https://schema.org/description":"Commisioned by V2_ for Evening of the Black Box Concern. Researchers of digital culture often regard artificial intelligence as black boxes. However, developers of these systems often regard the humans that are analysed as black boxes.\n\nWhat happens when we use black boxes (AI) to analyse black boxes (humans) and present these back to black boxes (humans)?\n\nThis prototype used emotion recognition software by Affectiva to analyse the audience of the talks. It then highlighted the moments in the talks for which outliers in the data were found. Can we use this data to analyse either of the black boxes?","https://schema.org/image":[{"@id":"_:b6"},{"@id":"_:b7"},{"@id":"_:b8"},{"@id":"_:b9"}],"https://schema.org/name":"Spectacular Spectator Mood Meter","https://schema.org/producer":{"@id":"https://rubenvandeven.com/organisation/v2_"}},{"@id":"https://rubenvandeven.com/sustaining-gazes","@type":"https://schema.org/MediaObject","https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/dateCreated":"2018","https://schema.org/description":"In analytics and statistics, data visualisations, such as the heatmap, are used as tools bring forward patterns in data. These data visualisations, are often presented as objective tools of knowledge: data supposedly do not lie. What is often neglected however, are the subjective and political intricacies embedded within the datasets, and its method of visualisation. In collaboration with Cristina Cochior I am exploring the concept of data dramatisations, as an opposite to data visualisations. Rather than aiming for the objective, we explore the affective & performative aspects of data gathering and processing.\n\nSustaining Gazes is a data dramatisation which looks at the role between the visualisation and its subject. A heatmap is generated by looking at it, which directly influences the looking. Areas which are looked at turn into interesting shapes, inviting even more observation. The pattern of looking is reinforced though its visualisation. This cycle reveals both a hierarchy of power between algorithm and subject, as well as a point for intervention.","https://schema.org/image":[{"@id":"https://rubenvandeven.com/sustaining-gazes/image/1"},{"@id":"https://rubenvandeven.com/sustaining-gazes/image/2"}],"https://schema.org/name":"Sustaining Gazes"},{"@id":"https://rubenvandeven.com/sustaining-gazes/image/1","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/sustaining-gazes-2.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/sustaining-gazes-2.jpg"},{"@id":"https://rubenvandeven.com/sustaining-gazes/image/2","@type":"https://schema.org/ImageObject","https://schema.org/contentUrl":"/assets/image/sustaining-gazes-1.jpg","https://schema.org/thumbnailUrl":"/assets/thumb/sustaining-gazes-1.jpg"},{"@id":"https://rubenvandeven.com/university/piet-zwart","@type":"https://schema.org/CollegeOrUniversity","https://schema.org/address":"Rotterdam","https://schema.org/educationalCredentialAwarded":{"@id":"https://rubenvandeven.com/degree/media-design"},"https://schema.org/name":"Piet Zwart Institute"},{"@id":"https://rubenvandeven.com/venue/cruise-terminal","@type":"https://schema.org/EventVenue","https://schema.org/address":"Rotterdam","https://schema.org/name":"Cruise Terminal"},{"@id":"https://rubenvandeven.com/venue/tivoli","@type":"https://schema.org/EventVenue","https://schema.org/name":"Tivoli Vredeburg"},{"@id":"https://rubenvandeven.com/venue/zoho","@type":"https://schema.org/EventVenue","https://schema.org/address":"Rotterdam","https://schema.org/name":"ZOHO"},{"@id":"https://rubenvandeven.com/workshop/plotting-data-das-theatre","@type":"https://schema.org/Event","https://schema.org/alternateName":"Plotting the Enron Corpus","https://schema.org/description":"As part of the series Broadcast from Babylon.","https://schema.org/endDate":"2018-02-21","https://schema.org/name":"Workshop @ DAS Theatre","https://schema.org/organizer":{"@id":"https://rubenvandeven.com/plottingdata"},"https://schema.org/startDate":"2019-02-21","https://schema.org/url":"https://netdem.nl/en/articles/bfb-cp-5-creative-coding-and-workshop-plotting-data/"},{"@id":"https://rubenvandeven.com/workshop/plotting-data-onomatopee","@type":"https://schema.org/Event","https://schema.org/alternateName":"Plotting Data: Function Creep in the Wild","https://schema.org/description":"Datasets form a basis on which a city is made readable and interpretable foralgorithms, such as the those that process the endless streams of information coming from the cameras and sensors that stand scattered throughoutEindhoven. In this workshop, we will get acquainted with various ways in which data is collected and imagined. Who is being collected and what are the (dis)advantages of being represented? After an introduction into the types of biases that are inherent to their creation, we will combine hands-on work with pre-made scripts and discuss ways in which fiction and performance play a role in seeing like a dataset.","https://schema.org/endDate":"2018-06-12 18:30","https://schema.org/location":"Onomatopee","https://schema.org/name":"Workshop @ Onomatopee","https://schema.org/organizer":{"@id":"https://rubenvandeven.com/plottingdata"},"https://schema.org/startDate":"2019-06-12 16:00","https://schema.org/url":"https://www.onomatopee.net/exhibition/eindhoven-footnotes/#agenda_9839"},{"@id":"https://rubenvandeven.com/www","@type":"https://schema.org/WebSite","http://www.w3.org/2000/01/rdf-schema#seeAlso":["https://rubenvandeven.com/rubenvandeven.jsonld","https://git.rubenvandeven.com/r/portfolio"],"https://schema.org/author":{"@id":"https://rubenvandeven.com/"},"https://schema.org/url":"https://rubenvandeven.com"}]} \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index 9af7e80..a2617ce 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -10,6 +10,7 @@ var browserSync = require('browser-sync'); var jsonld = require('jsonld'); var source = require('vinyl-source-stream'); var buffer = require('vinyl-buffer'); +var exec = require('child_process').exec; var through = require('through2') @@ -106,21 +107,39 @@ function createHtaccessFromFlattenedJsonld(flattened) { require('fs').writeFileSync('.htaccess', contentLines.join("\n")+"\n"+Object.values(typeLines).join("\n") + "\n"); } -gulp.task('jsonld', function(){ +function createPagerankFromFlattenedJsonld(done){ + exec('ranking/venv/bin/python ranking/jsonld_ranking.py -i assets/js/rubenvandeven.jsonld -o assets/js/ranking.json', function (err, stdout, stderr) { + if(stdout) + console.log(stdout); + if(stderr) + console.error(stderr); + done(err); + }); +} + +gulp.task('flattenJsonld', function() { return gulp.src(paths.data.src) .pipe(through.obj(function (file, enc, callback) { let data = JSON.parse(file.contents.toString(enc)); var transformedFile = file.clone(); // console.log(data); jsonld.flatten(data, {}, (err, flattened)=> { + if(err) { + console.error(err); + } transformedFile.contents = Buffer.from(JSON.stringify(flattened), enc); createHtaccessFromFlattenedJsonld(flattened); callback(null, transformedFile) }); })) - .pipe(gulp.dest(paths.data.dest)); + .pipe(gulp.dest(paths.data.dest)) }); +gulp.task('jsonld', gulp.series( + 'flattenJsonld', + createPagerankFromFlattenedJsonld +)); + var watchStylesAndScripts = function() { gulp.watch(paths.styles.src, gulp.series('styles')); gulp.watch(paths.scripts.src,gulp.series('scripts', reload)); diff --git a/index.html b/index.html index 94d5e36..df09f21 100644 --- a/index.html +++ b/index.html @@ -10,7 +10,6 @@ diff --git a/ranking/jsonld_ranking.py b/ranking/jsonld_ranking.py index 9f45b9e..18a6ea6 100644 --- a/ranking/jsonld_ranking.py +++ b/ranking/jsonld_ranking.py @@ -1,10 +1,20 @@ from pyld import jsonld import json - import PageRank.pagerank as pagerank +import argparse + +parser = argparse.ArgumentParser(description='Apply pagerank to the (flattened) JSONLD file') +parser.add_argument('--jsonld', '-i', metavar='FILENAME.JSONLD', type=str, + required=True, + help='Input filename, make sure to use the flattened JSONLD (in our case from the \'assets\' folder)') +parser.add_argument('--output', '-o', type=str, + default=None, metavar='FILENAME.JSON', + help='Optional output filename for the resulting JSON') + +args = parser.parse_args() # use flattened jsonld -with open('../assets/js/rubenvandeven.jsonld', 'r') as fp: +with open(args.jsonld, 'r') as fp: contents = json.load(fp)['@graph'] linksPerItem = {} @@ -17,6 +27,7 @@ def addCount(fromId, toId, weight): linksPerItem[fromId][toId] += weight def addLink(fromId, toId, weight = 1): + # Add link both ways: from + to. addCount(fromId, toId, weight) addCount(toId, fromId, weight) @@ -49,7 +60,13 @@ targetMax = 1.5 values = pagerank.powerIteration(linksPerItem) normalised = targetMin + (values - min(values)) * (targetMax-targetMin)/max(values) -print(json.dumps(dict(normalised))) + +if args.output is None: + print(json.dumps(dict(normalised))) +else: + with open(args.output, 'w') as fp: + json.dump(dict(normalised), fp) + # # factor = 1 / min(values) # print(factor) diff --git a/rubenvandeven.jsonld b/rubenvandeven.jsonld index c13ca48..f531084 100644 --- a/rubenvandeven.jsonld +++ b/rubenvandeven.jsonld @@ -5,1461 +5,1525 @@ "r": "https://rubenvandeven.com" }, "@type": "WebSite", - "@id": "r:/www", - "url": "https://rubenvandeven.com", - "s:seeAlso": [ "https://rubenvandeven.com/rubenvandeven.jsonld", "https://git.rubenvandeven.com/r/portfolio"], - "author": - { - "@id": "r:/", - "@type": "Person", - "name": "Ruben van de Ven", - "jobTitle": "digital artist / researcher of software culture", - "email": "info@rubenvandeven.com", - "nationality": "The Netherlands", - "@reverse": { + "@id": "r:/www", + "url": "https://rubenvandeven.com", + "s:seeAlso": [ + "https://rubenvandeven.com/rubenvandeven.jsonld", + "https://git.rubenvandeven.com/r/portfolio" + ], + "author": { + "@id": "r:/", + "@type": "Person", + "name": "Ruben van de Ven", + "jobTitle": "digital artist / researcher of software culture", + "email": "info@rubenvandeven.com", + "nationality": "The Netherlands", + "@reverse": { + "member": [ + { + "@id": "r:/plottingdata", + "@type": "PerformingGroup", + "name": "Plotting Data: dramatisation as tactic", + "url": "http://plottingd.at/a", + "temporalCoverage": "2018-2020", + "description": "A research into Data Dramatisation as a tactic to make data visualisations more transparent in their underlying procedures of data collection. We advocate a form of data literacy that is not so much focussed on programming skill, but rather one that brings an understanding of data infrastructures: allowing for restistance against data driven governance.\n\nWith support of the Creative Industries Fund NL.", "member": [ { - "@id": "r:/plottingdata", - "@type": "PerformingGroup", - "name": "Plotting Data: dramatisation as tactic", - "url": "http://plottingd.at/a", - "foundingDate": "2018", - "description": "A research into Data Dramatisation as a tactic to make data visualisations more transparent in their underlying procedures of data collection. We advocate a form of data literacy that is not so much focussed on programming skill, but rather one that brings an understanding of data infrastructures: allowing for restistance against data driven governance.", - "member": [ - {"@id": "r:/person/cristina-cochior"} - ], - "@reverse": { - "about": [ - { - "@id": "r:/2018/digital-cultures", - "@type": "Event", - "name": "Digital Cultures: Knowledge / Culture / Technology", - "url": "https://digitalculturesconference.org/", - "startDate": "2018-09-19", - "endDate": "2018-09-22", - "organizer": "Centre for Digital Cultures & Institute for Culture and Society", - "description": "As Plotting Data, we gave a presentation at the Digital Cultures Conference", - "location": "Leuphana University, Lüneburg" - }, - { - "@type": "EducationEvent", - "name": "Workshop: Urban Frictions", - "alternateName": "Critical Making of Frictional Urban Interfaces", - "url": "https://urbaninterfaces.sites.uu.nl", - "startDate": "2018-03-06", - "endDate": "2018-03-06", - "organizer": "Urban Interfaces, Utrecht University", - "location": "Utrecht" + "@id": "r:/person/cristina-cochior" + } + ], + "@reverse": { + "about": [ + { + "@id": "r:/2020/acts-of-collection-and-omission", + "@type": "Event", + "name": "Acts of Collection and Omission", + "url": "https://digitalculturesconference.org/", + "startDate": "2020-03-11 19:30", + "endDate": "2020-03-11 22:00", + "organizer": "Centre for Digital Cultures & Institute for Culture and Society", + "description": "The event will host three rounds of conversations that will introduce various datasets and artistic ways of interfacing them.\n\nAlgorithmic models learn to distinguish patterns and make predictions by attempting to imitate existing structures in vast collections of data. In the process of creating these datasets, conflict and ambiguity are omitted in favour of turning the world into its computable double. How do we bring forth narratives that make other interpretations possible?\n\nPlotting Data was a series of workshops held by Cristina Cochior & Ruben van de Ven in 2019, which explored the biases and tensions within datasets that underlie systems for automated decision making. Discussions, presentations and performances fed into the creation of digital interfaces that emphasise the inherently performative characteristics of datasets.\n\nThis final event marks the end of this project and the release of the Acts of Collection and Omission digital publication. Two tables will be hosted by invited artists Julie Boschat Thorez & Sami Hammana and Nicolas Malevé, while the third table will give an overview of the publication.", + "location": "Framer Framed & Netwerk Democratie, Amsterdam" + }, + { + "@id": "r:/2018/digital-cultures", + "@type": "Event", + "name": "Digital Cultures: Knowledge / Culture / Technology", + "url": "https://digitalculturesconference.org/", + "startDate": "2018-09-19", + "endDate": "2018-09-22", + "organizer": "Centre for Digital Cultures & Institute for Culture and Society", + "description": "As Plotting Data, we gave a presentation at the Digital Cultures Conference", + "location": "Leuphana University, Lüneburg" + }, + { + "@type": "EducationEvent", + "name": "Workshop: Urban Frictions", + "alternateName": "Critical Making of Frictional Urban Interfaces", + "url": "https://urbaninterfaces.sites.uu.nl", + "startDate": "2018-03-06", + "endDate": "2018-03-06", + "organizer": "Urban Interfaces, Utrecht University", + "location": "Utrecht" + } + ], + "organizer": [ + { + "@id": "r:/2018/data-flaneur", + "@type": "Event", + "name": "Data Flâneur", + "alternateName": "Data Flâneur - seeing and being seen in the data driven city", + "startDate": "2018-11-04", + "endDate": "2018-11-04", + "url": "https://creativecodingutrecht.nl/2018/10/20/the-data-flaneur-seen-and-being-seen-in-the-data-driven-city-tour/", + "description": "Inspired by Alison Powell’s ‘data walk’, the Flaneur twists her concept by not only making participants aware of data collection within the city, but also by making them experiment with data collection for their own purposes. By zooming in on the procedures of selection, classification and digitisation, participants experience the intricacies of data collection.", + "superEvent": { + "@id": "r:/exhibition/hello-world", + "@type": "ExhibitionEvent", + "name": "Hello World!", + "startDate": "2018-11-02", + "endDate": "2018-11-04", + "organizer": { + "@id": "r:/organisation/ccu", + "@type": "Organization", + "name": "Creative Coding Utrecht" + }, + "url": "https://www.creativecodingutrecht.nl/2018/10/30/hello-world-full-program-online/" } - ], + }, + { + "@id": "r:/workshop/plotting-data-das-theatre", + "@type": "Event", + "name": "Workshop @ DAS Theatre", + "alternateName": "Plotting the Enron Corpus", + "startDate": "2019-02-21", + "endDate": "2018-02-21", + "url": "https://netdem.nl/en/articles/bfb-cp-5-creative-coding-and-workshop-plotting-data/", + "description": "As part of the series Broadcast from Babylon." + }, + { + "@id": "r:/workshop/plotting-data-onomatopee", + "@type": "Event", + "name": "Workshop @ Onomatopee", + "alternateName": "Plotting Data: Function Creep in the Wild", + "startDate": "2019-06-12 16:00", + "endDate": "2018-06-12 18:30", + "url": "https://www.onomatopee.net/exhibition/eindhoven-footnotes/#agenda_9839", + "location": "Onomatopee", + "description": "Datasets form a basis on which a city is made readable and interpretable foralgorithms, such as the those that process the endless streams of information coming from the cameras and sensors that stand scattered throughoutEindhoven. In this workshop, we will get acquainted with various ways in which data is collected and imagined. Who is being collected and what are the (dis)advantages of being represented? After an introduction into the types of biases that are inherent to their creation, we will combine hands-on work with pre-made scripts and discuss ways in which fiction and performance play a role in seeing like a dataset." + } + ] + } + } + ], + "organiser": [ + { + "@type": "EducationEvent", + "name": "Workshop - API: Artistic Point Of Interferance", + "alternateName": "API-art & situated fictions", + "location": "AKV St. Joost, Breda", + "description": "A presentation & workshop about working with APIs as an artist. In collaboration with Manetta Berends & Max Dovey", + "url": "https://caradt.com/2017/03/07/ekv-13-march-lecture-by-human-index/", + "startDate": "2017-03-13", + "endDate": "2017-03-14", + "organiser": [ + { + "@type": "Person", + "name": "Max Dovey", + "url": "https://maxdovey.hashbase.io/" + }, + { + "@type": "Person", + "name": "Manetta Berends", + "url": "http://manettaberends.nl/" + } + ] + } + ], + "author": [ + { + "@id": "r:/guest-worker", + "@type": "MediaObject", + "name": "Guest Worker", + "dateCreated": "2019", + "description": "Nowadays, we are not only increasingly delegating and automating tasks and processes, there also new forms of work that are being created for people. With the emergence of services such as Amazon's Mechanical Turk, specific parts of automatic processes are being outsourced to human workers. These Human Intelligence Tasks are tasks that a machine cannot execute, for example retyping a scanned receipt or entering a Captcha code. In this way machines selectively delegate tasks to humans, creating a human working class that remains largely invisible.Merijn van Moll and Ruben van de Ven want to make this feedback loop between man and machine visible. This creates a new ritual in which the spirit of the worker is invoked again and again.\n\nThis project was developed in light of Future scenarios for AI and the job market by Setup and the NSvP (Dutch Foundation for Psycho technology)", + "image": [ + { + "@id": "r:/guest-worker/image/1", + "@type": "ImageObject", + "contentUrl": "/assets/image/guest_worker01.jpg", + "thumbnailUrl": "/assets/thumb/guest_worker01.jpg" + }, + { + "@id": "r:/guest-worker/image/2", + "@type": "ImageObject", + "contentUrl": "/assets/image/guest_worker02.jpg", + "thumbnailUrl": "/assets/thumb/guest_worker02.jpg" + }, + { + "@id": "r:/guest-worker/image/3", + "@type": "ImageObject", + "contentUrl": "/assets/image/guest_worker03.jpg", + "thumbnailUrl": "/assets/thumb/guest_worker03.jpg" + } + ], + "video": [ + { + "@id": "r:/guest-worker/video/outcome", + "@type": "VideoObject", + "thumbnailUrl": "/assets/thumb/guest_worker04.jpg", + "contentUrl": "http://works.rubenvandeven.com/2019-guest_worker/guestworker-without-credits.mp4", + "encodingFormat": "video/mp4", + "videoFrameSize": "1920x1080" + }, + { + "@id": "r:/guest-worker/video/process", + "@type": "VideoObject", + "thumbnailUrl": "/assets/thumb/guest_worker05.jpg", + "contentUrl": "http://works.rubenvandeven.com/2019-guest_worker/GuestWorker.mp4", + "encodingFormat": "video/mp4", + "videoFrameSize": "1920x1080" + } + ], + "author": { + "@id": "r:/person/merijn-van-moll", + "@type": "Person", + "name": "Merijn van Moll", + "url": "https://merijnvanmoll.nl/" + }, + "@reverse": { + "workFeatured": [ + { + "@type": "ExhibitionEvent", + "name": "Beyond Human", + "url": "https://www.beyondhuman.nl/event/setup/", "organizer": [ { - "@id": "r:/2018/data-flaneur", - "@type": "Event", - "name": "Data Flâneur", - "alternateName": "Data Flâneur - seeing and being seen in the data driven city", - "startDate": "2018-11-04", - "endDate": "2018-11-04", - "url":"https://creativecodingutrecht.nl/2018/10/20/the-data-flaneur-seen-and-being-seen-in-the-data-driven-city-tour/", - "description": "Inspired by Alison Powell’s ‘data walk’, the Flaneur twists her concept by not only making participants aware of data collection within the city, but also by making them experiment with data collection for their own purposes. By zooming in on the procedures of selection, classification and digitisation, participants experience the intricacies of data collection.", - "superEvent": { - "@id": "r:/exhibition/hello-world", - "@type": "ExhibitionEvent", - "name": "Hello World!", - "startDate": "2018-11-02", - "endDate": "2018-11-04", - "organizer": { - "@id": "r:/organisation/ccu", - "@type": "Organization", - "name": "Creative Coding Utrecht" - }, - "url": "https://www.creativecodingutrecht.nl/2018/10/30/hello-world-full-program-online/" - } - }, + "@id": "r:/organisation/setup" + }, { - "@id": "r:/workshop/plotting-data-das-theatre", - "@type": "Event", - "name": "Workshop @ DAS Theatre", - "alternateName": "Plotting the Enron Corpus", - "startDate": "2019-02-21", - "endDate": "2018-02-21", - "url":"https://netdem.nl/en/articles/bfb-cp-5-creative-coding-and-workshop-plotting-data/", - "description": "As part of the series Broadcast from Babylon." - }, - { - "@id": "r:/workshop/plotting-data-onomatopee", - "@type": "Event", - "name": "Workshop @ Onomatopee", - "alternateName": "Plotting Data: Function Creep in the Wild", - "startDate": "2019-06-12 16:00", - "endDate": "2018-06-12 18:30", - "url":"https://www.onomatopee.net/exhibition/eindhoven-footnotes/#agenda_9839", - "location": "Onomatopee", - "description": "Datasets form a basis on which a city is made readable and interpretable foralgorithms, such as the those that process the endless streams of information coming from the cameras and sensors that stand scattered throughoutEindhoven. In this workshop, we will get acquainted with various ways in which data is collected and imagined. Who is being collected and what are the (dis)advantages of being represented? After an introduction into the types of biases that are inherent to their creation, we will combine hands-on work with pre-made scripts and discuss ways in which fiction and performance play a role in seeing like a dataset." - } - ] - } - } - ], - "attendee": [ - { - "@id": "r:/residency/summer-sessions", - "@type": "VisualArtsEvent", - "name": "Residency: Summer Sessions 2016", - "url": [ - "http://summersessions.net/17-projects/projects-2016/55-emotion-hero", - "http://www.arquivo237.com/en/Passado/manipulation-emotion-hero-2/" - ], - "description": "I was part of the Summer Sessions Network for Talent Development in a co-production of Arquivo 237 and V2_ Lab for the Unstable Media, with support of the Creative Industries Fund NL.", - "startDate": "2016-09", - "endDate": "2016-10", - "about": { - "@id": "r:/emotionhero" - } - }, - { - "@id": "r:/residency/q21", - "@type": "VisualArtsEvent", - "name": "Residency: Q21", - "startDate": "2017-01", - "endDate": "2017-02", - "url": "https://www.mqw.at/institutionen/q21/artists-in-residence/2016/ruben-van-de-ven/", - "@reverse": { - "subEvent": { - "@id": "r:/exhibition/mood_swings" - } - }, - "location": { - "@id": "r:/place/q21" - } - }, - { - "@id": "r:/event/cqrrelations", - "@type": "Event", - "name": "Cqrrelations Worksession", - "url": "http://cqrrelations.constantvzw.org/", - "startDate": "2015-01-18", - "endDate": "2015-01-23", - "organizer": { - "@id": "r:/organisation/constant", - "url": "http://constantvzw.org", - "@type": "Organization", - "name": "Constant" - } - } - ], - "organiser": [ - { - "@type":"EducationEvent", - "name": "Workshop - API: Artistic Point Of Interferance", - "alternateName": "API-art & situated fictions", - "location": "AKV St. Joost, Breda", - "description": "A presentation & workshop about working with APIs as an artist. In collaboration with Manetta Berends & Max Dovey", - "url":"https://caradt.com/2017/03/07/ekv-13-march-lecture-by-human-index/", - "startDate": "2017-03-13", - "endDate": "2017-03-14", - "organiser": [ - { - "@type": "Person", - "name": "Max Dovey", - "url": "https://maxdovey.hashbase.io/" - }, - { - "@type": "Person", - "name": "Manetta Berends", - "url": "http://manettaberends.nl/" - } - ] - } - ], - "author": [ - { - "@id": "r:/guest-worker", - "@type": "MediaObject", - "name": "Guest Worker", - "dateCreated": "2019", - "description": "Nowadays, we are not only increasingly delegating and automating tasks and processes, there also new forms of work that are being created for people. With the emergence of services such as Amazon's Mechanical Turk, specific parts of automatic processes are being outsourced to human workers. These Human Intelligence Tasks are tasks that a machine cannot execute, for example retyping a scanned receipt or entering a Captcha code. In this way machines selectively delegate tasks to humans, creating a human working class that remains largely invisible.Merijn van Moll and Ruben van de Ven want to make this feedback loop between man and machine visible. This creates a new ritual in which the spirit of the worker is invoked again and again.\n\nThis project was developed in light of Future scenarios for AI and the job market by Setup and the NSvP (Dutch Foundation for Psycho technology)", - "image": [ - { - "@id": "r:/guest-worker/image/1", - "@type": "ImageObject", - "contentUrl": "/assets\/image\/guest_worker01.jpg", - "thumbnailUrl": "/assets\/thumb\/guest_worker01.jpg" - }, - { - "@id": "r:/guest-worker/image/2", - "@type": "ImageObject", - "contentUrl": "/assets\/image\/guest_worker02.jpg", - "thumbnailUrl": "/assets\/thumb\/guest_worker02.jpg" - }, - { - "@id": "r:/guest-worker/image/3", - "@type": "ImageObject", - "contentUrl": "/assets\/image\/guest_worker03.jpg", - "thumbnailUrl": "/assets\/thumb\/guest_worker03.jpg" - } - ], - "video": [ - { - "@id": "r:/guest-worker/video/outcome", - "@type": "VideoObject", - "thumbnailUrl": "/assets\/thumb\/guest_worker04.jpg", - "contentUrl": "http://works.rubenvandeven.com/2019-guest_worker/guestworker-without-credits.mp4" , - "encodingFormat": "video/mp4", - "videoFrameSize": "1920x1080" - }, - { - "@id": "r:/guest-worker/video/process", - "@type": "VideoObject", - "thumbnailUrl": "/assets\/thumb\/guest_worker05.jpg", - "contentUrl": "http://works.rubenvandeven.com/2019-guest_worker/GuestWorker.mp4" , - "encodingFormat": "video/mp4", - "videoFrameSize": "1920x1080" - } - ], - "author": { - "@id": "r:/person/merijn-van-moll", - "@type": "Person", - "name": "Merijn van Moll", - "url": "https://merijnvanmoll.nl/" - }, - "@reverse": { - "workFeatured": [ - { - "@type": "ExhibitionEvent", - "name": "Beyond Human", - "url": "https://www.beyondhuman.nl/event/setup/", - "organizer": [ - {"@id": "r:/organisation/setup"}, - { - "@id": "r:/organisation/nsvp", - "@type": "Organization", - "name": "Nederlandse Stichting voor Psychotechniek", - "url": "https://www.innovatiefinwerk.nl/" - } - ], - "location": "Naturalis, Leiden", - "description": "SETUP x NSVP: future scenarios for AI and the job market\nAlgorithms that assess application letters. Voice assistants who take over the job interview. Predicting the perfect candidate for a vacancy. The possibilities of AI for recruitment and selection of employees seem endless. What does the future of this development look like? And how does AI facilitate - or frustrate - diversity in the labor market? Eight selected makers worked on this theme in four teams. From programmer to writer of historical novels, and from costume designer to cultural anthropologist.\nWith installations, performances and other works they make the social consequences of AI in the HR sector tangible. Because reading about it is one thing, but the consequences can only be felt if you yourself undergo an algorithmic interview. Would you still be hired for your own job if you had to apply with these systems?", - "startDate": "2019-11-04", - "endDate": "2019-11-06", - "workFeatured": [] - }, - { - "@type": "ExhibitionEvent", - "name": "re:connect | Digital Art Expo", - "location": "Janskerk, Utrecht", - "startDate": "2019-11-16", - "endDate": "2019-11-16", - "url": "https://www.setup.nl/reconnect", - "organizer": { - "@id": "r:/organisation/setup", - "@type": "Organization", - "name": "Setup", - "address": "Utrecht", - "url":"https://www.setup.nl/" - }, - "workFeatured": [] - }, - { - "@type": "ExhibitionEvent", - "name": "ECP Conference", - "location": { - "@type": "EventVenue", - "name": "Fokker Terminal" - }, - "startDate": "2019-11-13", - "endDate": "2019-11-13", - "url": "https://ecp.nl/jaarcongres/kunst-expo-2019/", - "workFeatured": [] - }, - { - "@type": "ExhibitionEvent", - "name": "Privacyrede 2020: the internet is broken", - "description": "(NL) Het internet is stuk. Hoe kunnen we het weer repareren? Daarover vertelt Marleen Stikker, auteur van Het internet is stuk, op 23 januari tijdens de Privacyrede 2020. Met de 50e verjaardag van het internet is dit hét moment om terug te blikken en vooruit te kijken.", - "location": { - "@id": "r:/venue/tivoli", - "@type": "EventVenue", - "name": "Tivoli Vredeburg" - }, - "startDate": "2020-01-23", - "endDate": "2020-01-23", - "url": "https://www.tivolivredenburg.nl/agenda/privacyrede-2019-16-01-2019/", - "workFeatured": [] - }, - { - "@id": "r:/event/2019/ccu-presentation", - "@type": "Event", - "name": "Presentation @ Creative Coding Utrecht", - "startDate": "2019-10-31", - "organizer": {"@id": "r:/organisation/ccu"}, - "location": "Nijverheidsloods, Utrecht" - } - ], - "about": { - "@id": "r:/guest-worker/report", - "@type": "Report", - "name": "Guest Worker Research Report", - "description": "A brief report written in light of Guest Worker (2019). In Dutch.", - "url": "http://guest_worker.rubenvandeven.com/", - "datePublished": "2019-11-26" - } - } - }, - { - "@id": "r:/exercises-in-overfitting", - "@type": "MediaObject", - "name": "Exercises in overfitting", - "dateCreated": "2019", - "description": "I taught a computer how to write the name of my son. The progression of this machine learning processes is materialised with a pen plotter.", - "s:seeAlso": [ "https://gitlab.com/rubenvandeven/diede"], - "image": [ - { - "@id": "r:/exercises-in-overfitting/image/2", - "@type": "ImageObject", - "contentUrl": "/assets\/image\/exercises-in-overfitting2.jpg", - "thumbnailUrl": "/assets\/thumb\/exercises-in-overfitting2.jpg" - }, - { - "@id": "r:/exercises-in-overfitting/image/1", - "@type": "ImageObject", - "contentUrl": "/assets\/image\/exercises-in-overfitting1.jpg", - "thumbnailUrl": "/assets\/thumb\/exercises-in-overfitting1.jpg" - } - ], - "@reverse": { - "workFeatured": {"@id": "r:/event/2019/ccu-presentation"} + "@id": "r:/organisation/nsvp", + "@type": "Organization", + "name": "Nederlandse Stichting voor Psychotechniek", + "url": "https://www.innovatiefinwerk.nl/" } - }, - { - "@id": "r:/heartbeat", - "@type": "MediaObject", - "name": "Data double black market", - "dateCreated": "2018", - "description": "Why buy live access to heartbeats?
  • Insurance companies give you discounts for monitoring a healthy lifestyle.
  • Because you can re-sell it to data hoarding companies.
  • To chill out with the soothing sound on your headphones.
  • Use it as input data for your amazing new media art installation.
  • Because it's cheap!
", - "image": [ - { - "@id": "r:/heartbeat/image/1", - "@type": "ImageObject", - "contentUrl": "/assets\/image\/data-double-black-market.jpg", - "thumbnailUrl": "/assets\/thumb\/data-double-black-market.jpg" - } - ], - "@reverse": { - "workFeatured": { - "@id": "r:/event/2018/yama-ichi", - "@type": "ExhibitionEvent", - "name": "Yama Ichi Black Market", - "location": {"@id":"r:/venue/tivoli"} - } - } - }, - { - "@id": "r:/sustaining-gazes", - "@type": "MediaObject", - "name": "Sustaining Gazes", - "dateCreated": "2018", - "description": "In analytics and statistics, data visualisations, such as the heatmap, are used as tools bring forward patterns in data. These data visualisations, are often presented as objective tools of knowledge: data supposedly do not lie. What is often neglected however, are the subjective and political intricacies embedded within the datasets, and its method of visualisation. In collaboration with Cristina Cochior I am exploring the concept of data dramatisations, as an opposite to data visualisations. Rather than aiming for the objective, we explore the affective & performative aspects of data gathering and processing.\n\nSustaining Gazes is a data dramatisation which looks at the role between the visualisation and its subject. A heatmap is generated by looking at it, which directly influences the looking. Areas which are looked at turn into interesting shapes, inviting even more observation. The pattern of looking is reinforced though its visualisation. This cycle reveals both a hierarchy of power between algorithm and subject, as well as a point for intervention.", - "@reverse": { - "workFeatured": [ - { - "@id": "r:/exhibition/route-du-nord", - "@type": "ExhibitionEvent", - "name": "Route du Nord", - "url": "http://routedunord.nl/portfolio-item/ruben-van-de-ven-2/", - "location": { - "@id": "r:/venue/zoho", - "@type": "EventVenue", - "name": "ZOHO", - "address": "Rotterdam" - }, - "startDate": "2018-05", - "endDate": "2018-05", - "workFeatured": [] - }, - { - "@id": "r:/exhibition/the-new-current", - "@type": "ExhibitionEvent", - "name": "The New Current", - "url": "https://www.thenewcurrent.org/artists-artweek", - "location": { - "@id": "r:/venue/cruise-terminal", - "@type": "EventVenue", - "name": "Cruise Terminal", - "address": "Rotterdam" - }, - "startDate": "2019-02-06", - "endDate": "2019-02-10", - "workFeatured": [] - } - ] - }, - "image": [ - { - "@id": "r:/sustaining-gazes/image/1", - "@type": "ImageObject", - "contentUrl": "/assets\/image\/sustaining-gazes-2.jpg", - "thumbnailUrl": "/assets\/thumb\/sustaining-gazes-2.jpg" - }, - { - "@id": "r:/sustaining-gazes/image/2", - "@type": "ImageObject", - "contentUrl": "/assets\/image\/sustaining-gazes-1.jpg", - "thumbnailUrl": "/assets\/thumb\/sustaining-gazes-1.jpg" - } - ] - }, - { - "@id": "r:/mvps", - "@type": "CreativeWorkSeries", - "name": "MVPs", - "about": "November 2017 In4Art approached me to be part of their KickstART project. They commissioned three works to be part of their auction. The goal was to explicitly develop works that fitted the commercial art scene.\n\nRather than creating 'sellable' works myself, I took the start-up culture that forms the foundation of In4Art, as my object of my series. I augmented the works of three other participants with business models taken from the online/digital realm. This resulted in three Minimum Viable Products. Recontextualising these business models towards an arts context, results in new perspectives on both the arts as well as start-up culture.", - "dateCreated":"2018", - "hasPart": [ - { - "@id": "r:/mvp1", - "@type": "MediaObject", - "name": "MVP#1 Gathering viewing statistics for Donald Schenkel", - "dateCreated": "2018", - "description": "The work of Donald Schenkel is augmented with a camera which keeps track of how long people look at the work. Like an electricity meter, the value increases the more the work is used. This data is then sent to a server, and provides the artist —in this case Donald Schenkel— with live statistics. But who owns this data generated by the work? The buyer, the artist, or the mediator — which is me?\n\nThis is the first augmentation that is part of the MVP series created for KickstART.", - "width": "45cm + 15cm", - "height": "55cm + 8cm", - "artworkSurface": "Oilpaint on wood + WiFi-connected RaspberryPi in ABS enclosure", - "contributor": { - "@id": "r:/person/donald-schenkel", - "@type": "Person", - "name": "Donald Schenkel", - "url": "http://www.donaldschenkel.nl/" - }, - "@reverse": { - "workFeatured": [ - { - "@id": "r:/exhibition/kickstart", - "@type": "ExhibitionEvent", - "name": "KickstART II", - "url": "http://www.in4art.eu/kickstart/launching-kickstart-ii/", - "location": { - "@id": "r:/place/in4art", - "@type": "EventVenue", - "name": "In4Art Project Space", - "address": "Amsterdam" - }, - "startDate": "2018-03-28", - "endDate": "2018-03-28" - }, - { - "@id": "r:/in4art-salon", - "@type": "ExhibitionEvent", - "name": "Salon VI - Innovatism", - "url": "http://www.in4art.eu/salon/salon-vi-innovatism/", - "location": { - "@id": "r:/place/in4art" - }, - "startDate": "2018-05-18", - "endDate": "2018-05-27" - } - ] - }, - "image": [ - { - "@id": "r:/mvp1/image/1", - "@type": "ImageObject", - "contentUrl": "/assets\/image\/mvp1-1.jpg", - "thumbnailUrl": "/assets\/thumb\/mvp1-1.jpg" - }, - { - "@id": "r:/mvp1/image/2", - "@type": "ImageObject", - "contentUrl": "/assets\/image\/mvp1-2.jpg", - "thumbnailUrl": "/assets\/thumb\/mvp1-2.jpg" - }, - { - "@id": "r:/mvp1/image/3", - "@type": "ImageObject", - "contentUrl": "/assets\/image\/mvp1-4.jpg", - "thumbnailUrl": "/assets\/thumb\/mvp1-4.jpg" - } - ] - }, - { - "@id": "r:/mvp2", - "@type": "MediaObject", - "name": "MVP#2 Joseph Huot's Limited Edition", - "dateCreated": "2018", - "description": "In September 2017, huricane Irma was racing towards Florida. Everybody tried to get away from there as quick as possible. Stuck were those with the electric Tesla Model S with the cheaper battery option (60kWh). Then, all of a sudden, Tesla send a software update to these cars. The cars could drive futher then ever before. Until 72 hours later, Tesla reversed the software update. Exactly the same car could drive shorter distances.\n\nThis is the business of software companies: just like Apple limits performance on old iPhones, Tesla used softare to limit the reach of its cars in order to make more money. While physically the exact same product, it can do less.\n\nMinimum Viable Product #2 brings this business model to the art world. It provides a limited edition of a drawing by Joseph Huot.", - "width":"32.5cm", - "height":"50cm", - "artworkSurface": "Pencil drawing in metal LCD enclosure", - "contributor": { - "@id": "r:/person/joseph-huot", - "@type": "Person", - "name": "Joseph Huot", - "url": "http://www.joseph-huot.com/" - }, - "@reverse": { - "workFeatured": - { - "@id": "r:/exhibition/kickstart" - } - }, - "image": [ - { - "@id": "r:/mvp2/image/1", - "@type": "ImageObject", - "contentUrl": "/assets\/image\/mvp2-01.jpg", - "thumbnailUrl": "/assets\/thumb\/mvp2-01.jpg" - }, - { - "@id": "r:/mvp2/image/2", - "@type": "ImageObject", - "contentUrl": "/assets\/image\/mvp2-02.jpg", - "thumbnailUrl": "/assets\/thumb\/mvp2-02.jpg" - }, - { - "@id": "r:/mvp2/image/3", - "@type": "ImageObject", - "contentUrl": "/assets\/image\/mvp2-5.jpg", - "thumbnailUrl": "/assets\/thumb\/mvp2-5.jpg" - } - ] - }, - { - "@id": "r:/mvp3", - "@type": "MediaObject", - "name": "MVP#3 Customiseyour.art - Mikel Folgerts 1/3", - "dateCreated": "2018", - "description": "On YouTube, Instagram, and many other online platforms, celebrities get paid to place consumer products in their videos. Not prominently, but hidden in plain sight. Can precarious artists finance their work by employing this product placement?\n\nMinimum Viable Product #3 allows buyers to customise the work they bought —Rotterdam, by Mikel Folgerts—, linking the status of the artist to their product.", - "width":"40cm", - "height":"40cm", - "artworkSurface": "Personalised print on perspex", - "contributor": { - "@id": "r:/person/mikel-folgerts", - "@type": "Person", - "name": "Mikel Folgerts", - "url": "https://www.instagram.com/mikelfolgerts/" - }, - "@reverse": { - "workFeatured": - { - "@id": "r:/exhibition/kickstart" - } - }, - "image": [ - { - "@id": "r:/mvp3/image/1", - "@type": "ImageObject", - "contentUrl": "/assets\/image\/mvp3-1.jpg", - "thumbnailUrl": "/assets\/thumb\/mvp3-1.jpg" - } - ] - } - ] - }, - { - "@id": "r:/spectacular-spectator-mood-meter", - "@type": "MediaObject", - "name": "Spectacular Spectator Mood Meter", - "dateCreated": "2017", - "description": "Commisioned by V2_ for Evening of the Black Box Concern. Researchers of digital culture often regard artificial intelligence as black boxes. However, developers of these systems often regard the humans that are analysed as black boxes.\n\nWhat happens when we use black boxes (AI) to analyse black boxes (humans) and present these back to black boxes (humans)?\n\nThis prototype used emotion recognition software by Affectiva to analyse the audience of the talks. It then highlighted the moments in the talks for which outliers in the data were found. Can we use this data to analyse either of the black boxes?", - "producer": { - "@id": "r:/organisation/v2_" - }, - "@reverse": { - "workFeatured": [ - { - "@type": "ExhibitionEvent", - "name": "Evening of the Black Box Concerns", - "url": "http://v2.nl/events/evening-of-the-black-box-concerns", - "location": { - "@id": "r:/organisation/v2_" - }, - "startDate": "2017-12-7", - "workFeatured": [] - } - ] - }, - "image": [ - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/moodmeter1-1.jpg", - "thumbnailUrl": "/assets\/thumb\/moodmeter1-1.jpg" - }, - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/moodmeter2.jpg", - "thumbnailUrl": "/assets\/thumb\/moodmeter2.jpg" - }, - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/moodmeter3.jpg", - "thumbnailUrl": "/assets\/thumb\/moodmeter3.jpg" - }, - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/moodmeter4.jpg", - "thumbnailUrl": "/assets\/thumb\/moodmeter4.jpg" - } - ] - }, - { - "@id": "r:/emotionhero", - "@type": "MediaObject", - "dateCreated": "2016", - "name": "Emotion Hero", - "description": "Emotion recognition software is being used both as a tool for \u2018objective\u2019 measurements as well as a tool for training one\u2019s facial expressions, eg. for job interviews. Emotion Hero is a literal translation of the paradoxical relation between these applications of the technology.\n\nEmotion Hero is a two-part artwork. On the one hand is a video-game that is freely downloadable for everybody with an Android device (see Google Play<\/a>). Inspired by Guitar Hero, the user scores points by following given cues. It provides detailed feedback on the mechanics of the face (eg. \u201cYou showed on 10% Joy when you had to show 100%, smile 99.32% more.\u201d), revealing that rather than being a window into the brain, the face is a controllable surface.\n\nThe second part is a projection that shows the aggregated scores of the game. In order to substantiate their discourse, companies in facial expression measurement employ a huge amount of data collection and processing. The results are displayed in a fixed grid, recalling historical practices that, trough extensive measurement and administration, also aimed to delineate something which is conceptually undelineated: think of Duchenne de Boulogne, Lombroso, and Charcot.\n\nEmotion Hero is a playful invitation to open up the box of expression analysis to reveal the assumptions that underlie this technology.\nThe game's emotional intelligence is powered by Affectiva (I was also interviewed<\/a> by them).", - "url": "https://emotionhero.com", - "@reverse": { - "workFeatured": [ - { - "@type": "ExhibitionEvent", - "name": "ECP Conference", - "location": { - "@type": "EventVenue", - "name": "Fokker Terminal" - }, - "url":"https://ecp.nl/jaarcongres/kunst-expo-2018/", - "startDate": "2018-11-15", - "endDate": "2018-11-15", - "workFeatured": [] - }, - { - "@type": "ExhibitionEvent", - "name": "Free Panorama - Shenzen MAF", - "url": "http://shenzhenmaf.cn/Portal/en-US/Exhibition/Detail/10f64524-be11-1985-bbfa-7dd7d27868de", - "location": "Pingshan Cultural Center Exhibition Gallery, Shenzen", - "startDate": "2019-04-20", - "endDate": "2019-05", - "workFeatured": [], - "image": [ - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/eh-shenzen.jpg", - "thumbnailUrl": "/assets\/thumb\/eh-shenzen.jpg" - } - ] - }, - { - "@id": "r:/exhibition/mood_swings", - "@type": "ExhibitionEvent", - "name": "Mood Swings", - "url": "https://www.mqw.at/en/institutions/q21/frei-raum-q21-exhibition-space/2017/03/mood-swings-on-mood-politics-sentiment-data-market-sentiments-and-other-sentiment-agencies/", - "location": { - "@id": "r:/place/q21", - "@type": "Museum", - "name": "frei_raum / Q21", - "address": "MuseumsQuartier /Vienna" - }, - "startDate": "2017-03-28", - "endDate": "2017-05-28", - "workFeatured": [] - }, - { - "@type": "ExhibitionEvent", - "name": "Open Codes", - "url": "https://open-codes.zkm.de/", - "location": { - "@type": "Museum", - "name": "ZKM", - "address": "Karlsrue" - }, - "startDate": "2017-10-20", - "endDate": "2018-08-05", - "workFeatured": [] - }, - { - "@type": "ExhibitionEvent", - "name": "Plan D", - "url": ["http://2017.pland.hr/", - "http://2017.pland.hr/vijesti/dodijeljena-nagrada-i-pocasne-diplome-festivala-plan-d/"], - "location": "Zagreb", - "startDate": "2017-10", - "endDate": "2018-10", - "awarded": "honorable mention", - "workFeatured": [] - }, - { - "@type": "ExhibitionEvent", - "name": "Ars Electronica", - "url": "http://v2.nl/events/summer-sessions-at-ars-electronica-festival-2017", - "location": { - "@type": "Festival", - "name": "Ars Electronica", - "address": "Linz" - }, - "startDate": "2017-09", - "endDate": "2017-09", - "organiser": { "@id":"r:/organisation/v2_" }, - "funded": "Creative Industries Fund", - "workFeatured": [] - }, - { - "@id": "r:/event/creativity-and-cognition", - "@type": "ExhibitionEvent", - "name": "Microbites of Creativity", - "url": ["http://microbites.me/","http://cc.acm.org/2017/microbites/?ArtworksCC2017/"], - "organiser": "ACM Creativity & Cognition", - "location": { - "@type": "Museum", - "name": "Museum of Arts & Sciences", - "address": "Singapore" - }, - "startDate": "2017-06", - "endDate": "2017-06", - "workFeatured": [] - }, - { - "@id": "r:/exhibition/codesandmodes", - "@type": "ExhibitionEvent", - "url": "https://www.hunterintegratedmedia.org/reframe/speaker-lineup/ruben-van-de-ven/", - "name": "Codes & Modes II", - "organiser": "Integrated Media Arts MFA", - "location": { - "@type": "CollegeOrUniversity", - "name": "Hunter College", - "address": "New York City" - }, - "startDate": "2017-03-16", - "endDate": "2017-03-18", - "workFeatured": [], - "about": { - "@id": "http://networkcultures.org/longform/2017/01/25/choose-how-you-feel-you-have-seven-options/" - } - }, - { - "@id": "r:/exhibition/stateofemotion", - "@type": "ExhibitionEvent", - "name": "STATE of Emotion", - "url": "https://www.statefestival.org/participant/2016/ruben-van-de-ven", - "@reverse": { - "subEvent": { - "@id": "r:/festival/statefestival", - "@type": "Festival", - "name": "STATE Festival", - "address": "Berlin", - "url":"https://www.statefestival.org/" - } - }, - "startDate": "2016-11-04", - "endDate": "2016-11-05", - "workFeatured": [] - }, - { - "@type": "ExhibitionEvent", - "name": "Manipulation: Emotion Hero", - "description": "I organised this exhibition as part of my Summer Sessions residency at Arquivo237. It was a modest exhibition covering my research on emotion recognition software.", - "url":"https://www.facebook.com/events/589274264578244/", - "location": { - "@type": "EventVenue", - "name": "Arquivo237", - "address": "Lisbon" - }, - "startDate": "2016-09", - "endDate": "2016-09", - "workFeatured": [], - "@reverse": { - "subEvent": { - "@id": "r:/residency/summer-sessions" - } - } - } - ] - }, - "image": [ - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/emotionhero1-2.jpg", - "thumbnailUrl": "/assets\/thumb\/emotionhero1-2.jpg" - }, - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/emotionhero2.jpg", - "thumbnailUrl": "/assets\/thumb\/emotionhero2.jpg" - } - ] - }, - { - "@type": "MediaObject", - "name": "Choose How You Feel; You Have Seven Options", - "dateCreated": "2016", - "duration":"9M9S (∞ loop)", - "artworkSurface": "3 projections", - "description": "What does it mean to feel 47% happy and 21% surprised? Choose how you feel; you have seven options is a video work that revolves around this question as it looks at software that derives emotional parameters from facial expressions. It combines human accounts and algorithmic processing to examine the intersection of highly cognitive procedures and ambiguous experiences. Born from a fascination with the technological achievements, the work interrogates the discursive apparatus the software is embedded in.\n\nThis work builds on my research into the workings of expression analysis technologies and the assumptions that underlie it, scrutinising the claims that are made by the companies developing the software.", - "@reverse": { - "workFeatured": [ - { - "@type": "ExhibitionEvent", - "name": "Big Stories Need Human Stakes", - "url": "https://nieuwevide.nl/programma/big-stories-need-human-stakes", - "location": { - "@type": "Museum", - "name": "Nieuwe Vide", - "address": "Haarlem" - }, - "startDate": "2018-02-02", - "endDate": "2018-03-04", - "workFeatured": [] - }, - { - "@type": "ExhibitionEvent", - "name": "Test_Lab the Graduation Edition", - "url": "http://v2.nl/events/test_lab-the-graduation-edition-2015-1/", - "location": { - "@id": "r:/organisation/v2_", - "@type": "Place", - "name": "V2_", - "address": "Rotterdam" - }, - "startDate": "2016-07-07 20:00", - "endDate": "2016-07-07 23:00", - "workFeatured": [] - }, - { - "@type": "ExhibitionEvent", - "name": "Fuzzy Logic - Graduation Show", - "url": "https://pzimediadesign.nl/2016.html", - "location": { - "@id": "r:/university/piet-zwart", - "@type": "CollegeOrUniversity", - "name": "Piet Zwart Institute", - "address": "Rotterdam" - }, - "startDate": "2016-06-17", - "endDate": "2016-06-26", - "workFeatured": [] - } - ] - }, - "image": [ - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/choosehowyoufeel2-2.jpg", - "thumbnailUrl": "/assets\/thumb\/choosehowyoufeel2-2.jpg" - }, - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/choosehowyoufeel.jpg", - "thumbnailUrl": "/assets\/thumb\/choosehowyoufeel.jpg" - } - ] - }, - { - "@id": "r:/eye-without-a-face", - "@type": "MediaObject", - "name": "EYE Without A Face", - "dateCreated": "2016", - "duration": "11:32 (∞ loop)", - "description": "Whether the video frames are ordered by time or by emotion will not make a difference to a computer. For it, both orderings are just as logical. However, for the human spectator the reordered display of frames becomes a disruptive process. The human is positioned as a required agent for meaning making in an algorithmic procedure.\n\nIn collaboration with Cristina Cochior I went manually through the Eye's public collection, and catalogued faces by surrendering them to an emotion detection algorithm. Cutting from one face to another,its uncritical selection produced a new portrait of emotional gradients moving in-between anger and happiness.", - "author": { - "@id": "r:/person/cristina-cochior", - "@type": "Person", - "name": "Cristina Cochior", - "url": "http://randomizer.info" - }, - "image": [ - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/eye_0-2.jpg", - "thumbnailUrl": "/assets\/thumb\/eye_0-2.jpg" - }, - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/eye_3-2.jpg", - "thumbnailUrl": "/assets\/thumb\/eye_3-2.jpg" - }, - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/eye_6-2.jpg", - "thumbnailUrl": "/assets\/thumb\/eye_6-2.jpg" - } - ], - "video": { - "@id": "r:/eye-without-a-face/video", - "@type": "VideoObject", - "thumbnailUrl": "/assets\/thumb\/eye_1.jpg", - "contentUrl": "http://works.rubenvandeven.com/2016-eye_without_a_face/EyeWithoutAFace.mp4" , - "encodingFormat": "video/mp4", - "videoFrameSize": "1920x1080" - }, - "@reverse": { - "workFeatured": [ - { - "@type": "ExhibitionEvent", - "name": "Video Vortex", - "url":"https://issuu.com/instituteofnetworkcultures/docs/catalouge_compiled_final__29-03_/29", - "location": { - "@type": "Place", - "name": " Mill Hall / Kochi-Muzeris biennial", - "address": "Kochi (India)" - }, - "startDate": "2017-04-23", - "endDate": "2017-04-26" - }, - { - "@type": "ExhibitionEvent", - "name": "Grand Instant Fiction", - "url":"http://umakart.tumblr.com/post/169464483314/grand-instant-fiction-10-sakrowski-evil", - "location": { - "@type": "EventVenue", - "name": "Umakart Gallery", - "address": "Brno" - }, - "startDate": "2016-12", - "endDate": "2016-12" - }, - { - "@type": "ExhibitionEvent", - "name": "Boundaries of the Archive", - "description": "The Piet Zwart Institute at the Eye Film Museum in Amsterdam as part of its ResearchLab series. The exhibition focussed on the boundaries of the archive. Studying the structures and cultural impacts of our media technologies, it concentrated on the intricate and usually hidden aspects of EYE's extensive archive", - "url":"https://www.eyefilm.nl/film/boundaries-of-the-archive-research-lab-piet-zwart-institute", - "location": { - "@type": "Museum", - "name": "EYE Film Museum", - "address": "Amsterdam" - }, - "startDate": "2016-04-12", - "endDate": "2014-04-24" - } - ] - } - }, - { - "@type": "ScholarlyArticle", - "name": "Article - Emotion Hero", - "pageStart": "422", - "pageEnd": "423", - "isPartOf": [ - "C&C '17 Proceedings of the 2017 ACM SIGCHI Conference on Creativity and Cognition", - {"@id": "r:/event/creativity-and-cognition"} ], - "description": "What does it mean to feel 62% joy, and 15% surprised? Over the past years the digitization of emotions is booming business: multimillion dollar investments are made in technologies of which is claimed that they give companies an objective view in their consumers' feelings. The video-game-artwork Emotion Hero challenges the user to investigate this claim and question the premise of the technology. Emotion Hero is a two-part artwork. On the one hand is a video-game that is freely downloadable for everybody with an Android device. Inspired by Guitar Hero, the user scores points by following given cues. It provides detailed feedback on the mechanics of the face. The second part is a projection that shows a grid with aggregated scores of the game, that updates live. In its design, the grid refers to 19th century positivist practices.", - "url": "https://doi.org/10.1145/3059454.3059490/", - "publisher": "ACM New York, NY, USA", - "datePublished": "2017-01-27" + "location": "Naturalis, Leiden", + "description": "SETUP x NSVP: future scenarios for AI and the job market\nAlgorithms that assess application letters. Voice assistants who take over the job interview. Predicting the perfect candidate for a vacancy. The possibilities of AI for recruitment and selection of employees seem endless. What does the future of this development look like? And how does AI facilitate - or frustrate - diversity in the labor market? Eight selected makers worked on this theme in four teams. From programmer to writer of historical novels, and from costume designer to cultural anthropologist.\nWith installations, performances and other works they make the social consequences of AI in the HR sector tangible. Because reading about it is one thing, but the consequences can only be felt if you yourself undergo an algorithmic interview. Would you still be hired for your own job if you had to apply with these systems?", + "startDate": "2019-11-04", + "endDate": "2019-11-06", + "workFeatured": [] }, { - "@id": "r:/article/choose-how-you-feel-you-have-seven-options", - "@type": "Report", - "name": "Longform - Choose How You Feel; You Have Seven Options", - "description": "What does it mean to feel 82% surprised or 93% joy? As part of their Longform series, the Institute of Network Cultures published my research into software that derives emotional scores from facial expressions.", - "url": "http://networkcultures.org/longform/2017/01/25/choose-how-you-feel-you-have-seven-options/", - "datePublished": "2017-01-27", - "publisher": { + "@type": "ExhibitionEvent", + "name": "re:connect | Digital Art Expo", + "location": "Janskerk, Utrecht", + "startDate": "2019-11-16", + "endDate": "2019-11-16", + "url": "https://www.setup.nl/reconnect", + "organizer": { + "@id": "r:/organisation/setup", "@type": "Organization", - "name": "Institute of Network Cultures", - "url": "http://networkcultures.org" + "name": "Setup", + "address": "Utrecht", + "url": "https://www.setup.nl/" }, - "@reverse": { - "about": [ - { - "@type": "Event", - "name": "Presentation @ Act Natural 04", - "startDate": "2019-06-08", - "endDate": "2019-06-08", - "organizer": "Jeisson Drenth", - "location": "Doornroosje, Rotterdam" - }, - { - "@type": "Event", - "name": "Presentation @ BARTALK #12: Coded Gestures", - "startDate": "2018-10-26", - "endDate": "2018-10-26", - "organizer": ["Yun Ingrid Lee", "Rae Parnell"], - "location": "Doornroosje, Rotterdam", - "url": "https://bartalkdh.wordpress.com/bartalk-12-coded-gestures/" - }, - { - "@type": "Event", - "name": "Presentation @ Media Lab UFRJ", - "startDate": "2018-05-25", - "endDate": "2018-05-25", - "organizer": "Media Lab UFRJ & Dutch Consulate", - "location": "Rio de Janeiro", - "url":"http://medialabufrj.net/" + "workFeatured": [] + }, + { + "@type": "ExhibitionEvent", + "name": "ECP Conference", + "location": { + "@type": "EventVenue", + "name": "Fokker Terminal" + }, + "startDate": "2019-11-13", + "endDate": "2019-11-13", + "url": "https://ecp.nl/jaarcongres/kunst-expo-2019/", + "workFeatured": [] + }, + { + "@type": "ExhibitionEvent", + "name": "Privacyrede 2020: the internet is broken", + "description": "(NL) Het internet is stuk. Hoe kunnen we het weer repareren? Daarover vertelt Marleen Stikker, auteur van Het internet is stuk, op 23 januari tijdens de Privacyrede 2020. Met de 50e verjaardag van het internet is dit hét moment om terug te blikken en vooruit te kijken.", + "location": { + "@id": "r:/venue/tivoli", + "@type": "EventVenue", + "name": "Tivoli Vredeburg" + }, + "startDate": "2020-01-23", + "endDate": "2020-01-23", + "url": "https://www.tivolivredenburg.nl/agenda/privacyrede-2019-16-01-2019/", + "workFeatured": [] + }, + { + "@id": "r:/event/2019/ccu-presentation", + "@type": "Event", + "name": "Presentation @ Creative Coding Utrecht", + "startDate": "2019-10-31", + "organizer": { + "@id": "r:/organisation/ccu" + }, + "location": "Nijverheidsloods, Utrecht" + } + ], + "about": { + "@id": "r:/guest-worker/report", + "@type": "Report", + "name": "Guest Worker Research Report", + "description": "A brief report written in light of Guest Worker (2019). In Dutch.", + "url": "http://guest_worker.rubenvandeven.com/", + "datePublished": "2019-11-26" + } + } + }, + { + "@id": "r:/exercises-in-overfitting", + "@type": "MediaObject", + "name": "Exercises in overfitting", + "dateCreated": "2019", + "description": "I taught a computer how to write the name of my son. The progression of this machine learning processes is materialised with a pen plotter.", + "s:seeAlso": [ + "https://gitlab.com/rubenvandeven/diede" + ], + "image": [ + { + "@id": "r:/exercises-in-overfitting/image/2", + "@type": "ImageObject", + "contentUrl": "/assets/image/exercises-in-overfitting2.jpg", + "thumbnailUrl": "/assets/thumb/exercises-in-overfitting2.jpg" + }, + { + "@id": "r:/exercises-in-overfitting/image/1", + "@type": "ImageObject", + "contentUrl": "/assets/image/exercises-in-overfitting1.jpg", + "thumbnailUrl": "/assets/thumb/exercises-in-overfitting1.jpg" + } + ], + "@reverse": { + "workFeatured": { + "@id": "r:/event/2019/ccu-presentation" + } + } + }, + { + "@id": "r:/heartbeat", + "@type": "MediaObject", + "name": "Data double black market", + "dateCreated": "2018", + "description": "Why buy live access to heartbeats?
  • Insurance companies give you discounts for monitoring a healthy lifestyle.
  • Because you can re-sell it to data hoarding companies.
  • To chill out with the soothing sound on your headphones.
  • Use it as input data for your amazing new media art installation.
  • Because it's cheap!
", + "image": [ + { + "@id": "r:/heartbeat/image/1", + "@type": "ImageObject", + "contentUrl": "/assets/image/data-double-black-market.jpg", + "thumbnailUrl": "/assets/thumb/data-double-black-market.jpg" + } + ], + "@reverse": { + "workFeatured": { + "@id": "r:/event/2018/yama-ichi", + "@type": "ExhibitionEvent", + "name": "Yama Ichi Black Market", + "location": { + "@id": "r:/venue/tivoli" + } + } + } + }, + { + "@id": "r:/sustaining-gazes", + "@type": "MediaObject", + "name": "Sustaining Gazes", + "dateCreated": "2018", + "description": "In analytics and statistics, data visualisations, such as the heatmap, are used as tools bring forward patterns in data. These data visualisations, are often presented as objective tools of knowledge: data supposedly do not lie. What is often neglected however, are the subjective and political intricacies embedded within the datasets, and its method of visualisation. In collaboration with Cristina Cochior I am exploring the concept of data dramatisations, as an opposite to data visualisations. Rather than aiming for the objective, we explore the affective & performative aspects of data gathering and processing.\n\nSustaining Gazes is a data dramatisation which looks at the role between the visualisation and its subject. A heatmap is generated by looking at it, which directly influences the looking. Areas which are looked at turn into interesting shapes, inviting even more observation. The pattern of looking is reinforced though its visualisation. This cycle reveals both a hierarchy of power between algorithm and subject, as well as a point for intervention.", + "@reverse": { + "workFeatured": [ + { + "@id": "r:/exhibition/route-du-nord", + "@type": "ExhibitionEvent", + "name": "Route du Nord", + "url": "http://routedunord.nl/portfolio-item/ruben-van-de-ven-2/", + "location": { + "@id": "r:/venue/zoho", + "@type": "EventVenue", + "name": "ZOHO", + "address": "Rotterdam" + }, + "startDate": "2018-05", + "endDate": "2018-05", + "workFeatured": [] + }, + { + "@id": "r:/exhibition/the-new-current", + "@type": "ExhibitionEvent", + "name": "The New Current", + "url": "https://www.thenewcurrent.org/artists-artweek", + "location": { + "@id": "r:/venue/cruise-terminal", + "@type": "EventVenue", + "name": "Cruise Terminal", + "address": "Rotterdam" + }, + "startDate": "2019-02-06", + "endDate": "2019-02-10", + "workFeatured": [] + } + ] + }, + "image": [ + { + "@id": "r:/sustaining-gazes/image/1", + "@type": "ImageObject", + "contentUrl": "/assets/image/sustaining-gazes-2.jpg", + "thumbnailUrl": "/assets/thumb/sustaining-gazes-2.jpg" + }, + { + "@id": "r:/sustaining-gazes/image/2", + "@type": "ImageObject", + "contentUrl": "/assets/image/sustaining-gazes-1.jpg", + "thumbnailUrl": "/assets/thumb/sustaining-gazes-1.jpg" + } + ] + }, + { + "@id": "r:/mvps", + "@type": "CreativeWorkSeries", + "name": "MVPs", + "about": "November 2017 In4Art approached me to be part of their KickstART project. They commissioned three works to be part of their auction. The goal was to explicitly develop works that fitted the commercial art scene.\n\nRather than creating 'sellable' works myself, I took the start-up culture that forms the foundation of In4Art, as my object of my series. I augmented the works of three other participants with business models taken from the online/digital realm. This resulted in three Minimum Viable Products. Recontextualising these business models towards an arts context, results in new perspectives on both the arts as well as start-up culture.", + "dateCreated": "2018", + "hasPart": [ + { + "@id": "r:/mvp1", + "@type": "MediaObject", + "name": "MVP#1 Gathering viewing statistics for Donald Schenkel", + "dateCreated": "2018", + "description": "The work of Donald Schenkel is augmented with a camera which keeps track of how long people look at the work. Like an electricity meter, the value increases the more the work is used. This data is then sent to a server, and provides the artist —in this case Donald Schenkel— with live statistics. But who owns this data generated by the work? The buyer, the artist, or the mediator — which is me?\n\nThis is the first augmentation that is part of the MVP series created for KickstART.", + "width": "45cm + 15cm", + "height": "55cm + 8cm", + "artworkSurface": "Oilpaint on wood + WiFi-connected RaspberryPi in ABS enclosure", + "contributor": { + "@id": "r:/person/donald-schenkel", + "@type": "Person", + "name": "Donald Schenkel", + "url": "http://www.donaldschenkel.nl/" + }, + "@reverse": { + "workFeatured": [ + { + "@id": "r:/exhibition/kickstart", + "@type": "ExhibitionEvent", + "name": "KickstART II", + "url": "http://www.in4art.eu/kickstart/launching-kickstart-ii/", + "location": { + "@id": "r:/place/in4art", + "@type": "EventVenue", + "name": "In4Art Project Space", + "address": "Amsterdam" }, - { - "@type": "Event", - "name": "Presentation @ Instituto Europeo di Design", - "url": "https://www.ied.edu/ied-locations/sao-paulo", - "startDate": "2018-05-22", - "endDate": "2018-05-22", - "organizer": "Instituto Europeo di Design & Dutch Consulate", - "location": "São Paulo" + "startDate": "2018-03-28", + "endDate": "2018-03-28" + }, + { + "@id": "r:/in4art-salon", + "@type": "ExhibitionEvent", + "name": "Salon VI - Innovatism", + "url": "http://www.in4art.eu/salon/salon-vi-innovatism/", + "location": { + "@id": "r:/place/in4art" }, - { - "@type": "Event", - "name": "Presentation @ Nuffic Neso", - "url": "https://www.nuffic.nl/onderwerpen/kantoren-het-buitenland/", - "startDate": "2018-05-21", - "endDate": "2018-05-21", - "organizer": "Nuffic Neso & Dutch Consulate", - "location": "São Paulo" - }, - { - "@type": "Event", - "name": "Presentation @ Festival PATH", - "url": "https://www.festivalpath.com.br/palestras/#palestrante-ruben-van-de-ven", - "startDate": "2018-05-19", - "endDate": "2018-05-19", - "organizer": "Dutch Consulate", - "location": "São Paulo" - }, - { - "@type": "Event", - "name": "Presentation @ The Hmm", - "url": "https://thehmm.nl/the-hmm-x-baut/", - "startDate": "2018-03-28", - "endDate": "2018-03-28", - "organizer": "The Hmm", - "location": "Baut, Amsterdam" - }, - { - "@type": "EducationEvent", - "name": "Presentation @ Industrial Design", - "startDate": "2018-03-06", - "endDate": "2018-03-06", - "organizer": "Felienne Hermans, TU Delft", - "location": "TU Delft" - }, - { - "@type": "Event", - "name": "Presentation @ Worlding the Brain II", - "url": "https://worldingthebrain2017.com", - "startDate": "2017-11-02", - "endDate": "2017-11-04", - "organizer": "ASCA Research Group Neuroaesthetics and Neurocultures, University of Amsterdam", - "location": "CREA, Amsterdam" - }, - { - "@type": "Event", - "name": "Presentation @ Creative Coding Utrecht", - "startDate": "2017", - "organizer": {"@id": "r:/organisation/ccu"}, - "location": "Stadstuin, Utrecht" - }, - { - "@type": "EducationEvent", - "name": "Workshop: Artistic Point of Interference", - "url": "https://caradt.com/2017/03/07/ekv-13-march-lecture-by-human-index/", - "startDate": "2017-03-13", - "endDate": "2017-03-14", - "organizer": "St. Joost Academy", - "location": "Breda" - }, - { - "@type": "Event", - "name": "Presentation @ Cqrrelations publication launch", - "url": "http://cqrrelations.constantvzw.org/0x0/", - "startDate": "2016-06-11", - "endDate": "2016-06-11", - "organizer": "Constant VZW.", - "location": "FoAM, Brussels" - }, - { - "@type": "Event", - "name": "Panel: Tracking Emotions", - "url": "https://state-studio.com/participant/2016/ruben-van-de-ven", - "startDate": "2018-11-04", - "endDate": "2018-11-04", - "@reverse": { - "subEvent": { - "@id": "r:/festival/statefestival" - } - }, - "recordedIn": { - "@id": "r:/panel/stateofemotion/video", - "@type": "VideoObject", - "embedUrl": "https://www.youtube.com/embed/L2O6ecO-8PM?start=2062", - "thumbnailUrl": "https://i.ytimg.com/vi/L2O6ecO-8PM/maxresdefault.jpg" - } - }, - { - "@type": "Event", - "name": "Presentation @ Digitalorders", - "url": "https://www.normativeorders.net/en/events/young-researchers-conferences/34-veranstaltungen/nachwuchskonferenz/5114-seventh-international-young-researchers-conference", - "startDate": "2016-11-17", - "endDate": "2016-11-19", - "organizer": "Goethe University", - "location": "Frankfurt am Main" - }, - { - "@type": "Event", - "name": "Presentation @ Winter school", - "alternateName": "What happens to the data in 'Big Data'?", - "url": "www.bsts.be/wp-content/uploads/winter_school_2016-1.pdf", - "startDate": "2016-02", - "endDate": "016-02", - "organizer": "Workgroup: algorithmic governmentality", - "location": "University of Namur" - }, - { - "@type": "Event", - "name": "Presentation @ Art Meets Radical Openness", - "url": "https://www.radical-openness.org/en/festival/2016", - "startDate": "2018-05-25", - "endDate": "2018-05-28", - "location": "Linz" - }, - { - "@type": "Event", - "name": "Presentation @ Digital Emotions Workgroup", - "url": "http://asca.uva.nl/content/research-groups/digital-emotions/digital-emotions.html", - "startDate": "2016", - "endDate": "2016", - "organizer": "Amsterdam School for Cultral Analysis", - "location": "University of Amsterdam" - } - ] + "startDate": "2018-05-18", + "endDate": "2018-05-27" + } + ] + }, + "image": [ + { + "@id": "r:/mvp1/image/1", + "@type": "ImageObject", + "contentUrl": "/assets/image/mvp1-1.jpg", + "thumbnailUrl": "/assets/thumb/mvp1-1.jpg" + }, + { + "@id": "r:/mvp1/image/2", + "@type": "ImageObject", + "contentUrl": "/assets/image/mvp1-2.jpg", + "thumbnailUrl": "/assets/thumb/mvp1-2.jpg" + }, + { + "@id": "r:/mvp1/image/3", + "@type": "ImageObject", + "contentUrl": "/assets/image/mvp1-4.jpg", + "thumbnailUrl": "/assets/thumb/mvp1-4.jpg" + } + ] + }, + { + "@id": "r:/mvp2", + "@type": "MediaObject", + "name": "MVP#2 Joseph Huot's Limited Edition", + "dateCreated": "2018", + "description": "In September 2017, huricane Irma was racing towards Florida. Everybody tried to get away from there as quick as possible. Stuck were those with the electric Tesla Model S with the cheaper battery option (60kWh). Then, all of a sudden, Tesla send a software update to these cars. The cars could drive futher then ever before. Until 72 hours later, Tesla reversed the software update. Exactly the same car could drive shorter distances.\n\nThis is the business of software companies: just like Apple limits performance on old iPhones, Tesla used softare to limit the reach of its cars in order to make more money. While physically the exact same product, it can do less.\n\nMinimum Viable Product #2 brings this business model to the art world. It provides a limited edition of a drawing by Joseph Huot.", + "width": "32.5cm", + "height": "50cm", + "artworkSurface": "Pencil drawing in metal LCD enclosure", + "contributor": { + "@id": "r:/person/joseph-huot", + "@type": "Person", + "name": "Joseph Huot", + "url": "http://www.joseph-huot.com/" + }, + "@reverse": { + "workFeatured": { + "@id": "r:/exhibition/kickstart" + } + }, + "image": [ + { + "@id": "r:/mvp2/image/1", + "@type": "ImageObject", + "contentUrl": "/assets/image/mvp2-01.jpg", + "thumbnailUrl": "/assets/thumb/mvp2-01.jpg" + }, + { + "@id": "r:/mvp2/image/2", + "@type": "ImageObject", + "contentUrl": "/assets/image/mvp2-02.jpg", + "thumbnailUrl": "/assets/thumb/mvp2-02.jpg" + }, + { + "@id": "r:/mvp2/image/3", + "@type": "ImageObject", + "contentUrl": "/assets/image/mvp2-5.jpg", + "thumbnailUrl": "/assets/thumb/mvp2-5.jpg" + } + ] + }, + { + "@id": "r:/mvp3", + "@type": "MediaObject", + "name": "MVP#3 Customiseyour.art - Mikel Folgerts 1/3", + "dateCreated": "2018", + "description": "On YouTube, Instagram, and many other online platforms, celebrities get paid to place consumer products in their videos. Not prominently, but hidden in plain sight. Can precarious artists finance their work by employing this product placement?\n\nMinimum Viable Product #3 allows buyers to customise the work they bought —Rotterdam, by Mikel Folgerts—, linking the status of the artist to their product.", + "width": "40cm", + "height": "40cm", + "artworkSurface": "Personalised print on perspex", + "contributor": { + "@id": "r:/person/mikel-folgerts", + "@type": "Person", + "name": "Mikel Folgerts", + "url": "https://www.instagram.com/mikelfolgerts/" + }, + "@reverse": { + "workFeatured": { + "@id": "r:/exhibition/kickstart" + } + }, + "image": [ + { + "@id": "r:/mvp3/image/1", + "@type": "ImageObject", + "contentUrl": "/assets/image/mvp3-1.jpg", + "thumbnailUrl": "/assets/thumb/mvp3-1.jpg" + } + ] + } + ] + }, + { + "@id": "r:/spectacular-spectator-mood-meter", + "@type": "MediaObject", + "name": "Spectacular Spectator Mood Meter", + "dateCreated": "2017", + "description": "Commisioned by V2_ for Evening of the Black Box Concern. Researchers of digital culture often regard artificial intelligence as black boxes. However, developers of these systems often regard the humans that are analysed as black boxes.\n\nWhat happens when we use black boxes (AI) to analyse black boxes (humans) and present these back to black boxes (humans)?\n\nThis prototype used emotion recognition software by Affectiva to analyse the audience of the talks. It then highlighted the moments in the talks for which outliers in the data were found. Can we use this data to analyse either of the black boxes?", + "producer": { + "@id": "r:/organisation/v2_" + }, + "@reverse": { + "workFeatured": [ + { + "@type": "ExhibitionEvent", + "name": "Evening of the Black Box Concerns", + "url": "http://v2.nl/events/evening-of-the-black-box-concerns", + "location": { + "@id": "r:/organisation/v2_" + }, + "startDate": "2017-12-7", + "workFeatured": [] + } + ] + }, + "image": [ + { + "@type": "ImageObject", + "contentUrl": "/assets/image/moodmeter1-1.jpg", + "thumbnailUrl": "/assets/thumb/moodmeter1-1.jpg" + }, + { + "@type": "ImageObject", + "contentUrl": "/assets/image/moodmeter2.jpg", + "thumbnailUrl": "/assets/thumb/moodmeter2.jpg" + }, + { + "@type": "ImageObject", + "contentUrl": "/assets/image/moodmeter3.jpg", + "thumbnailUrl": "/assets/thumb/moodmeter3.jpg" + }, + { + "@type": "ImageObject", + "contentUrl": "/assets/image/moodmeter4.jpg", + "thumbnailUrl": "/assets/thumb/moodmeter4.jpg" + } + ] + }, + { + "@id": "r:/emotionhero", + "@type": "MediaObject", + "dateCreated": "2016", + "name": "Emotion Hero", + "description": "Emotion recognition software is being used both as a tool for ‘objective’ measurements as well as a tool for training one’s facial expressions, eg. for job interviews. Emotion Hero is a literal translation of the paradoxical relation between these applications of the technology.\n\nEmotion Hero is a two-part artwork. On the one hand is a video-game that is freely downloadable for everybody with an Android device (see
Google Play). Inspired by Guitar Hero, the user scores points by following given cues. It provides detailed feedback on the mechanics of the face (eg. “You showed on 10% Joy when you had to show 100%, smile 99.32% more.”), revealing that rather than being a window into the brain, the face is a controllable surface.\n\nThe second part is a projection that shows the aggregated scores of the game. In order to substantiate their discourse, companies in facial expression measurement employ a huge amount of data collection and processing. The results are displayed in a fixed grid, recalling historical practices that, trough extensive measurement and administration, also aimed to delineate something which is conceptually undelineated: think of Duchenne de Boulogne, Lombroso, and Charcot.\n\nEmotion Hero is a playful invitation to open up the box of expression analysis to reveal the assumptions that underlie this technology.\nThe game's emotional intelligence is powered by Affectiva (I was also interviewed by them).", + "url": "https://emotionhero.com", + "@reverse": { + "workFeatured": [ + { + "@type": "ExhibitionEvent", + "name": "ECP Conference", + "location": { + "@type": "EventVenue", + "name": "Fokker Terminal" + }, + "url": "https://ecp.nl/jaarcongres/kunst-expo-2018/", + "startDate": "2018-11-15", + "endDate": "2018-11-15", + "workFeatured": [] + }, + { + "@type": "ExhibitionEvent", + "name": "Free Panorama - Shenzen MAF", + "url": "http://shenzhenmaf.cn/Portal/en-US/Exhibition/Detail/10f64524-be11-1985-bbfa-7dd7d27868de", + "location": "Pingshan Cultural Center Exhibition Gallery, Shenzen", + "startDate": "2019-04-20", + "endDate": "2019-05", + "workFeatured": [], + "image": [ + { + "@type": "ImageObject", + "contentUrl": "/assets/image/eh-shenzen.jpg", + "thumbnailUrl": "/assets/thumb/eh-shenzen.jpg" + } + ] + }, + { + "@id": "r:/exhibition/mood_swings", + "@type": "ExhibitionEvent", + "name": "Mood Swings", + "url": "https://www.mqw.at/en/institutions/q21/frei-raum-q21-exhibition-space/2017/03/mood-swings-on-mood-politics-sentiment-data-market-sentiments-and-other-sentiment-agencies/", + "location": { + "@id": "r:/place/q21", + "@type": "Museum", + "name": "frei_raum / Q21", + "address": "MuseumsQuartier /Vienna" + }, + "startDate": "2017-03-28", + "endDate": "2017-05-28", + "workFeatured": [] + }, + { + "@type": "ExhibitionEvent", + "name": "Open Codes", + "url": "https://open-codes.zkm.de/", + "location": { + "@type": "Museum", + "name": "ZKM", + "address": "Karlsrue" + }, + "startDate": "2017-10-20", + "endDate": "2018-08-05", + "workFeatured": [] + }, + { + "@type": "ExhibitionEvent", + "name": "Plan D", + "url": [ + "http://2017.pland.hr/", + "http://2017.pland.hr/vijesti/dodijeljena-nagrada-i-pocasne-diplome-festivala-plan-d/" + ], + "location": "Zagreb", + "startDate": "2017-10", + "endDate": "2018-10", + "awarded": "honorable mention", + "workFeatured": [] + }, + { + "@type": "ExhibitionEvent", + "name": "Ars Electronica", + "url": "http://v2.nl/events/summer-sessions-at-ars-electronica-festival-2017", + "location": { + "@type": "Festival", + "name": "Ars Electronica", + "address": "Linz" + }, + "startDate": "2017-09", + "endDate": "2017-09", + "organiser": { + "@id": "r:/organisation/v2_" + }, + "funded": "Creative Industries Fund", + "workFeatured": [] + }, + { + "@id": "r:/event/creativity-and-cognition", + "@type": "ExhibitionEvent", + "name": "Microbites of Creativity", + "url": [ + "http://microbites.me/", + "http://cc.acm.org/2017/microbites/?ArtworksCC2017/" + ], + "organiser": "ACM Creativity & Cognition", + "location": { + "@type": "Museum", + "name": "Museum of Arts & Sciences", + "address": "Singapore" + }, + "startDate": "2017-06", + "endDate": "2017-06", + "workFeatured": [] + }, + { + "@id": "r:/exhibition/codesandmodes", + "@type": "ExhibitionEvent", + "url": "https://www.hunterintegratedmedia.org/reframe/speaker-lineup/ruben-van-de-ven/", + "name": "Codes & Modes II", + "organiser": "Integrated Media Arts MFA", + "location": { + "@type": "CollegeOrUniversity", + "name": "Hunter College", + "address": "New York City" + }, + "startDate": "2017-03-16", + "endDate": "2017-03-18", + "workFeatured": [], + "about": { + "@id": "http://networkcultures.org/longform/2017/01/25/choose-how-you-feel-you-have-seven-options/" } }, { - "@type": "MediaObject", - "name": "We know how you feel", - "dateCreated": "2015", - "description": "A two-part artwork and my first work on software that derives emotional parameters from facial expressions. The first part displays the Mind Reading Emotions Library<\/em>, an interactive collection of videos, audio fragments and scenes depicting 412 distinct emotions —ranging from `angry' to `unsure'— grouped in 24 categories. The second part of the project is a tablet with a modified demo app by Affectiva, a major player in the field of emotion analysis software. This app acts as an interactive mirror which displays the various parameters that the Affectiva software derives from someone's facial expression, while a voice over reads a text extracted from the Dutch classic Beyond Sleep<\/em> by W.F. Hermans (1966), concerning the impact of the mirror, photography and video on the human self-image.", - "image": [ - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/we_know_how_you_feel.jpg", - "thumbnailUrl": "/assets\/thumb\/we_know_how_you_feel.jpg", - "caption": "We know how you feel" - }, - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/we_know_how_you_feel-3.jpg", - "thumbnailUrl": "/assets\/thumb\/we_know_how_you_feel-3.jpg", - "caption": "Mind Reading Emotions Library" - } - ], - "@reverse": { - "workFeatured": [ - { - "@id": "r:/exhibition/codesandmodes" - }, - { - "@id": "r:/exhibition/stateofemotion" - }, - { - "@type": "ExhibitionEvent", - "name": "An Encyclopedia of Media Objects", - "url": "http://v2.nl/events/an-encyclopedia-of-media-objects", - "startDate": "2015-06-26", - "endDate": "2015-06-27", - "description": "What is an encyclopedia? What are media? What is an object? Students of the Piet Zwart Institute Media Design Masters programme invite you to look at these issues. Twelve installations and one choreography present a taxonomy of disappearing, human and non-human, introvert and collected media objects.\n\nThis exhibition was developed in a 'Thematic Seminar' run in the summer trimester 2015 taught by Florian Cramer.\n\nArtists: Lucas Battich [IT], Manetta Berends [NL], Julie Boschat Thorez [FR], Cihad Caner [TR], Joana Chicau [PT], Cristina Cochior [RO], Solange Frankort [NL], Arantxa Gonlag [NL], Anne Lamb [US], Benjamin Li [NL], Yuzhen Tang [CN], Ruben van de Ven [NL] & Thomas Walskaar [NO]", - "location": { - "@id": "r:/organisation/v2_" - } - } - ] + "@id": "r:/exhibition/stateofemotion", + "@type": "ExhibitionEvent", + "name": "STATE of Emotion", + "url": "https://www.statefestival.org/participant/2016/ruben-van-de-ven", + "@reverse": { + "subEvent": { + "@id": "r:/festival/statefestival", + "@type": "Festival", + "name": "STATE Festival", + "address": "Berlin", + "url": "https://www.statefestival.org/" } - - }, - { - "@type": "MediaObject", - "name": "Fragments of reality", - "dateCreated": "2015-01-01", - "description": "In western society, images are generally perceived as objective traces of events. As evidence that things happened as how they are captured in the frame.\n\nAs Susan Sontag elaborates, this counts for photographic images in particular. They are seen, not as subjective statements about the world, but rather as pieces of it —as fragments of a reality. Photographic images are often seen as unbiased; they carry in them the \"burden of truth\". We use them to give meaning, to asses and to judge. It exactly is in this passivity of the image, that its aggression lurks.\nFragments of Reality is a newspaper that assembles descriptions of five images of one event: a press conference with Jeroen Dijsselbloem and Yanis Varoufakis. Each interviewee was shown one of the images, in an attempt to highlight how we read events trough photographs.\n\nIt considers an event not as a single factual moment, but as the cumulative of subjective experiences, inherently proposing that an image is always lacking in its representation of that which it presents.", - "image": [ - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/fragments-6-2.jpg", - "thumbnailUrl": "/assets\/thumb\/fragments-6-2.jpg", - "caption": "Fragments of reality" - }, - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/fragments-9-2.jpg", - "thumbnailUrl": "/assets\/thumb\/fragments-9-2.jpg", - "caption": "Fragments of reality" - }, - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/fragments-7-2.jpg", - "thumbnailUrl": "/assets\/thumb\/fragments-7-2.jpg", - "caption": "Fragments of reality" - } - ] - }, - { - "@type": "Movie", - "name": "Waterdagen", - "dateCreated": "2013", - "description": "Adam is security guard at a nursing home with comatose patients. During his night shifts he has unsettling visions of someone drowning. He seeks his comfort in the company of his pregnant girlfriend. Days of Water is a story on guilt and shame; and on a longing for hope.\nI wrote and directed this film for my graduation as film director for fiction at the Utrecht School of the Arts.\nIt was accompanied by my MA research on spectatorial emotion and the influence emotions on the spectator's sympathy for the protagonist.", - "image": [ - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/waterdagen-teaser.jpg", - "thumbnailUrl": "/assets\/thumb\/waterdagen-teaser.jpg" - }, - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/waterdagen1.jpg", - "thumbnailUrl": "/assets\/thumb\/waterdagen1.jpg" - } - ], - "@reverse": { - "workFeatured": [ - { - "@type": "ExhibitionEvent", - "name": "High Desert International Film Festival ", - "url": "http://routedunord.nl/portfolio-item/ruben-van-de-ven-2/", - "location": { - "@type": "Festival", - "name": "High Desert International Film Festival ", - "address": "Pahrump, Nevada" - }, - "startDate": "2014-05", - "endDate": "2014-05", - "workFeatured": [] - } - ] - } - }, - { - "@type": "MediaObject", - "name": "Co-Poet", - "dateCreated": "2012", - "url": "http://projectkaleido.nl/#copoet", - "description": "For the visitors of the Crossing Border festival in The Hague we desgined an installation to collaboratively contribute to a poem.\nBased on the input of the user, a sentence is added to the poem, originating from digitalised texts of artists participating in the festival.\nThe text was combined with an audiovisual presentation that changed depending on the user's input.", - "image": [ - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/copoet1.jpg", - "thumbnailUrl": "/assets\/thumb\/copoet1.jpg" - } - ], - "@reverse": { - "workFeatured": [ - { - "@type": "ExhibitionEvent", - "name": "Crossing Border", - "location": { - "@type": "PerformingArtsTheater", - "name": "Leidse Schouwburg", - "address": "Leiden" - }, - "startDate": "2012-11-14", - "endDate": "2012-11-17", - "workFeatured": [] - } - ] - } - }, - { - "@type": "MediaObject", - "name": "Rangi Ya Samawati", - "dateCreated": "2012", - "description": "The Colour of Blue. A diptych about two Tanzanians: a miner and a lobster fisher. How do they live, work and survive; and how do they see their own future? Each of the two men is in his own way depending on nature, everyday gambling for a good catch.\nThis documentary was shot complementary to our work at the Kilimanjaro Film Institute in Arusha.\nDocumentary, 14′42″. The full film is available on Youtube.", - "image": [ - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/samawati-prev2.jpg", - "thumbnailUrl": "/assets\/thumb\/samawati-prev2.jpg" - }, - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/samawati-prev1.jpg", - "thumbnailUrl": "/assets\/thumb\/samawati-prev1.jpg" - } - ], - "video": { - "@id": "r:/samawati/video", - "@type": "VideoObject", - "thumbnailUrl": "/assets/thumb/samawati.mp4.jpg", - "contentUrl": "/assets/video/samawati.mp4" , - "encodingFormat": "video/mp4", - "videoFrameSize": "1280x1024" - } - }, - { - "@type": "MediaObject", - "name": "Virtual Afterlife", - "dateCreated": "2010", - "description": "A short HKU project on the future of social media, when it was still an upcomming phenomenon. It is made in two weeks for a series of shorts with a given start and ending image.\nWe asked ourselves: what happens if our online identity lives on after we die? Do we still live on if a part of our online identity does? How can this virtual identity be shaped?\n2′10″", - "image": [ - { - "@type": "ImageObject", - "contentUrl": "/assets/image/guerilla2.jpg", - "thumbnailUrl": "/assets/thumb/guerilla2.jpg" - } - ], - "video": { - "@id": "r:/assets/video/guerilla_project.mp4#videoobject", - "@type": "VideoObject", - "contentUrl": "/assets/video/guerilla_project.mp4", - "thumbnailUrl": "/assets/thumb/guerilla_project.mp4.jpg", - "encodingFormat": "video/mp4", - "videoFrameSize": "1280x1024" - } - } - ], - "contributor": [ - { - "@type": "MediaObject", - "name": "Pillow Talk", - "dateCreated": "2019", - "description": "The voice is surely an uncanny phenomenon. In the digital age it leaves us constantly in doubt, if a person or a non-person is speaking. In this immersive performance, doubt and conviction change roles in the blink of an eye. Spread out on a hilly landscape, audience engages in a conversation with something that is there and not there at the same time. An artificial voice functions as a mediator, a partner and a mirror to one's own.\n\nWhile conversations are constructed word-by-word, impressions are shared, naps are taken, and time is passed, Pillow Talk is an invitation to suspend eye-to-eye relations and to reposition yourself in direct relation to the non-human.\n\nI developed the interface for the participants, as well as a custom story flow editor for the director/writer Begüm Erciyas.", - "url": "https://www.begumerciyas.com/work/pillow-talk-2019/", - "@reverse": { - "author": [ - { - "@type": "Person", - "name": "Begüm Erciyas", - "url":"https://www.begumerciyas.com" - } - ], - "workFeatured": [ - { - "@type": "TheaterEvent", - "name": "Kunstenfestivaldesarts", - "url": "https://www.kfda.be/en/program/pillow-talk", - "location": "KVS, Brussels", - "startDate": "2019-05-15", - "endDate": "2019-05-20", - "workFeatured": [] - }, - { - "@type": "TheaterEvent", - "name": "Festival Politics of Algorithms", - "location": "Münchner Kammerspiele", - "startDate": "2019-06-14", - "endDate": "2019-06-16", - "workFeatured": [] - }, - { - "@type": "TheaterEvent", - "name": "New Empathies Program Series", - "location": "Radialsystem, Berlin", - "startDate": "2019-08-29", - "endDate": "2019-08-31", - "workFeatured": [] - }, - { - "@type": "TheaterEvent", - "name": "New Settings/Fondation d'Enterprise Hermés", - "location": "Theatre Nanterre-Amandiers, Paris", - "startDate": "2019-11-13", - "endDate": "2019-11-16", - "workFeatured": [] - }, - { - "@type": "TheaterEvent", - "name": "NEXT Festival", - "location": "Kortrijk", - "startDate": "2019-11-29", - "endDate": "2019-11-31", - "workFeatured": [] - }, - { - "@type": "TheaterEvent", - "name": "Winzavod Art Center", - "location": "Moscow", - "startDate": "2020-02-14", - "endDate": "2020-02-28", - "workFeatured": [] - }, - { - "@type": "TheaterEvent", - "name": "STUK", - "location": "Leuven", - "startDate": "2020-03-19", - "endDate": "2020-03-20", - "workFeatured": [] - } - ] - }, - "image": [ - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/pillow_talk01.jpg", - "thumbnailUrl": "/assets\/thumb\/pillow_talk01.jpg" - }, - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/pillow_talk02.jpg", - "thumbnailUrl": "/assets\/thumb\/pillow_talk02.jpg" - }, - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/pillow_talk03.jpg", - "thumbnailUrl": "/assets\/thumb\/pillow_talk03.jpg" - } - ], - "about": [ - { - "@type": "VisualArtsEvent", - "name": "Residency: PACT Zollverein", - "startDate": "2019", - "url":"https://www.pact-zollverein.de/en" - }, - { - "@type": "VisualArtsEvent", - "name": "Residency: Buda", - "startDate": "2019", - "url":"https://www.budakortrijk.be/en/residenties/beguem-erciyas-tr-hugvie" - } - ] - }, - { - "@type": "MediaObject", - "name": "The Specta­cular Times", - "dateCreated": "2013-12-04", - "author": { - "@id": "r:/person/ward-goes", - "@type": "Person", - "name": "Ward Goes", - "url": "http://www.wardgoes.nl" }, - "url":"http://spectacularspectacular.news", - "description": "Originally initiated as a graduation project (cum laude) by Ward Goes, The Spectacular Times<\/a> is an ongoing visual inquiry into the presentation of news. It investigates how news, rather than being subjective, is representational of its social, cultural, (geo)political and ideological contexts. The project sets out to lay bare these representations in currently circulating news.\n\nBy layering and contrasting different news elements The Spectacular Times re-contextualises news and makes explicit the intangible notions that lie beyond an increasingly universal guise of news reporting. Not in an effort to tell apart true from false, left from right, or right from wrong, but in order to accentuate a variety of articulations of news.\n\nThis web based project uses user defined variables to animate news headers, texts and images, which are directly sourced from different news websites world wide. By adjusting these parameters (among which region, scope and speed) the spectator actively perceives how news content is de- and reformed through its aesthetics.", - "image": [ - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/times1.jpg", - "thumbnailUrl": "/assets\/thumb\/times1.jpg", - "caption": "The Spectacular Times" - }, - { - "@type": "ImageObject", - "contentUrl": "/assets\/image\/times2.jpg", - "thumbnailUrl": "/assets\/thumb\/times2.jpg", - "caption": "The Spectacular Times" - } - ] - } - ], - "attendee":[ - { - "@type": "Course", - "name": "MA - Media Design and Communication", - "provider": {"@id": "r:/university/piet-zwart"}, - "addressLocality": "Rotterdam", - "temporalCoverage": "2014-2016", - "educationalCredentialAwarded": "Master of Arts" + "startDate": "2016-11-04", + "endDate": "2016-11-05", + "workFeatured": [] }, { - "@type": "Course", - "name": "MA - Creative Design for Digital Cultures", - "provider": "The Open University", - "addressLocality": "London", - "temporalCoverage": "2012-2013", - "educationalCredentialAwarded": "Master of Arts" - }, - { - "@type": "Course", - "name": "BA - Audio-visual Media", - "provider": "Hogeschool voor de Kunsten Utrecht", - "addressLocality": "Utrecht", - "temporalCoverage": "2009-2013", - "educationalCredentialAwarded": "Bachelor of Arts" - }, - { - "@type": "Course", - "name": "Propaedeutic - Mechanical Engineering", - "provider": "Twente University", - "addressLocality": "Enschede", - "temporalCoverage": "2007-2009", - "educationalCredentialAwarded": "Propaedeutic degree" + "@type": "ExhibitionEvent", + "name": "Manipulation: Emotion Hero", + "description": "I organised this exhibition as part of my Summer Sessions residency at Arquivo237. It was a modest exhibition covering my research on emotion recognition software.", + "url": "https://www.facebook.com/events/589274264578244/", + "location": { + "@type": "EventVenue", + "name": "Arquivo237", + "address": "Lisbon" + }, + "startDate": "2016-09", + "endDate": "2016-09", + "workFeatured": [], + "@reverse": { + "subEvent": { + "@id": "r:/residency/summer-sessions" + } + } } + ] + }, + "image": [ + { + "@type": "ImageObject", + "contentUrl": "/assets/image/emotionhero1-2.jpg", + "thumbnailUrl": "/assets/thumb/emotionhero1-2.jpg" + }, + { + "@type": "ImageObject", + "contentUrl": "/assets/image/emotionhero2.jpg", + "thumbnailUrl": "/assets/thumb/emotionhero2.jpg" + } ] - } + }, + { + "@type": "MediaObject", + "@id": "r:/choose-how-you-feel-you-have-seven-options", + "name": "Choose How You Feel; You Have Seven Options", + "dateCreated": "2016", + "duration": "9M9S (∞ loop)", + "artworkSurface": "3 projections", + "description": "What does it mean to feel 47% happy and 21% surprised? Choose how you feel; you have seven options is a video work that revolves around this question as it looks at software that derives emotional parameters from facial expressions. It combines human accounts and algorithmic processing to examine the intersection of highly cognitive procedures and ambiguous experiences. Born from a fascination with the technological achievements, the work interrogates the discursive apparatus the software is embedded in.\n\nThis work builds on my research into the workings of expression analysis technologies and the assumptions that underlie it, scrutinising the claims that are made by the companies developing the software.", + "@reverse": { + "workFeatured": [ + { + "@type": "ExhibitionEvent", + "name": "Big Stories Need Human Stakes", + "url": "https://nieuwevide.nl/programma/big-stories-need-human-stakes", + "location": { + "@type": "Museum", + "name": "Nieuwe Vide", + "address": "Haarlem" + }, + "startDate": "2018-02-02", + "endDate": "2018-03-04", + "workFeatured": [] + }, + { + "@type": "ExhibitionEvent", + "name": "Test_Lab the Graduation Edition", + "url": "http://v2.nl/events/test_lab-the-graduation-edition-2015-1/", + "location": { + "@id": "r:/organisation/v2_", + "@type": "Place", + "name": "V2_", + "address": "Rotterdam" + }, + "startDate": "2016-07-07 20:00", + "endDate": "2016-07-07 23:00", + "workFeatured": [] + }, + { + "@type": "ExhibitionEvent", + "name": "Fuzzy Logic - Graduation Show", + "url": "https://pzimediadesign.nl/2016.html", + "location": { + "@id": "r:/university/piet-zwart", + "@type": "CollegeOrUniversity", + "name": "Piet Zwart Institute", + "address": "Rotterdam" + }, + "startDate": "2016-06-17", + "endDate": "2016-06-26", + "workFeatured": [], + "about": { + "@id": "r:/degree/media-design" + } + } + ] + }, + "image": [ + { + "@type": "ImageObject", + "contentUrl": "/assets/image/choosehowyoufeel2-2.jpg", + "thumbnailUrl": "/assets/thumb/choosehowyoufeel2-2.jpg" + }, + { + "@type": "ImageObject", + "contentUrl": "/assets/image/choosehowyoufeel.jpg", + "thumbnailUrl": "/assets/thumb/choosehowyoufeel.jpg" + } + ] + }, + { + "@id": "r:/eye-without-a-face", + "@type": "MediaObject", + "name": "EYE Without A Face", + "dateCreated": "2016", + "duration": "11:32 (∞ loop)", + "description": "Whether the video frames are ordered by time or by emotion will not make a difference to a computer. For it, both orderings are just as logical. However, for the human spectator the reordered display of frames becomes a disruptive process. The human is positioned as a required agent for meaning making in an algorithmic procedure.\n\nIn collaboration with Cristina Cochior I went manually through the Eye's public collection, and catalogued faces by surrendering them to an emotion detection algorithm. Cutting from one face to another,its uncritical selection produced a new portrait of emotional gradients moving in-between anger and happiness.", + "author": { + "@id": "r:/person/cristina-cochior", + "@type": "Person", + "name": "Cristina Cochior", + "url": "http://randomizer.info" + }, + "image": [ + { + "@type": "ImageObject", + "contentUrl": "/assets/image/eye_0-2.jpg", + "thumbnailUrl": "/assets/thumb/eye_0-2.jpg" + }, + { + "@type": "ImageObject", + "contentUrl": "/assets/image/eye_3-2.jpg", + "thumbnailUrl": "/assets/thumb/eye_3-2.jpg" + }, + { + "@type": "ImageObject", + "contentUrl": "/assets/image/eye_6-2.jpg", + "thumbnailUrl": "/assets/thumb/eye_6-2.jpg" + } + ], + "video": { + "@id": "r:/eye-without-a-face/video", + "@type": "VideoObject", + "thumbnailUrl": "/assets/thumb/eye_1.jpg", + "contentUrl": "http://works.rubenvandeven.com/2016-eye_without_a_face/EyeWithoutAFace.mp4", + "encodingFormat": "video/mp4", + "videoFrameSize": "1920x1080" + }, + "@reverse": { + "workFeatured": [ + { + "@type": "ExhibitionEvent", + "name": "Video Vortex", + "url": "https://issuu.com/instituteofnetworkcultures/docs/catalouge_compiled_final__29-03_/29", + "location": { + "@type": "Place", + "name": " Mill Hall / Kochi-Muzeris biennial", + "address": "Kochi (India)" + }, + "startDate": "2017-04-23", + "endDate": "2017-04-26" + }, + { + "@type": "ExhibitionEvent", + "name": "Grand Instant Fiction", + "url": "http://umakart.tumblr.com/post/169464483314/grand-instant-fiction-10-sakrowski-evil", + "location": { + "@type": "EventVenue", + "name": "Umakart Gallery", + "address": "Brno" + }, + "startDate": "2016-12", + "endDate": "2016-12" + }, + { + "@type": "ExhibitionEvent", + "name": "Boundaries of the Archive", + "description": "The Piet Zwart Institute at the Eye Film Museum in Amsterdam as part of its ResearchLab series. The exhibition focussed on the boundaries of the archive. Studying the structures and cultural impacts of our media technologies, it concentrated on the intricate and usually hidden aspects of EYE's extensive archive", + "url": "https://www.eyefilm.nl/film/boundaries-of-the-archive-research-lab-piet-zwart-institute", + "location": { + "@type": "Museum", + "name": "EYE Film Museum", + "address": "Amsterdam" + }, + "startDate": "2016-04-12", + "endDate": "2014-04-24" + } + ] + } + }, + { + "@type": "ScholarlyArticle", + "name": "Article - Emotion Hero", + "pageStart": "422", + "pageEnd": "423", + "isPartOf": [ + "C&C '17 Proceedings of the 2017 ACM SIGCHI Conference on Creativity and Cognition", + { + "@id": "r:/event/creativity-and-cognition" + } + ], + "description": "What does it mean to feel 62% joy, and 15% surprised? Over the past years the digitization of emotions is booming business: multimillion dollar investments are made in technologies of which is claimed that they give companies an objective view in their consumers' feelings. The video-game-artwork Emotion Hero challenges the user to investigate this claim and question the premise of the technology. Emotion Hero is a two-part artwork. On the one hand is a video-game that is freely downloadable for everybody with an Android device. Inspired by Guitar Hero, the user scores points by following given cues. It provides detailed feedback on the mechanics of the face. The second part is a projection that shows a grid with aggregated scores of the game, that updates live. In its design, the grid refers to 19th century positivist practices.", + "url": "https://doi.org/10.1145/3059454.3059490/", + "publisher": "ACM New York, NY, USA", + "datePublished": "2017-01-27" + }, + { + "@id": "r:/article/choose-how-you-feel-you-have-seven-options", + "@type": "Report", + "name": "Longform - Choose How You Feel; You Have Seven Options", + "description": "What does it mean to feel 82% surprised or 93% joy? As part of their Longform series, the Institute of Network Cultures published my research into software that derives emotional scores from facial expressions.", + "url": "http://networkcultures.org/longform/2017/01/25/choose-how-you-feel-you-have-seven-options/", + "datePublished": "2017-01-27", + "publisher": { + "@type": "Organization", + "name": "Institute of Network Cultures", + "url": "http://networkcultures.org" + }, + "@reverse": { + "about": [ + { + "@type": "Event", + "name": "Presentation @ Act Natural 04", + "startDate": "2019-06-08", + "endDate": "2019-06-08", + "organizer": "Jeisson Drenth", + "location": "Doornroosje, Rotterdam" + }, + { + "@type": "Event", + "name": "Presentation @ BARTALK #12: Coded Gestures", + "startDate": "2018-10-26", + "endDate": "2018-10-26", + "organizer": [ + "Yun Ingrid Lee", + "Rae Parnell" + ], + "location": "Doornroosje, Rotterdam", + "url": "https://bartalkdh.wordpress.com/bartalk-12-coded-gestures/" + }, + { + "@type": "Event", + "name": "Presentation @ Media Lab UFRJ", + "startDate": "2018-05-25", + "endDate": "2018-05-25", + "organizer": "Media Lab UFRJ & Dutch Consulate", + "location": "Rio de Janeiro", + "url": "http://medialabufrj.net/" + }, + { + "@type": "Event", + "name": "Presentation @ Instituto Europeo di Design", + "url": "https://www.ied.edu/ied-locations/sao-paulo", + "startDate": "2018-05-22", + "endDate": "2018-05-22", + "organizer": "Instituto Europeo di Design & Dutch Consulate", + "location": "São Paulo" + }, + { + "@type": "Event", + "name": "Presentation @ Nuffic Neso", + "url": "https://www.nuffic.nl/onderwerpen/kantoren-het-buitenland/", + "startDate": "2018-05-21", + "endDate": "2018-05-21", + "organizer": "Nuffic Neso & Dutch Consulate", + "location": "São Paulo" + }, + { + "@type": "Event", + "name": "Presentation @ Festival PATH", + "url": "https://www.festivalpath.com.br/palestras/#palestrante-ruben-van-de-ven", + "startDate": "2018-05-19", + "endDate": "2018-05-19", + "organizer": "Dutch Consulate", + "location": "São Paulo" + }, + { + "@type": "Event", + "name": "Presentation @ The Hmm", + "url": "https://thehmm.nl/the-hmm-x-baut/", + "startDate": "2018-03-28", + "endDate": "2018-03-28", + "organizer": "The Hmm", + "location": "Baut, Amsterdam" + }, + { + "@type": "EducationEvent", + "name": "Presentation @ Industrial Design", + "startDate": "2018-03-06", + "endDate": "2018-03-06", + "organizer": "Felienne Hermans, TU Delft", + "location": "TU Delft" + }, + { + "@type": "Event", + "name": "Presentation @ Worlding the Brain II", + "url": "https://worldingthebrain2017.com", + "startDate": "2017-11-02", + "endDate": "2017-11-04", + "organizer": "ASCA Research Group Neuroaesthetics and Neurocultures, University of Amsterdam", + "location": "CREA, Amsterdam" + }, + { + "@type": "Event", + "name": "Presentation @ Creative Coding Utrecht", + "startDate": "2017", + "organizer": { + "@id": "r:/organisation/ccu" + }, + "location": "Stadstuin, Utrecht" + }, + { + "@type": "EducationEvent", + "name": "Workshop: Artistic Point of Interference", + "url": "https://caradt.com/2017/03/07/ekv-13-march-lecture-by-human-index/", + "startDate": "2017-03-13", + "endDate": "2017-03-14", + "organizer": "St. Joost Academy", + "location": "Breda" + }, + { + "@type": "Event", + "name": "Presentation @ Cqrrelations publication launch", + "url": "http://cqrrelations.constantvzw.org/0x0/", + "startDate": "2016-06-11", + "endDate": "2016-06-11", + "organizer": "Constant VZW.", + "location": "FoAM, Brussels" + }, + { + "@type": "Event", + "name": "Panel: Tracking Emotions", + "url": "https://state-studio.com/participant/2016/ruben-van-de-ven", + "startDate": "2018-11-04", + "endDate": "2018-11-04", + "@reverse": { + "subEvent": { + "@id": "r:/festival/statefestival" + } + }, + "recordedIn": { + "@id": "r:/panel/stateofemotion/video", + "@type": "VideoObject", + "embedUrl": "https://www.youtube.com/embed/L2O6ecO-8PM?start=2062", + "thumbnailUrl": "https://i.ytimg.com/vi/L2O6ecO-8PM/maxresdefault.jpg" + } + }, + { + "@type": "Event", + "name": "Presentation @ Digitalorders", + "url": "https://www.normativeorders.net/en/events/young-researchers-conferences/34-veranstaltungen/nachwuchskonferenz/5114-seventh-international-young-researchers-conference", + "startDate": "2016-11-17", + "endDate": "2016-11-19", + "organizer": "Goethe University", + "location": "Frankfurt am Main" + }, + { + "@type": "Event", + "name": "Presentation @ Winter school", + "alternateName": "What happens to the data in 'Big Data'?", + "url": "www.bsts.be/wp-content/uploads/winter_school_2016-1.pdf", + "startDate": "2016-02", + "endDate": "016-02", + "organizer": "Workgroup: algorithmic governmentality", + "location": "University of Namur" + }, + { + "@type": "Event", + "name": "Presentation @ Art Meets Radical Openness", + "url": "https://www.radical-openness.org/en/festival/2016", + "startDate": "2018-05-25", + "endDate": "2018-05-28", + "location": "Linz" + }, + { + "@type": "Event", + "name": "Presentation @ Digital Emotions Workgroup", + "url": "http://asca.uva.nl/content/research-groups/digital-emotions/digital-emotions.html", + "startDate": "2016", + "endDate": "2016", + "organizer": "Amsterdam School for Cultral Analysis", + "location": "University of Amsterdam" + } + ] + } + }, + { + "@type": "MediaObject", + "name": "We know how you feel", + "dateCreated": "2015", + "description": "A two-part artwork and my first work on software that derives emotional parameters from facial expressions. The first part displays the Mind Reading Emotions Library, an interactive collection of videos, audio fragments and scenes depicting 412 distinct emotions —ranging from `angry' to `unsure'— grouped in 24 categories. The second part of the project is a tablet with a modified demo app by Affectiva, a major player in the field of emotion analysis software. This app acts as an interactive mirror which displays the various parameters that the Affectiva software derives from someone's facial expression, while a voice over reads a text extracted from the Dutch classic Beyond Sleep by W.F. Hermans (1966), concerning the impact of the mirror, photography and video on the human self-image.", + "image": [ + { + "@type": "ImageObject", + "contentUrl": "/assets/image/we_know_how_you_feel.jpg", + "thumbnailUrl": "/assets/thumb/we_know_how_you_feel.jpg", + "caption": "We know how you feel" + }, + { + "@type": "ImageObject", + "contentUrl": "/assets/image/we_know_how_you_feel-3.jpg", + "thumbnailUrl": "/assets/thumb/we_know_how_you_feel-3.jpg", + "caption": "Mind Reading Emotions Library" + } + ], + "@reverse": { + "workFeatured": [ + { + "@id": "r:/exhibition/codesandmodes" + }, + { + "@id": "r:/exhibition/stateofemotion" + }, + { + "@type": "ExhibitionEvent", + "name": "An Encyclopedia of Media Objects", + "url": "http://v2.nl/events/an-encyclopedia-of-media-objects", + "startDate": "2015-06-26", + "endDate": "2015-06-27", + "description": "What is an encyclopedia? What are media? What is an object? Students of the Piet Zwart Institute Media Design Masters programme invite you to look at these issues. Twelve installations and one choreography present a taxonomy of disappearing, human and non-human, introvert and collected media objects.\n\nThis exhibition was developed in a 'Thematic Seminar' run in the summer trimester 2015 taught by Florian Cramer.\n\nArtists: Lucas Battich [IT], Manetta Berends [NL], Julie Boschat Thorez [FR], Cihad Caner [TR], Joana Chicau [PT], Cristina Cochior [RO], Solange Frankort [NL], Arantxa Gonlag [NL], Anne Lamb [US], Benjamin Li [NL], Yuzhen Tang [CN], Ruben van de Ven [NL] & Thomas Walskaar [NO]", + "location": { + "@id": "r:/organisation/v2_" + } + } + ] + } + }, + { + "@type": "MediaObject", + "name": "Fragments of reality", + "dateCreated": "2015-01-01", + "description": "In western society, images are generally perceived as objective traces of events. As evidence that things happened as how they are captured in the frame.\n\nAs Susan Sontag elaborates, this counts for photographic images in particular. They are seen, not as subjective statements about the world, but rather as pieces of it —as fragments of a reality. Photographic images are often seen as unbiased; they carry in them the \"burden of truth\". We use them to give meaning, to asses and to judge. It exactly is in this passivity of the image, that its aggression lurks.\nFragments of Reality is a newspaper that assembles descriptions of five images of one event: a press conference with Jeroen Dijsselbloem and Yanis Varoufakis. Each interviewee was shown one of the images, in an attempt to highlight how we read events trough photographs.\n\nIt considers an event not as a single factual moment, but as the cumulative of subjective experiences, inherently proposing that an image is always lacking in its representation of that which it presents.", + "image": [ + { + "@type": "ImageObject", + "contentUrl": "/assets/image/fragments-6-2.jpg", + "thumbnailUrl": "/assets/thumb/fragments-6-2.jpg", + "caption": "Fragments of reality" + }, + { + "@type": "ImageObject", + "contentUrl": "/assets/image/fragments-9-2.jpg", + "thumbnailUrl": "/assets/thumb/fragments-9-2.jpg", + "caption": "Fragments of reality" + }, + { + "@type": "ImageObject", + "contentUrl": "/assets/image/fragments-7-2.jpg", + "thumbnailUrl": "/assets/thumb/fragments-7-2.jpg", + "caption": "Fragments of reality" + } + ] + }, + { + "@type": "Movie", + "name": "Waterdagen", + "dateCreated": "2013", + "description": "Adam is security guard at a nursing home with comatose patients. During his night shifts he has unsettling visions of someone drowning. He seeks his comfort in the company of his pregnant girlfriend. Days of Water is a story on guilt and shame; and on a longing for hope.\nI wrote and directed this film for my graduation as film director for fiction at the Utrecht School of the Arts.\nIt was accompanied by my MA research on spectatorial emotion and the influence emotions on the spectator's sympathy for the protagonist.", + "image": [ + { + "@type": "ImageObject", + "contentUrl": "/assets/image/waterdagen-teaser.jpg", + "thumbnailUrl": "/assets/thumb/waterdagen-teaser.jpg" + }, + { + "@type": "ImageObject", + "contentUrl": "/assets/image/waterdagen1.jpg", + "thumbnailUrl": "/assets/thumb/waterdagen1.jpg" + } + ], + "@reverse": { + "workFeatured": [ + { + "@type": "ExhibitionEvent", + "name": "High Desert International Film Festival ", + "url": "http://routedunord.nl/portfolio-item/ruben-van-de-ven-2/", + "location": { + "@type": "Festival", + "name": "High Desert International Film Festival ", + "address": "Pahrump, Nevada" + }, + "startDate": "2014-05", + "endDate": "2014-05", + "workFeatured": [] + } + ] + } + }, + { + "@type": "MediaObject", + "name": "Co-Poet", + "dateCreated": "2012", + "url": "http://projectkaleido.nl/#copoet", + "description": "For the visitors of the Crossing Border festival in The Hague we desgined an installation to collaboratively contribute to a poem.\nBased on the input of the user, a sentence is added to the poem, originating from digitalised texts of artists participating in the festival.\nThe text was combined with an audiovisual presentation that changed depending on the user's input.", + "image": [ + { + "@type": "ImageObject", + "contentUrl": "/assets/image/copoet1.jpg", + "thumbnailUrl": "/assets/thumb/copoet1.jpg" + } + ], + "@reverse": { + "workFeatured": [ + { + "@type": "ExhibitionEvent", + "name": "Crossing Border", + "location": { + "@type": "PerformingArtsTheater", + "name": "Leidse Schouwburg", + "address": "Leiden" + }, + "startDate": "2012-11-14", + "endDate": "2012-11-17", + "workFeatured": [] + } + ] + } + }, + { + "@type": "MediaObject", + "name": "Rangi Ya Samawati", + "dateCreated": "2012", + "description": "The Colour of Blue. A diptych about two Tanzanians: a miner and a lobster fisher. How do they live, work and survive; and how do they see their own future? Each of the two men is in his own way depending on nature, everyday gambling for a good catch.\nThis documentary was shot complementary to our work at the Kilimanjaro Film Institute in Arusha.\nDocumentary, 14′42″. The full film is available on Youtube.", + "image": [ + { + "@type": "ImageObject", + "contentUrl": "/assets/image/samawati-prev2.jpg", + "thumbnailUrl": "/assets/thumb/samawati-prev2.jpg" + }, + { + "@type": "ImageObject", + "contentUrl": "/assets/image/samawati-prev1.jpg", + "thumbnailUrl": "/assets/thumb/samawati-prev1.jpg" + } + ], + "video": { + "@id": "r:/samawati/video", + "@type": "VideoObject", + "thumbnailUrl": "/assets/thumb/samawati.mp4.jpg", + "contentUrl": "/assets/video/samawati.mp4", + "encodingFormat": "video/mp4", + "videoFrameSize": "1280x1024" + } + }, + { + "@type": "MediaObject", + "name": "Virtual Afterlife", + "dateCreated": "2010", + "description": "A short HKU project on the future of social media, when it was still an upcomming phenomenon. It is made in two weeks for a series of shorts with a given start and ending image.\nWe asked ourselves: what happens if our online identity lives on after we die? Do we still live on if a part of our online identity does? How can this virtual identity be shaped?\n2′10″", + "image": [ + { + "@type": "ImageObject", + "contentUrl": "/assets/image/guerilla2.jpg", + "thumbnailUrl": "/assets/thumb/guerilla2.jpg" + } + ], + "video": { + "@id": "r:/assets/video/guerilla_project.mp4#videoobject", + "@type": "VideoObject", + "contentUrl": "/assets/video/guerilla_project.mp4", + "thumbnailUrl": "/assets/thumb/guerilla_project.mp4.jpg", + "encodingFormat": "video/mp4", + "videoFrameSize": "1280x1024" + } + } + ], + "contributor": [ + { + "@id": "r:/pillow-talk", + "@type": "MediaObject", + "name": "Pillow Talk", + "dateCreated": "2019", + "description": "The voice is surely an uncanny phenomenon. In the digital age it leaves us constantly in doubt, if a person or a non-person is speaking. In this immersive performance, doubt and conviction change roles in the blink of an eye. Spread out on a hilly landscape, audience engages in a conversation with something that is there and not there at the same time. An artificial voice functions as a mediator, a partner and a mirror to one's own.\n\nWhile conversations are constructed word-by-word, impressions are shared, naps are taken, and time is passed, Pillow Talk is an invitation to suspend eye-to-eye relations and to reposition yourself in direct relation to the non-human.\n\nI developed the interface for the participants, as well as a custom story flow editor for the director/writer Begüm Erciyas.", + "url": "https://www.begumerciyas.com/work/pillow-talk-2019/", + "@reverse": { + "author": [ + { + "@type": "Person", + "name": "Begüm Erciyas", + "url": "https://www.begumerciyas.com" + } + ], + "workFeatured": [ + { + "@type": "TheaterEvent", + "name": "Kunstenfestivaldesarts", + "url": "https://www.kfda.be/en/program/pillow-talk", + "location": "KVS, Brussels", + "startDate": "2019-05-15", + "endDate": "2019-05-20", + "workFeatured": [] + }, + { + "@type": "TheaterEvent", + "name": "Festival Politics of Algorithms", + "location": "Münchner Kammerspiele", + "startDate": "2019-06-14", + "endDate": "2019-06-16", + "workFeatured": [] + }, + { + "@type": "TheaterEvent", + "name": "New Empathies Program Series", + "location": "Radialsystem, Berlin", + "startDate": "2019-08-29", + "endDate": "2019-08-31", + "workFeatured": [] + }, + { + "@type": "TheaterEvent", + "name": "New Settings/Fondation d'Enterprise Hermés", + "location": "Theatre Nanterre-Amandiers, Paris", + "startDate": "2019-11-13", + "endDate": "2019-11-16", + "workFeatured": [] + }, + { + "@type": "TheaterEvent", + "name": "NEXT Festival", + "location": "Kortrijk", + "startDate": "2019-11-29", + "endDate": "2019-11-31", + "workFeatured": [] + }, + { + "@type": "TheaterEvent", + "name": "Winzavod Art Center", + "location": "Moscow", + "startDate": "2020-02-14", + "endDate": "2020-02-28", + "workFeatured": [] + }, + { + "@type": "TheaterEvent", + "name": "STUK", + "location": "Leuven", + "startDate": "2020-03-19", + "endDate": "2020-03-20", + "workFeatured": [] + } + ] + }, + "image": [ + { + "@type": "ImageObject", + "contentUrl": "/assets/image/pillow_talk01.jpg", + "thumbnailUrl": "/assets/thumb/pillow_talk01.jpg" + }, + { + "@type": "ImageObject", + "contentUrl": "/assets/image/pillow_talk02.jpg", + "thumbnailUrl": "/assets/thumb/pillow_talk02.jpg" + }, + { + "@type": "ImageObject", + "contentUrl": "/assets/image/pillow_talk03.jpg", + "thumbnailUrl": "/assets/thumb/pillow_talk03.jpg" + } + ], + "about": [ + { + "@type": "VisualArtsEvent", + "name": "Residency: PACT Zollverein", + "startDate": "2019", + "url": "https://www.pact-zollverein.de/en" + }, + { + "@type": "VisualArtsEvent", + "name": "Residency: Buda", + "startDate": "2019", + "url": "https://www.budakortrijk.be/en/residenties/beguem-erciyas-tr-hugvie" + } + ] + }, + { + "@type": "MediaObject", + "name": "The Specta­cular Times", + "dateCreated": "2013-12-04", + "author": { + "@id": "r:/person/ward-goes", + "@type": "Person", + "name": "Ward Goes", + "url": "http://www.wardgoes.nl" + }, + "url": "http://spectacularspectacular.news", + "description": "Originally initiated as a graduation project (cum laude) by Ward Goes, The Spectacular Times is an ongoing visual inquiry into the presentation of news. It investigates how news, rather than being subjective, is representational of its social, cultural, (geo)political and ideological contexts. The project sets out to lay bare these representations in currently circulating news.\n\nBy layering and contrasting different news elements The Spectacular Times re-contextualises news and makes explicit the intangible notions that lie beyond an increasingly universal guise of news reporting. Not in an effort to tell apart true from false, left from right, or right from wrong, but in order to accentuate a variety of articulations of news.\n\nThis web based project uses user defined variables to animate news headers, texts and images, which are directly sourced from different news websites world wide. By adjusting these parameters (among which region, scope and speed) the spectator actively perceives how news content is de- and reformed through its aesthetics.", + "image": [ + { + "@type": "ImageObject", + "contentUrl": "/assets/image/times1.jpg", + "thumbnailUrl": "/assets/thumb/times1.jpg", + "caption": "The Spectacular Times" + }, + { + "@type": "ImageObject", + "contentUrl": "/assets/image/times2.jpg", + "thumbnailUrl": "/assets/thumb/times2.jpg", + "caption": "The Spectacular Times" + } + ] + } + ], + "attendee": [ + { + "@id": "r:/residency/summer-sessions", + "@type": "VisualArtsEvent", + "name": "Residency: Summer Sessions 2016", + "url": [ + "http://summersessions.net/17-projects/projects-2016/55-emotion-hero", + "http://www.arquivo237.com/en/Passado/manipulation-emotion-hero-2/" + ], + "description": "I was part of the Summer Sessions Network for Talent Development in a co-production of Arquivo 237 and V2_ Lab for the Unstable Media, with support of the Creative Industries Fund NL.", + "startDate": "2016-09", + "endDate": "2016-10", + "about": { + "@id": "r:/emotionhero" + } + }, + { + "@id": "r:/residency/q21", + "@type": "VisualArtsEvent", + "name": "Residency: Q21", + "startDate": "2017-01", + "endDate": "2017-02", + "url": "https://www.mqw.at/institutionen/q21/artists-in-residence/2016/ruben-van-de-ven/", + "@reverse": { + "subEvent": { + "@id": "r:/exhibition/mood_swings" + } + }, + "location": { + "@id": "r:/place/q21" + } + }, + { + "@id": "r:/event/cqrrelations", + "@type": "Event", + "name": "Cqrrelations Worksession", + "url": "http://cqrrelations.constantvzw.org/", + "startDate": "2015-01-18", + "endDate": "2015-01-23", + "organizer": { + "@id": "r:/organisation/constant", + "url": "http://constantvzw.org", + "@type": "Organization", + "name": "Constant" + } + } + ], + "hasCredential": [ + { + "@id": "r:/degree/media-design", + "@type": "EducationalOccupationalCredential", + "name": "MA - Media Design and Communication", + "credentialCategory": "Master of Arts", + "temporalCoverage": "2014-2016", + "@reverse": { + "educationalCredentialAwarded": { + "@id": "r:/university/piet-zwart" + } + }, + "about": { + "@id": "r:/choose-how-you-feel-you-have-seven-options" + } + }, + { + "@id": "r:/degree/cddc", + "@type": "EducationalOccupationalCredential", + "name": "MA - Creative Design for Digital Cultures", + "credentialCategory": "Master of Arts", + "temporalCoverage": "2012-2013", + "@reverse": { + "educationalCredentialAwarded": { + "@type": "CollegeOrUniversity", + "name": "The Open University", + "addressLocality": "London" + } + } + }, + { + "@id": "r:/degree/avm", + "@type": "EducationalOccupationalCredential", + "name": "BA - Audio-visual Media", + "credentialCategory": "Bachelor of Arts", + "temporalCoverage": "2009-2013", + "@reverse": { + "educationalCredentialAwarded": { + "@type": "Hogeschool voor de Kunsten Utrecht", + "addressLocality": "Utrecht" + } + } + }, + { + "@id": "r:/degree/mechanical-engineering", + "@type": "EducationalOccupationalCredential", + "name": "Propaedeutic - Mechanical Engineering", + "credentialCategory": "Propaedeutic degree", + "temporalCoverage": "2007-2009", + "@reverse": { + "educationalCredentialAwarded": { + "@type": "Twente University", + "addressLocality": "Enschede" + } + } + } + ] + } } -} +} \ No newline at end of file diff --git a/src/js/portfolio.js b/src/js/portfolio.js index b13cd67..0b510b1 100644 --- a/src/js/portfolio.js +++ b/src/js/portfolio.js @@ -33,7 +33,7 @@ function getNodeYear(n){ return n['https://schema.org/datePublished'].substr(0,4); } if(typeof n['https://schema.org/startDate'] !== 'undefined') { - console.log(n['https://schema.org/startDate']); + // console.log(n['https://schema.org/startDate']); return n['https://schema.org/startDate'].substr(0,4); } if(typeof n['https://schema.org/endDate'] !== 'undefined') { @@ -114,10 +114,21 @@ var graph; var nodeMap = {}; var linkMap = {}; var breadcrumbs = {}; +var weights = {}; + // load the flattened jsonld file -const requestPromise = fetch('/assets/js/rubenvandeven.jsonld') - .then(r => r.json()) - .then(data => { +const requestPromise = fetch('/assets/js/rubenvandeven.jsonld').then(r => r.json()); +const rankingPromise = fetch('/assets/js/ranking.json').then(r => r.json()); + +Promise.all([requestPromise, rankingPromise]) + .then(values => { + if(values[0].hasOwnProperty('@graph')) { + data = values[0]; + weights = values[1]; + } else { + data = values[1]; + weights = values[0]; + } graph = jsonLdToGraph(data['@graph']); // create a map of nodes by id. for(let i in graph.nodes) { @@ -169,8 +180,8 @@ var firstNodeId = "https://rubenvandeven.com/"; function getSizeForNode(node) { if(node.hasOwnProperty('https://schema.org/thumbnailUrl')) return nodeSize; - //if(weights[node['@id']]) - // return nodeSize * weights[node['@id']]; + if(weights[node['@id']]) + return nodeSize * weights[node['@id']]; if(node['@id'] == firstNodeId) return nodeSize*1.2; // everynode has at least one link. these should equal 1 @@ -442,7 +453,7 @@ var centerByType = function(types, updateHistory) { deselectNode(); if(updateHistory) { // TODO: working - console.log(types[0], getDisplayAttr(types[0]),types.map(getDisplayAttr)); + // console.log(types[0], getDisplayAttr(types[0]),types.map(getDisplayAttr)); history.pushState({types: types}, "", "/@type/"+(types.map(getDisplayAttr).join("+"))); } else { history.replaceState({types: types}, "", "/@type/"+(types.map(getDisplayAttr).join("+"))); @@ -614,11 +625,15 @@ var setDetails = function(nodeDatum, nodeIdx) { } } - // relationships / links in
+ // relationships / links incomming
for(let attr in relDown) { let attrEl = document.createElement("dt"); attrEl.innerHTML = getDisplayAttr(attr); relsEl.appendChild(attrEl); + + // highest pagerank first: + relDown[attr].sort((a,b) => weights[b['@id']] - weights[a['@id']]); + for(let i in relDown[attr]) { let rel = relDown[attr][i]; relsEl.appendChild(createRelationshipEl(rel)); @@ -637,10 +652,15 @@ var setDetails = function(nodeDatum, nodeIdx) { } } + // relationships / links outgoing
for(let attr in relUp) { let attrEl = document.createElement("dt"); attrEl.innerHTML = getDisplayAttr(attr); relsEl.appendChild(attrEl); + + // highest pagerank first: + relUp[attr].sort((a,b) => weights[b['@id']] - weights[a['@id']]); + for(let i in relUp[attr]) { let rel = relUp[attr][i]; relsEl.appendChild(createRelationshipEl(rel, i)); diff --git a/src/scss/portfolio.scss b/src/scss/portfolio.scss index 14cbef9..3679ab0 100644 --- a/src/scss/portfolio.scss +++ b/src/scss/portfolio.scss @@ -20,7 +20,8 @@ body{ // - NunitoSansRegular font-weight: light; height: 100vh; - background: black; + background:#222; + // background: radial-gradient(purple, darken(purple, 10%)); font-size: 12pt; } @@ -271,7 +272,8 @@ text{ .nodeType{ font-size:80%; - text-transform: uppercase; + // text-transform: uppercase; + font-variant-caps: small-caps; color: #999; margin-left:10px; @@ -329,6 +331,7 @@ text{ font-weight:bold; min-height:25px; clear:both; + word-wrap: anywhere; // relations like "educationalCredentialAward" are crazily long.. } dd{ min-height:30px;