initial commit
							
								
								
									
										1
									
								
								.aspell.en.prepl
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| personal_repl-1.1 en 0  | ||||
							
								
								
									
										69
									
								
								.aspell.en.pws
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,69 @@ | ||||
| personal_ws-1.1 en 68  | ||||
| AAAAA | ||||
| RaspberryPi | ||||
| Grantham | ||||
| DevOps | ||||
| TheMajority | ||||
| canham | ||||
| statefull | ||||
| Jinja | ||||
| ElastiCache | ||||
| Atlassian | ||||
| Lamda | ||||
| backends | ||||
| unmanaged | ||||
| Subreddit | ||||
| subreddit | ||||
| Config | ||||
| orchestrator | ||||
| Github | ||||
| Gitlab | ||||
| Rekognition | ||||
| Calify | ||||
| Cloudwatch | ||||
| JuanCanham | ||||
| pythonic | ||||
| Cloudreach | ||||
| Serverless | ||||
| serverless | ||||
| countryCode | ||||
| SysOps | ||||
| Powershell | ||||
| Monit | ||||
| Kaseya's | ||||
| endDate | ||||
| studyType | ||||
| Cloudreach's | ||||
| FastTrack | ||||
| piRobotWars | ||||
| Cloudformation | ||||
| frontend | ||||
| knowledgebase | ||||
| Supporttree | ||||
| whitepapers | ||||
| prototyped | ||||
| datacentre | ||||
| skunkworks | ||||
| Milkround | ||||
| virtualised | ||||
| Heymarket | ||||
| Mopidy | ||||
| CodeDeploy | ||||
| Kaseya | ||||
| subskills | ||||
| hackathons | ||||
| ChatOps | ||||
| AppStream | ||||
| SystemD | ||||
| Musicbox | ||||
| MusicBox | ||||
| Norges | ||||
| AnthillPro | ||||
| hackathon | ||||
| LinkedIn | ||||
| NBIM's | ||||
| natively | ||||
| startDate | ||||
| Kubernetes | ||||
| Terraform | ||||
| Ansible | ||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,3 @@ | ||||
| node_modules/ | ||||
| dist/ | ||||
| *~ | ||||
							
								
								
									
										9
									
								
								.yamllint.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,9 @@ | ||||
| --- | ||||
| extends: default | ||||
|  | ||||
| rules: | ||||
|   line-length: disable | ||||
|   document-start: disable | ||||
|  | ||||
| ignore: | | ||||
|   node_modules/ | ||||
							
								
								
									
										66
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,66 @@ | ||||
| .PHONY: help mrproper all install clean local lint prepare validate build test clear post-test deploy deploy-full | ||||
|  | ||||
| SITENAME = cv.juancanham.com | ||||
| hackmyresume=./node_modules/.bin/hackmyresume | ||||
| linkchecker=linkchecker -f .linkcheckerrc --check-extern | ||||
|  | ||||
| help: | ||||
| 	@echo  'Targets:' | ||||
| 	@echo  ' * all [clean install deploy-full]' | ||||
| 	@echo  ' * local [lint validate build test]' | ||||
| 	@echo  ' * deploy - does not clear the CDN' | ||||
| 	@echo  ' * deploy-full [local deploy clear post-test]' | ||||
| 	@echo  ' * mrproper - removes node_modues' | ||||
|  | ||||
| all:  clean install deploy-full | ||||
| local: lint validate build test | ||||
| deploy-full: deploy clear post-test | ||||
|  | ||||
| mrproper: | ||||
| 	rm -rf ./node_modules/ | ||||
|  | ||||
| install: | ||||
| 	pip install -r requirements.txt | ||||
| 	npm install | ||||
|  | ||||
| clean: | ||||
| 	rm -r dist/* || true | ||||
|  | ||||
| lint: | ||||
| 	shellcheck *.sh deploy/*.sh deploy/shared-functions | ||||
| 	spelling=$$(aspell --ignore=4 --home-dir=. list < resume.yaml) ; \ | ||||
| 	if [ -n "$$spelling" ] ; then echo spelling errors found: $$spelling ; exit 1 ; fi | ||||
| 	yamllint . | ||||
| 	black *.py | ||||
| 	pylint *.py | ||||
| 	cfn-lint deploy/cloudformation/* | ||||
|  | ||||
| prepare: clean resume.yaml | ||||
| 	./transform.py | ||||
| 	./generate_qrcode.py "https://$(SITENAME)" QR | ||||
| 	cp -r images dist/ | ||||
| 	rm dist/images/*~ | ||||
|  | ||||
| validate: prepare | ||||
| 	 $(hackmyresume) validate dist/resume.json | ||||
| 	 $(hackmyresume) analyze dist/resume.json | ||||
|  | ||||
| build: prepare | ||||
| 	./build.sh | ||||
|  | ||||
| test: | ||||
| 	$(linkchecker) dist/resume.html | ||||
|  | ||||
| deploy: | ||||
| 	./deploy/deploy-cloudformation.sh $(SITENAME) | ||||
| 	aws s3 sync --delete dist/ s3://$(subst .,-,$(SITENAME)) | ||||
|  | ||||
| clear: | ||||
| 	./deploy/clear-cache.sh $(SITENAME) | ||||
|  | ||||
| post-test: | ||||
| 	$(linkchecker) https://$(SITENAME) | ||||
| 	wget http://${SITENAME} -O /dev/null | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										43
									
								
								Readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,43 @@ | ||||
| # Juan Canham's Resume Repo | ||||
|  | ||||
| ## Motivation | ||||
|  | ||||
| As a pragmatist I want to use existing tools e.g hackmyresume, | ||||
| however I also want to personalise the input format as the roles on my CV | ||||
| are less important than the projects and work that I did as part of them. | ||||
|  | ||||
| Additionally I want a single tool used to generate | ||||
| * My Dynamic Web CV e.g [cv.juancanham.com](https://cv.juancanham.com) | ||||
| * Public Static CVs | ||||
|  | ||||
| ## Contents | ||||
| This repository contains  | ||||
|  | ||||
| * [The source yaml file used to generate my CV](resume.yaml) | ||||
| * [The resultant markdown](Resume.md) | ||||
| * The tools to generate my CVs | ||||
|   * [The script used to generate it](build.sh) | ||||
|   * [The settings](settings.yaml) | ||||
|   * [The Intermediary json passed to hackmyresume](resume.json) | ||||
|   * [A script to preform arbitrary transforms on yaml](transform.py) | ||||
| * The tools to generate my host my CV: | ||||
|   * [cloudformation templates](deploy/cloudformation/) | ||||
|   * [scripts used to deploy them](deploy/) | ||||
| * [A makefile to tie it all together](Makefile) | ||||
|  | ||||
|  | ||||
| ## Dependencies | ||||
| * node tools (see also [package.json]) | ||||
|   * work on at least node 8 | ||||
|   * hackmyresume | ||||
|   * kcv | ||||
|   * fresh | ||||
|  | ||||
| * python tools (see also [requirements.txt]) | ||||
|   * qrcode | ||||
|   * awscli - used to create the static s3+cloudfront website | ||||
|   * linters | ||||
|  | ||||
| ## License | ||||
|  | ||||
| Code: BSD-2-Clause | ||||
							
								
								
									
										97
									
								
								Resume.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,97 @@ | ||||
| Juan Barry Manual Canham | ||||
| ============ | ||||
| Email: cv@juancanham.com | ||||
|  | ||||
| Web: https://cv.juancanham.com | ||||
|  | ||||
| A Pragmatic Cloud "DevOps" Engineer, with experience at a variety of companies, across a range of technologies | ||||
| driving both technological change as well as business focused outcomes. | ||||
| Capable of wearing whatever hat is needed for a given job, primarily working as both: | ||||
| * an architect, aligning the technical solutions to the customers requirements | ||||
| * a technical lead, both delivering code and guiding/mentoring/supporting teams as required. | ||||
|  | ||||
|  | ||||
| ## SKILLS | ||||
|  | ||||
|   - Programming: Python Ruby Bash JavaScript Apex/Java Other Languages  | ||||
|   - AWS: Cloudformation IAM Lambda DynamoDB Core AWS services Additional AWS services  | ||||
|   - DevOps tools and methodologies: IaC Immutability Configuration Management TDD - Infrastructure TDD - Application Build systems Containers Init systems Agile  | ||||
|   - Google: GCP Google deployment manager Google App Engine Google Apps  | ||||
|   - Salesforce: Apex Configuration  | ||||
|  | ||||
| ## EMPLOYMENT | ||||
|  | ||||
| ### *Open Source Developer*, [Self](https://juancanham.com) (2019-07 — Present) | ||||
|  | ||||
| Spending a few months developing tools to make engineering in the clouds easier. And other assorted tools | ||||
|   - Quickly Built a tool to view twitter exports | ||||
|   - Begun work on a module | ||||
|   - Built a website to highlight the problems with FPTP | ||||
|   - Built a tool to monitor activity on toxic internet communities | ||||
|  | ||||
| ### *Cloud Systems Developer Lead*, [Cloudreach](https://www.cloudreach.com) (2014-03 — 2019-07) | ||||
|  | ||||
| Worked on customer projects as a Lead/Architect and mentored a small team. | ||||
|   - Architect on several Enterprise engagement, at companies such as NBIM, BP, News UK, etc. | ||||
|   - Delivered both the architecture and implementation on multiple Cloud Access models | ||||
|   - Managed a team for 4 engineers, helping them get the most out of working for Cloudreach | ||||
|   - Helped run a city government hackathon (TFL) | ||||
|  | ||||
| ### *Role Owner (Cloud Systems Developers)*, [Cloudreach](https://www.cloudreach.com) (2016-06 — 2019-07) | ||||
|  | ||||
| Worked with the leadership team to improve the System Developers role. | ||||
|   - Helped Engineers get improve their technical skills though a hands-on training workshop program | ||||
|   - Trained and mentored multiple sets of graduates | ||||
|  | ||||
| ### *Internal hackathons/skunkworks Developer*, [Cloudreach](https://www.cloudreach.com) (2012-02 — 2019-07) | ||||
|  | ||||
| While at Cloudreach, worked on various spikes and hackathons | ||||
|   - Built Automated tanks that used image recognition to move and fire at each other. | ||||
|   - Built various useful internal tools, that remained in use for years | ||||
|   - Built a variety of IaC tools, that made deployments easier | ||||
|   - Won a trip to Central America | ||||
|   - Had project open sourced externally, by somebody that found it useful | ||||
|  | ||||
| ### *Cloud Systems Developer*, [Cloudreach](https://www.cloudreach.com) (2012-02 — 2014-03) | ||||
|  | ||||
| Worked on technical projects on AWS, Google Apps & Salesforce both individually and as part of a team. | ||||
|   - Worked across 3 cloud platforms (Google, AWS, Salesforce) | ||||
|   - Delivered difficult Google 2 Google migrations on tight deadlines | ||||
|  | ||||
| ### *Support Engineer*, [Supporttree](https://supporttree.co.uk) (2010-01 — 2012-02) | ||||
|  | ||||
| Full support for small businesses including end user systems, on-premise servers and cloud services. | ||||
|   - Worked in a user facing role, for a variety of small businesses | ||||
|   - Made use of automation and unix, in an otherwise manual windows environment | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## EDUCATION | ||||
|  | ||||
| ### UCL (2006-09 — 2009-07) | ||||
|  | ||||
|  | ||||
|  | ||||
| ### King's School Grantham (2004-09 — 2006-07) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## INTERESTS | ||||
|  | ||||
| - OPEN SOURCE & LINUX | ||||
|  | ||||
| - TRAVELLING | ||||
|  | ||||
| - PUNK ROCK, POLITICS & THE PUB | ||||
|  | ||||
|  | ||||
							
								
								
									
										41
									
								
								build.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -0,0 +1,41 @@ | ||||
| #!/usr/bin/env bash | ||||
| set -e | ||||
|  | ||||
| PATH="./node_modules/.bin/:$PATH" | ||||
|  | ||||
| for content in $(yq -r '.generate | keys[]' settings.yaml); do | ||||
|   echo "=== Generating ${content} themes with hackmyresume ===" | ||||
|   for theme in $(yq -r ".generate.${content}.plain[]?" settings.yaml); do | ||||
|     hackmyresume build "dist/${content}.json" TO "dist/${theme##*-}.all" -t "$theme" | ||||
|   done | ||||
|  | ||||
|   echo "=== Generating ${content} themes with css ===" | ||||
|   if yq -ce ".generate.${content}.css" settings.yaml; then | ||||
|     for theme in $(yq -r ".generate.${content}.css | keys[]" settings.yaml); do | ||||
|       for css in $(yq -r ".generate.${content}.css[\"$theme\"][]" settings.yaml); do | ||||
|         hackmyresume build "dist/${content}.json" TO "dist/${css}.all" -t "./node_modules/$theme" --css "$css" | ||||
|       done | ||||
|     done | ||||
|   fi | ||||
|  | ||||
|   echo "=== Generating ${content} themes with kcv ===" | ||||
|   hackmyresume convert "dist/${content}.json" resume.json | ||||
|   for theme in $(yq -r ".generate.${content}.kcv[]?" settings.yaml); do | ||||
|     for format in html pdf; do | ||||
|       kcv export "dist/kcv-${theme}.${format}" --theme "$theme" | ||||
|     done | ||||
|   done | ||||
|   mv resume.json "dist/${content}.jrs.json" | ||||
|  | ||||
| done | ||||
| rm dist/*.*.html | ||||
|  | ||||
| for ext in $(yq -r '.primary | keys[]' settings.yaml); do | ||||
|   cp "dist/$(niet ".primary.$ext" settings.yaml).$ext" "dist/resume.$ext" | ||||
| done | ||||
|  | ||||
| cp dist/"$(niet '.primary.md' settings.yaml)".md Resume.md | ||||
| cp dist/full.jrs.json ./resume.jrs.json | ||||
| cp dist/resume.json ./ | ||||
|  | ||||
| cp resume.yaml dist/ | ||||
							
								
								
									
										9
									
								
								deploy/clear-cache.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -0,0 +1,9 @@ | ||||
| #!/usr/bin/env bash | ||||
| set -e | ||||
|  | ||||
| # shellcheck disable=SC1090 | ||||
| . "$( dirname "${BASH_SOURCE[0]}" )/shared-functions" | ||||
|  | ||||
| DISTRIBUTION=$(get-output site CloudfrontDistribution) | ||||
| INVALIDATION=$(aws cloudfront create-invalidation --paths '/*' --distribution-id "$DISTRIBUTION" --query Invalidation.Id --output text) | ||||
| aws cloudfront wait invalidation-completed --distribution-id "$DISTRIBUTION" --id "$INVALIDATION" | ||||
							
								
								
									
										22
									
								
								deploy/cloudformation/certificate.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,22 @@ | ||||
| AWSTemplateFormatVersion: '2010-09-09' | ||||
| Description: Template for an SSL certificate (must be deployed in us-east-1 for cloudfront) | ||||
| Metadata: | ||||
|   License: magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later | ||||
|  | ||||
| Parameters: | ||||
|   SiteName: | ||||
|     Type: String | ||||
|     Description: Name for the site | ||||
|     AllowedPattern: '[a-zA-Z0-9-.]{1,63}' | ||||
|     ConstraintDescription: must be a valid DNS name. | ||||
|  | ||||
| Resources: | ||||
|   Certificate: | ||||
|     Type: AWS::CertificateManager::Certificate | ||||
|     Properties: | ||||
|       DomainName: !Ref SiteName | ||||
|       ValidationMethod: DNS | ||||
|  | ||||
| Outputs: | ||||
|   CertificateARN: | ||||
|     Value: !Ref Certificate | ||||
							
								
								
									
										94
									
								
								deploy/cloudformation/roles.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,94 @@ | ||||
| AWSTemplateFormatVersion: '2010-09-09' | ||||
| Description: Iam Roles for account running a static S3 website with cloudfront (IAMAdmin, Admin, S3Admin/User) | ||||
| Metadata: | ||||
|   License: magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later | ||||
|  | ||||
| Resources: | ||||
|   IAMAdmin: | ||||
|     Type: AWS::IAM::Role | ||||
|     Properties: | ||||
|       RoleName: IAMAdmin | ||||
|       ManagedPolicyArns: | ||||
|         - arn:aws:iam::aws:policy/AWSCloudFormationFullAccess | ||||
|         - arn:aws:iam::aws:policy/IAMFullAccess | ||||
|         - arn:aws:iam::aws:policy/ReadOnlyAccess | ||||
|       AssumeRolePolicyDocument: | ||||
|         Version: '2012-10-17' | ||||
|         Statement: | ||||
|           - Effect: Allow | ||||
|             Principal: | ||||
|               AWS: arn:aws:iam::212707113393:root | ||||
|             Action: sts:AssumeRole | ||||
|           - Effect: Allow | ||||
|             Principal: | ||||
|               Federated: | ||||
|                 - !Sub arn:aws:iam::${AWS::AccountId}:saml-provider/Google | ||||
|             Action: sts:AssumeRoleWithSAML | ||||
|             Condition: | ||||
|               StringEquals: | ||||
|                 SAML:aud: https://signin.aws.amazon.com/saml | ||||
|   Admin: | ||||
|     Type: AWS::IAM::Role | ||||
|     Properties: | ||||
|       RoleName: Admin | ||||
|       ManagedPolicyArns: | ||||
|         - arn:aws:iam::aws:policy/ReadOnlyAccess | ||||
|         - arn:aws:iam::aws:policy/AWSCloudFormationFullAccess | ||||
|         - arn:aws:iam::aws:policy/AmazonS3FullAccess | ||||
|         - arn:aws:iam::aws:policy/AmazonRoute53FullAccess | ||||
|         - arn:aws:iam::aws:policy/CloudFrontFullAccess | ||||
|         - arn:aws:iam::aws:policy/AWSCertificateManagerFullAccess | ||||
|       AssumeRolePolicyDocument: | ||||
|         Version: '2012-10-17' | ||||
|         Statement: | ||||
|           - Effect: Allow | ||||
|             Principal: | ||||
|               AWS: arn:aws:iam::212707113393:root | ||||
|             Action: sts:AssumeRole | ||||
|           - Effect: Allow | ||||
|             Principal: | ||||
|               Federated: | ||||
|                 - !Sub arn:aws:iam::${AWS::AccountId}:saml-provider/Google | ||||
|             Action: sts:AssumeRoleWithSAML | ||||
|             Condition: | ||||
|               StringEquals: | ||||
|                 SAML:aud: https://signin.aws.amazon.com/saml | ||||
|   User: | ||||
|     Type: AWS::IAM::Role | ||||
|     Properties: | ||||
|       RoleName: User | ||||
|       ManagedPolicyArns: | ||||
|         - arn:aws:iam::aws:policy/ReadOnlyAccess | ||||
|         - !Ref UserPolicy | ||||
|       AssumeRolePolicyDocument: | ||||
|         Version: '2012-10-17' | ||||
|         Statement: | ||||
|           - Effect: Allow | ||||
|             Principal: | ||||
|               AWS: arn:aws:iam::212707113393:root | ||||
|             Action: sts:AssumeRole | ||||
|           - Effect: Allow | ||||
|             Principal: | ||||
|               Federated: | ||||
|                 - !Sub arn:aws:iam::${AWS::AccountId}:saml-provider/Google | ||||
|             Action: sts:AssumeRoleWithSAML | ||||
|             Condition: | ||||
|               StringEquals: | ||||
|                 SAML:aud: https://signin.aws.amazon.com/saml | ||||
|  | ||||
|   UserPolicy: | ||||
|     Type: AWS::IAM::ManagedPolicy | ||||
|     Properties: | ||||
|       Description: Grants Access to Created/Update/Delete S3 Objects & Clear Cloudfront caches | ||||
|       PolicyDocument: | ||||
|         Version: 2012-10-17 | ||||
|         Statement: | ||||
|           - Effect: Allow | ||||
|             Action: | ||||
|               - s3:DeleteObject | ||||
|               - s3:PutObject | ||||
|             Resource: 'arn:aws:s3:::*/*' | ||||
|  | ||||
|           - Effect: Allow | ||||
|             Action: cloudfront:CreateInvalidation | ||||
|             Resource: '*' | ||||
							
								
								
									
										99
									
								
								deploy/cloudformation/site.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,99 @@ | ||||
| AWSTemplateFormatVersion: '2010-09-09' | ||||
| Description: Template will deploy an s3 bucket, Route53Zone & SSL certificate to host a static website | ||||
| Metadata: | ||||
|   License: magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later | ||||
|  | ||||
| Parameters: | ||||
|   SiteName: | ||||
|     Type: String | ||||
|     Description: Name for the site | ||||
|     AllowedPattern: '[a-zA-Z0-9-.]{1,63}' | ||||
|     ConstraintDescription: must be a valid DNS name. | ||||
|   CertificateARN: | ||||
|     Type: String | ||||
|  | ||||
| Resources: | ||||
|   Bucket: | ||||
|     Type: AWS::S3::Bucket | ||||
|     Properties: | ||||
|       BucketName: !Join [-, !Split [., !Ref SiteName]] | ||||
|       AccessControl: PublicRead | ||||
|       WebsiteConfiguration: | ||||
|         ErrorDocument: resume.html | ||||
|         IndexDocument: resume.html | ||||
|  | ||||
|   BucketPolicy: | ||||
|     Type: AWS::S3::BucketPolicy | ||||
|     Properties: | ||||
|       Bucket: !Ref Bucket | ||||
|       PolicyDocument: | ||||
|         Version: 2012-10-17 | ||||
|         Statement: | ||||
|           - Sid: PublicReadGetObject | ||||
|             Effect: Allow | ||||
|             Principal: '*' | ||||
|             Action: s3:GetObject | ||||
|             Resource: | ||||
|               - !Sub ${Bucket.Arn}/* | ||||
|  | ||||
|   Route53Zone: | ||||
|     Type: AWS::Route53::HostedZone | ||||
|     Properties: | ||||
|       HostedZoneConfig: | ||||
|         Comment: !Sub 'hosted zone for ${SiteName}' | ||||
|       Name: !Ref SiteName | ||||
|  | ||||
|   Route53RecordIPv4: | ||||
|     Type: AWS::Route53::RecordSet | ||||
|     Properties: | ||||
|       AliasTarget: | ||||
|         DNSName: !GetAtt CloudfrontDistribution.DomainName | ||||
|         HostedZoneId: Z2FDTNDATAQYW2 | ||||
|       HostedZoneId: !Ref Route53Zone | ||||
|       Name: !Ref SiteName | ||||
|       Type: A | ||||
|  | ||||
|   Route53RecordIPv6: | ||||
|     Type: AWS::Route53::RecordSet | ||||
|     Properties: | ||||
|       AliasTarget: | ||||
|         DNSName: !GetAtt CloudfrontDistribution.DomainName | ||||
|         HostedZoneId: Z2FDTNDATAQYW2 | ||||
|       HostedZoneId: !Ref Route53Zone | ||||
|       Name: !Ref SiteName | ||||
|       Type: AAAA | ||||
|  | ||||
|   CloudfrontDistribution: | ||||
|     Type: AWS::CloudFront::Distribution | ||||
|     Properties: | ||||
|       DistributionConfig: | ||||
|         Aliases: | ||||
|           - !Ref SiteName | ||||
|         Enabled: true | ||||
|         HttpVersion: http2 | ||||
|         IPV6Enabled: true | ||||
|         PriceClass: PriceClass_100 | ||||
|         DefaultRootObject: resume.html | ||||
|         ViewerCertificate: | ||||
|           AcmCertificateArn: !Ref CertificateARN | ||||
|           SslSupportMethod: sni-only | ||||
|         Origins: | ||||
|           - Id: bucket | ||||
|             DomainName: !GetAtt Bucket.RegionalDomainName | ||||
|             S3OriginConfig: | ||||
|               OriginAccessIdentity: '' | ||||
|         DefaultCacheBehavior: | ||||
|           DefaultTTL: 3600 | ||||
|           TargetOriginId: bucket | ||||
|           ViewerProtocolPolicy: allow-all | ||||
|           Compress: true | ||||
|           ForwardedValues: | ||||
|             QueryString: false | ||||
|  | ||||
| Outputs: | ||||
|   HostedZoneId: | ||||
|     Value: !Ref Route53Zone | ||||
|   HostedZoneRecords: | ||||
|     Value: !Join [",", !GetAtt Route53Zone.NameServers] | ||||
|   CloudfrontDistribution: | ||||
|     Value: !Ref CloudfrontDistribution | ||||
							
								
								
									
										14
									
								
								deploy/deploy-cloudformation.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -0,0 +1,14 @@ | ||||
| #!/usr/bin/env bash | ||||
| set -e | ||||
|  | ||||
| # shellcheck disable=SC1090 | ||||
| . "$( dirname "${BASH_SOURCE[0]}" )/shared-functions" | ||||
|  | ||||
| export AWS_DEFAULT_REGION=us-east-1 | ||||
| deploy certificate SiteName="$SITENAME" | ||||
| CERT=$(get-output certificate CertificateARN) | ||||
| unset AWS_DEFAULT_REGION | ||||
|  | ||||
| deploy site SiteName="$SITENAME" CertificateARN="$CERT" | ||||
|  | ||||
|  | ||||
							
								
								
									
										18
									
								
								deploy/shared-functions
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,18 @@ | ||||
| #!/usr/bin/env bash | ||||
| SITENAME=$1 | ||||
| PROJECT=${SITENAME//./} | ||||
|  | ||||
| CFN_DIR="$( dirname "${BASH_SOURCE[0]}" )/cloudformation" | ||||
| DEPLOY_CMD="aws cloudformation deploy --no-fail-on-empty-changeset --tags Classification=Public Site=$SITENAME" | ||||
|  | ||||
| deploy() { | ||||
|   # shellcheck disable=SC2145 | ||||
|   echo "deploying $1 [${@:2}]" | ||||
|   # shellcheck disable=SC2068 | ||||
|   $DEPLOY_CMD --stack-name "${PROJECT}-$1" --template-file "${CFN_DIR}/$1.yaml" --parameter-overrides ${@:2} | ||||
|   aws cloudformation wait stack-exists --stack-name "${PROJECT}-$1" | ||||
| } | ||||
|  | ||||
| get-output() { | ||||
|   aws cloudformation describe-stacks --stack-name "${PROJECT}-$1" --query "Stacks[0].Outputs[?OutputKey==\`$2\`].OutputValue" --output text | ||||
| } | ||||
							
								
								
									
										22
									
								
								generate_qrcode.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -0,0 +1,22 @@ | ||||
| #!/usr/bin/env python | ||||
| "Creates a QR code with a smaller border than the standard cli" | ||||
| import sys | ||||
| import os | ||||
| from qrcode import QRCode | ||||
|  | ||||
|  | ||||
| def generate_qrcode(site, filename): | ||||
|     """ Function to generate QR code wth boarder of 1 """ | ||||
|     qrcode = QRCode(border=1) | ||||
|     qrcode.add_data(site) | ||||
|     qrcode.make() | ||||
|  | ||||
|     img = qrcode.make_image() | ||||
|  | ||||
|     filename = os.path.join("images", filename) | ||||
|     filename += ".png" | ||||
|     img.save(filename) | ||||
|  | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     generate_qrcode(sys.argv[1], sys.argv[2]) | ||||
							
								
								
									
										
											BIN
										
									
								
								images/AWS-DevOps-Pro.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 9.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/AWS-Developer-Associate.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 7.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/AWS-Solutions-Architect-Associate.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 8.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/AWS-Solutions-Architect-Pro.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 8.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/AWS-Sysops-Associate.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 8.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/GCP-Cloud-Architect-Pro.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 16 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/GCP-Data-Engineer-Pro.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 14 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/LPCI-1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 16 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/MCTS-Windows-7-Configuration.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 23 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/QR.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 498 B | 
							
								
								
									
										
											BIN
										
									
								
								images/Salesforce-Platform-Developer.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 18 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/Salesforce-administrator.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 22 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/qr.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.5 KiB | 
							
								
								
									
										28
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,28 @@ | ||||
| { | ||||
|   "name": "juan-canham-resume", | ||||
|   "version": "0.9.0", | ||||
|   "description": "Juan Canham's Resume/CV", | ||||
|   "dependencies": { | ||||
|     "hackmyresume": "git+https://git.juancanham.com/JuanCanham/HackMyResume.git#juan-canham-json-theme", | ||||
|     "kcv-cli": "^1.3.0", | ||||
|     "kcv-theme-fresh": "^0.0.4", | ||||
|     "resume-cli": "^1.2.7", | ||||
|     "jsonresume-theme-modern": "git+https://git.juancanham.com/JuanCanham/jsonresume-theme-modern.git", | ||||
|     "fresh-theme-bootstrap": "git+https://git.juancanham.com/JuanCanham/fresh-theme-bootstrap.git", | ||||
|     "fresh-theme-elegant": "git+https://git.juancanham.com/JuanCanham/fresh-theme-elegant.git#feature/interactive" | ||||
|   }, | ||||
|   "devDependencies": {}, | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1" | ||||
|   }, | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "https://git.juancanham.com/JuanCanham/juan-canham-resume" | ||||
|   }, | ||||
|   "keywords": [ | ||||
|     "resume", | ||||
|     "CV" | ||||
|   ], | ||||
|   "author": "Juan Canham <juan@juancanham.com>", | ||||
|   "license": "BSD-2-Clause" | ||||
| } | ||||
							
								
								
									
										7
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | ||||
| awscli==1.18.* | ||||
| black==19.10b0 | ||||
| cfn-lint==0.28.* | ||||
| pylint==2.* | ||||
| qrcode==6.* | ||||
| yamllint==1.20.* | ||||
| image==1.5.28 | ||||
							
								
								
									
										319
									
								
								resume.jrs.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,319 @@ | ||||
| { | ||||
|   "basics": { | ||||
|     "name": "Juan Barry Manual Canham", | ||||
|     "label": "Cloud \"DevOps\" Engineer", | ||||
|     "summary": "A Pragmatic Cloud \"DevOps\" Engineer, with experience at a variety of companies, across a range of technologies\ndriving both technological change as well as business focused outcomes.\nCapable of wearing whatever hat is needed for a given job, primarily working as both:\n* an architect, aligning the technical solutions to the customers requirements\n* a technical lead, both delivering code and guiding/mentoring/supporting teams as required.\n", | ||||
|     "website": "https://cv.juancanham.com", | ||||
|     "email": "cv@juancanham.com", | ||||
|     "picture": "images/QR.png", | ||||
|     "location": { | ||||
|       "city": "London", | ||||
|       "countryCode": "England", | ||||
|       "region": "EU" | ||||
|     }, | ||||
|     "profiles": [ | ||||
|       { | ||||
|         "network": "Git", | ||||
|         "username": "jc", | ||||
|         "url": "http://git.juancanham.com/" | ||||
|       }, | ||||
|       { | ||||
|         "network": "LinkedIn", | ||||
|         "username": "juan-canham-aa005a51", | ||||
|         "url": "https://www.linkedin.com/in/juan-canham-aa005a51/" | ||||
|       }, | ||||
|       { | ||||
|         "network": "Github", | ||||
|         "username": "JuanCanham", | ||||
|         "url": "https://github.com/juancanham" | ||||
|       } | ||||
|     ] | ||||
|   }, | ||||
|   "work": [ | ||||
|     { | ||||
|       "company": "Self", | ||||
|       "website": "https://juancanham.com", | ||||
|       "position": "Open Source Developer", | ||||
|       "startDate": "2019-07", | ||||
|       "summary": "Spending a few months developing tools to make engineering in the clouds easier. And other assorted tools", | ||||
|       "highlights": [ | ||||
|         "Quickly Built a tool to view twitter exports", | ||||
|         "Begun work on a module", | ||||
|         "Built a website to highlight the problems with FPTP", | ||||
|         "Built a tool to monitor activity on toxic internet communities" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "company": "Cloudreach", | ||||
|       "website": "https://www.cloudreach.com", | ||||
|       "position": "Cloud Systems Developer Lead", | ||||
|       "startDate": "2014-03", | ||||
|       "endDate": "2019-07", | ||||
|       "summary": "Worked on customer projects as a Lead/Architect and mentored a small team.", | ||||
|       "highlights": [ | ||||
|         "Architect on several Enterprise engagement, at companies such as NBIM, BP, News UK, etc.", | ||||
|         "Delivered both the architecture and implementation on multiple Cloud Access models", | ||||
|         "Managed a team for 4 engineers, helping them get the most out of working for Cloudreach", | ||||
|         "Helped run a city government hackathon (TFL)" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "company": "Cloudreach", | ||||
|       "website": "https://www.cloudreach.com", | ||||
|       "position": "Role Owner (Cloud Systems Developers)", | ||||
|       "startDate": "2016-06", | ||||
|       "endDate": "2019-07", | ||||
|       "summary": "Worked with the leadership team to improve the System Developers role.", | ||||
|       "highlights": [ | ||||
|         "Helped Engineers get improve their technical skills though a hands-on training workshop program", | ||||
|         "Trained and mentored multiple sets of graduates" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "company": "Cloudreach", | ||||
|       "website": "https://www.cloudreach.com", | ||||
|       "position": "Internal hackathons/skunkworks Developer", | ||||
|       "startDate": "2012-02", | ||||
|       "endDate": "2019-07", | ||||
|       "summary": "While at Cloudreach, worked on various spikes and hackathons", | ||||
|       "highlights": [ | ||||
|         "Built Automated tanks that used image recognition to move and fire at each other.", | ||||
|         "Built various useful internal tools, that remained in use for years", | ||||
|         "Built a variety of IaC tools, that made deployments easier", | ||||
|         "Won a trip to Central America", | ||||
|         "Had project open sourced externally, by somebody that found it useful" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "company": "Cloudreach", | ||||
|       "website": "https://www.cloudreach.com", | ||||
|       "position": "Cloud Systems Developer", | ||||
|       "startDate": "2012-02", | ||||
|       "endDate": "2014-03", | ||||
|       "summary": "Worked on technical projects on AWS, Google Apps & Salesforce both individually and as part of a team.", | ||||
|       "highlights": [ | ||||
|         "Worked across 3 cloud platforms (Google, AWS, Salesforce)", | ||||
|         "Delivered difficult Google 2 Google migrations on tight deadlines" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "company": "Supporttree", | ||||
|       "website": "https://supporttree.co.uk", | ||||
|       "position": "Support Engineer", | ||||
|       "startDate": "2010-01", | ||||
|       "endDate": "2012-02", | ||||
|       "summary": "Full support for small businesses including end user systems, on-premise servers and cloud services.", | ||||
|       "highlights": [ | ||||
|         "Worked in a user facing role, for a variety of small businesses", | ||||
|         "Made use of automation and unix, in an otherwise manual windows environment" | ||||
|       ] | ||||
|     } | ||||
|   ], | ||||
|   "education": [ | ||||
|     { | ||||
|       "institution": "UCL", | ||||
|       "startDate": "2006-09", | ||||
|       "endDate": "2009-07" | ||||
|     }, | ||||
|     { | ||||
|       "institution": "King's School Grantham", | ||||
|       "gpa": "AAAAA", | ||||
|       "courses": [ | ||||
|         "Maths", | ||||
|         "Further Maths", | ||||
|         "Physics", | ||||
|         "Chemistry", | ||||
|         "Spanish" | ||||
|       ], | ||||
|       "startDate": "2004-09", | ||||
|       "endDate": "2006-07" | ||||
|     } | ||||
|   ], | ||||
|   "skills": [ | ||||
|     { | ||||
|       "name": "Programming", | ||||
|       "level": "Skilled", | ||||
|       "keywords": [ | ||||
|         { | ||||
|           "name": "Python", | ||||
|           "level": "Skilled", | ||||
|           "summary": "Primary language used for most projects" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Ruby", | ||||
|           "level": "Skilled", | ||||
|           "summary": "Primary language used for some projects, also often used as part of Chef or other tools used within projects" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Bash", | ||||
|           "level": "Skilled", | ||||
|           "summary": "Used extensively for system automation" | ||||
|         }, | ||||
|         { | ||||
|           "name": "JavaScript", | ||||
|           "level": "Knowledgeable", | ||||
|           "summary": "Experience with both frontend development and Node to deliver automation" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Apex/Java", | ||||
|           "level": "Basic", | ||||
|           "summary": "Primary language used for Salesforce development" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Other Languages", | ||||
|           "level": "Novice", | ||||
|           "summary": "Powershell, Vbs, batch, PHP, Perl, C, C#" | ||||
|         } | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "name": "AWS", | ||||
|       "level": "Skilled", | ||||
|       "keywords": [ | ||||
|         { | ||||
|           "name": "Cloudformation", | ||||
|           "level": "Skilled", | ||||
|           "summary": "Both natively and via Troposphere, Jinja & ruby-DSL" | ||||
|         }, | ||||
|         { | ||||
|           "name": "IAM", | ||||
|           "level": "Skilled", | ||||
|           "summary": "Extensive knowledge in building secured multi-tenanted accounts" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Lambda", | ||||
|           "level": "Knowledgeable", | ||||
|           "summary": "Used extensively with both Python & JavaScript as part of stand-alone components & complex frameworks" | ||||
|         }, | ||||
|         { | ||||
|           "name": "DynamoDB", | ||||
|           "level": "Knowledgeable", | ||||
|           "summary": "Used in-depth to store state for lambda, whenever S3 was not viable" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Core AWS services", | ||||
|           "level": "Skilled", | ||||
|           "summary": "Have used EC2, S3, RDS, SNS, SQS, Cloudwatch, Config, ElastiCache, etc, extensively" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Additional AWS services", | ||||
|           "level": "Knowledgeable", | ||||
|           "summary": "Have used other services such as Direct Connect, CodeDeploy, AppStream, etc" | ||||
|         } | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "name": "DevOps tools and methodologies", | ||||
|       "level": "Skilled", | ||||
|       "keywords": [ | ||||
|         { | ||||
|           "name": "IaC", | ||||
|           "level": "Skilled", | ||||
|           "summary": "Always used Infrastructure as Code (IaC), primarily native tools, but also Terraform when needed" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Immutability", | ||||
|           "level": "Skilled", | ||||
|           "summary": "Designed and implemented immutable systems" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Configuration Management", | ||||
|           "level": "Skilled", | ||||
|           "summary": "Extensive use of configuration management tools such as Chef and Ansible when needed" | ||||
|         }, | ||||
|         { | ||||
|           "name": "TDD - Infrastructure", | ||||
|           "level": "skilled", | ||||
|           "summary": "Used test driven development (TDD) on most greenfield projects and also gradually retrofitted to legacy infrastructure" | ||||
|         }, | ||||
|         { | ||||
|           "name": "TDD - Application", | ||||
|           "level": "Moderate" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Build systems", | ||||
|           "level": "skilled", | ||||
|           "summary": "Always used Build systems (Jenkins, AnthillPro, Code*, Gitlab, etc)" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Containers", | ||||
|           "level": "Knowledge", | ||||
|           "summary": "Familiar with immutable image pipelines and methodologies" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Init systems", | ||||
|           "level": "Knowledgeable", | ||||
|           "summary": "Used Upstart/SystemD/SysV/Monit as required, in particular use of signals/sockets when possible" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Agile", | ||||
|           "level": "Moderate", | ||||
|           "summary": "Used both within Small companies and adapted Larger Enterprise" | ||||
|         } | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "name": "Google", | ||||
|       "level": "Knowledgeable", | ||||
|       "keywords": [ | ||||
|         { | ||||
|           "name": "GCP", | ||||
|           "level": "Moderate", | ||||
|           "summary": "Developed high level account strategies for GCP" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Google deployment manager", | ||||
|           "level": "Moderate", | ||||
|           "summary": "Developed transformation tool using Google Deployment Manager" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Google App Engine", | ||||
|           "level": "Moderate", | ||||
|           "summary": "Some use as part of projects, primarily in Python" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Google Apps", | ||||
|           "level": "Skilled", | ||||
|           "summary": "Extensive use as part of Google Apps projects" | ||||
|         } | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "name": "Salesforce", | ||||
|       "level": "Moderate", | ||||
|       "keywords": [ | ||||
|         { | ||||
|           "name": "Apex", | ||||
|           "level": "Moderate", | ||||
|           "summary": "Experience writing both small classes and triggers" | ||||
|         }, | ||||
|         { | ||||
|           "name": "Configuration", | ||||
|           "level": "Basic", | ||||
|           "summary": "Experience configuring Salesforce estates as per customer requirements" | ||||
|         } | ||||
|       ] | ||||
|     } | ||||
|   ], | ||||
|   "interests": [ | ||||
|     { | ||||
|       "name": "Open Source & Linux" | ||||
|     }, | ||||
|     { | ||||
|       "name": "Travelling" | ||||
|     }, | ||||
|     { | ||||
|       "name": "Punk Rock, Politics & the Pub" | ||||
|     } | ||||
|   ], | ||||
|   "languages": [ | ||||
|     { | ||||
|       "language": "English", | ||||
|       "fluency": "Native" | ||||
|     }, | ||||
|     { | ||||
|       "language": "Spanish", | ||||
|       "fluency": "Native" | ||||
|     } | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										1
									
								
								resume.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										479
									
								
								resume.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,479 @@ | ||||
| --- | ||||
| name: Juan Barry Manual Canham | ||||
| contact: | ||||
|   email: "cv@juancanham.com" | ||||
|   website: https://cv.juancanham.com | ||||
|  | ||||
| info: | ||||
|   label: Cloud "DevOps" Engineer | ||||
|   image: images/QR.png | ||||
|   brief: | | ||||
|     A Pragmatic Cloud "DevOps" Engineer, with experience at a variety of companies, across a range of technologies | ||||
|     driving both technological change as well as business focused outcomes. | ||||
|     Capable of wearing whatever hat is needed for a given job, primarily working as both: | ||||
|     * an architect, aligning the technical solutions to the customers requirements | ||||
|     * a technical lead, both delivering code and guiding/mentoring/supporting teams as required. | ||||
|  | ||||
| location: | ||||
|   city: London | ||||
|   county: Greater London | ||||
|   country: England | ||||
|   region: EU | ||||
|   countryCode: GB | ||||
|  | ||||
| social: | ||||
|   - label: Git | ||||
|     network: Git | ||||
|     user: jc | ||||
|     url: http://git.juancanham.com/ | ||||
|   - label: LinkedIn | ||||
|     network: LinkedIn | ||||
|     user: juan-canham-aa005a51 | ||||
|     url: https://www.linkedin.com/in/juan-canham-aa005a51/ | ||||
|   - label: Github | ||||
|     network: Github | ||||
|     user: JuanCanham | ||||
|     url: https://github.com/juancanham | ||||
|  | ||||
| certifications: | ||||
|   - organisation: AWS | ||||
|     certificates: | ||||
|       - name: Solutions Architect | ||||
|         level: Professional | ||||
|         logo: AWS-Solutions-Architect-Pro.png | ||||
|       - name: DevOps | ||||
|         level: Professional | ||||
|         logo: AWS-DevOps-Pro.png | ||||
|       - name: Solutions Architect | ||||
|         level: Associate | ||||
|         logo: AWS-Solutions-Architect-Associate.png | ||||
|       - name: SysOps Administrator | ||||
|         level: Associate | ||||
|         logo: AWS-Sysops-Associate.png | ||||
|       - name: Developer | ||||
|         level: Associate | ||||
|         logo: AWS-Developer-Associate.png | ||||
|   - organisation: Google | ||||
|     certificates: | ||||
|       - name: Cloud Architect | ||||
|         level: Professional | ||||
|         logo: GCP-Cloud-Architect-Pro.png | ||||
|       - name: Data Engineer | ||||
|         level: Professional | ||||
|         logo: GCP-Data-Engineer-Pro.png | ||||
|       - name: Google Apps Deployment Specialist | ||||
|   - organisation: Linux Professional Institute | ||||
|     certificates: | ||||
|       - name: LPCI-1 | ||||
|         logo: LPCI-1.png | ||||
|   - organisation: Salesforce | ||||
|     certificates: | ||||
|       - name: Force.com Developer | ||||
|         logo: Salesforce-Platform-Developer.png | ||||
|       - name: Administrator | ||||
|         logo: Salesforce-administrator.png | ||||
|   - organisation: Microsoft | ||||
|     certificates: | ||||
|       - name: Windows 7, Configuration | ||||
|         level: Microsoft Certified Technology Specialist | ||||
|  | ||||
| employment: | ||||
|   summary: "9+ years cloud infrastructure experience as engineer, technical lead & architect" | ||||
|   history: | ||||
|     - employer: Self | ||||
|       url: https://juancanham.com | ||||
|       technologies: [Cloud, AWS, GCP, Azure, SSO, Open Source] | ||||
|       position: Open Source Developer | ||||
|       summary: Spending a few months developing tools to make engineering in the clouds easier. And other assorted tools | ||||
|       start: 2019-07 | ||||
|       highlights: | ||||
|         - Quickly Built a tool to view twitter exports | ||||
|         - Begun work on a module | ||||
|         - Built a website to highlight the problems with FPTP | ||||
|         - Built a tool to monitor activity on toxic internet communities | ||||
|       projects: | ||||
|         - name: Offline Twitter Export Viewer | ||||
|           summary: Simple tool to view twitter exports offline | ||||
|           url: https://gitlab.com/RitoingPacifst/offline-twitter-export-viewer | ||||
|         - name: Generic AWS Saml CLI (WIP) | ||||
|           summary: Generic SAML tool for AWS, to work with multiple providers and multiple backends using a modular pythonic design. | ||||
|         - name: TheMajority.uk | ||||
|           summary: Website generator combining markdown, Jinja & yaml. Also a website about proportional representation | ||||
|           url: https://gitlab.com/TheMajority/themajority.uk | ||||
|         - name: Subreddit Monitor | ||||
|           summary: Serverless Python bot, to monitor subreddit activity for cross-posts and notify users | ||||
|  | ||||
|  | ||||
|     - position: Cloud Systems Developer Lead | ||||
|       summary: Worked on customer projects as a Lead/Architect and mentored a small team. | ||||
|       employer: Cloudreach | ||||
|       url: https://www.cloudreach.com | ||||
|       description: | | ||||
|         Worked on customer projects as a Tech Lead/Architect. | ||||
|         Managed a team of 3 or 4 engineers within Cloudreach, making sure they got the most out of their role at Cloudreach, | ||||
|         aligning the individuals personal development plans both with Cloudreach's goals and their longer term career trajectories. | ||||
|         It was particularly rewarding was getting team members of promoted to Tech-lead level. | ||||
|       start: 2014-03 | ||||
|       end: 2019-07 | ||||
|       keywords: [Leadership, Mentoring, Architect, Tech Lead] | ||||
|       highlights: | ||||
|         - Architect on several Enterprise engagement, at companies such as NBIM, BP, News UK, etc. | ||||
|         - Delivered both the architecture and implementation on multiple Cloud Access models | ||||
|         - Managed a team for 4 engineers, helping them get the most out of working for Cloudreach | ||||
|         - Helped run a city government hackathon (TFL) | ||||
|       projects: | ||||
|         - name: Cloud Migration | ||||
|           customer: Norges Bank Investment Management | ||||
|           summary: Formed part of the CCOE supporting NBIM's datacentre exit onto immutable infrastructure in AWS | ||||
|           description: | | ||||
|             NBIM had an aggressive migration strategy, based on a standardised pipeline approach in order to | ||||
|             re-platform 150 applications into immutably deployed services within 8 months. | ||||
|             As part of the CCOE, helped build and maintain the pipeline (Cloudformation, Ansible, Packer, Jinja, | ||||
|             Powershell) in order to achieve this. | ||||
|             As well as support teams migrating applications, migrate applications and ensure best practices were | ||||
|             applied at an account level. | ||||
|           keywords: [CCOE, Deployment Pipeline, Immutable] | ||||
|           technologies: [AWS, Packer, Cloudformation, Ansible, Jinja, Python, Windows, Linux] | ||||
|         - name: AWS CIP | ||||
|           customer: BP | ||||
|           summary: Architect for BP's Cloud infrastructure Platform (AWS) | ||||
|           description: | | ||||
|             Architect/Tech Lead on the AWS side of BP's Cloud infrastructure Platform (CIP), responsible for | ||||
|               - Guiding high-level goals | ||||
|               - Interfacing with other teams and gather requirements at a technical level | ||||
|               - Aligning high-level & mid-Level architectures | ||||
|               - RBAC engine in a Multi-Tenanted account | ||||
|               - Supporting the team and ensure code quality for services and customers | ||||
|             Transitioned the project from an EC2-focused offering in 1 region, with 4 supported OSes, | ||||
|             to a managed cloud native datacentre, offering use of 20 AWS services, across 2 regions with 6 supported OSes, | ||||
|             as well as aligning future visions towards a many-account model. | ||||
|           keywords: [Strategy, RBAC, Multi-Tenanted, Platform, Shared Services, Landing Zone, Multi-Region] | ||||
|           technologies: [AWS, IAM, Cloudformation, Windows, Linux, Python] | ||||
|         - name: Multi Cloud Lab Vending Engine | ||||
|           customer: Cloudreach | ||||
|           summary: Replace Long lived Multi-User Labs with an on-demand Multi Cloud Lab Vending Engine | ||||
|           description: | | ||||
|             Transformed shared per-cloud lab accounts, into an SSO integrated multi-cloud (AWS, Azure, GCP) | ||||
|             on-demand vending engine, improving security, while reducing cost and increasing accountability. | ||||
|             In addition for pushing for the change on the business side, designed the API for integrating with | ||||
|             the serverless per-cloud solutions, | ||||
|             implement the central orchestration workflows in Google Apps script (JavaScript), | ||||
|             Wrote the serverless wrapper (python) that provided the link between AWS's Landing Zone product and the | ||||
|             orchestrator. | ||||
|           keywords: [Multi-cloud, Strategy, Portal, Landing Zone, Multi-Account, Serverless, SSO, API Design] | ||||
|           technologies: [AWS, Azure, GCP, Account Vending Engine, JavaScript, Stateless, Python, Lambda, SAM] | ||||
|         - name: TFL hackathon | ||||
|           customer: TFL | ||||
|           summary: Helped Run and Judge TFL Active Travel Hackathon | ||||
|           description: | | ||||
|             Provided expertise for teams making use of AWS while building solutions using TFL, Met Office & | ||||
|             Ordinance Survey's APIs. | ||||
|           keywords: [AWS, Hackathon, APIs] | ||||
|           technologies: [AWS] | ||||
|         - name: Pearson Governance Framework and Prototype | ||||
|           customer: Pearson | ||||
|           summary: Designed and prototyped Pearson's AWS governance strategy | ||||
|           description: | | ||||
|             Produced a cloud adoption and governance strategy, to reduce the unmanaged spend across 100+ accounts. | ||||
|             Provided a design for account structure, access, networking, security, monitoring, cost allocation and deployment. | ||||
|             Led team building a serverless monitoring and triage framework (similar to cloud guardian/current AWS whitepapers), | ||||
|             and target account creation and hardening. | ||||
|           keywords: [Strategy, Multi-Tenanted, Platform, Shared Services, Landing Zone, Serverless] | ||||
|           technologies: [AWS, Cloudformation, Windows, Linux, Python] | ||||
|  | ||||
|     - position: Role Owner (Cloud Systems Developers) | ||||
|       summary: Worked with the leadership team to improve the System Developers role. | ||||
|       employer: Cloudreach | ||||
|       url: https://www.cloudreach.com | ||||
|       description: | | ||||
|         Worked with the leadership team to improve the System Developers role. | ||||
|         This included both technical tooling and non-technical initiatives, processes, such as training programs, | ||||
|         interview processes and the graduate program. | ||||
|       start: 2016-06 | ||||
|       end: 2019-07 | ||||
|       keywords: [Strategy, Vision, Internal, Personal Development] | ||||
|       highlights: | ||||
|         - Helped Engineers get improve their technical skills though a hands-on training workshop program | ||||
|         - Trained and mentored multiple sets of graduates | ||||
|       projects: | ||||
|         - name: Personal Growth workshops | ||||
|           summary: Introduced monthly hands-on training workshops. | ||||
|           description: | | ||||
|             By using in-house experts, to deliver 1/2 day, regional hands-on, realistic, workshops, | ||||
|             the program gives engineers a chance to use emerging technologies on realistic use cases, rather than under idea situations. | ||||
|             For example, it's easy to setup a Kubernetes demo, but most introductions, don't cover dealing with sidecars and statefull containers. | ||||
|             The workshops also gave experienced team engineers a change to showcase their skills and produce content for our knowledgebase. | ||||
|             As the workshops were run separately it was also an opportunity for the American and European offices to collaborate | ||||
|             on training materials, without having to deal with time-zones for the delivery. | ||||
|           keywords: [Personal Development, Training, Strategy, DevOps] | ||||
|         - name: Graduate/FastTrack Trainer/coordinator | ||||
|           summary: Involved in the delivery of 6 Fast Track training programs. | ||||
|           description: | | ||||
|             The Graduate/Fast Track program was a 8-10 week training course initially for recent graduates | ||||
|             and later for anybody keen to retrain and start working in cloud based DevOps. | ||||
|             Responsible for at least one, two week course on either AWS or infrastructure as code, in every program, | ||||
|             as the cloud computing progresses rapidly this meant refreshing course materials and delivering, | ||||
|             a hands-on course to groups of 6-20. | ||||
|             In addition to delivering the training also worked with the leadership team and managers to ensure | ||||
|             graduates were placed onto appropriate projects. | ||||
|           keywords: [Personal Development, Training] | ||||
|           technologies: [AWS, IaC] | ||||
|         - name: Interview Process update | ||||
|           summary: Responsible for refining and updating the interview process | ||||
|           description: | | ||||
|             Refined the interview process through two major iterations, | ||||
|             First standardising the process across all our European and American offices, | ||||
|             being more prescriptive in terms of scoring. | ||||
|             The second introduced somewhat objective scoring criteria, while still giving interviewers enough scope to | ||||
|           keywords: [Interviews, Metrics] | ||||
|         - name: Unified Chatroom system & Knowledge base | ||||
|           summary: Helped establish a company wide unified Chatroom system & Knowledge base. | ||||
|           description: | | ||||
|             Standardising the company on a single chat and knowledge base, made it much easier for new colleagues to get up to | ||||
|             speed. Most of this was focusing on making the case for unifying the tooling (in this case Slack and Atlassian), | ||||
|             making sure there was a path forward for all the teams involved that wasn't seen as a regression was important. | ||||
|             The end result was much more cross-department knowledge sharing, mostly along technical lines, | ||||
|             however it also helped organise events (both globally and office specific). | ||||
|           keywords: [ChatOps, Knowledge Sharing] | ||||
|           technologies: [Slack] | ||||
|  | ||||
|     - position: Internal hackathons/skunkworks Developer | ||||
|       summary: While at Cloudreach, worked on various spikes and hackathons | ||||
|       employer: Cloudreach | ||||
|       url: https://www.cloudreach.com | ||||
|       description: | | ||||
|         Used various competitions and opportunities to build prototypes to demonstrate feasibility of tools, | ||||
|         as they were built over short periods of time, they were not production ready, | ||||
|         however they worked and often fed into the approaches used in projects. | ||||
|       start: 2012-02 | ||||
|       end: 2019-07 | ||||
|       keywords: [hackathon] | ||||
|       highlights: | ||||
|         - Built Automated tanks that used image recognition to move and fire at each other. | ||||
|         - Built various useful internal tools, that remained in use for years | ||||
|         - Built a variety of IaC tools, that made deployments easier | ||||
|         - Won a trip to Central America | ||||
|         - Had project open sourced externally, by somebody that found it useful | ||||
|       projects: | ||||
|         - name: piRobotWars | ||||
|           summary: Automated tanks that used image recognition to move and fire at each other. | ||||
|           technologies: [Rekognition, RaspberryPi, Soldering, Python, Lambda] | ||||
|         - name: Calify | ||||
|           summary: Room booking system, based on Google calendar and android. | ||||
|           technologies: [Android, Java, Google Apps] | ||||
|         - name: Cloudformation Supremacy Engine | ||||
|           summary: Tools to facilitate better deployment of Cloudformation | ||||
|           technologies: [Python, Terraform, Cloudformation] | ||||
|         - name: Serverless Sceptre | ||||
|           summary: Tool for event driven Cloudformation deployments | ||||
|           technologies: [Lamda, IaC, Cloudformation, Python] | ||||
|         - name: Address Book, Contact sync, Holiday booking system | ||||
|           summary: Google apps automation used internally for booking holidays and syncing to mobile devices | ||||
|           technologies: [Google Apps, JavaScript] | ||||
|         - name: MusicBox | ||||
|           summary: Various iterations of the Office jukebox systems | ||||
|           technologies: [RaspberryPi, Musicbox, Mopidy, JavaScript] | ||||
|  | ||||
|     - position: Cloud Systems Developer | ||||
|       employer: Cloudreach | ||||
|       url: https://www.cloudreach.com | ||||
|       summary: Worked on technical projects on AWS, Google Apps & Salesforce both individually and as part of a team. | ||||
|       start: 2012-02 | ||||
|       end: 2014-03 | ||||
|       highlights: | ||||
|         - Worked across 3 cloud platforms (Google, AWS, Salesforce) | ||||
|         - Delivered difficult Google 2 Google migrations on tight deadlines | ||||
|       projects: | ||||
|         - name: Salesforce Roll-out for Media Group | ||||
|           customer: Heymarket | ||||
|           summary: Re-implemented their sales processes in Salesforce and configured production & sandbox accounts | ||||
|           description: | | ||||
|             Part of the team doing the initial roll out to replace legacy CRM systems, did the initial requirements gathering, | ||||
|             then matched the existing processes to those of Salesforce to fully automate the process for transforming | ||||
|             digital media leads to cash. | ||||
|             This involved both customising Salesforce objects/processes and writing apex triggers and classes | ||||
|             (along with the tests required by the platform). | ||||
|           keywords: [Processes] | ||||
|           technologies: [Salesforce, Apex, SOQL] | ||||
|         - name: Cross Team Support at a Large Media company | ||||
|           customer: News UK | ||||
|           description: | | ||||
|             Working as the cloud lead systems engineer inside a large media corporation, | ||||
|             supported the infrastructure for all products being developed by partners on AWS, | ||||
|             as well as the build servers used to support those (and other) deployments. | ||||
|             Alongside supporting the running development environments, | ||||
|             developed and rolled out a unified platform & development kit to simplify application and | ||||
|             infrastructure, build, deployment, monitoring and support, | ||||
|             while reducing the overall support burden at the company by, | ||||
|             helping other teams standardise on the platform where practical. | ||||
|         - name: Google to Google Migrations | ||||
|           customer: Various (Milkround, News UK, etc) | ||||
|           summary: Helped migrate various customers between Google Apps accounts | ||||
|           description: | | ||||
|             Due to limitations in the Google Apps platform, the source account had to be completely deleted prior to the end of the | ||||
|             migration, this means the entire migration had to be completed, including fixes and validation of data within about 60 hours. | ||||
|             When combined with the user facing nature of mail migrations, this resulted in particularly difficult migrations, | ||||
|             with tight deadlines | ||||
|           keywords: [Migration, User Facing] | ||||
|           technologies: [Google Apps, Python, AWS] | ||||
|         - name: Google Migrations | ||||
|           customer: Various (Jamie Oliver group, Graze, etc) | ||||
|           summary: Helped migrate various customers between Google Apps accounts | ||||
|           keywords: [Migration, User Facing] | ||||
|           technologies: [Google Apps, Python, AWS] | ||||
|         - name: Teletext Holidays Optimisation | ||||
|           customer: Teletext Holidays | ||||
|           summary: Provided guidance and recommendations for frontend optimisation of the Teletext Holidays website | ||||
|           keywords: [Frontend, Web, Optimisation] | ||||
|           technologies: [JavaScript, Web] | ||||
|  | ||||
|     - employer: Supporttree | ||||
|       position: Support Engineer | ||||
|       summary: Full support for small businesses including end user systems, on-premise servers and cloud services. | ||||
|       description: | | ||||
|         Providing 1st to 3rd line support of Desktops (Windows and OS X), | ||||
|         Server (physical and virtualised) & Services (in-house and cloud based) for small businesses. | ||||
|         In addition to end-user support, also implemented several projects. | ||||
|         While the main toolkit for automation was Kaseya's custom DSL, pushed for automation whenever possible, | ||||
|         usually making use of either custom code or portable GNU tools. | ||||
|       start: 2010-01 | ||||
|       end: 2012-02 | ||||
|       url: https://supporttree.co.uk | ||||
|       keywords: [User Facing] | ||||
|       technologies: [Windows, OS X, Linux, Networking] | ||||
|       highlights: | ||||
|         - Worked in a user facing role, for a variety of small businesses | ||||
|         - Made use of automation and unix, in an otherwise manual windows environment | ||||
|  | ||||
| education: | ||||
|   level: Bachelor [incomplete] | ||||
|   history: | ||||
|     - institution: UCL | ||||
|       title: Bachelor Natural Sciences (Physics & Chemistry) [incomplete] | ||||
|       start: 2006-09 | ||||
|       end: 2009-07 | ||||
|     - institution: King's School Grantham | ||||
|       title: A-Levels | ||||
|       start: 2004-09 | ||||
|       end: 2006-07 | ||||
|       grade: AAAAA | ||||
|       curriculum: | ||||
|         - Maths | ||||
|         - Further Maths | ||||
|         - Physics | ||||
|         - Chemistry | ||||
|         - Spanish | ||||
|  | ||||
| skills: | ||||
|   levels: [Novice, Basic, Moderate, Knowledgeable, Skilled] | ||||
|   sets: | ||||
|     - name: Programming | ||||
|       level: Skilled | ||||
|       skills: | ||||
|         - name: Python | ||||
|           level: Skilled | ||||
|           summary: Primary language used for most projects | ||||
|         - name: Ruby | ||||
|           level: Skilled | ||||
|           summary: Primary language used for some projects, also often used as part of Chef or other tools used within projects | ||||
|         - name: Bash | ||||
|           level: Skilled | ||||
|           summary: Used extensively for system automation | ||||
|         - name: JavaScript | ||||
|           level: Knowledgeable | ||||
|           summary: Experience with both frontend development and Node to deliver automation | ||||
|         - name: Apex/Java | ||||
|           level: Basic | ||||
|           summary: Primary language used for Salesforce development | ||||
|         - name: Other Languages | ||||
|           level: Novice | ||||
|           summary: Powershell, Vbs, batch, PHP, Perl, C, C# | ||||
|     - name: AWS | ||||
|       level: Skilled | ||||
|       skills: | ||||
|         - name: Cloudformation | ||||
|           level: Skilled | ||||
|           summary: Both natively and via Troposphere, Jinja & ruby-DSL | ||||
|         - name: IAM | ||||
|           level: Skilled | ||||
|           summary: Extensive knowledge in building secured multi-tenanted accounts | ||||
|         - name: Lambda | ||||
|           level: Knowledgeable | ||||
|           summary: Used extensively with both Python & JavaScript as part of stand-alone components & complex frameworks | ||||
|         - name: DynamoDB | ||||
|           level: Knowledgeable | ||||
|           summary: Used in-depth to store state for lambda, whenever S3 was not viable | ||||
|         - name: Core AWS services | ||||
|           level: Skilled | ||||
|           summary: Have used EC2, S3, RDS, SNS, SQS, Cloudwatch, Config, ElastiCache, etc, extensively | ||||
|         - name: Additional AWS services | ||||
|           level: Knowledgeable | ||||
|           summary: Have used other services such as Direct Connect, CodeDeploy, AppStream, etc | ||||
|     - name: DevOps tools and methodologies | ||||
|       level: Skilled | ||||
|       skills: | ||||
|         - name: IaC | ||||
|           level: Skilled | ||||
|           summary: Always used Infrastructure as Code (IaC), primarily native tools, but also Terraform when needed | ||||
|         - name: Immutability | ||||
|           level: Skilled | ||||
|           summary: Designed and implemented immutable systems | ||||
|         - name: Configuration Management | ||||
|           level: Skilled | ||||
|           summary: Extensive use of configuration management tools such as Chef and Ansible when needed | ||||
|         - name: TDD - Infrastructure | ||||
|           level: skilled | ||||
|           summary: Used test driven development (TDD) on most greenfield projects and also gradually retrofitted to legacy infrastructure | ||||
|         - name: TDD - Application | ||||
|           level: Moderate | ||||
|         - name: Build systems | ||||
|           level: skilled | ||||
|           summary: Always used Build systems (Jenkins, AnthillPro, Code*, Gitlab, etc) | ||||
|         - name: Containers | ||||
|           level: Knowledge | ||||
|           summary: Familiar with immutable image pipelines and methodologies | ||||
|         - name: Init systems | ||||
|           level: Knowledgeable | ||||
|           summary: Used Upstart/SystemD/SysV/Monit as required, in particular use of signals/sockets when possible | ||||
|         - name: Agile | ||||
|           level: Moderate | ||||
|           summary: Used both within Small companies and adapted Larger Enterprise | ||||
|     - name: Google | ||||
|       level: Knowledgeable | ||||
|       skills: | ||||
|         - name: GCP | ||||
|           level: Moderate | ||||
|           summary: Developed high level account strategies for GCP | ||||
|         - name: Google deployment manager | ||||
|           level: Moderate | ||||
|           summary: Developed transformation tool using Google Deployment Manager | ||||
|         - name: Google App Engine | ||||
|           level: Moderate | ||||
|           summary: Some use as part of projects, primarily in Python | ||||
|         - name: Google Apps | ||||
|           level: Skilled | ||||
|           summary: Extensive use as part of Google Apps projects | ||||
|     - name: Salesforce | ||||
|       level: Moderate | ||||
|       skills: | ||||
|         - name: Apex | ||||
|           level: Moderate | ||||
|           summary: Experience writing both small classes and triggers | ||||
|         - name: Configuration | ||||
|           level: Basic | ||||
|           summary: Experience configuring Salesforce estates as per customer requirements | ||||
|  | ||||
| languages: | ||||
|   - language: English | ||||
|     fluency: Native | ||||
|   - language: Spanish | ||||
|     fluency: Native | ||||
|  | ||||
| interests: | ||||
|   - name: Open Source & Linux | ||||
|   - name: Travelling | ||||
|   - name: Punk Rock, Politics & the Pub | ||||
|  | ||||
| meta: | ||||
|   format: FRESH@1.0.0 | ||||
|   version: 0.0.1 | ||||
							
								
								
									
										50
									
								
								settings.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,50 @@ | ||||
| --- | ||||
| primary: | ||||
|   html: elegant | ||||
|   md: Compact | ||||
|   pdf: Compact | ||||
|  | ||||
| generate: | ||||
|   resume: | ||||
|     plain: | ||||
|       - Positive | ||||
|       - Compact | ||||
|       - Modern | ||||
|     css: | ||||
|       fresh-theme-bootstrap: | ||||
|         - darkly | ||||
|         - superhero | ||||
|         - cerulean | ||||
|     kcv: | ||||
|       - flat | ||||
|       - modern | ||||
|   full: | ||||
|     plain: | ||||
|       - node_modules/fresh-theme-elegant | ||||
|  | ||||
| links: | ||||
|   main: | ||||
|     - name: PDF | ||||
|       url: resume.pdf | ||||
|     - name: markdown | ||||
|       url: https://git.juancanham.com/JuanCanham/juan-canham-resume/Resume.md | ||||
|     - name: yaml | ||||
|       url: resume.yaml | ||||
|  | ||||
|   extra: | ||||
|     - group: styles | ||||
|       links: | ||||
|         - darkly | ||||
|         - Positive | ||||
|         - Compact | ||||
|         - Modern | ||||
|         - superhero | ||||
|         - cerulean | ||||
|         - kcv-flat | ||||
|         - kcv-modern | ||||
|     - group: formats | ||||
|       links: | ||||
|         - name: json | ||||
|           url: full.json | ||||
|         - name: json-resume | ||||
|           url: full.jrs.json | ||||
							
								
								
									
										63
									
								
								transform.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -0,0 +1,63 @@ | ||||
| #!/usr/bin/env python | ||||
| """ | ||||
| This script transforms a resume from a format container positions within an | ||||
| employer, to valid FRESH resume format | ||||
| """ | ||||
| import os | ||||
| import json | ||||
| import copy | ||||
| import yaml | ||||
|  | ||||
| # pylint: disable=missing-function-docstring | ||||
| def main(): | ||||
|     with open("resume.yaml") as file: | ||||
|         resume = yaml.load(file, Loader=yaml.BaseLoader) | ||||
|  | ||||
|     transform_and_write("full", make_full, resume) | ||||
|     transform_and_write("resume", make_fresh, resume) | ||||
|  | ||||
|  | ||||
| def write_file(name, data): | ||||
|     filename = os.path.join("dist", name + ".json") | ||||
|     with open(filename, "w") as file: | ||||
|         json.dump(data, file) | ||||
|  | ||||
|  | ||||
| def transform_and_write(name, func, raw_data): | ||||
|     data = copy.deepcopy(raw_data) | ||||
|     data = func(data) | ||||
|     write_file(name, data) | ||||
|  | ||||
|  | ||||
| def make_fresh(data): | ||||
|     data["skills"].setdefault("list", []) | ||||
|     for skillset in data["skills"]["sets"]: | ||||
|         skills = skillset["skills"][:] | ||||
|         skillset["skills"] = [skill["name"] for skill in skills] | ||||
|         data["skills"]["list"] += skills | ||||
|     return data | ||||
|  | ||||
|  | ||||
| def make_full(data): | ||||
|     with open("settings.yaml") as file: | ||||
|         data["settings"] = yaml.load(file, Loader=yaml.BaseLoader) | ||||
|  | ||||
|     tags = data.get("tags", []) | ||||
|     for employer in data["employment"]["history"]: | ||||
|         tags += employer.get("technologies", []) | ||||
|         tags += employer.get("keywords", []) | ||||
|         for project in employer.get("projects", []): | ||||
|             tags += project.get("technologies", []) | ||||
|             tags += project.get("keywords", []) | ||||
|  | ||||
|     tags = sorted(tags, key=tags.count, reverse=True) | ||||
|     data["tags"] = [] | ||||
|     for tag in tags: | ||||
|         if tag not in data["tags"]: | ||||
|             data["tags"].append(tag) | ||||
|  | ||||
|     return data | ||||
|  | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     main() | ||||