development.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <template><NuxtLayout name="default">
  2. <template #headline>{{ headline }}</template>
  3. <template #tagline>{{ tagline }}</template>
  4. <main id="main" class="container mx-auto max-w-screen-lg sm:px-12 px-2 prose" aria-label="Development">
  5. <article class="body grid sm:grid-cols-2 grid-cols-1 gap-x-12 gap-y-0">
  6. <section class="full col-start-1 sm:col-span-2">
  7. <p>I have been writing code for as long as I can remember &ndash; yes, that must have been around 1990, with my Amiga 500. It has been a long journey, and I learned a thing or two along the way.</p>
  8. </section>
  9. <section class="left col-start-1 col-span-1">
  10. <p>One of these is that the “<em>what languages do you know?</em> ” question is largely irrelevant. Once you know a bunch of them, learning a new one is easy. The hard part is knowing how to attack a problem and solve it.</p>
  11. </section>
  12. <section class="right col-start-1 col-span-1 sm:col-start-2">
  13. <p><strong>Languages</strong> I know:</p>
  14. <ul>
  15. <li>experienced: C, C++, Objective-C, XML, HTML, TypeScript, PHP, Ruby, Pure Data, Processing</li>
  16. <li>familiar: Swift, JavaScript, Python, x86 and ARM assembly for system programming</li>
  17. <li>learning: R, Julia, Haskell</li>
  18. </ul>
  19. </section>
  20. <section class="left col-start-1 col-span-1">
  21. <p>Knowing languages is only a small portion of the job. You also need to know how to not <a href="https://en.wikipedia.org/wiki/Reinventing_the_wheel">reinvent the wheel</a> all the time, how to design maintainable and scalable software architectures, and so on.</p>
  22. </section>
  23. <section class="right col-start-1 col-span-1 sm:col-start-2">
  24. <p><strong>Frameworks</strong> and other magic tricks:</p>
  25. <ul>
  26. <li>Qt, Cinder, openFrameworks</li>
  27. <li>Ruby on Rails, Sinatra</li>
  28. <li>React, Vue.js, Nuxt.js</li>
  29. <li>Arduino</li>
  30. <li>Godot</li>
  31. </ul>
  32. </section>
  33. <section class="full col-start-1 sm:col-span-2">
  34. <p>I may be forgetting some, but bottom line: <strong>it's no use knowing stuff if you don't know what it's used for</strong>.</p>
  35. <h2>Things I've done</h2>
  36. <p>Enough talk, let's see some of the projects I worked on over the years.</p>
  37. </section>
  38. <section class="project full col-start-1 sm:col-span-2 border-t-1 border-t-slate-300 pb-3" id="project_adriarattle">
  39. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  40. <h3>Adria's rattle</h3>
  41. </section>
  42. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  43. <video autoplay loop muted class="rounded">
  44. <source src="/images/rattle-site.mp4" type="video/mp4" />
  45. Your browser does not support HTML5 video.
  46. </video>
  47. </section>
  48. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  49. <p>I project-managed the co-design and development of the electronic replica and the info panel for the new permanent exhibition of <a href="https://www.culturaveneto.it/beni-culturali/beni-archeologici/5ced4b621ebd0e66c81d22bf">Adria's baby rattle</a> found in tomb 39 of the Ca' Cima archaeological site. I also developed the info panel and co-ordinated the group effort to produce the content.</p>
  50. <p><strong>Technologies</strong>: Godot 4, ESP32.</p>
  51. <p><a href="https://muse.beniculturali.unipd.it/case-studies/"><strong>Project website</strong></a> | <a href="https://gitlab.dei.unipd.it/prin-muse/interactive-panel-adria/"><strong>Source code</strong></a></p>
  52. </section>
  53. </section>
  54. <section class="project full col-start-1 sm:col-span-2 border-t-1 border-t-slate-300 pb-3" id="project_autoritratto">
  55. <section class="_left sm:float-left sm:w-1/2 sm:pr-2 ">
  56. <h3><em>Autoritratto per 4 camere e 4 voci</em></h3>
  57. <p>Michele Sambin, 1977</p>
  58. </section>
  59. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  60. <figure>
  61. <picture>
  62. <source srcset="/images/autoritratto-2x.webp" type="image/webp" />
  63. <source srcset="/images/autoritratto-2x.jpg 2x" type="image/jpeg" />
  64. <img class="rounded" srcset="/images/autoritratto-2x.jpg" alt="«Autoritratto per 4 camere e 4 voci» by Michele Sambin" />
  65. </picture>
  66. </figure>
  67. </section>
  68. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  69. <p>As part of an effort to restore and preserve old multi-media and interactive art installation, I collaborated with the team at the <a href="http://csc.dei.unipd.it/">CSC</a> to bring this performance art piece back to life in Virtual Reality.</p>
  70. <p><strong>Technologies</strong>: Godot 4, OpenXR.</p>
  71. </section>
  72. </section>
  73. <section class="project full col-start-1 sm:col-span-2 border-t-1 border-t-slate-300 pb-3" id="project_cashorcard">
  74. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  75. <h3>Cash or Card?</h3>
  76. </section>
  77. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  78. <figure>
  79. <picture>
  80. <source srcset="/images/cash_or_card-2x.webp" type="image/webp" />
  81. <source srcset="/images/cash_or_card.jpg 1x, /images/cash_or_card-2x.jpg 2x" type="image/jpeg" />
  82. <img class="rounded" srcset="/images/cash_or_card.jpg" alt="Circular Bells" />
  83. </picture>
  84. </figure>
  85. </section>
  86. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  87. <p>“Cash or Card?” is an educational puzzle-simulation video game to explore the theme of cash vs electronic payments. You play as a shopkeeper who has to earn enough money in 5 days and you need to choose how your customers are going to pay you.</p>
  88. <p><strong>Technologies</strong>: Godot 4.</p>
  89. <p><a href="https://edugames.andreafranceschini.org/games/cash_or_card/" title="Play Cash or Card online for free!"><strong>Play online</strong></a> | <a href="https://edugames.andreafranceschini.org/cash-or-card/"><strong>Description</strong></a> | <a href="https://edugames.andreafranceschini.org/wp-content/uploads/cash-or-card-gdd.pdf"><strong>GDD</strong></a> | <a href="https://github.com/Morpheu5/cash-or-card"><strong>Source code</strong></a></p>
  90. </section>
  91. </section>
  92. <section class="project full col-start-1 sm:col-span-2 border-t-1 border-t-slate-300 pb-3" id="project_rfk2d">
  93. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  94. <h3>Robot Finds Kitten 2D for Godot Engine</h3>
  95. </section>
  96. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  97. <figure>
  98. <picture>
  99. <source srcset="/images/rfk2d-2x.webp" type="image/webp" />
  100. <source srcset="/images/rfk2d.jpg 1x, /images/rfk2d-2x.jpg 2x" type="image/jpeg" />
  101. <img class="rounded" srcset="/images/rfk2d.jpg" alt="Robot Finds Kitten 2D for Godot Engine" />
  102. </picture>
  103. </figure>
  104. </section>
  105. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  106. <p>I wanted to learn <a href="https://godotengine.org/">Godot</a> so I made a port of the <a href="http://robotfindskitten.org/">famous zen simulation</a> Robot Finds Kitten which you can <a href="https://rfk.morpheu5.net/2d" title="Play Robot Finds Kitten 2D online for free!">play online here</a> for free! No ads! Pure zen!</p>
  107. <p><strong>Technologies</strong>: Godot 3.</p>
  108. <p><a href="https://rfk.morpheu5.net/2d" title="Play Robot Finds Kitten 2D online for free!"><strong>Play online</strong></a> | <a href="https://www.github.com/Morpheu5/RFK_Godot2D"><strong>Source code</strong></a></p>
  109. </section>
  110. </section>
  111. <section class="project full col-start-1 sm:col-span-2 border-t-1 border-t-slate-300 pb-3" id="project_circularbells">
  112. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  113. <h3>Circular Bells</h3>
  114. </section>
  115. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  116. <figure>
  117. <picture>
  118. <source srcset="/images/cb_demo-2x.webp" type="image/webp" />
  119. <source srcset="/images/cb_demo.jpg 1x, /images/cb_demo-2x.jpg 2x" type="image/jpeg" />
  120. <img class="rounded" srcset="/images/cb_demo.jpg" alt="Circular Bells" />
  121. </picture>
  122. </figure>
  123. </section>
  124. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  125. <p>Circular Bells is a music app that for kids and grown ups to sit back and relax while playing with its brightly-coloured, ever-changing interface, and uplifting sounds.</p>
  126. <p><strong>Technologies</strong>: C++, Cinder, iOS.</p>
  127. <p><a href="https://itunes.apple.com/us/app/circular-bells/id1062362784?mt=8"><strong>App Store</strong></a> | <a href="https://www.youtube.com/watch?v=a_GSQNIT7xM"><strong>Demo</strong></a></p>
  128. </section>
  129. </section>
  130. <section class="project full col-start-1 sm:col-span-2 border-t-1 border-t-slate-300 pb-3" id="project_phdappios">
  131. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  132. <h3>PhD music app for iPad</h3>
  133. </section>
  134. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  135. <figure>
  136. <picture>
  137. <source srcset="/images/phd-app-2x.webp" type="image/webp" />
  138. <source srcset="/images/phd-app.jpg 1x, /images/phd-app-2x.jpg 2x" type="image/jpeg" />
  139. <img class="rounded" srcset="/images/phd-app.jpg" alt="PhD app for iPad" />
  140. </picture>
  141. </figure>
  142. </section>
  143. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  144. <p>In 2014, I needed to bring the app below with me to a conference for demos. I figured pretty soon that I was not going to bring the giant screen with me, so I did an iOS port which worked wonderfully. No, you can't have it. Yet. I'm designing a new version. You can have that once it's ready.</p>
  145. <p><strong>Technologies</strong>: C++, Cinder, iOS.</p>
  146. <p><a href="https://www.github.com/Morpheu5/SecondStudy-iPad"><strong>Source code</strong></a></p>
  147. </section>
  148. </section>
  149. <section class="project full col-start-1 sm:col-span-2 border-t-1 border-t-slate-300 pb-3" id="project_phdapp">
  150. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  151. <h3>PhD music app</h3>
  152. </section>
  153. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  154. <figure>
  155. <picture>
  156. <source srcset="/images/table_2-2x.webp" type="image/webp" />
  157. <source srcset="/images/table_2.jpg 1x, /images/table_2-2x.jpg 2x" type="image/jpeg" />
  158. <img class="rounded" srcset="/images/table_2.jpg" alt="PhD app for large tabletop" />
  159. </picture>
  160. </figure>
  161. </section>
  162. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  163. <p>As part of my doctoral studies, I developed a collaborative music composition tabletop application to teach people how to compose and discuss melodies.</p>
  164. <p><strong>Technologies</strong>: C++, Cinder, Pure Data.</p>
  165. <p><a href="https://www.github.com/Morpheu5/FourthStudy"><strong>Source code</strong></a> | <a href="https://www.youtube.com/watch?v=AONzmnAHZ6w"><strong>Demo</strong></a></p>
  166. </section>
  167. </section>
  168. <section class="project full col-span-2 border-t-1 border-t-slate-300 pb-3" id="project_aranaboo">
  169. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  170. <h3>Aranaboo</h3>
  171. </section>
  172. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  173. <figure>
  174. <picture>
  175. <source srcset="/images/aranaboo-2x.webp" type="image/webp" />
  176. <source srcset="/images/aranaboo.jpg 1x, /images/aranaboo-2x.jpg 2x" type="image/jpeg" />
  177. <img class="rounded" srcset="/images/aranaboo.jpg" alt="Aranaboo" />
  178. </picture>
  179. </figure>
  180. </section>
  181. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  182. <p>A game of peek-a-boo using face detection.</p>
  183. <p><strong>Technologies</strong>: iOS.</p>
  184. <p><a href="https://www.beyoucompany.com/?page_id=8"><strong>Web site</strong></a></p>
  185. </section>
  186. </section>
  187. <section class="project full col-start-1 sm:col-span-2 border-t-1 border-t-slate-300 pb-3" id="project_astronauta">
  188. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  189. <h3>Da grande voglio fare l'astronauta</h3>
  190. </section>
  191. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  192. <figure>
  193. <picture>
  194. <source srcset="/images/astronauta-2x.webp" type="image/webp" />
  195. <source srcset="/images/astronauta.jpg 1x, /images/astronauta-2x.jpg 2x" type="image/jpeg" />
  196. <img class="rounded" srcset="/images/astronauta.jpg" alt="Da grande voglio fare l'astronauta" />
  197. </picture>
  198. </figure>
  199. </section>
  200. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  201. <p>An interactive book for children. The tale of a kid who wants to become an astronaut. I developed the iOS part of the project to completion, but sadly the app was never released.</p>
  202. <p><strong>Technologies</strong>: iOS.</p>
  203. <p><a href="https://www.behance.net/gallery/1201947/DA-GRANDE-VOGLIO-FARE-LASTRONAUTA-(-IPAD-APP)"><strong>Behance</strong></a></p>
  204. </section>
  205. </section>
  206. <section class="project full col-start-1 sm:col-span-2 border-t-1 border-t-slate-300 pb-3" id="project_bsc">
  207. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  208. <h3>CRUSADE Bleeding Score Calculator</h3>
  209. </section>
  210. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  211. <figure>
  212. <picture>
  213. <source srcset="/images/bsc-2x.webp" type="image/webp" />
  214. <source srcset="/images/bsc.jpg 1x, /images/bsc-2x.jpg 2x" type="image/jpeg" />
  215. <img class="rounded" srcset="/images/bsc.jpg" alt="CRUSADE Bleeding Score Calculator" />
  216. </picture>
  217. </figure>
  218. </section>
  219. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  220. <p>This app helps clinicians estimate a patient's baseline risk of in-hospital major bleeding during both ST and non-ST segment elevation myocardial infarction. Not that I know what that means. I was given a spreadsheet with some formulas, I was asked to make an iOS app, and so I did. Then the client did not want it anymore, so I published it myself.</p>
  221. <p><strong>Technologies</strong>: iOS (Swift), Android (Kotlin).</p>
  222. <p><a href="https://itunes.apple.com/us/app/crusade-bleeding-score-calculator/id454062627?mt=8"><strong>App Store</strong></a>, <a href="https://play.google.com/store/apps/details?id=net.morpheu5.bleedingscorecalculator"><strong>Google Play</strong></a></p>
  223. </section>
  224. </section>
  225. <section class="project full col-start-1 sm:col-span-2 border-t-1 border-t-slate-300 pb-3" id="project_doodle">
  226. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  227. <h3>Doodle</h3>
  228. </section>
  229. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  230. <figure>
  231. <picture>
  232. <source srcset="/images/doodle-2x.webp" type="image/webp" />
  233. <source srcset="/images/doodle.png 1x, /images/doodle-2x.png 2x" type="image/png" />
  234. <img class="rounded" srcset="/images/doodle.png" alt="Doodle" />
  235. </picture>
  236. </figure>
  237. </section>
  238. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  239. <p>I worked on the actual Reactable between 2008 and 2009, proposing a new approach to Western tonal music &ndash; the original support was quite minimal, I was tasked with making it a bit more usable.</p>
  240. <p><strong>Technologies</strong>: C++, <a href="https://www.qt.io">Qt 4</a>, <a href="https://www.jackaudio.org">Jack</a>.</p>
  241. <p><a href="https://www.github.com/Morpheu5/Doodle"><strong>Source code</strong></a> | <a href="https://vimeo.com/4325822"><strong>Demo</strong></a></p>
  242. </section>
  243. </section>
  244. <section class="project full col-start-1 sm:col-span-2 border-t-1 border-t-slate-300" id="project_tofus">
  245. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  246. <h3>tOfuS: the Framework OS</h3>
  247. </section>
  248. <section class="_right sm:float-right sm:w-1/2 sm:pl-2">
  249. <figure>
  250. <picture>
  251. <source srcset="/images/tofus-2x.webp" type="image/webp" />
  252. <source srcset="/images/tofus.jpg 1x, /images/tofus-2x.jpg 2x" type="image/jpeg" />
  253. <img class="rounded" srcset="/images/tofus.jpg" alt="tOfuS" />
  254. </picture>
  255. </figure>
  256. </section>
  257. <section class="_left sm:float-left sm:w-1/2 sm:pr-2">
  258. <p>Yes, there was a time when I worked on a toy operating system. It was good fun and I learned a lot about assembly code and bare-metal programming.</p>
  259. <p><strong>Technologies</strong>: x86 assembly, C.</p>
  260. <p><a href="https://www.github.com/Morpheu5/tOfuS"><strong>Source code</strong></a></p>
  261. </section>
  262. </section>
  263. <section class="full col-start-1 sm:col-span-2">
  264. <p class="calltoaction">Have a cool project in mind? <a href="/contact">Let's talk about it!</a></p>
  265. </section>
  266. </article>
  267. </main>
  268. </NuxtLayout></template>
  269. <script lang="ts" setup>
  270. definePageMeta({
  271. layout: false
  272. });
  273. const headline = "Software development";
  274. const tagline = "Not black magic";
  275. const title = `${headline} ••• Andrea Franceschini, PhD`
  276. const keywords = "software, development, music, learning, tabletop, research, the open university, university of cambridge, isaac physics, reactable";
  277. const description = "All the bits and bobs that make computers go 'boop'.";
  278. useState('pageClasses', () => ['development', 'page']);
  279. useHead({
  280. title,
  281. meta: [
  282. { property: 'keywords', content: keywords },
  283. { property: 'DC.Title', content: title },
  284. { property: 'twitter:title', content: title },
  285. { property: 'og:title', content: title },
  286. { property: 'description', content: description },
  287. { property: 'DC.Description', content: description },
  288. { property: 'twitter:description', content: description },
  289. { property: 'og:description', content: description },
  290. ]
  291. });
  292. </script>