1<!DOCTYPE html> 2<html lang="en"> 3 4<head> 5 6 <meta charset="utf-8"> 7 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 8 9 <title>Structed's Blog - About Me</title> 10 11 <link rel="canonical" href="https://blog.structed.me/about"> 12 13 <link type="application/rss+xml" rel="alternate" href="/feed.rss" /> 14 <link type="application/atom+xml" rel="alternate" href="/feed.atom" /> 15 16 <meta name="application-name" content="Structed's Blog" /> 17 <meta name="msapplication-tooltip" content="Structed's Blog" /> 18 <meta name="msapplication-starturl" content="/" /> 19 20 <meta property="og:title" content="Structed's Blog - About Me" /> 21 <meta property="og:image" content="https://blog.structed.me/images/virus.jpg" /> 22 <meta property="og:type" content="website" /> 23 <meta property="og:url" content="https://blog.structed.me/about" /> 24 25 <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"> 26 <link rel="icon" href="/favicon.ico" type="image/x-icon"> 27 28 <!-- Bootstrap core CSS --> 29 <link href="/vendor/bootstrap/scss/bootstrap.css" rel="stylesheet"> 30 31 <!-- Custom fonts for this template --> 32 <link href="/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css"> 33 <link href="/vendor/fontawesome-free/css/brands.min.css" rel="stylesheet" type="text/css"> 34 <link href='https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic' rel='stylesheet' type='text/css' data-no-mirror> 35 <link href='https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css' data-no-mirror> 36 37 <!-- Custom styles for this template --> 38 <link href="/scss/clean-blog.css" rel="stylesheet"> 39 40
40<script src="https://cdn.jsdelivr.net/npm/[email protected]/components/prism-core.min.js"></script>
40 41
41<script src="https://cdn.jsdelivr.net/npm/[email protected]/plugins/autoloader/prism-autoloader.min.js" data-no-mirror></script>
41 42
42<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/quicklink.umd.js"></script>
42 43 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/themes/prism.css"> 44 45 46
47<script type="text/javascript"> 48 !function(T,l,y){var S=T.location,k="script",D="instrumentationKey",C="ingestionendpoint",I="disableExceptionTracking",E="ai.device.",b="toLowerCase",w="crossOrigin",N="POST",e="appInsightsSDK",t=y.name||"appInsights";(y.name||T[e])&&(T[e]=t);var n=T[t]||function(d){var g=!1,f=!1,m={initialize:!0,queue:[],sv:"5",version:2,config:d};function v(e,t){var n={},a="Browser";return n[E+"id"]=a[b](),n[E+"type"]=a,n["ai.operation.name"]=S&&S.pathname||"_unknown_",n["ai.internal.sdkVersion"]="javascript:snippet_"+(m.sv||m.version),{time:function(){var e=new Date;function t(e){var t=""+e;return 1===t.length&&(t="0"+t),t}return e.getUTCFullYear()+"-"+t(1+e.getUTCMonth())+"-"+t(e.getUTCDate())+"T"+t(e.getUTCHours())+":"+t(e.getUTCMinutes())+":"+t(e.getUTCSeconds())+"."+((e.getUTCMilliseconds()/1e3).toFixed(3)+"").slice(2,5)+"Z"}(),iKey:e,name:"Microsoft.ApplicationInsights."+e.replace(/-/g,"")+"."+t,sampleRate:100,tags:n,data:{baseData:{ver:2}}}}var h=d.url||y.src;if(h){function a(e){var t,n,a,i,r,o,s,c,u,p,l;g=!0,m.queue=[],f||(f=!0,t=h,s=function(){var e={},t=d.connectionString;if(t)for(var n=t.split(";"),a=0;a<n.length;a++){var i=n[a].split("=");
482===i.length&&(e[i[0][b]()]=i[1])}if(!e[C]){var r=e.endpointsuffix,o=r?e.location:null;e[C]="https://"+(o?o+".":"")+"dc."+(r||"services.visualstudio.com")}return e}(),c=s[D]||d[D]||"",u=s[C],p=u?u+"/v2/track":d.endpointUrl,(l=[]).push((n="SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)",a=t,i=p,(o=(r=v(c,"Exception")).data).baseType="ExceptionData",o.baseData.exceptions=[{typeName:"SDKLoadFailed",message:n.replace(/\./g,"-"),hasFullStack:!1,stack:n+"\nSnippet failed to load ["+a+"] -- Telemetry is disabled\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\nHost: "+(S&&S.pathname||"_unknown_")+"\nEndpoint: "+i,parsedStack:[]}],r)),l.push(function(e,t,n,a){var i=v(c,"Message"),r=i.data;r.baseType="MessageData";var o=r.baseData;return o.message='AI (Internal): 99 message:"'+("SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) ("+n+")").replace(/\"/g,"")+'"',o.properties={endpoint:a},i}(0,0,t,p)),function(e,t){if(JSON){var n=T.fetch;if(n&&!y.useXhr)n(t,{method:N,body:JSON.stringify(e),mode:"cors"});else if(XMLHttpRequest){var a=new XMLHttpRequest;a.open(N,t),a.setRequestHeader("Content-type","application/json"),a.send(JSON.stringify(e))}}}(l,p))}function i(e,t){f||setTimeout(function(){!t&&m.core||a()},500)}var e=function(){var n=l.createElement(k);n.src=h;var e=y[w];return!e&&""!==e||"undefined"==n[w]||(n[w]=e),n.onload=i,n.onerror=a,n.onreadystatechange=function(e,t){"loaded"!==n.readyState&&"complete"!==n.readyState||i(0,t)},n}();y.ld<0?l.getElementsByTagName("head")[0].appendChild(e):setTimeout(function(){l.getElementsByTagName(k)[0].parentNode.appendChild(e)},y.ld||0)}try{m.cookie=l.cookie}catch(p){}function t(e){for(;e.length;)!function(t){m[t]=function(){var e=arguments;g||m.queue.push(function(){m[t].apply(m,e)})}}(e.pop())}var n="track",r="TrackPage",o="TrackEvent";t([n+"Event",n+"PageView",n+"Exception",n+"Trace",n+"DependencyData",n+"Metric",n+"PageViewPerformance","start"+r,"stop"+r,"start"+o,"stop"+o,"addTelemetryInitializer","setAuthenticatedUserContext","clearAuthenticatedUserContext","flush"]),m.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4};var s=(d.extensionConfig||{}).ApplicationInsightsAnalytics||{};if(!0!==d[I]&&!0!==s[I]){var c="onerror";t(["_"+c]);var u=T[c];T[c]=function(e,t,n,a,i){var r=u&&u(e,t,n,a,i);return!0!==r&&m["_"+c]({message:e,url:t,lineNumber:n,columnNumber:a,error:i}),r},d.autoExceptionInstrumented=!0}return m}(y.cfg);function a(){y.onInit&&y.onInit(n)}(T[t]=n).queue&&0===n.queue.length?(n.queue.push(a),n.trackPageView({})):a()}(window,document,{ 49 src: "https://js.monitor.azure.com/scripts/b/ai.2.min.js", // The SDK URL Source 50 // name: "appInsights", // Global SDK Instance name defaults to "appInsights" when not supplied 51 // ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout, 52 // useXhr: 1, // Use XHR instead of fetch to report failures (if available), 53 crossOrigin: "anonymous", // When supplied this will add the provided value as the cross origin attribute on the script tag 54 // onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument -- the sdk instance (DO NOT ADD anything to the sdk.queue -- As they won't get called) 55 cfg: { // Application Insights Configuration 56 connectionString: "InstrumentationKey=c6d2ff53-bb5e-419a-b0ad-a14645b19e54;IngestionEndpoint=https://northeurope-2.in.applicationinsights.azure.com/" 57 }}); 58</script>
58 59 60 61 62</head> 63 64<body> 65 66 <!-- Navigation --> 67 <nav class="navbar navbar-expand-lg navbar-light fixed-top" id="mainNav"> 68 <div class="container"> 69 <a class="navbar-brand" href="/">Structed's Blog</a> 70 <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation"> 71 Menu 72 <i class="fas fa-bars"></i> 73 </button> 74 <div class="collapse navbar-collapse" id="navbarResponsive"> 75 <ul class="navbar-nav ml-auto"> 76 <li class="nav-item"> 77 <a class="nav-link" href="/posts">Posts</a> 78 </li> 79 <li class="nav-item"> 80 <a class="nav-link" href="/tags">Tags</a> 81 </li> 82 <li class="nav-item"> 83 <a class="nav-link" href="/about">About Me</a> 84 </li> 85 <li class="nav-item"> 86 <a class="nav-link" href="/imprint">Imprint</a> 87 </li> 88</ul> 89 </div> 90 </div> 91</nav> 92 93 <!-- Page Header --> 94 <header class="masthead" style="background-image: url("/images/virus.jpg")"> 95 <div class="overlay"></div> 96 <div class="container"> 97 <div class="row"> 98 <div class="col-md-12"> 99 <div class="site-heading"> 100 <h1> 101 About Me 102 </h1> 103 </div> 104 </div> 105 </div> 106 </div> 107</header> 108 109 <!-- Main Content --> 110 <div class="container"> 111 <div class="row"> 112 <div id="content" class="col-md-12"> 113 <p><img src="images/Profile.jpg" alt="drawing" width="200" style="float: right; padding-left: 30px;padding-bottom: 30px"/> 114My name is Johannes Ebner - I am a Husband, Dad of two lovely girls and two fluffy cats. 115Since I am a gamer, ex-game developer, ex-backend-developer/SRE/DevOps engineer I know quite a lot about making games, running games as a service, launching them and keeping them alive! 116<p>I have worked with many AAA studios, indie & mobile developers and publishers across Europe and the world and helped them ship games, build online services and saved many of them from the brink of failure.</p> 117<blockquote> 118<p>I'd love to help YOU build your game and make it a success! Contact me <a href="mailto:pelase-useyourname-hereinstead-so-i-can-block-spammers@structed.me">via E-Mail</a>, via <a href="https://linkedin.com/in/johannesebner">LinkedIn</a> or use the embedded contact form below!</p> 119</blockquote> 120<h1 id="reference-projects">Reference Projects</h1> 121<p>A selection of projects I have worked on, either as a freelancer or as an employee, and which I can talk about publicly.</p> 122<h2 id="valheim">Valheim</h2> 123<p>I helped migrate Valheim's multiplayer backend from Steam to PlayFab. My role was to consult <a href="https://www.coffeestainpublishing.com/">Coffee Stain Publishing</a> and <a href="https://www.piktiv.se/">Piktiv</a>, who did the implementation.</p> 124<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/l8hxprdWZdI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> 125<h2 id="godot-playfab">godot-playfab</h2> 126<p>I built <a href="https://github.com/Structed/godot-playfab">godot-playfab</a>, a <a href="https://godotengine.org/">Godot</a> plugin for <a href="https://playfab.com/">PlayFab</a>, which is a cloud backend for games. It is used by more and more studios and games, including <a href="https://rawfury.com/games/dome-keeper/">Dome Keeper</a> by Bippinbits/Raw Fury.</p> 127<h1 id="professional-life-history">Professional Life History</h1> 128<p>I have over 20 years of experience in the IT industry (15 in the games industry), with a focus on software/game development, backend development, DevOps and cloud technologies. I have worked for a variety of companies, from small startups to large corporations, and have been involved in a wide range of projects, from small web applications to large scale cloud services and MMO games.</p> 129<p>Before going freelance, I used to work at <a href="https://microsoft.com/">Microsoft</a> as a <em>Gaming Solution Manager</em> in the <em>Gaming Developer Relations</em> team (formerly: Azure Gaming Global Black Belt Technical Specialist).</p> 130<p>We use to be a team of cloud, backend and game production experts. We know how games are built, what it takes to build games and what the unique challenges are, that studios & publishers face. We help them solve the hard ones with our expertise, products and services and are trusted partners to them.</p> 131<p>If you want to reach out or have a look at my CV, please see my LinkedIn profile at <a href="https://linkedin.com/in/johannesebner">linkedin.com/in/johannesebner</a>.</p> 132<p>You can also contact me via <a href="https://twitter.com/Structed">Twitter</a> or <a href="https://mastodon.social/@structed">Mastodon</a>.</p> 133<h1 id="contact-form">Contact Form</h1> 134<iframe width="640px" height="480px" src="https://forms.office.com/Pages/ResponsePage.aspx?id=DQSIkWdsW0yxEjajBLZtrQAAAAAAAAAAAAMAAK2w3TBUNFNIN1pXR01DVlI2MTYwMVFZQjU1R0UzUy4u&embed=true" frameborder="0" marginwidth="0" marginheight="0" style="border: none; max-width:100%; max-height:100vh" allowfullscreen webkitallowfullscreen mozallowfullscreen msallowfullscreen> </iframe> 135 136 </div> 137 </div> 138 </div> 139 140 <hr> 141 142 <!-- Footer --> 143 <footer> 144 <div class="container"> 145 <div class="row"> 146 <div class="col-md-12 text-center"> 147 <p class="copyright text-muted m-0"> 148 <a rel="me" href="https://bsky.app/profile/structed.bsky.social"><img src="/images/icons/bluesky-logo.png" width="50" height="50" alt="Bluesky profile" title="Bluesky profile"/>@structed.bsky.social</a> 149 <a rel="me" href="https://mastodon.social/@structed"><img src="/images/icons/mastodon_icon.jpg" width="50" height="50" alt="Mastodon profile" title="Mastodon profile"/>[email protected]</a> 150 <a rel="me" href="https://twitter.com/structed"><img src="/images/icons/twitter_icon.png" width="50" height="50" alt="Twitter Profile" title="Twitter Profile"/>@structed</a> 151 <a rel="me" href="https://github.com/structed"><img src="/images/icons/github_icon.png" width="50" height="50" alt="GitHub Profile" title="GitHub Profile"/>@structed</a> 152 </p> 153 <p class="copyright text-muted m-0">Copyright © Johannes Ebner 2024</p> 154 <br/> 155 <ul class="list-inline text-center small"> 156 <li class="list-inline-item"> 157 <a href="/feed.rss"><i class="fa fa-rss"></i> RSS Feed</a> 158 </li> 159 <li class="list-inline-item"> 160 <a href="/feed.atom"><i class="fa fa-rss"></i> Atom Feed</a> 161 </li> 162 </ul> 163 <br/> 164 <div class="font-weight-bold small"><a href="https://statiq.dev">Generated by Statiq</a></div> 165 </div> 166 </div> 167 </div> 168</footer> 169 170 <!-- Bootstrap core JavaScript --> 171
171<script src="/vendor/jquery/jquery.min.js"></script>
171 172
172<script src="/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
172 173 174 175 176 177 178 179 <!-- Custom scripts for this template --> 180
180<script src="/js/clean-blog.js"></script>
180 181 182</body> 183 184</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.