From 0ef6d12a32aa5a23cc8b11c7d11a58e2fc122ba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sean=20O=E2=80=99Connor?= Date: Mon, 31 Aug 2026 15:57:00 -0400 Subject: [PATCH] Update resume for BU and Hadlock technologies --- .github/workflows/compile-latex.yml | 211 +--------------------------- resume.tex | 66 +++------ 2 files changed, 29 insertions(+), 248 deletions(-) diff --git a/.github/workflows/compile-latex.yml b/.github/workflows/compile-latex.yml index 19a7614..9820218 100644 --- a/.github/workflows/compile-latex.yml +++ b/.github/workflows/compile-latex.yml @@ -16,10 +16,8 @@ jobs: container: ghcr.io/xu-cheng/texlive-alpine:latest steps: - name: Install system dependencies - run: apk add --no-cache git gettext bash nodejs - + run: apk add --no-cache git gettext bash nodejs poppler-utils - uses: actions/checkout@v4 - - name: Create public info file env: PERSONAL_NAME: ${{ secrets.PERSONAL_NAME || github.repository_owner }} @@ -28,7 +26,6 @@ jobs: PERSONAL_SCHOOL_EMAIL: ${{ secrets.PERSONAL_SCHOOL_EMAIL || '' }} run: | cat > personal_info.tex << 'EOL' - % Public version of personal information \newcommand{\personalName}{$PERSONAL_NAME} \newcommand{\personalEmail}{$PERSONAL_EMAIL} \newcommand{\personalPhone}{~} @@ -42,31 +39,16 @@ jobs: EOL envsubst < personal_info.tex > personal_info.tex.tmp mv personal_info.tex.tmp personal_info.tex - - - name: Cache TeX Live - uses: actions/cache@v4 - with: - path: | - /tmp/texlive - ~/.texlive* - key: texlive-${{ runner.os }}-${{ hashFiles('**/*.tex', 'subfiles/**/*.tex') }} - restore-keys: | - texlive-${{ runner.os }}- - - - name: Create TeX Live directory - run: mkdir -p /tmp/texlive - - name: Compile LaTeX run: | latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode resume.tex latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode cv.tex - - - name: List generated PDFs - run: ls -la *.pdf - - # --- GITHUB RELEASES (Run only on GitHub) --- - - name: Upload Public PDFs as Release (GitHub) - if: github.server_url == 'https://github.com' + - name: Enforce one-page resume + run: | + pages=$(pdfinfo resume.pdf | awk '/^Pages:/ {print $2}') + echo "Resume pages: $pages" + test "$pages" -eq 1 + - name: Upload Public PDFs as Release uses: ncipollo/release-action@v1 with: artifacts: "resume.pdf,cv.pdf" @@ -74,187 +56,8 @@ jobs: name: Latest PDFs body: | Latest compiled resume and CV (public versions) - Built from commit ${{ github.sha }} token: ${{ secrets.GITHUB_TOKEN }} allowUpdates: true removeArtifacts: true replacesArtifacts: true - - - name: Create Numbered Release (GitHub) - if: github.server_url == 'https://github.com' - uses: ncipollo/release-action@v1 - with: - artifacts: "resume.pdf,cv.pdf" - tag: release-${{ github.run_number }} - name: Release ${{ github.run_number }} - body: | - Automated release #${{ github.run_number }} - - Built from commit ${{ github.sha }} - token: ${{ secrets.GITHUB_TOKEN }} - draft: false - prerelease: false - - # --- GITEA RELEASES (Run only on Gitea) --- - - name: Upload Public PDFs as Release (Gitea) - if: github.server_url != 'https://github.com' - uses: akkuman/gitea-release-action@v1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - files: | - resume.pdf - cv.pdf - name: Latest PDFs - tag_name: latest - prerelease: false - draft: false - - - name: Create Numbered Release (Gitea) - if: github.server_url != 'https://github.com' - uses: akkuman/gitea-release-action@v1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - files: | - resume.pdf - cv.pdf - name: Release ${{ github.run_number }} - tag_name: release-${{ github.run_number }} - prerelease: false - draft: false - - build-private-github: - runs-on: ubuntu-latest - container: ghcr.io/xu-cheng/texlive-alpine:latest - if: github.actor == github.repository_owner && github.server_url == 'https://github.com' - steps: - - name: Install system dependencies - run: apk add --no-cache git gettext bash nodejs - - - uses: actions/checkout@v4 - - - name: Create private info file - env: - PERSONAL_NAME: ${{ secrets.PERSONAL_NAME || github.repository_owner }} - PERSONAL_EMAIL: ${{ secrets.PERSONAL_EMAIL || '' }} - PERSONAL_WEBSITE: ${{ secrets.PERSONAL_WEBSITE || '' }} - PERSONAL_SCHOOL_EMAIL: ${{ secrets.PERSONAL_SCHOOL_EMAIL || '' }} - PERSONAL_PHONE: ${{ secrets.PERSONAL_PHONE || '' }} - PERSONAL_HOME_ADDRESS_LINE1: ${{ secrets.PERSONAL_HOME_ADDRESS_LINE1 || '' }} - PERSONAL_HOME_ADDRESS_LINE2: ${{ secrets.PERSONAL_HOME_ADDRESS_LINE2 || '' }} - PERSONAL_SCHOOL_ADDRESS_LINE1: ${{ secrets.PERSONAL_SCHOOL_ADDRESS_LINE1 || '' }} - PERSONAL_SCHOOL_ADDRESS_LINE2: ${{ secrets.PERSONAL_SCHOOL_ADDRESS_LINE2 || '' }} - PERSONAL_SCHOOL_ADDRESS_LINE3: ${{ secrets.PERSONAL_SCHOOL_ADDRESS_LINE3 || '' }} - run: | - cat > personal_info.tex << 'EOL' - % Private version of personal information - \newcommand{\personalName}{${PERSONAL_NAME}} - \newcommand{\personalEmail}{${PERSONAL_EMAIL}} - \newcommand{\personalPhone}{${PERSONAL_PHONE}} - \newcommand{\personalWebsite}{${PERSONAL_WEBSITE}} - \newcommand{\personalSchoolEmail}{${PERSONAL_SCHOOL_EMAIL}} - \newcommand{\personalHomeAddressLineOne}{${PERSONAL_HOME_ADDRESS_LINE1}} - \newcommand{\personalHomeAddressLineTwo}{${PERSONAL_HOME_ADDRESS_LINE2}} - \newcommand{\personalSchoolAddressLineOne}{${PERSONAL_SCHOOL_ADDRESS_LINE1}} - \newcommand{\personalSchoolAddressLineTwo}{${PERSONAL_SCHOOL_ADDRESS_LINE2}} - \newcommand{\personalSchoolAddressLineThree}{${PERSONAL_SCHOOL_ADDRESS_LINE3}} - EOL - envsubst < personal_info.tex > personal_info.tex.tmp - mv personal_info.tex.tmp personal_info.tex - - - name: Cache TeX Live - uses: actions/cache@v4 - with: - path: | - /tmp/texlive - ~/.texlive* - key: texlive-${{ runner.os }}-${{ hashFiles('**/*.tex', 'subfiles/**/*.tex') }} - restore-keys: | - texlive-${{ runner.os }}- - - - name: Create TeX Live directory - run: mkdir -p /tmp/texlive - - - name: Compile LaTeX - run: | - latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode resume.tex - latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode cv.tex - - - name: List generated PDFs - run: ls -la *.pdf - - - name: Upload Private PDFs - uses: actions/upload-artifact@v4 - with: - name: private-documents - path: | - resume.pdf - cv.pdf - - build-private-gitea: - runs-on: ubuntu-latest - container: ghcr.io/xu-cheng/texlive-alpine:latest - if: github.actor == github.repository_owner && github.server_url != 'https://github.com' - steps: - - name: Install system dependencies - run: apk add --no-cache git gettext bash nodejs - - - uses: actions/checkout@v4 - - - name: Create private info file - env: - PERSONAL_NAME: ${{ secrets.PERSONAL_NAME || github.repository_owner }} - PERSONAL_EMAIL: ${{ secrets.PERSONAL_EMAIL || '' }} - PERSONAL_WEBSITE: ${{ secrets.PERSONAL_WEBSITE || '' }} - PERSONAL_SCHOOL_EMAIL: ${{ secrets.PERSONAL_SCHOOL_EMAIL || '' }} - PERSONAL_PHONE: ${{ secrets.PERSONAL_PHONE || '' }} - PERSONAL_HOME_ADDRESS_LINE1: ${{ secrets.PERSONAL_HOME_ADDRESS_LINE1 || '' }} - PERSONAL_HOME_ADDRESS_LINE2: ${{ secrets.PERSONAL_HOME_ADDRESS_LINE2 || '' }} - PERSONAL_SCHOOL_ADDRESS_LINE1: ${{ secrets.PERSONAL_SCHOOL_ADDRESS_LINE1 || '' }} - PERSONAL_SCHOOL_ADDRESS_LINE2: ${{ secrets.PERSONAL_SCHOOL_ADDRESS_LINE2 || '' }} - PERSONAL_SCHOOL_ADDRESS_LINE3: ${{ secrets.PERSONAL_SCHOOL_ADDRESS_LINE3 || '' }} - run: | - cat > personal_info.tex << 'EOL' - % Private version of personal information - \newcommand{\personalName}{${PERSONAL_NAME}} - \newcommand{\personalEmail}{${PERSONAL_EMAIL}} - \newcommand{\personalPhone}{${PERSONAL_PHONE}} - \newcommand{\personalWebsite}{${PERSONAL_WEBSITE}} - \newcommand{\personalSchoolEmail}{${PERSONAL_SCHOOL_EMAIL}} - \newcommand{\personalHomeAddressLineOne}{${PERSONAL_HOME_ADDRESS_LINE1}} - \newcommand{\personalHomeAddressLineTwo}{${PERSONAL_HOME_ADDRESS_LINE2}} - \newcommand{\personalSchoolAddressLineOne}{${PERSONAL_SCHOOL_ADDRESS_LINE1}} - \newcommand{\personalSchoolAddressLineTwo}{${PERSONAL_SCHOOL_ADDRESS_LINE2}} - \newcommand{\personalSchoolAddressLineThree}{${PERSONAL_SCHOOL_ADDRESS_LINE3}} - EOL - envsubst < personal_info.tex > personal_info.tex.tmp - mv personal_info.tex.tmp personal_info.tex - - - name: Cache TeX Live - uses: actions/cache@v4 - with: - path: | - /tmp/texlive - ~/.texlive* - key: texlive-${{ runner.os }}-${{ hashFiles('**/*.tex', 'subfiles/**/*.tex') }} - restore-keys: | - texlive-${{ runner.os }}- - - - name: Create TeX Live directory - run: mkdir -p /tmp/texlive - - - name: Compile LaTeX - run: | - latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode resume.tex - latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode cv.tex - - - name: List generated PDFs - run: ls -la *.pdf - - - name: Upload Private PDFs - uses: actions/upload-artifact@v3 - with: - name: private-documents - path: | - resume.pdf - cv.pdf \ No newline at end of file diff --git a/resume.tex b/resume.tex index df30589..4b4388f 100644 --- a/resume.tex +++ b/resume.tex @@ -1,72 +1,50 @@ \documentclass{article} - -% Include common style \input{shared/style/common} - -% Include personal information (check build/ first, then root) \IfFileExists{build/personal_info.tex}{\input{build/personal_info}}{\input{personal_info}} - \begin{document} - -% Header with contact information \input{shared/sections/header} - -% Education section \input{shared/sections/education} -% Publications section -\resumesection{Publications} - -\textbf{First Author, IEEE International Conference on Robot \& Human Interactive Communication (RO-MAN)} +\resumesection{Publications \& Research} +\textbf{Human-Robot Interaction Researcher, Bucknell University} \hfill \textbf{Jan 2023 – May 2026} \begin{itemize}[noitemsep,topsep=2pt] - \item O'Connor, S. \& Perrone, L.F. ``A Web-Based Wizard-of-Oz Platform for Collaborative and Reproducible HRI Research'' \textit{IEEE RO-MAN 2025}, Eindhoven, The Netherlands - \item O'Connor, S. \& Perrone, L.F. ``HRIStudio: A Framework for Wizard-of-Oz Experiments in HRI Studies'' \textit{IEEE RO-MAN 2024}, Pasadena, CA - \item O'Connor, S. ``A Web-Based Wizard-of-Oz Platform for Collaborative and Reproducible HRI Research'' \textit{Bachelor's Honors Thesis}, Bucknell University, 2026 -\end{itemize} - -\resumesection{Research Experience} - -\textscbf{Bucknell University} \hfill \textscbf{Lewisburg, PA} - -\textbf{Human-Robot Interaction Researcher} \hfill \textbf{Jan 2023 – May 2026} -\begin{itemize}[noitemsep,topsep=2pt] - \item Published 2 first-author papers at IEEE RO-MAN (2024, 2025) on HRIStudio, a web-based Wizard-of-Oz platform enabling reproducible HRI studies across multiple robot platforms - \item Completed honors thesis evaluating HRIStudio via pilot study: achieved 100\% design fidelity and 96.7 execution reliability vs.\ 66.7 baseline; SUS score 76.7 vs.\ 59.2 for Choregraphe - \item Architected modular plugin system with WebSocket teleoperation and RESTful API integrating ROS for NAO, Pepper, and custom robots + \item Published two first-author papers at IEEE RO-MAN (2024, 2025) on HRIStudio, a web-based Wizard-of-Oz platform for reproducible HRI studies; completed an honors thesis evaluating the platform + \item Achieved 100\% design fidelity and 96.7\% execution reliability vs.\ 66.7\% baseline; SUS usability score 76.7 vs.\ 59.2 for Choregraphe + \item Architected modular robot plugins, WebSocket teleoperation, comprehensive experiment logging, and RESTful ROS integration for NAO, Pepper, and custom robots \end{itemize} +\textit{O'Connor, S. \& Perrone, L.F.}, ``A Web-Based Wizard-of-Oz Platform for Collaborative and Reproducible HRI Research,'' IEEE RO-MAN 2025.\\ +\textit{O'Connor, S. \& Perrone, L.F.}, ``HRIStudio: A Framework for Wizard-of-Oz Experiments in HRI Studies,'' IEEE RO-MAN 2024. \resumesection{Professional Experience} +\textscbf{Hadlock technologies LLC} \hfill \textscbf{New York} +\textbf{Founder \& Software Engineer} \hfill \textbf{2026 – Present} +\begin{itemize}[noitemsep,topsep=2pt] + \item Founded Hadlock technologies LLC and built RaceTix, a digital ticketing platform integrating Shopify with signed, idempotent webhooks for automated ticket issuance and QR-code fulfillment + \item Developed real-time scanning and redemption workflows with event validation, partial redemption, role-based permissions, and append-only audit logging +\end{itemize} \textscbf{Riverhead Raceway} \hfill \textscbf{Riverhead, NY} - -\textbf{Software Developer} \hfill \textbf{Oct 2020 – May 2026} +\textbf{Software Developer} \hfill \textbf{Oct 2020 – Present} \begin{itemize}[noitemsep,topsep=2pt] - \item Architected and deployed full-stack real-time statistics platform serving 1500+ concurrent users and 250k+ monthly visitors using Next.js, TypeScript, PostgreSQL, and Docker - \item Designed and implemented RESTful APIs for mobile applications and third-party integrations, processing 10M+ API requests monthly - \item Built automated CI/CD pipelines with GitHub Actions and monitoring systems, maintaining 99.9\% uptime across racing season + \item Architected and deployed RaceHub, a Next.js/TypeScript/PostgreSQL production platform serving 1,500+ concurrent users and 250k+ monthly visitors + \item Designed APIs processing 10M+ requests monthly and built Docker/GitHub Actions CI/CD, monitoring, and automated operations maintaining 99.9\% uptime during racing season \end{itemize} \textscbf{Bucknell University} \hfill \textscbf{Lewisburg, PA} - \textbf{Teaching Assistant – Software Engineering \& Engineering Design} \hfill \textbf{Aug 2023 – May 2026} \begin{itemize}[noitemsep,topsep=2pt] - \item Mentored 150+ students across software engineering, design patterns, and embedded systems (Arduino, microcontrollers) - \item Developed automated testing frameworks and grading tools, improving learning outcomes while streamlining assessment processes + \item Mentored 150+ students in software engineering, design patterns, and embedded systems; developed automated testing and grading tools \end{itemize} -\resumesection{Selected Projects} - -\textbf{HRIStudio Research Platform} \hfill \textbf{Next.js/TypeScript/ROS} +\resumesection{Selected Engineering Projects} +\textbf{Computer System from Scratch – Nand2Tetris} \hfill \textbf{HDL/Assembly/Java} \begin{itemize}[noitemsep,topsep=2pt] - \item Full-stack web application for managing HRI experiments with WebSocket robot control, role-based access, and comprehensive data logging for reproducibility + \item Built a complete computer from NAND gates through OS: designed ALU, CPU, and memory and implemented an assembler, VM translator, compiler, and operating system \end{itemize} - -\textbf{Autonomous Vehicle Control – Chem-E-Car Competition} \hfill \textbf{C++/Arduino} +\textbf{Autonomous Vehicle Control – Chem-E-Car} \hfill \textbf{C++/Arduino} \begin{itemize}[noitemsep,topsep=2pt] - \item Led 15-member team; implemented embedded control system with real-time sensor fusion achieving \textpm10cm precision at AIChE National Competition (2nd place, 2024) + \item Led a 15-member interdisciplinary team; implemented finite-state embedded control and real-time sensor integration achieving \textpm10cm distance precision in AIChE competition \end{itemize} -% Technical Skills \input{shared/sections/skills-resume} - \end{document}