From a7170a6f3e2c730d9c6e11b244f4725b85cced93 Mon Sep 17 00:00:00 2001 From: Cesar Date: Sat, 21 Oct 2023 12:14:24 +0100 Subject: [PATCH] Refreshed version Oct 2023 --- components/date-set/date-set.js | 10 +-- components/experience-set/experience.js | 9 +-- components/header/header.js | 6 +- components/text/text.js | 2 +- components/tool-set/tool-set.js | 4 +- controllers/cypher/md5.js | 1 - css/candidate.css | 87 +++++++------------------ cv.js | 70 ++++++++++---------- package.json | 2 +- pages/candidate.js | 1 - service-worker.js | 2 +- 11 files changed, 70 insertions(+), 124 deletions(-) delete mode 100644 controllers/cypher/md5.js diff --git a/components/date-set/date-set.js b/components/date-set/date-set.js index 1e42ff1..a540a59 100644 --- a/components/date-set/date-set.js +++ b/components/date-set/date-set.js @@ -1,14 +1,6 @@ -const dateParse = date => date === 'now' ? new Date() : new Date(date); -const dateRound = millisecondsDiff => Math.round(millisecondsDiff/3.1536e8)/1e2; -const dateDiff = ({ endDate, startDate }) => { - const years = dateRound(dateParse(endDate)-dateParse(startDate)); - return `${years} year${years === 1 ? '' : 's'}`; -}; - export default ({ endDate, startDate }) => startDate || endDate ? `

- ${startDate && endDate ? `${dateDiff({ endDate, startDate })}, ` : ''} - ${startDate ? `from ${startDate}` : ''} + ${startDate ? ` ${startDate}` : ''} ${endDate ? `to ${endDate}` : ''}

` : ''; diff --git a/components/experience-set/experience.js b/components/experience-set/experience.js index 56b9059..b01c38d 100644 --- a/components/experience-set/experience.js +++ b/components/experience-set/experience.js @@ -6,12 +6,9 @@ export default ({ name, position, endDate, startDate, tools, summary }) => `
  • -

    ${name}

    -
    -

    ${position}

    - ${DateSet({ endDate, startDate })} - -
    +

    ${name},

    +

    ${position}

    + ${DateSet({ endDate, startDate })}
    ${ToolSet(tools)} diff --git a/components/header/header.js b/components/header/header.js index 414d59c..d9c8d83 100644 --- a/components/header/header.js +++ b/components/header/header.js @@ -1,9 +1,5 @@ -import md5 from '../../controllers/cypher/md5.js'; - -export default ({ name, label, email }) => ` +export default ({ name, label }) => `
    -
    -

    ${name}

    ${label}

    diff --git a/components/text/text.js b/components/text/text.js index 079ffb0..470359e 100644 --- a/components/text/text.js +++ b/components/text/text.js @@ -1,3 +1,3 @@ export default ({ class: name, text }) => text ? ` -

    ${text.replace(/(\n)(\n)/g, '$1

    $2')}

    +

    ${text.replace(/(\n)(\n)/g, '$1$2')}

    ` : ''; diff --git a/components/tool-set/tool-set.js b/components/tool-set/tool-set.js index 5de72d5..7878b06 100644 --- a/components/tool-set/tool-set.js +++ b/components/tool-set/tool-set.js @@ -1,10 +1,8 @@ import List from '../list/list.js'; import Tool from './tool.js'; -const stackIcon = (height = 8) => ``; - export default (tools) => tools ? ` -
    ${stackIcon()} Tech Stack:
    +
      ${List(Tool, tools)}
    diff --git a/controllers/cypher/md5.js b/controllers/cypher/md5.js deleted file mode 100644 index 33a6b4b..0000000 --- a/controllers/cypher/md5.js +++ /dev/null @@ -1 +0,0 @@ -function s2b(n){var r,t=8*n.length,o=new Array((n.length>>2)-1).fill(0);for(r=0;r>5]|=(255&n.charCodeAt(r/8))<g(r&t|~r&o,n,r,e,f,a),B=(n,r,t,o,e,f,a)=>g(r&o|t&~o,n,r,e,f,a),h=(n,r,t,o,e,f,a)=>g(r^t^o,n,r,e,f,a),s=(n,r,t,o,e,f,a)=>g(t^(r|~o),n,r,e,f,a),d=(n,r)=>n<>>32-r;function T(n,r){var t=(65535&n)+(65535&r);return(n>>16)+(r>>16)+(t>>16)<<16|65535&t}function g(n,r,t,o,e,f){return T(d(T(T(r,n),T(o,f)),e),t)}for(n[r>>5]|=128<>>9<<4)]=r,t=0;t>5]>>>r%32&255,e+="0123456789abcdef".charAt(t>>>4&15)+"0123456789abcdef".charAt(15&t);return e}export default function md5(n){return b2h(b2md5(s2b(unescape(encodeURIComponent(n)))))}; diff --git a/css/candidate.css b/css/candidate.css index 11b528e..16f527e 100644 --- a/css/candidate.css +++ b/css/candidate.css @@ -25,7 +25,6 @@ body.loaded { } .page-intro { - height: 100vh; display: flex; flex-direction: column; } @@ -43,22 +42,6 @@ body.loaded { padding: 30px 0; } -.hero__pic { - background-size: cover; - border-radius: 50%; - height: 7em; - margin-bottom: 1em; - width: 7em; -} - -.hero__pic--div { - flex: 0 0 7em; -} - -.hero__pic--img { - display: none; -} - .hero__name { margin: 0; text-transform: uppercase; @@ -144,7 +127,6 @@ p br { .job-experience { - margin-bottom: 30px; position: relative; } @@ -161,6 +143,9 @@ p br { background: white; z-index: 200; padding: 5px 0 0; + display: flex; + flex-flow: row wrap; + gap: .4em; } .job-experience__main-section { @@ -168,30 +153,18 @@ p br { overflow: auto; } -.job-experience__main-section > h5, -.job-experience__main-section > ul { - display: inline-block; -} - -.job-experience__meta { - display: flex; - flex-direction: row; - flex-wrap: wrap; -} - -.job-experience__business { +.job-experience__position { text-transform: uppercase; + flex: 1 0; } .job-experience__date { - border-bottom: 0.5px solid black; - flex: 1 0 90%; + flex: 1 0 100%; font-style: italic; padding: 0 .5em 0 0; position: relative; - text-align: right; - margin: 0 0 .7em .4em; top: -5px; + display: none; } .job-experience__tool { @@ -204,7 +177,10 @@ p br { .job-experience__tool-set { padding: 0; - margin: 0 0 15px; + margin: 0; + display: flex; + flex-flow: row wrap; + gap: .4em; } .job-experience__tool-name, @@ -217,11 +193,6 @@ p br { margin: 0 0 0 5px; } - -.education-experience { - margin: 10px 0 0; -} - .education-experience__title-set { color: steelblue; padding: 0; @@ -255,14 +226,16 @@ h1, h2, h3, h4, h5, h6, .experience-set, .education-set { margin: 0; - padding: 30px calc(2vw + 15px) 0; + padding: 30px calc(2vw + 15px); + display: flex; + flex-flow: column; + gap: 1.5em; } .summary__title, .experience-set__title, .education-set__title { color: white; - margin: 30px 0 0; padding: 10px; position: sticky; top: 0; @@ -361,29 +334,11 @@ a:focus { } .hero { - padding: 3em 1em 1em; + padding: 0 0 .4em; position: relative; text-align: right; } - .hero__pic { - border-radius: 70% 60% 80% 50%; - top: 0; - left: 0; - height: 93%; - margin: 0; - position: absolute; - width: auto; - } - - .hero__pic--div { - display: none; - } - - .hero__pic--img { - display: inline-block; - } - .contact-set { flex-direction: row; } @@ -416,7 +371,14 @@ a:focus { .summary, .experience-set, .education-set { - padding: 15px calc(2vw) 0; + padding: .4em calc(2vw); + gap: .4em; + } + + .summary__title, + .experience-set__title, + .education-set__title { + padding: .1em 10px; } /* PRINT THEME */ @@ -435,7 +397,6 @@ a:focus { .experience-set__title, .education-set__title { background: rgba(54, 57, 72, 0.3) !important; - margin: 10px 0 0; } #revision-id { diff --git a/cv.js b/cv.js index 9bb5a8c..025ac00 100644 --- a/cv.js +++ b/cv.js @@ -14,13 +14,16 @@ phone: '+447920158374', email: 'costascarrera.cesar@gmail.com', summary: ` -I am a problem solver with ${semanticYearsOfExperience('11/15/2013')} in the frontend. +I am a software engineer with ${semanticYearsOfExperience('2013-11-15')} in web development. -Through my roles at different businesses, I have contributed to solving most scaling up and cutting edge issues related to web development including: - performance, acessibility, analytics, internationalisation, building design systems, modularisation with version control, A/B testing, drag and drop page builders, and SSR/static/hybrid rendering methods. - And I have carried out all kinds of testing: end to end, integration, contract, visual and unit tests. +I have helped businesses to improve on: + performance, acessibility, analytics, compliance, + internationalisation, whitelabelling, + microfrontends, design systems, tokenisation, + testing, CI/CD, IaC, + CMS, SEO, CRO, and others. -I am a team player and I deeply care about the products I work on. I like to get involved in business solutions and enjoy collaborating with my colleagues. +I am a team player, and I deeply care about the products I contribute to. `, location: { city: 'London', @@ -42,11 +45,14 @@ I am a team player and I deeply care about the products I work on. I like to get name: 'Nutmeg', position: 'Senior Software Engineer', startDate: 'Feb 2022', endDate: 'now', - tools: [ 'React 17', 'SASS', 'Node 16', 'RTL', 'Jenkins', 'Argo', 'Terraform', /* 'AWS', 'Enzime', 'Gitlab', 'Jira Cloud', */ ], + tools: [ 'React 17', 'Node 18', 'SASS', 'RTL', 'Cypress', 'Jenkins', 'Terraform', 'AWS', /* 'Argo', 'Enzime', 'Gitlab', 'Jira Cloud', */ ], summary: ` -As part of Nutmeg's product team I've developed UI elements with great detail on accessibility and simplicity. - -Collaborated with colleagues while leading or being lead in initiatives, and also with BE, UX and infrastructure teams. +I became part of the product team + and was shortly promoted due my contributions to the design system. + I collaborated company-wide beyond engineering teams, + delivering features, tools, business ideas and architectural decisions. + In February 2023 I was selected to form the Developer Experience team. + Since then we refreshed almost every tool in the stack, and we keep improving iteratively. ` }, { @@ -54,15 +60,12 @@ Collaborated with colleagues while leading or being lead in initiatives, and als name: 'Ocado Technology', position: 'Software Engineer Ⅱ', startDate: 'Jan 2020', endDate: 'Jan 2022', - tools: [ 'React 17', 'Redux', 'styled-components 5', 'Node 14', 'RTL', /* 'Enzime', 'Gitlab', 'Jira Cloud', */ ], + tools: [ 'React 17', 'Node 14', 'styled-components 5', 'RTL', 'Redux', /* 'Enzime', 'Gitlab', 'Jira Cloud', */ ], summary: ` -Ocado's development culture relies on high autonomy. - -I lead the engineering team to work on - legal aspects of the site such as compliance with cookies, - and pushed for initiatives to prevent the project from becoming legacy or being exposed to security holes. - -I worked with my colleagues on cutting edge frontend responsibilities like accessibility, performance, and developing features designed by the UX team. +I was hired to join the ecommere team. + In addition to my responsibilities I championed best practices on + accessibility, performance, compliance, + and created technical initiatives to keep the project evergreen. ` }, { @@ -70,13 +73,14 @@ I worked with my colleagues on cutting edge frontend responsibilities like acces name: 'Loveholidays', position: 'Frontend web developer', startDate: 'May 2018', endDate: '2020', - tools: [ 'React 16', 'Redux', 'styled-components 5', 'Sass', /* 'redux-sagas', 'Enzime', 'Github', 'Jira Cloud', 'Karma', 'Optimizely', 'Google Analytics', 'Google Optimize', */ ], + tools: [ 'React 16', 'styled-components 5', 'Redux', /* 'Sass', 'redux-sagas', 'Enzime', 'Github', 'Jira Cloud', 'Karma', 'Optimizely', 'Google Analytics', 'Google Optimize', */ ], summary: ` -My time at Loveholidays was completely in sync with the needs of their business. -I joined to help scale the business internationally and migrating from Django into a React frontend. - -I lead by example the experiments team from its inception with two developers until its end with three frontend teams with around 15 developers. -The values that I induced in the team were: speed (quick tasks, big impact, fast pipeline), quality, standards (close to native and semantic), and performance. +Loveholidays was migrating to React when I joined. + Soon after, I was invited with other two colleagues to form the CRO team + which we grew to 15 developers within a year. + I improved the development process + and cross-team communications + with dashboards, metrics and documentation. `, }, { @@ -84,14 +88,14 @@ The values that I induced in the team were: speed (quick tasks, big impact, fast name: 'Tribal worldwide', position: 'Frontend web developer', startDate: 'Jan 2017', endDate: 'May 2018', - tools: [ 'Polymer 1', 'Redux', 'Mocha', 'Sass', 'Node 6', /* 'Gulp 4', 'jQuery 3', 'Git', 'Handlebars', 'Wordpress', 'Jira', 'Aem', 'Jahia', */ ], + tools: [ 'Polymer 1', 'Aem', 'Jahia', /* 'Redux', 'Mocha', 'Sass', 'Node 6', 'Gulp 4', 'jQuery 3', 'Git', 'Handlebars', 'Wordpress', 'Jira', */ ], summary: ` -Tribal is a hybrid ad-development agency that provides websites to their advertising clients. -Each project is handled by a small team of 1 to 4 specialists. - -At Tribal I contributed to Wordpress, AEM and Polymer proyects, while mentoring a junior and an intern developers. - -I took the initiative on improving performance through rooting for reusable components, unit tests and understanding the problem and the client needs before coding. +At this award-winning agency I developed features for multiple clients. + While working for Volkswagen, + I designed, together with backend developers, + an SSR flow for Jahia and Polymer allowing us to migrate + from a CMS server multi-page site, + to a CMS driven SPA. `, }, { @@ -99,21 +103,21 @@ I took the initiative on improving performance through rooting for reusable comp name: 'Imatia innovation', position: 'Full stack web developer', startDate: 'Jun 2016 Jun', endDate: '2017', - tools: [ 'Angular 2', 'TypeScript 2', 'Sass', 'Node 6', 'Docker', 'Scala', 'Java', 'Hadoop', /* 'Gulp 3', 'Gitlab', */ ], + /* tools: [ 'Angular 2', 'TypeScript 2', 'Sass', 'Node 6', 'Docker', 'Scala', 'Java', 'Hadoop', 'Gulp 3', 'Gitlab' ], */ }, { name: 'ViewNext', position: 'Full stack web developer', startDate: 'Jun 2015', endDate: 'Jun 2016', - tools: [ 'Angular 1', 'Java 5', 'DB2', /* 'jQuery 1', 'HTML 4', 'CSS 2', 'Backbone', 'SVN', 'JSP', 'Jira', */ ], + /* tools: [ 'Angular 1', 'Java 5', 'DB2', 'jQuery 1', 'HTML 4', 'CSS 2', 'Backbone', 'SVN', 'JSP', 'Jira' ], */ }, { name: 'University of Vigo', position: 'Full stack web developer', startDate: 'Nov 2013', endDate: 'May 2015', - tools: [ 'D3js', 'jQuery 1', 'Ruby-on-Rails', /* 'HTML 5', 'CSS 3', 'Java', 'Weka', 'RapidMiner', 'Python', */ ], + /* tools: [ 'D3js', 'jQuery 1', 'Ruby-on-Rails', 'HTML 5', 'CSS 3', 'Java', 'Weka', 'RapidMiner', 'Python' ], */ }], education: [{ diff --git a/package.json b/package.json index 9e451c9..a2d1c64 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "cv", "author": "Cesar Costas Carrera", - "version": "3.0.l9q", + "version": "4.0.m0h", "private": false, "homepage": "http://gatsbimantico.github.io/cv", "dependencies": { diff --git a/pages/candidate.js b/pages/candidate.js index 7c11582..9f9b86a 100644 --- a/pages/candidate.js +++ b/pages/candidate.js @@ -9,7 +9,6 @@ import ThemeStyle from '../controllers/theme-styles/theme-style.js'; export default ({ cv, manifest }) => cv ? ` ${PageIntro(cv)}
    -

    Summary

    ${Text({ class: 'summary', text: cv.basics.summary })} ${ExperienceSet(cv)} ${EducationSet(cv)} diff --git a/service-worker.js b/service-worker.js index b828cd8..bd8eb32 100755 --- a/service-worker.js +++ b/service-worker.js @@ -1,7 +1,7 @@ (function (app) { 'use strict'; - const CACHE_NAME = 'CVjs-3.0.l9q', + const CACHE_NAME = 'CVjs-4.0.m0h', externalUrlsToCache = [ 'https://fonts.googleapis.com/css?family=Nanum+Gothic:400,700|Work+Sans:300,600&display=swap', ],