Repository: eddiewebb/hugo-resume Branch: master Commit: 40757d34666d Files: 78 Total size: 209.6 KB Directory structure: gitextract_9bhti92m/ ├── .circleci/ │ └── config.yml ├── .gitignore ├── Jenkinsfile ├── LICENSE.md ├── README.md ├── archetypes/ │ ├── adv-ride/ │ │ ├── index.md │ │ └── route.gpx │ ├── blog-post/ │ │ └── index.md │ ├── projects.md │ └── publications.md ├── exampleSite/ │ ├── config.toml │ ├── content/ │ │ ├── _index.md │ │ ├── blog/ │ │ │ └── force-ssl.md │ │ ├── contact.md │ │ ├── projects/ │ │ │ ├── _index.md │ │ │ ├── contributions/ │ │ │ │ ├── _index.md │ │ │ │ ├── deploy-triggers.md │ │ │ │ ├── schema-org.md │ │ │ │ └── shields-docker.md │ │ │ └── creations/ │ │ │ ├── _index.md │ │ │ ├── bosh-agents.md │ │ │ ├── docker-marketplace.md │ │ │ └── marketplace.md │ │ ├── publications/ │ │ │ ├── AllDayDevOps.md │ │ │ └── _index.md │ │ └── search.md │ ├── data/ │ │ ├── boards.json │ │ ├── certifications.json │ │ ├── education.json │ │ ├── experience.json │ │ └── skills.json │ └── static/ │ ├── .well-known/ │ │ └── google-verify.etc │ └── admin/ │ ├── README.md │ ├── cms.js │ ├── config.yml │ ├── index.html │ └── templates/ │ └── about.js ├── i18n/ │ ├── en.json │ └── fr.json ├── layouts/ │ ├── 404.html │ ├── _default/ │ │ ├── baseof.html │ │ ├── contact.html │ │ ├── contact.vcf │ │ ├── index.json │ │ ├── list.html │ │ ├── search.html │ │ ├── section.html │ │ ├── single.html │ │ ├── taxonomy.html │ │ └── terms.html │ ├── adv/ │ │ └── single.html │ ├── blog/ │ │ └── single.html │ ├── index.html │ ├── markdown/ │ │ ├── baseof.html │ │ └── single.html │ ├── partials/ │ │ ├── about.html │ │ ├── advSummary.html │ │ ├── advtags.html │ │ ├── blogSummary.html │ │ ├── breadcrumbs.html │ │ ├── contact-qr.html │ │ ├── nav.html │ │ ├── portfolio/ │ │ │ ├── education.html │ │ │ ├── experience.html │ │ │ └── skills.html │ │ ├── projectsSummary.html │ │ ├── publicationsSummary.html │ │ ├── sectionSummary.html │ │ ├── techtags.html │ │ └── vcard.html │ ├── projects/ │ │ └── single.html │ ├── publications/ │ │ └── single.html │ └── shortcodes/ │ └── imgresize.html ├── static/ │ ├── css/ │ │ ├── resume.css │ │ └── tweaks.css │ └── js/ │ ├── resume.js │ └── search.js └── theme.toml ================================================ FILE CONTENTS ================================================ ================================================ FILE: .circleci/config.yml ================================================ version: 2.1 workflows: build-deploy: jobs: - test jobs: test: docker: - image: cibuilds/hugo:0.62 working_directory: /hugo-resume steps: - checkout - run: name: HUGO build for Test domain command: | pwd cd /hugo-resume hugo -v -s exampleSite --destination /tmp/public -b http://localhost --themesDir ../.. ls /tmp/public if [ ! -f /tmp/public/index.html ];then echo "index.html not created, failing" exit 1 fi - run: name: Start Local Server background: true command: | pwd hugo server -v -s exampleSite -b http://localhost --themesDir ../.. - run: name: Check Server command: | sleep 5 #wait for last background step to complete HTTPCODE=`curl -s -o /dev/null -w "%{http_code}" http://localhost:1313` if [ "$HTTPCODE" -ne 200 ];then echo "index not found, failing" exit 1 fi - run: name: Check Content command: | curl -s -o /tmp/index http://localhost:1313 #just some keywords that confirm content was read into template.. grep 'Rochester' /tmp/index grep 'Eddie Webb' /tmp/index grep 'BOSH (Bosh Outer SHell)' /tmp/index ================================================ FILE: .gitignore ================================================ .DS_Store .hugo_build.lock public/ ================================================ FILE: Jenkinsfile ================================================ pipeline { agent any stages { stage('Hello') { steps { echo 'Hello World' } post { always { jiraSendBuildInfo site: 'se-demo.atlassian.net' } } } stage('Deploy - Dev') { steps { echo 'Deploying to US East Dev 1' } post { always { jiraSendDeploymentInfo site: 'se-demo.atlassian.net', serviceIds: ['b:YXJpOmNsb3VkOmdyYXBoOjpzZXJ2aWNlLzJlNjQ1Y2Q0LTc4ZmEtMTFlYS04ZjMyLTBhNzdmM2Y0NTMwNC8xNWM3YmZjYy1lZWI2LTExZWEtOWFmZC0xMjhiNDI4MTk0MjQ='], environmentId: 'us-dev-1', environmentName: 'us-dev-1', environmentType: 'development' } } } /* waiting on plugin update stage('Deploy - prod') { steps { echo 'Queueing...' jiraSendDeploymentInfo(site:'se-demo.atlassian.net', environmentId:'us-prd-1', environmentName:'us-prd-1', environmentType:'production', // now we can define a state of build explicitly state:"pending", enableGate:true, serviceIds: [ "b:YXJpOmNsb3VkOmdyYXBoOjpzZXJ2aWNlLzJlNjQ1Y2Q0LTc4ZmEtMTFlYS04ZjMyLTBhNzdmM2Y0NTMwNC8xNWM3YmZjYy1lZWI2LTExZWEtOWFmZC0xMjhiNDI4MTk0MjQ="] ) } } stage("check gate") { steps { waitUntil { input message: "Check for approval?" checkGateStatus(site:'se-demo.atlassian.net', environmentId:'us-prd-1') } } } stage("deploy") { steps { echo "Deploying!" } } */ } } ================================================ FILE: LICENSE.md ================================================ The MIT License (MIT) Copyright (c) 2018 Eddie A. Webb Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # hugo Resume Created from [Start Bootstrap - Resume](https://startbootstrap.com/template-overviews/resume/). This is basically a single-page website with auto-scrolling based on left-hand nav. Dedicated project/publications pages allow more detail. Includes a client-side search powered by fuse.js at '/search' but currently theme does not link to that anywhere. Includes an `/admin` endpoint that can allow authorized users to use a WYSIWYG editor and commit files back to markdown, but with a Wordpress/CMS like experience. - [Examples](#examples) - [Setup & Use](#setup--use) - [Summary](#summary) - [Data files](#data-files) - [Projects](#projects) - [Publications](#publications) - [Blog / Posts](#blog--posts) - [Template params](#template-params) - [Internationalization](#internationalization) - [CMS Editor with Netlify CMS](#cms-editor-with-netlify-cms) - [Credits](#credits) - [Contributions](#contributions) - [Start Bootstrap Resume](#start-bootstrap-resume) ## Examples ![About You](https://raw.githubusercontent.com/eddiewebb/hugo-resume/master/images/about.png) ![With optional Contact QR Code](https://raw.githubusercontent.com/eddiewebb/hugo-resume/master/images/qrcode.png) ![Highlight skills with dev icons](https://raw.githubusercontent.com/eddiewebb/hugo-resume/master/images/skills.png) ![List featured projects](https://raw.githubusercontent.com/eddiewebb/hugo-resume/master/images/projects.png) ![Searchable content](https://raw.githubusercontent.com/eddiewebb/hugo-resume/master/images/search.png) See [Eddie's site](https://edwardawebb.com) for a live example. ## Setup & Use This theme uses a combination of a custom archetype `projects` and some data files to drive content. You can test the provided [exampleSite](exampleSite) after cloning with the command: `cd exampleSite;hugo -t hugo-resume --themesDir ../.. server` ### Summary Edit the main `contents/_index.md with a brief bio/summary` ### Data files Data files are used for simple content presented on the homepage. - [data/skills.json](https://github.com/eddiewebb/hugo-resume/blob/master/exampleSite/data/skills.json) - [data/experience.json](https://github.com/eddiewebb/hugo-resume/blob/master/exampleSite/data/experience.json) - [data/education.json](https://github.com/eddiewebb/hugo-resume/blob/master/exampleSite/data/education.json) ### Projects Initially projects were in their own JSON file too, but I decided I wanted to allow more detail and custom formatting. Projects are added to one of 2 subfolders of `creations` or `contributions`. The difference indicates your role as originator or collaborator. Use `hugo add projects/TYPE/name-of-project.md` to leverage the proper archetype. ### Publications Similar to projects, create them under `publications`. Include any papers, speaking engagements, articles, etc. ### Blog / Posts Similar to posts, create them under `blog`. Include any thoughts, musings, etc. **This template does not support a `posts` folder** ### Template params All personal information outside the above details is captured by params in [`config.toml`](https://github.com/eddiewebb/hugo-resume/blob/master/exampleSite/config.toml), or can be edited in the "Settings" collection if using CMS. ### Internationalization Left navigation menu and section titles handle multiple languages. Use `defaultContentLanguage` parameter un [`config.toml`](https://gohugo.io/content-management/multilingual/) to choose your language. Current supported languages are : - `en` - `fr` ## CMS Editor with Netlify CMS **Does not require deployment to Netlify!** [Netlify CMS](https://www.netlifycms.org/) is an open source project that enables CMS like experience for static site generation tools like Hugo. This theme includes a fully working integration and guide in [exampleSite/static/admin](https://github.com/eddiewebb/hugo-resume/blob/master/exampleSite/static/admin) ![CMS integration](/images/cms.png) ## Credits This project ports the Start Bootstrap Resume theme by David Miller to support hugo. ### Contributions The following users have made notable contributions: - [Anthony Whitford](https://github.com/awhitford) - [Kaushal Modi](https://github.com/kaushalmodi) - [Julien Rouse](https://github.com/JulienRouse) ### Start Bootstrap Resume Start Bootstrap is an open source library of free Bootstrap templates and themes. All of the free templates and themes on Start Bootstrap are released under the MIT license, which means you can use them for any purpose, even for commercial projects. * https://startbootstrap.com * https://twitter.com/SBootstrap Start Bootstrap was created by and is maintained by **[David Miller](http://davidmiller.io/)**, Owner of [Blackrock Digital](http://blackrockdigital.io/). * http://davidmiller.io * https://twitter.com/davidmillerskt * https://github.com/davidtmiller Start Bootstrap is based on the [Bootstrap](http://getbootstrap.com/) framework created by [Mark Otto](https://twitter.com/mdo) and [Jacob Thorton](https://twitter.com/fat). ================================================ FILE: archetypes/adv-ride/index.md ================================================ --- title: "{{ replace .Name "-" " " | title }}" date: {{ .Date }} draft: false tags: [adv, motorcycles, riding] advtags: [forest, curvy, off-road, waterside] featured: true type: adv resources: - name: 'teaser-optional' src: 'curves.JPG' - name: 'map' src: 'route.png' - name: 'gpx' src: 'route.gpx' --- How far will your car go on "E"? Once the little light pops on you know there's a good bit left to get you to a fill-up at the nearest station. And I've pushed my car knowing that. A bit of googling says depending on make & model, most cars will get 30-50 miles. But when the indicator light came on my bike this weekend I knew my little tank would **not** be so generous... or would it? I started with one of my favorite roads to start my trip; Strackville Road. The road is only about 6 miles but it includes deep ruts, water crossing, and packed and loose rocks to navigate. Its a great technical ride. ![43 miles on empty](whataride.JPG) {{% imgresize teaser "350x350" %}} I had been back on tarmac for about 20 minutes when I turned onto Goldsmith rd, a class 3 packed gravel ride. My indicator came on as soon as I straightened out. Checking the map it was ~15 miles back to the last town, and ~10 miles to the next. I knew the bike will get at least 15 miles on empty, so I pressed on. ![Indicator Light Comes on](lightson.JPG) County Road 26 was amazing, I wanted to really rev into some of these twisty turns, and stop at every other one to take a picture, but with my empty mileage counter growing I grew more nervous with every twist that only revealed more road. ![County Road 26](cr26.jpg) Where CR26 ended was popular state road, but the town was a miss. Checking the map again, and searching for gas stations my heart dropped at least another 12 miles in the wrong direction. Heading home there was one about 20 miles out. Optimism in heart I was optimistic this now major highway would have some little place that no one bothered to mark on my GPS. ... Well 35 miles on empty now, I must be running on fumes. I'm now scanning every house I pass (which are all to infrequent) for a lawn-mower, atv, or anything with a gas can I could beg for. **43 miles on empty** -- and finally! a shop, oh now.. no pumps here. I let the clutch out again as I spot something in the corner of the little general store - a single hose hand-cranked gas pump! ![43 miles on empty](43miles.JPG) Wait, WAIT, turn-around! Was that in fact an old hand-pump -- is it show or functional? Do they actually have gas?! No option but to try! Cash only, hand-cranked spinning wheels quickly brought my tank to full again. The anxiety of leaving my bike and walking lord knows how far fades, I can finally resume taking in the scenery, and gosh what a ride. ================================================ FILE: archetypes/adv-ride/route.gpx ================================================ Tour on 2020 - 06 - 05 created by eddiewebb Tour on 2020 - 06 - 05 Tour on 2020 - 06 - 05 ================================================ FILE: archetypes/blog-post/index.md ================================================ --- title: "{{ replace .Name "-" " " | title }}" date: {{ .Date }} draft: false tags: [] featured: false weight: 100 aliases: [] resources: - name: headshot title: Eddie Webbinaro src: assets/headsot.jpg --- {{< floatimg "headshot" "350x350" "Eddie headhsot" "right" >}} Welcome to sample post - list - of - things Special image formatting to float in upper right ================================================ FILE: archetypes/projects.md ================================================ --- title: "{{ replace .Name "-" " " | title }}" date: {{ .Date }} featured: true description: "Text used in summary on main page" tags: ["techtags","used","in","website"] image: "" link: "URL linked from project details page" fact: "Interesting little tidbit shown below image on summary and detail page" weight: 500 sitemap: priority : 0.8 --- ================================================ FILE: archetypes/publications.md ================================================ --- title: "{{ replace .Name "-" " " | title }}" date: 2018-01-01 pubtype: "Talk,Article,Etc" featured: true description: "Text used in summary on main page" tags: ["techtags","used","in","website"] image: "" link: "URL linked from project details page" fact: "Interesting little tidbit shown below image on summary and detail page" weight: 500 sitemap: priority : 0.8 --- ================================================ FILE: exampleSite/config.toml ================================================ title = "Eddie Webbinaro" baseURL = "https://example.com/" theme = "hugo-resume" languageCode = "en-us" PygmentsCodeFences = true PygmentsCodeFencesGuessSyntax = true PygmentsStyle = "monokai" enableGitInfo = false [params] address = "Rollinsford, NH" email = "email@domain.com" favicon = "/favicon.ico" firstName = "Eddie" lastName = "Webbinaro" phone = "1-555-555-1234" profileImage = "img/TechChat.png" showQr = true showContact = true showBoards = true showCertifications = true showSocializations = true sections = ["skills","publications","creations","contributions","experience","education","blog"] vcardfields = [ "name", "image", "org", "email", "workemail", "phone", "url", "title" ] [params.google] [params.google.analytics] trackerID = "XX-123446-01" [[params.handles]] name = "LinkedIn" link = "https://www.linkedin.com/in/edwardwebb/" [[params.handles]] name = "GitHub" link = "https://github.com/eddiewebb/" [[params.handles]] name = "Keybase" link = "https://keybase.io/edwardawebb" icon = "keybase" [[params.handles]] name = "Bluesky" link = "https://bsky.app/profile/webbinaro.dev" icon = "bluesky" [[params.handles]] link = "https://stackoverflow.com/users/82880/eddie" name = "Stack Overflow" icon = "stack-overflow" [params.customSections.ham] name = "SOME LINK" url = "https://example.com" [outputs] home = ["HTML", "JSON"] [taxonomies] tag = "tags" [mediaTypes] [mediaTypes."text/vcard"] suffixes = ["vcf"] [outputFormats] [outputFormats.VCard] mediaType = "text/vcard" baseName = "contact" isPlainText = true notAlternative = true ================================================ FILE: exampleSite/content/_index.md ================================================ --- title: "Home" date: 2018-02-10T18:56:13-05:00 sitemap: priority : 1.0 outputs: - html - rss - json --- Proven Software Platform Engineer with experience leveraging agile, DevOps, and CI/CD to manage large scale distributed platforms both on prem and in public cloud. ================================================ FILE: exampleSite/content/blog/force-ssl.md ================================================ --- title: 'Forcing Visits to use SSL' date: Thu, 01 Jan 2009 14:09:10 +0000 draft: false tags: [apache, apache, redirect, rewrite, ssl, web development] --- Intro ----- Doesn't matter whether it's a CakePHP app for a client, your own personal CMS, or any other web based application. **If your passing around passwords or other sensitive info you should really implement SSL.** SSL provides 2 main perks to your visitors. * First it encrypts all communication that flies across the web. This prevents curious or devious billies from getting your secrets. * Secondly it ensures to the user that your server is in fact who it claims, and not a nasty 'man in the middle" attack. * Finally it gives your site that touch of class.... which of course a classy person like yourself relies on. Once you implement SSL certificates on your server you'll want to **require secure connections** using Apache's rewrite module. Now I won't dwell on the creation and signing of certificates, its already well documented.  If your just starting out though,heres a few links I recommend; * [Creating self-signed certificates](http://www.tc.umn.edu/~brams006/selfsign.html "Creating and Signing your own SSL Certificate") (free, but should only be used internally or for testing, users will; see an 'Untrusted" warning) * [Requesting a CA Signed certificate](http://www.google.com/url?sa=t&source=web&ct=res&cd=10&url=http%3A%2F%2Fwww.lsu.edu%2Fpki%2FSSL_Certificate_Apache.pdf&ei=Z8FcSbDRGaCY8gTdk7GHDQ&usg=AFQjCNELddGd6jW1_Dv1X-CaocEVa4rV2A&sig2=FQMNaM_RlhngJW3MSYiQzw "Generating a Certificate Signing Request") (not free, but the final certificate is trusted and seamless for users) The second link uses the schools internal CA, you will need to pay a public CA like Entrust or Verisign. **All of this information is aimed at 'nix or solaris servers running apache**. Why? cause a production windows server is laughable :-p Now that you have a certificate, what's next? -------------------------------------------- So there you are you have a shiny new Certificate and Server key, how do you force visitors to your apache driven site to use the SSL? You copied the certificates into the appropite locations right? And you have made the needed changes in httpd.conf right? So now when you view https://example.com you see a 'trusted' warning or your site right? If No to any of these than [this article](http://www.sitepoint.com/article/securing-apache-2-server-ssl/ "Securing Apcche Server with SSL") does a pretty good job of outlining those steps. The SSL Works, How do I force connections to use it? ---------------------------------------------------- First you need to decide if you want to force every page on your site to use SSL, or only a particular sub-domain, or maybe just your admin directory.  Since the overhead is minimal there is no harm is forcing the entire domain to leverage SSL, but if it is a self-signed certificate for your personal use than you'll most certainly want to restrict its use to your own areas. This prevents users from seeing that nasty warning "This server is not trusted" You'll know if your using SSL because the url prefix changes from http to https (s for secure). ### Forcing entire domain to use SSL **You want any visit, any where to use ssl**. This probably the simplest solution. Create or append to your htaccess file in the top directory of your server. Some people use a port check (80 is typically http, while 443 is https) but if you have alternate configs or the user just adds :8080 to the end of the url this method is useless. Instead check whether the https environmental variable is set, if not then redirect. ``` RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 \[R,L\] ``` ### Forcing sub-domains to use SSL Maybe **you only want mysecretarea.example.com to use SSL**, that's easy enough. Its the same premise as above, but you move the htaccess file into the directory that corresponds to the subdomain. Also change the second line like below; ``` RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://mysecretarea.%{SERVER_NAME}$1 \[R,L\] ``` ### Forcing a directory to use SSL This method cn get a little hairier if your using aliases or redirects on top of this one. You'll need to consider what order the commands are read. The basic principle is like so.  **You want all visits to example.com/admin to use ssl.** Create a htaccess file in the parent directory.  Again will check for the https variable, but this time we also check for the sub-directory to be in the path. ``` RewriteCond %{HTTPS} !=on RewriteRule ^/admin/(.*)$ https://%{SERVER_NAME}/admin/$1 \[R,L\] ``` ================================================ FILE: exampleSite/content/contact.md ================================================ --- title: Eddie Webbinaro layout: "contact" outputs: ["HTML","VCard"] --- [VCard Download](/contact.vcf) ================================================ FILE: exampleSite/content/projects/_index.md ================================================ --- title: "Projects" sitemap: priority : 0.9 ---

This section contains projects created and contributed to by Eddie. Everything listed is an open source effort, the distinction is only my role as owner or contributor.

================================================ FILE: exampleSite/content/projects/contributions/_index.md ================================================ --- title: Open Source Contributions date: 2020-01-07T16:49:15.046Z link: NA image: /img/marketplace-summary.webp description: NA tags: - '' weight: 20 sitemap: priority: 0.5 weight: 0.5 ---

A collection of efforts to which I contributed, but did not create. Contributing back to Open Source projects is a strong passion of mine, and requires a considerate approach to learn norms, standards and approach for each community for a successful merge!

================================================ FILE: exampleSite/content/projects/contributions/deploy-triggers.md ================================================ --- title: "Atlassian Deployment Triggers" link: "https://bitbucket.org/atlassianlabs/bamboo-after-deployment-trigger/pull-requests/2/fixes-issue-2-eliminate/diff" image: "/img/deploysonly.webp" description: "Uses Async call to lucene index for super fast autocompletion to address performance issue loading config." featured: true tags: ["Java","jQuery","REST APIs","Bamboo","JSON"] fact: "Reduce page load time from minutes to instantaneous." weight: 100 sitemap: priority : 0.8 --- Addressed pretty significant page load performance issue founde in larger deployments. Eliminates uses of intensive backend query, replacing it with an asynchronous API call against a lucene index. This change reduces page load from from 2+ minutes to nearly instant, with an incredibly responsive UI. ================================================ FILE: exampleSite/content/projects/contributions/schema-org.md ================================================ --- title: Schema.org Structured Data documentation fixes date: 2020-01-07T17:08:21.433Z link: 'https://github.com/schemaorg/schemaorg/pull/1120' image: /img/schema-org.webp description: >- Not all pull requests are glorious code, documentation is really important too! This commit fixed some invalid JSON found in some example specs. tags: - JSON fact: >- Schema.org provides a common specification for Structured Data on the internet. weight: 999 sitemap: priority: 0.8 weight: 0.1 --- While adding *Structured Data* to a client's website I found some example JSON that was invalid. Simple contribution to cleanup the user documentation providing syntactically valid JSON documents. ================================================ FILE: exampleSite/content/projects/contributions/shields-docker.md ================================================ --- title: Added Docker Build Status Badge to shields.io date: 2020-01-07T17:09:26.037Z featured: true link: 'https://github.com/badges/shields/pull/856' image: >- https://img.shields.io/docker/build/eddiewebb/bitbucket-pipelines-marketplace.svg?style=plastic description: Added a shield for Docker Hub builds indicating state of last build tags: - Docker - Rest APIs - JavaScript - node.js - JSON fact: '' weight: 500 sitemap: priority: 0.8 weight: 0.4 --- Shields.io is a massive library of badges that can be inserted into project README's or websites displaying various statuses (code coverage, health, version, etc).  Support for docker was missing the current build health, and was a pretty trivial addition. ================================================ FILE: exampleSite/content/projects/creations/_index.md ================================================ --- title: Creations date: 2020-01-07T15:00:28.528Z link: Not applicable image: /img/marketplace-summary.webp description: Not applicable weight: 10 sitemap: priority: 0.5 weight: 0.8 ---

A collection of projects authored by Eddie, and likely shared out with the community as an open source project.

================================================ FILE: exampleSite/content/projects/creations/bosh-agents.md ================================================ { "title": "BOSH release for Bamboo & Remote Agents", "date": "2018-02-11T12:41:05-05:00", "image": "/img/circleci-workflow.webp", "link": "https://github.com/eddiewebb/bosh-bamboo", "image": "/img/aafb-agent-ids-match-bamboo.webp", "description": "BOSH (Bosh Outer SHell) \"is an open source tool for release engineering, deployment, lifecycle management, and monitoring of distributed systems.\" And it's amazingly powerful. This examples uses BOSH to provision an Alassian vendor app running on JDK along with the support Postgres database and agents to support it.  The releases manages the health of services and will automatically provision, start/stop processes across the various services.", "tags": ["DevOps","BOSH", "Java", "Atlassian Ecosystem", "monit", "python", "xml/xslt", "bash/shell","REST APIs"], "fact": "", "featured":true } BOSH (Bosh Outer SHell) "... is an open source tool for release engineering, deployment, lifecycle management, and monitoring of distributed systems." And it's amazingly powerful. This examples uses BOSH to provision an Alassian vendor app running on JDK along with the support Postgres database and agents to support it.  The releases manages the health of services and will automatically provision, start/stop processes across the various services. ================================================ FILE: exampleSite/content/projects/creations/docker-marketplace.md ================================================ { "title":"Docker image for Bitbucket CI/CD Pipelines  \"shipit\"", "link":"https://hub.docker.com/r/eddiewebb/bitbucket-pipelines-marketplace/", "image":"/img/docker-pipelines.webp", "description":"Provides required dependencies and additional utilities to simplify and codify the process of building, testing and delivering Atlassian plugins all the way to the live marketplace.", "tags":[ "Docker", "Maven", "Java", "Python", "REST APIs", "Bash/Shell" ], "fact":" 700+ \"pulls\" from docker hub" } Provides required dependencies and additional utilities to simplify and codify the process of building, testing and delivering Atlassian plugins all the way to the live marketplace. ================================================ FILE: exampleSite/content/projects/creations/marketplace.md ================================================ { "title":"Atlassian Marketplace Plugins", "link":"https://marketplace.atlassian.com/vendors/1017039", "image":"/img/marketplace-summary.webp", "description":"Multiple plugins used by thousands of teams that provide enhanced functionality of Atlassian’s core products (primarily JIRA and Bamboo) to enrich CI/CD capabilities, DevOps automation, or productivity. Functionality spans user interface, web services and persistence.", "tags":["Java", "Spring", "REST APIs", "Javascript", "Atlassian Developer Ecosystem", "Bamboo", "JIRA", "Bitbucket", "Confluence","DevOps"], "fact":"1,500+ Active installations across large and small companies." } Multiple plugins used by thousands of teams that provide enhanced functionality of Atlassian’s core products (primarily JIRA and Bamboo) to enrich CI/CD capabilities, DevOps automation, or productivity. Functionality spans user interface, web services and persistence. ================================================ FILE: exampleSite/content/publications/AllDayDevOps.md ================================================ --- title: "Organically DevOps: Building Quality and Security into the Software Supply Chain at Liberty Mutual" date: 2016-11-08 pubtype: "Talk" featured: true description: "This talk looked at Liberty Mutual’s transformation to Continuous Integration, Continuous Delivery, and DevOps. For a large, heavily regulated industry, this task can not only be daunting, but viewed by many as impossible." tags: ["DevOps","Continuous Integration","Continuous Delivery","CI/CD pipelines","agile","Culture"] image: "/img/organicdevops.webp" link: "http://www.alldaydevops.com/blog/organically-devops-building-quality-and-security-into-the-software-supply-chain-at-liberty-mutual" fact: "Interesting little tidbit shown below image on summary and detail page" weight: 400 sitemap: priority : 0.8 --- This talk looked at Liberty Mutual’s transformation to Continuous Integration, Continuous Delivery, and DevOps. For a large, heavily regulated industry, this task can not only be daunting, but viewed by many as impossible. Often, organizations try to reduce the friction through micro-fixes, but Eddie’s team asked how to change the culture to reduce the friction and concluded with the following final points: - Don’t mandate DevOps. Give employees the chance to master their discipline with examples to set and follow. - Favor deep end-to-end accomplishments over broad but incremental steps forward. Focus on taking the right teams far before encouraging broad adoption. - Centralize the platforms and tools that your teams shouldn’t be thinking about. Provide foundational services/commodities and let teams stay on purpose. - Incorporate contributions from everyone; don’t stifle autonomy. Stay open to new ways of working. - Challenge security policies, but respect intentions. Find new ways to enforce concerns without abandoning precaution. {{< youtube id="FsfKsqI07jM" t="80" width="600px" >}} ================================================ FILE: exampleSite/content/publications/_index.md ================================================ --- title: Publications date: 2020-01-07T16:47:30.077Z link: NA image: /img/organicdevops.webp description: NA weight: 10 sitemap: priority: 0.6 weight: 0.5 --- A collection of articles, presentations or talks, most likely on Culture and DevOps, because let's admit it, they are one in the same ;) ================================================ FILE: exampleSite/content/search.md ================================================ --- title: "Search Results" sitemap: priority : 0.1 layout: "search" --- This file exists solely to respond to /search URL with the related `search` layout template. No content shown here is rendered, all content is based in the template layouts/page/search.html Setting a very low sitemap priority will tell search engines this is not important content. This implementation uses Fusejs, jquery and mark.js ## Initial setup Search depends on additional output content type of JSON in config.toml ``` [outputs] home = ["HTML", "JSON"] ``` ## Searching additional fields To search additional fields defined in front matter, you must add it in 2 places. ### Edit layouts/_default/index.JSON This exposes the values in /index.json i.e. add `category` ``` ... "contents":{{ .Content | plainify | jsonify }} {{ if .Params.tags }}, "tags":{{ .Params.tags | jsonify }}{{end}}, "categories" : {{ .Params.categories | jsonify }}, ... ``` ### Edit fuse.js options to Search `static/js/search.js` ``` keys: [ "title", "contents", "tags", "categories" ] ``` ================================================ FILE: exampleSite/data/boards.json ================================================ [ { "organization":"Champlain Valley Educational Services", "logo":"https://www.cves.org/wp-content/uploads/2023/01/cropped-cves-logo-color-no-subtext-square-512-192x192.png", "website":"https://cves.org", "description":"CVES is the regional Board of Cooperative Educational Services (BOCES) for 16 component schools across Clinton, Esses, Warren, and Washington counties.", "term_start":"2023-06-01", "term_end":"2025-05-31", "role":"BOCES Member" }, { "organization":"Peru Central School Disctrict, Board of Education", "logo":"https://perucsd.org/wp-content/uploads/2021/05/cropped-square-192x192.png", "website":"https://perucsd.org", "description":"Peru Central School is a Regional school serving multiple towns in Clinton County. Go Nighthawks!", "term_start":"2022-06-01", "term_end":"2027-05-31", "role":"BOE Member" } ] ================================================ FILE: exampleSite/data/certifications.json ================================================ [ { "name":"AWS Solutions Architect", "description": "AWS Certified Solutions Architect – Associate", "badge":"https://images.credly.com/size/340x340/images/4bc21d8b-4afe-4fbd-9a90-a9de8bf7b240/AWS-SolArchitect-Associate-2020.png", "proof":"https://www.credly.com/badges/9c168644-e23c-4605-9d98-91b5db56e6c9" }, { "name":"ACP-JSD", "description": "Jira Service Desk Administrator", "badge":"https://www.certmetrics.com/api/ob/image/atlassian/c/4/", "proof":"https://www.certmetrics.com/atlassian/public/badge.aspx?i=4&t=c&d=2020-05-11&ci=AT00143196" }, { "name":"ACP-JCA", "description": "Jira Cloud Administrator", "badge":"https://www.certmetrics.com/api/ob/image/atlassian/c/26/", "proof":"https://www.certmetrics.com/atlassian/public/badge.aspx?i=26&t=c&d=2020-08-07&ci=AT00143196" } ] ================================================ FILE: exampleSite/data/education.json ================================================ [ { "school":"[Rochester Institute of Technology](https://rit.edu)", "degree":"Bachelor of Science", "major":"Management Information Systems", "notes":"Beta Gamma Signma, High Honors", "range":"2006 - 2008" }, { "school":"Clinton Community College", "degree":"Associate of Applied Science", "major":"Computer Information Systems", "range":"2004 - 2006" } ] ================================================ FILE: exampleSite/data/experience.json ================================================ [ { "role":"Boss man", "company":"Current Company LTD", "summary":"Led in development of fast paced software teams.\n- list\n- of\n- things", "range":"February 2016 - Present" }, { "role":"Developer", "company":"Current Company LTD", "summary":"Expedited the synergies of collaborative agile tooling.", "range":"March 2014 - February 2016" }, { "role":"Developer", "company":"Previous Company Inc.", "summary":"Implemented continuous devops pipelines automationing", "range":"February 2013 - March 2014" } ] ================================================ FILE: exampleSite/data/skills.json ================================================ [ { "grouping":"Architecture", "skills":[ "IP Networking","DNS","Firewalls","Load Balancing","Microservices","RESTful APIs","SaaS/PaaS/IaaS"] },{ "grouping":"Languages, Operating Systems & Tools", "skills":[ "Java","Python","git","subversion","linux","bash","php","jquery","javascript"] }, { "grouping":"Platform Development & Administration", "skills":[ "Atlassian","Bamboo","Bitbucket","NGINX","MySQL","Wordpress"] }, { "grouping":"Data Management", "skills":[ {"name":"Microsoft SQL Server","icon":"msql_server"}, {"name":"Oracle","icon":"database"}, "MongoDB", {"name":"Apache Spark"} ] }, { "grouping":"Containers & Cloud", "skills":[ {"name":"BOSH","link":"https://bosh.io"}, {"name":"Docker","link":"https://docker.com"}, {"name":"AWS","link":"https://aws.amazon.com"}, {"name":"Google Cloud","link":"https://cloud.google.com"}, {"name":"Linux","link":"https://bosh.io"} ] } ] ================================================ FILE: exampleSite/static/.well-known/google-verify.etc ================================================ You can place files needed for google, letsencrypt ================================================ FILE: exampleSite/static/admin/README.md ================================================ # Netlify CMS Support This folder exposes an `/admin` page in your website that allows a CMS editor experience. All changes are pushed to the GitHub repository (right to master, or via PR is configurable) ## Using on your site 1) Copy the full admin folder (this folder) from exampleSite within theme to the 'static' folder of you hugo site. `cp -a PROJECT_DIRECTORY/themes/hugo-resume/admin PROJECT_DIRECTORY/static` 2) Edit `config.yml` (which includes hints) to reflect any changes you made to content structure, and also - Github Repository Path - Paths to images and content folders ================================================ FILE: exampleSite/static/admin/cms.js ================================================ import AboutPreview from "./templates/about.js"; CMS.registerPreviewStyle("/css/resume.css"); CMS.registerPreviewStyle("/css/tweaks.css"); CMS.registerPreviewTemplate("about", AboutPreview); CMS.init(); ================================================ FILE: exampleSite/static/admin/config.yml ================================================ # #. This config file adds support for Netlify CMS, exposed at /admin on the running site. # In order to use this on your site, #. 1) replace instances of "exampleSite/......" with the appropriate paths, relative from repository root. #. 2) replace repo path in `backend` settings, and set branch to master. # 3) Optionally enable the [editor workflow](https://www.netlifycms.org/docs/configuration-options/#publish-mode) which uses PRs for content changes # 4) Optionally enable [open authoring](https://www.netlifycms.org/docs/open-authoring/) for community sites, which requires #3 # # backend: name: github repo: eddiewebb/hugo-resume branch: cms media_folder: "exampleSite/static/img" # Folder where user uploaded files should go public_folder: "img" collections: # A list of collections the CMS should be able to edit - name: "Blog" # Used in routes, ie.: /admin/collections/:slug/edit label: "Blog" # Used in the UI, ie.: "New Post" folder: "exampleSite/content/blog" # The path to the folder where the documents are stored create: true # Allow users to create new documents in this collection fields: # The fields each document in this collection have - {label: "Title", name: "title", widget: "string"} - {label: "Publish Date", name: "date", widget: "datetime"} - {label: "Tags", name: "tags", widget: "list", required: false} - {label: "Body", name: "body", widget: "markdown"} - name: "Projects" # Used in routes, ie.: /admin/collections/:slug/edit label: "Projects" # Used in the UI, ie.: "New Post" folder: "exampleSite/content/projects/creations" # The path to the folder where the documents are stored create: true # Allow users to create new documents in this collection fields: # The fields each document in this collection have - {label: "Title", name: "title", widget: "string"} - {label: "Publish Date", name: "date", widget: "datetime"} - {label: "featured", name: "featured", widget: "boolean", required: false} - {label: "link to project repo or site", name: "link", widget: "string"} - {label: "Project Image", name: image, widget: 'image' } - {label: "Brief description", name: "description", widget: "string"} - {label: "Tags", name: "tags", widget: "list", required: false} - {label: "Fun Fact or Stat", name: "fact", widget: "string", default: "used by 20% of Fortune 500 companies!", required: false} - {label: "weight (lower get more visibility)", name: "weight", widget: "number", valueType: float, step: 10, min: 0, max: 1000} - {label: "Sitemap", name: "sitemap", widget: "object", field: {label: weight, name: weight, widget: "number", valueType: float, step: 0.1, min: 0.0, max: 1.0}} - {label: "Body", name: "body", widget: "markdown"} - name: "Contributions" # Used in routes, ie.: /admin/collections/:slug/edit label: "Contributions" # Used in the UI, ie.: "New Post" folder: "exampleSite/content/projects/contributions" # The path to the folder where the documents are stored create: true # Allow users to create new documents in this collection fields: # The fields each document in this collection have - {label: "Title", name: "title", widget: "string"} - {label: "Publish Date", name: "date", widget: "datetime"} - {label: "featured", name: "featured", widget: "boolean", required: false} - {label: "link to project repo or site", name: "link", widget: "string"} - {label: "Project Image", name: image, widget: 'image' } - {label: "Brief description", name: "description", widget: "string"} - {label: "Tags", name: "tags", widget: "list", required: false} - {label: "Fun Fact or Stat", name: "fact", widget: "string", default: "used by 20% of Fortune 500 companies!", required: false} - {label: "weight (lower get more visibility)", name: "weight", widget: "number", valueType: float, step: 10, min: 0, max: 1000} - {label: "Sitemap", name: "sitemap", widget: "object", field: {label: weight, name: weight, widget: "number", valueType: float, step: 0.1, min: 0.0, max: 1.0}} - {label: "Body", name: "body", widget: "markdown"} - name: "Publications" # Used in routes, ie.: /admin/collections/:slug/edit label: "Publications" # Used in the UI, ie.: "New Post" folder: "exampleSite/content/publications" # The path to the folder where the documents are stored create: true # Allow users to create new documents in this collection fields: # The fields each document in this collection have - {label: "Title", name: "title", widget: "string"} - {label: "Publish Date", name: "date", widget: "datetime"} - {label: "featured", name: "featured", widget: "boolean", required: false} - {label: "link to project repo or site", name: "link", widget: "string"} - {label: "Project Image", name: image, widget: 'image' } - {label: "Brief description", name: "description", widget: "string"} - {label: "Tags", name: "tags", widget: "list", required: false} - {label: "Fun Fact or Stat", name: "fact", widget: "string", default: "used by 20% of Fortune 500 companies!", required: false} - {label: "weight (lower get more visibility)", name: "weight", widget: "number", valueType: float, step: 10, min: 0, max: 1000} - {label: "Sitemap", name: "sitemap", widget: "object", field: {label: weight, name: weight, widget: "number", valueType: float, step: 0.1, min: 0.0, max: 1.0}} - {label: "Body", name: "body", widget: "markdown"} - name: 'settings' label: 'Settings' delete: false # Prevent users from deleting documents in this collection editor: preview: false files: - name: 'general' label: 'Site Settings' file: 'exampleSite/config.toml' extension: toml description: 'General Site Settings' fields: - { label: 'Global title', name: 'title', widget: 'string' } - { label: 'Site Url', name: 'baseURL', widget: 'string' } - { label: 'Theme', name: 'theme', widget: 'hidden', default: "hugo-resume" } - { label: 'Language Code', name: 'languageCode', widget: 'hidden', default: "en-us" } - { label: 'PygmentCodeFences', name: 'PygmentsCodeFences', widget: 'boolean', required: false } - { label: 'PygmentCodeFencesGuessSyntax', name: 'PygmentsCodeFencesGuessSyntax', widget: 'boolean', required: false } - { label: 'PygmentCodeFencesGuessSyntax', name: 'PygmentsStyle', widget: 'string' } - label: 'Params' name: 'params' widget: 'object' fields: - { label: 'First Name', name: 'firstName', widget: 'string' } - { label: 'Last Name', name: 'lastName', widget: 'string' } - { label: address, name: address, widget: 'string' } - { label: profileImage, name: profileImage, widget: 'image' } - { label: 'phone', name: 'phone', widget: 'string' } - { label: 'email', name: 'email', widget: 'string' } - label: 'Social Handles' name: 'handles' widget: 'list' fields: - { label: 'Name', name: 'name', widget: 'string' } - { label: 'Link', name: 'link', widget: 'string' } - { label: 'showSkills', name: 'showSkills', widget: 'boolean', required: false } - { label: 'showProjects', name: 'showProjects', widget: 'boolean', required: false } - { label: 'showOpenSource', name: 'showOpenSource', widget: 'boolean', required: false } - { label: 'showPublications', name: 'showPublications', widget: 'boolean', required: false } - { label: 'showExperience', name: 'showExperience', widget: 'boolean', required: false } - { label: 'showEducation', name: 'showEducation', widget: 'boolean', required: false } - { label: 'showQr', name: 'showQr', widget: 'boolean', required: false } - { label: 'favicon', name: 'favicon', widget: 'image' } - label: 'Google' name: 'google' widget: 'object' fields: - { label: 'analytics', name: 'analytics', widget: 'object',fields: [{ label: 'Tracker ID', name: 'trackerID', widget: 'string', required: false }] } - { label: 'Show Git Commit INfo', name: 'enableGitInfo', widget: 'boolean', required: false } - { label: 'outputs', name: 'outputs', widget: 'object', field: {name: 'home', label: 'home' , widget: list, default: ['HTML','JSON'] }} - { label: 'taxonomies', name: 'taxonomies', widget: 'hidden', default: {name: 'home', label: 'home' , widget: string, default: ['tags'] }} ================================================ FILE: exampleSite/static/admin/index.html ================================================ Content Manager ================================================ FILE: exampleSite/static/admin/templates/about.js ================================================ var AboutPreview = createClass({ // Object fields are simpler than lists - instead of `widgetsFor` returning // an array of objects, it returns a single object. Accessing the shape of // that object is the same as the shape of objects returned for list fields: // // { // data: { front_limit: 0, author: 'Chris' }, // widgets: { front_limit: (), author: (WidgetComponent>)} // } render: function() { var entry = this.props.entry; var intro = entry.getIn(['data', 'intro']); var about = entry.getIn(['data', 'about']); var classes = entry.getIn(['data', 'classes']); var contact = entry.getIn(['data', 'contact']); var bg = this.props.widgetsFor('intro').getIn(['widgets', 'background']).props.value; return h('div',{}, // Intro Section h('header', { "class":"masthead", "style":{ backgroundImage: "url(" + bg + ")", backgroundPosition: 'center', backgroundSize: 'cover', backgroundRepeat: 'no-repeat' } }, h('div',{'class':'intro-body'}, h('div',{'class':'container'}, h('div',{'class':'row'}, h('div',{'class':'col-lg-8 mx-auto'}, h('div',{'class':'improve-contrast-box'}, h('h1',{'class':'brand-heading'}, this.props.widgetsFor('intro').getIn(['widgets', 'header']) ), h('p',{'class':'intro-text'}, this.props.widgetsFor('intro').getIn(['widgets', 'text']) ) ) ) ) ) ) ) , // About Section h('section',{"id":"about","class":"content-section text-center"}, h('div',{"class":"container"}, h('div',{"class":"row"}, h('div',{"class":"col-lg-8 mx-auto"}, h('h2',{}, this.props.widgetsFor('about').getIn(['widgets', 'header']) ), h('p',{}, this.props.widgetsFor('about').getIn(['widgets', 'text']) ) ) ) ) ), // Contact Section h('section',{"id":"contact","class":"content-section text-center"}, h('div',{"class":"container"}, h('div',{"class":"row"}, h('div',{"class":"col-lg-8 mx-auto"}, h('h2',{}, this.props.widgetsFor('contact').getIn(['widgets', 'header']) ), h('p',{}, this.props.widgetsFor('contact').getIn(['widgets', 'text']) ) ) ) ) ) ) return h('div', {}, h('h1', {}, title), h('dl', {}, h('dt', {}, 'Posts on Frontpage'), h('dd', {}, this.props.widgetsFor('posts').getIn(['widgets', 'front_limit']) || 0), h('dt', {}, 'Default Author'), h('dd', {}, this.props.widgetsFor('posts').getIn(['data', 'author']) || 'None'), ) ); } }); export default AboutPreview; ================================================ FILE: i18n/en.json ================================================ { "about": "About", "blog": "Blog", "certifications": "Certifications", "creations": "Creations", "contact": "Contact", "contributions":"Open Source", "education": "Education", "experience": "Experience", "publications": "Presentations", "skills": "Skills", "socialization": "Socialization", "boards": "Boards & Volunteering" } ================================================ FILE: i18n/fr.json ================================================ { "about": "À Propos", "blog": "Blog", "certifications": "Certifications", "creations": "Creations", "contact": "Contact", "contributions":"Open Source", "education": "Formation", "experience": "Expériences", "publications": "Presentations", "skills": "Compétences", "socialization": "Réseaux sociaux", "boards": "Conseil" } ================================================ FILE: layouts/404.html ================================================ ================================================ FILE: layouts/_default/baseof.html ================================================ {{ .Site.Title }} | {{ .Title }} {{ $preview_image := .Resources.GetMatch "site_preview" }} {{if $preview_image }} {{ else }} {{ end }} {{ hugo.Generator }} {{ block "headfiles" . }} {{ end }} {{ partial "nav.html" . }}
{{ block "main" . }} {{ .Content }} {{ end }}
Nifty tech tag lists from Wouter Beeftink {{ with $.GitInfo }}{{ with $.Site.Params.gitCommitPrefix }} | Page content generated from commit: {{ $.GitInfo.AbbreviatedHash }}{{ end }}{{end}}
{{ if .Site.Params.google.analytics.trackerID }} {{ end }} {{ block "footerfiles" . }} {{ end }} ================================================ FILE: layouts/_default/contact.html ================================================ {{ define "main" }}

{{ .Param "firstName" }} {{ .Param "lastName" }}

{{ partial "contact-qr" . }}
{{ .Content }}
{{ end }} ================================================ FILE: layouts/_default/contact.vcf ================================================ {{ partial "vcard" . }} ================================================ FILE: layouts/_default/index.json ================================================ {{- $.Scratch.Add "index" slice -}} {{- range .Site.RegularPages -}} {{- $.Scratch.Add "index" (dict "title" .Title "tags" .Params.tags "categories" .Params.categories "contents" .Plain "permalink" .Permalink) -}} {{- end -}} {{- $.Scratch.Get "index" | jsonify -}} ================================================ FILE: layouts/_default/list.html ================================================ {{ define "main" }} {{ .Content }} {{ end }} ================================================ FILE: layouts/_default/search.html ================================================ {{ define "footerfiles" }} {{ end }} {{ define "main" }}

Matching pages

{{ end }} ================================================ FILE: layouts/_default/section.html ================================================ {{ define "main" }} {{ partial "breadcrumbs" . }}

{{ .Title }}

{{ .Content }}

{{ range .Data.Pages.ByWeight }} {{ if ne .Type "markdown" }} {{ partial (printf "%s%s" .Type "Summary") . }} {{ end }} {{ end }} {{ range .Sections }}

{{ .Title }}

{{ .Content }}

{{ range .Pages }} {{ if ne .Type "markdown" }} {{ partial (printf "%s%s" .Type "Summary") . }} {{ end }} {{ end }} {{ end }}
{{ end }} ================================================ FILE: layouts/_default/single.html ================================================ {{ define "main" }}

{{ .Title }}

{{ .Content }}
{{ end }} ================================================ FILE: layouts/_default/taxonomy.html ================================================ {{ define "main" }}
Content tagged with {{ .Data.Term }}
{{ end }} ================================================ FILE: layouts/_default/terms.html ================================================ {{ define "main" }}
{{ end }} ================================================ FILE: layouts/adv/single.html ================================================ {{ define "main" }} {{ partial "breadcrumbs" . }}

{{ .Title }}

{{ .Date.Format "January 2, 2006" }}
{{ .Summary }}
{{ with $.Page.Resources.GetMatch "map" }} {{ $image := .Resize "x400" }} {{ with $.Page.Resources.GetMatch "gpx" }} Map image of this route {{ end }} {{ end }}
{{ $body := replace .Content .Summary "" }} {{ $body | safeHTML }} {{ with .Params.link }}

Project link: {{ . }}

{{ end }}
{{ with $.Page.Resources.GetMatch "gpx" }} GPX file {{ end }}
{{ partial "advtags" . }}
{{ end }} ================================================ FILE: layouts/blog/single.html ================================================ {{ define "main" }} {{ partial "breadcrumbs" . }}

{{ .Title }}

{{ .Date.Format "January 2, 2006" }}
{{ .Content }} {{ with .Params.link }}

Project link: {{ . }}

{{ end }}
{{ with $.Page.Resources.GetMatch "gpx" }} GPX file {{ end }}
{{ partial "advtags" . }}
{{ end }} ================================================ FILE: layouts/index.html ================================================ {{ define "main" }} {{ partial "about.html" .}} {{ $projects := slice "creations" "contributions" }} {{ $sections := slice "publications" "blog" }} {{ $site := .Site }} {{ range .Site.Params.sections }} {{ $sectionName := . }} {{ if in $projects . }} {{ with $site.GetPage "section" (printf "projects/%s" .) }} {{ .Scratch.Set "sectionId" $sectionName }} {{ partial "sectionSummary" . }} {{ end }} {{ else if in $sections . }} {{ with $site.GetPage "section" . }} {{ .Scratch.Set "sectionId" $sectionName }} {{ partial "sectionSummary" . }} {{ end }} {{ else }} {{ partial (printf "portfolio/%s" . ) $site }} {{ end }} {{ end }} {{ end }} ================================================ FILE: layouts/markdown/baseof.html ================================================ {{ .Site.Title }} | {{ .Title }}
{{ block "main" . }} {{ .Content }} {{ end }} {{ with $.GitInfo }}{{ with $.Site.Params.gitCommitPrefix }} | Page content generated from commit: {{ $.GitInfo.AbbreviatedHash }}{{ end }}{{end}}
{{ block "footerfiles" . }} {{ end }} ================================================ FILE: layouts/markdown/single.html ================================================ {{ define "main" }}

{{ .Title }}

{{ .Date.Format "January 2, 2006" }}
{{ .Content }}
{{ end }} ================================================ FILE: layouts/partials/about.html ================================================

{{ .Site.Params.firstName }} {{ .Site.Params.lastName }}

{{ if .Site.Params.showQr }} {{ partial "contact-qr" . }} {{ end }}
{{ .Content }} {{ if .Site.Params.showSocializations }}
    {{ range .Site.Params.handles }}
  • {{ end }}
{{ end }} {{ if .Site.Params.showCertifications }}

{{ i18n "certifications" }}

    {{ range hugo.Data.certifications }}
  • {{ end }}
{{ end }} {{ if .Site.Params.showBoards }}

{{ i18n "boards" }}

    {{ range hugo.Data.boards }}

  • {{ .organization }}
  •  
  • {{ end }}
{{end}}
================================================ FILE: layouts/partials/advSummary.html ================================================
{{ $teaser := default ($.Page.Resources.GetMatch "map") ($.Page.Resources.GetMatch "teaser") }} {{ $roller := default ($.Page.Resources.GetMatch "teaser") ($.Page.Resources.GetMatch "map") }} {{ $timage := $teaser.Fill "250x250" }} Card Back {{ $rimage := $roller.Fill "250x250" }}

{{ .Params.title }}

{{ .Date.Format "January 2, 2006" }}
{{ .Summary | safeHTML }}
{{ partial "advtags" . }}
================================================ FILE: layouts/partials/advtags.html ================================================ ================================================ FILE: layouts/partials/blogSummary.html ================================================

{{ .Params.title }}

{{ .Summary | safeHTML }}
{{ partial "advtags" . }}
{{ .Date.Format "January 2, 2006" }}
================================================ FILE: layouts/partials/breadcrumbs.html ================================================ {{ define "breadcrumbnav" }} {{ if .p1.Parent }} {{ template "breadcrumbnav" (dict "p1" .p1.Parent "p2" .p2 ) }} {{ else if not .p1.IsHome }} {{ template "breadcrumbnav" (dict "p1" .p1.Site.Home "p2" .p2 ) }} {{ end }} {{ end }} ================================================ FILE: layouts/partials/contact-qr.html ================================================

Scan contact card

Scannable QR code with contact info
================================================ FILE: layouts/partials/nav.html ================================================ ================================================ FILE: layouts/partials/portfolio/education.html ================================================

{{ i18n "education" }}

{{ range hugo.Data.education }}

{{ .school | markdownify }}

{{ .degree }}
{{ .major | markdownify }}

{{ .notes | markdownify }}

{{ .range }}
{{ end }}
================================================ FILE: layouts/partials/portfolio/experience.html ================================================

{{ i18n "experience" }}

{{ range hugo.Data.experience }}

{{ .role }}

{{ .company | markdownify }}

{{ .summary | markdownify }}

{{ .range }}
{{ end }}
================================================ FILE: layouts/partials/portfolio/skills.html ================================================

{{ i18n "skills" }}

{{ range hugo.Data.skills }}
{{ .grouping }}
    {{ range .skills }} {{ $name := "error" }} {{ $iconclass := "devicon-bash-plain" }} {{ if isset . "name" }} {{ $name = .name }} {{ else }} {{ $name = . }} {{ end }} {{ if isset . "devicon" }} {{ $iconclass = printf "devicon-%s-plain devicon-%-original" ( lower .devicon ) (lower .devicon ) }} {{ else }} {{ $iconclass = printf "devicon-%s-plain devicon-%-original" ( lower $name ) (lower $name ) }} {{ end }}
  • {{if isset . "link"}} {{$name}} {{ else }} {{ $name }} {{ end }}
  • {{ end }}
{{ end }}
================================================ FILE: layouts/partials/projectsSummary.html ================================================

{{ .Title }}

{{with .Params.image }} {{ end }}

{{ .Description | safeHTML }}

Read more..

{{ partial "techtags" . }}
================================================ FILE: layouts/partials/publicationsSummary.html ================================================

{{ .Params.pubtype }} - {{ .Params.title }}

{{ .Params.description | safeHTML }}

{{ partial "techtags" . }}

{{ .Params.date | dateFormat "January 2006" }} {{ if .Resources.Get .Params.image }} {{ with .Resources.Get .Params.image }} {{ end }} {{ else if resources.Get .Params.image }} {{ with .Resources.Get .Params.image }} {{ end }} {{ else if .Params.image }} {{ end }}
================================================ FILE: layouts/partials/sectionSummary.html ================================================

{{ .Title }}

{{ .Content | replaceRE "

" "

" | safeHTML }}

{{ $featuredPages := where .Pages "Params.featured" true }} {{ range $featuredPages }} {{ partial (printf "%s%s" .Section "Summary") . }} {{ end }}
{{ if gt .Pages $featuredPages }}

Wait! There's more..

See all {{ .Title | pluralize }} for more examples!

{{ end }}
================================================ FILE: layouts/partials/techtags.html ================================================ ================================================ FILE: layouts/partials/vcard.html ================================================ {{ $fields := (index .Site.Params.vcardfields) }} BEGIN:VCARD VERSION:4.0 {{ if in $fields "name" }} N:{{ .Site.Params.lastName }};{{ .Site.Params.firstName }};;; FN:{{ .Site.Params.firstName }} {{ .Site.Params.lastName }} {{ end }} {{ if in $fields "phone" }} TEL;TYPE=WORK,VOICE:{{ .Site.Params.phone }} {{ end }} {{ if in $fields "email" }} EMAIL;TYPE=INTERNET,PREF:{{ .Param "email" }} {{ end }} {{ if in $fields "workemail" }} EMAIL;TYPE=INTERNET,WORK:{{ .Param "workemail" }} {{ end }} {{ if in $fields "image" }} PHOTO;TYPE=JPG;VALUE=URI:{{ .Site.BaseURL }}{{ .Site.Params.profileImage }} {{ end }} {{ if in $fields "org" }} ORG:{{ range first 1 hugo.Data.experience }}{{ .company }}{{ end }} {{ end }} {{ if in $fields "title" }} TITLE:{{ .Site.Params.contactNote }} {{ end }} {{ if in $fields "url" }} URL:{{ .Site.BaseURL }} {{ end }} END:VCARD ================================================ FILE: layouts/projects/single.html ================================================ {{ define "main" }} {{ partial "breadcrumbs" . }}

{{ .Title }}

{{ .Content }} {{ with .Params.link }}

Project link: {{ . }}

{{ end }} {{ partial "techtags" . }}
{{ end }} ================================================ FILE: layouts/publications/single.html ================================================ {{ define "main" }} {{ partial "breadcrumbs" . }}

{{ .Title }}

Link to full {{ .Params.pubtype }}

{{ with .Params.image }}{{ end }} {{ .Content }}

{{ partial "techtags" . }}

{{ end }} ================================================ FILE: layouts/shortcodes/imgresize.html ================================================ {{ $original := .Page.Resources.GetMatch (.Get 0) }} {{ $options := .Get 1 }} {{ .Scratch.Set "image" ($original.Fit $options) }} {{ $image := .Scratch.Get "image" }} {{ $title := .Get 2 }} {{ $title }} ================================================ FILE: static/css/resume.css ================================================ html { --scroll-behavior: smooth; scroll-behavior: smooth; } body { font-family: 'Open Sans', serif; padding-top: 54px; color: #868e96; } @media (min-width: 992px) { body { padding-top: 0; padding-left: 17rem; } } h1, h2, h3, h4, h5, h6 { font-family: 'Saira Extra Condensed', serif; font-weight: 700; color: #343a40; } h1, h2{ text-transform: uppercase; } h1 { font-size: 6rem; line-height: 5.5rem; } h2 { font-size: 3.5rem; } .subheading { text-transform: uppercase; font-weight: 500; font-family: 'Saira Extra Condensed', serif; font-size: 1.35rem; } .list-social-icons a { color: #495057; } .list-social-icons a:hover { color: #BD5D38; } .list-social-icons a .fa-lg { font-size: 1.75rem; } .list-icons { font-size: 3rem; } .list-icons .list-inline-item i:hover { color: #BD5D38; } #sideNav .navbar-nav .nav-item .nav-link { font-weight: 600; text-transform: uppercase; } @media (min-width: 992px) { #sideNav { text-align: center; position: fixed; top: 0; left: 0; display: flex; flex-direction: column; width: 17rem; height: 100vh; } #sideNav .navbar-brand { display: flex; margin: auto auto 0; padding: 0.5rem; } #sideNav .navbar-brand .img-profile { max-width: 10rem; max-height: 10rem; border: 0.5rem solid rgba(255, 255, 255, 0.2); } #sideNav .navbar-collapse { display: flex; align-items: flex-start; flex-grow: 0; width: 100%; margin-bottom: auto; } #sideNav .navbar-collapse .navbar-nav { flex-direction: column; width: 100%; } #sideNav .navbar-collapse .navbar-nav .nav-item { display: block; } #sideNav .navbar-collapse .navbar-nav .nav-item .nav-link { display: block; } } section.resume-section { border-bottom: 1px solid #dee2e6; padding-top: 5rem !important; padding-bottom: 5rem !important; } section.resume-section .resume-item .resume-date { min-width: none; } @media (min-width: 768px) { section.resume-section { min-height: 100vh; } section.resume-section .resume-item .resume-date { min-width: 18rem; } } @media (min-width: 992px) { section.resume-section { padding-top: 3rem !important; padding-bottom: 3rem !important; } } .bg-primary { background-color: #BD5D38 !important; } .text-primary { color: #BD5D38 !important; } a { color: #BD5D38; } a:hover, a:focus, a:active { color: #824027; } ================================================ FILE: static/css/tweaks.css ================================================ @media (max-width: 768px) { /* makes googlebot happy with tap target spacing */ a { min-height: 48px !important; min-width: 48px !important; min-inline-size: 48px !important; margin-right: 4px; margin-left: 4px; line-height: 48px; } } img { max-width: 100% !important; } .p-0{ margin: 0 auto; } .devicons{ font-size:1.5em; vertical-align: sub; } /* ensure items with short summarues push date over image */ .publication-content{ width:90%; } h3{ margin-top:40px; } h3.mb-0{ margin-top:0; } div.skills-heading{ margin-top:1em; margin-bottom:0 !important; } /* From https://codepen.io/wbeeftink/pen/dIaDH */ .tags { font: 12px/1.5 'PT Sans', serif; list-style: none; margin: 0; overflow: hidden; padding: 0; } .tags li { float: left; } .tag { background: #eee; border-radius: 3px 0 0 3px; color: #999; display: inline-block; height: 26px; line-height: 26px; padding: 0 20px 0 23px; position: relative; margin: 0 10px 10px 0; text-decoration: none; -webkit-transition: color 0.2s; } .tag::before { background: #fff; border-radius: 10px; box-shadow: inset 0 1px rgba(0, 0, 0, 0.25); content: ''; height: 6px; left: 10px; position: absolute; width: 6px; top: 10px; } .tag::after { background: #fff; border-bottom: 13px solid transparent; border-left: 10px solid #eee; border-top: 13px solid transparent; content: ''; position: absolute; right: 0; top: 0; } .tag:hover { background-color: crimson; color: white; } .tag:hover::after { border-left-color: crimson; } .project-fact{ font-size:80%; font-style:italic; } .resume-section blockquote { border-left: 4px solid #BD5D38; padding-left: 1em; } /* Fix responsive width for blog posts */ .my-auto { width: 100% } .advteaser-container{ } .advteaser { width: 250px; height: 250px; position: relative; display: inline-block; } .advteaser img { position: absolute; top: 0; left: 0; } .advteaser .img-top { display: none; z-index: 99; } .advteaser-container:hover .img-top { display: inline; } img.qrcode { max-width: 300px !important; } ================================================ FILE: static/js/resume.js ================================================ (function($) { "use strict"; // Start of use strict // Closes responsive menu when a scroll trigger link is clicked $('.js-scroll-trigger').click(function() { $('.navbar-collapse').collapse('hide'); }); // Activate scrollspy to add active class to navbar items on scroll $('body').scrollspy({ target: '#sideNav' }); $(function () { $('[data-toggle="tooltip"]').tooltip() }) })(jQuery); // End of use strict ================================================ FILE: static/js/search.js ================================================ (function($) { summaryInclude=60; var fuseOptions = { shouldSort: true, includeMatches: true, threshold: 0.0, tokenize:true, location: 0, distance: 100, maxPatternLength: 32, minMatchCharLength: 3, keys: [ {name:"title",weight:0.8}, {name:"contents",weight:0.5}, {name:"tags",weight:0.3} ] }; var searchQuery = param("s"); if(searchQuery){ $("#search-query").val(searchQuery); executeSearch(searchQuery); }else { $('#search-results').append("

Please enter a word or phrase above

"); } function executeSearch(searchQuery){ $.ajax({ dataType: "json", url: "/index.json", success: function( data ) { var pages = data; var fuse = new Fuse(pages, fuseOptions); var result = fuse.search(searchQuery); console.log({"matches":result}); if(result.length > 0){ populateResults(result); }else{ $('#search-results').append("

No matches found

"); } } }); } function populateResults(result){ $.each(result,function(key,value){ var contents= value.item.contents; var snippet = ""; var snippetHighlights=[]; var tags =[]; if( fuseOptions.tokenize ){ snippetHighlights.push(searchQuery); }else{ $.each(value.matches,function(matchKey,mvalue){ if(mvalue.key == "tags"){ snippetHighlights.push(mvalue.value); }else if(mvalue.key == "contents"){ start = mvalue.indices[0][0]-summaryInclude>0?mvalue.indices[0][0]-summaryInclude:0; end = mvalue.indices[0][1]+summaryInclude