it's full of stars...
This commit is contained in:
parent
b2ff9ecce9
commit
247dba5374
@ -1,4 +0,0 @@
|
||||
Charles N Wyble
|
||||
=====
|
||||
|
||||
Senior (**Staff level**) **System Engineer/SRE/Architect** with extensive Linux/Windows/Networking/Cyber security background and experience
|
@ -1,6 +0,0 @@
|
||||
Charles N Wyble
|
||||
=====
|
||||
|
||||
Senior (**Staff level**) **System Engineer/SRE/Architect** with extensive Linux/Windows/Networking/Cyber security background and experience
|
||||
|
||||
[ [Github Profile](https://github.com/reachableceo) ] . [ [Linkedin Profile](https://www.linkedin.com/in/charles-wyble-412007337) ] . [ reachableceo@reachableceo.com ] . [ 818 280 7059 ] . [ Austin TX / Raleigh NC / Remote ]
|
4
Templates/ContactInfo/ContactInfo-ClientSubmit.md
Normal file
4
Templates/ContactInfo/ContactInfo-ClientSubmit.md
Normal file
@ -0,0 +1,4 @@
|
||||
{{CandidateName}}
|
||||
=====
|
||||
|
||||
{{CandidateOneLinerSummary}}
|
6
Templates/ContactInfo/ContactInfo-JobBoard.md
Normal file
6
Templates/ContactInfo/ContactInfo-JobBoard.md
Normal file
@ -0,0 +1,6 @@
|
||||
{{CandidateName}}
|
||||
=====
|
||||
|
||||
{{CandidateOneLinerSummary}}
|
||||
|
||||
[ [Github Profile]({{CandidateGithub}}) ] . [ [Linkedin Profile]({{CandidateLinkedin}}) ] . [ {{CandidateEmail}} ] . [ {{CandidatePhone}} ] . [ {{CandidateLocation}} ]
|
3
Templates/JobHistoryDetails/job1.md
Normal file
3
Templates/JobHistoryDetails/job1.md
Normal file
@ -0,0 +1,3 @@
|
||||
- Stuff
|
||||
- Things
|
||||
- Amazing project!
|
3
Templates/JobHistoryDetails/job2.md
Normal file
3
Templates/JobHistoryDetails/job2.md
Normal file
@ -0,0 +1,3 @@
|
||||
- Stuff
|
||||
- Things
|
||||
- Amazing project!
|
@ -1,11 +1,2 @@
|
||||
- Developed and implemented a process to switch thousands of desktops providing digital signage functionality from Fedora to Debian in a completely automated fashion using a custom initrd.
|
||||
- Developed and implemented an internal private cloud orchestration and provisioning system for a hardware development engineering team that handled the entire provisioning lifecycle for physical and virtual systems.
|
||||
- Developed and implemented standardized language and procedures and incident investigation automation for a large technical support organization with high turnover.
|
||||
- Developed and implemented an automated order status and payment handling interactive voice response application using Angel.ccm with a backend web service returning Voice XML. This allows call center personnel to focus on revenue generating opportunities instead of administrative matters.
|
||||
- Provided technician support to a team of electrical engineers building the power system for the radar of FrankenSAM in Ukraine. Handled high / low voltage wiring and plumbing and documentation of those systems.
|
||||
- Provided root cause analysis , mitigation and remediation of security breaches by advanced persistent threat actors at high value targets.
|
||||
- Project managed a successful brand new data center build from bare dirt to serving content in 86 days. Oversaw 8 billion dollars of capital deployment.
|
||||
- Led and consulted tier 1 payment compliance industry (PCI) implementations for some of the worlds largest brands (including at a payment processor).
|
||||
- Rolled out centralized Active Directory authentication, deployed Dell OpenManage, and upgraded network equipment.
|
||||
- Deployed password vault, Active Directory PKI, and implemented a ground-up network redesign.
|
||||
- Designed VmWare NSX network.
|
||||
- Cool project 1.
|
||||
- cool project 2.
|
||||
|
@ -1,20 +1,2 @@
|
||||
Linux|22 years|RHEL,Debian,Ubuntu,kickstart,PXE, LDAP,SSSD,RPM/Deb package creation, quotas,extended permissions, clustering,NFS,Samba
|
||||
Unix|5 years|HPUX/Solaris
|
||||
Windows|22 years|Server (2008 2016),Windows client automated deployment (7,8,10,11),Active Directory,Group Policy,WSUS,Certificate Services,AD DNS,AD DHCP,complex multiple forest and domain setups
|
||||
Free/Libre/Open Source software|22 years|Apache,Postfix,Qmail,Dovecot,Courier IMAP,Nginx,Matamo,Discourse,Wordpress, Mautic,Dolibarr,Revive Ad Server,Firefly,Cloudron,Coolify,Gitea, HomeAssistant, Jenkins,Rundeck,N8N, LetsEncrypt,ACME,cfssl
|
||||
Databases|22 years| MySQL,PostgreSQL, Dbeaver,PHPMyAdmin,PostGIS
|
||||
Cyber Security|22 years|PCI Compliance (tier 1 implementations),OpenVAS<,Lynis,security hardening,audits,breach response and mitigation, patch and vulnerability management. AppArmor, SeLinux, Centrify, Tripwire, Integrit, OSSEC
|
||||
Virtualization|22 years|VmWare,Parallels,HyperV,KVM,Xen
|
||||
Networking|22 years|Linux Virtual Server(LVS),HAProxy,Ubiquiti Unifi,Opnsense,Pfsense,DNS,DHCP,IPAM,PXE,IPS,IDS,GRE,IPSEC.Wireguard,OpenVPN,Nebula,Tailscale,RADIUS. Mostly layer2 data center/campus/access some WAN,firewall,layer3
|
||||
Monitoring|22 years|Uptime Kuma,Librenms,Zabbix,Zenoss,Nagios,Elasticsearch,Logstash,Kibana(ELK)
|
||||
Storage|22 years|Netapp,EMC,EqualLogic,3par,MSA,TrueNAS/ZFS,iscsi,S3,Azure Storage
|
||||
Cloud|5 years|AWS,Azure,Kubernetes,Helm,Docker
|
||||
Containerization|15 years|LXC,Docker,OpenVZ
|
||||
Configuration management/InfrastructureAsCode(IAC)|22 years|FetchApply,Terraform/OpenTOfU,Ansible,AWX,Hashicorp Packer/Vault
|
||||
Ticket / incident / project management| 22 years| Jira,ServiceNow,Redmine,RT
|
||||
Git|15 years|Branching,merging,multiple teams,external vendors,submodules
|
||||
SRE|5 years| Grafana,Prometheus,Signoz,Wazuh
|
||||
LLM|2 years|OpenWebUI,QA/validation,RAG,data cleaning/prep
|
||||
Programming|5 years|J2ME,PHP,Ruby,TCL/TK,Java,C,C++
|
||||
Automation|22 years|Bash,YAML,TOML,PowerShell,Perl
|
||||
Embedded development|5 years|Raspberry pi,arduino,seeduino,Lego Mindstorms
|
||||
skill1|1 years|skill,1,details,and,stuff
|
||||
skill2|2 years|skill2,2,details,and,stuff,and,things
|
|
@ -1,11 +1,2 @@
|
||||
CDK Global,Senior System Engineer,July 2024 - October 2024
|
||||
Apple Computer,Senior System Administrator,March 2024 - July 2024
|
||||
SHEIN,Staff Site Reliability Engineer,December 2022 - August 2023
|
||||
3M,Senior Site Reliability Engineer,March 2020 - November 2022
|
||||
TippingPoint,Staff System Architect,March 2012 - June 2019
|
||||
HostGator.com,Automation and Escalation Engineer,March 2011 - May 2012
|
||||
RippleTV,System Engineer,October 2008 - January 2010
|
||||
Walt Disney Internet Group,Site Reliability Engineer,August 2006 - September 2007
|
||||
Electronic Clearing House,Senior System Administrator,April 2005 - July 2006
|
||||
GSI Commerce,System Administrator,March 2002 - February 2005
|
||||
ReachableCEO Enterprises,Freelancer,January 2001 - December 2024
|
||||
job1,Title of job 1,January 1 1970 - January 6 1980
|
||||
job2,Title of Job 2,January 1 1970 - January 6 1980
|
|
BIN
build-output/client-submission/Resume.doc
Normal file
BIN
build-output/client-submission/Resume.doc
Normal file
Binary file not shown.
30
build-output/client-submission/Resume.md
Normal file
30
build-output/client-submission/Resume.md
Normal file
@ -0,0 +1,30 @@
|
||||
First Middle Last
|
||||
=====
|
||||
|
||||
|
||||
|
||||
## Career Highlights
|
||||
- Cool project 1.
|
||||
- cool project 2.
|
||||
\pagebreak
|
||||
|
||||
## Employment History
|
||||
|
||||
**job1 | Title of job 1 | January 1 1970 - January 6 1980**
|
||||
|
||||
- Stuff
|
||||
- Things
|
||||
- Amazing project!
|
||||
**job2 | Title of Job 2 | January 1 1970 - January 6 1980**
|
||||
|
||||
- Stuff
|
||||
- Things
|
||||
- Amazing project!
|
||||
\pagebreak
|
||||
|
||||
## Skills
|
||||
|
||||
|Skill|Experience|Skill Details|
|
||||
|---|---|---|
|
||||
|**skill1**|1 years|skill,1,details,and,stuff|
|
||||
|**skill2**|2 years|skill2,2,details,and,stuff,and,things|
|
BIN
build-output/client-submission/Resume.pdf
Normal file
BIN
build-output/client-submission/Resume.pdf
Normal file
Binary file not shown.
BIN
build-output/job-board/Resume.doc
Normal file
BIN
build-output/job-board/Resume.doc
Normal file
Binary file not shown.
36
build-output/job-board/Resume.md
Normal file
36
build-output/job-board/Resume.md
Normal file
@ -0,0 +1,36 @@
|
||||
First Middle Last
|
||||
=====
|
||||
|
||||
|
||||
|
||||
[ [Github Profile](github.com) ] . [ [Linkedin Profile](linkedin.com) ] . [ candidate@domain.com ] . [ 1 123 456 7890 ] . [ Place 1/Place 2 ]
|
||||
|
||||
## Career Highlights
|
||||
- Cool project 1.
|
||||
- cool project 2.
|
||||
\pagebreak
|
||||
|
||||
## Employment History
|
||||
|
||||
|
||||
**job1 | Title of job 1 | January 1 1970 - January 6 1980**
|
||||
|
||||
|
||||
- Stuff
|
||||
- Things
|
||||
- Amazing project!
|
||||
|
||||
**job2 | Title of Job 2 | January 1 1970 - January 6 1980**
|
||||
|
||||
|
||||
- Stuff
|
||||
- Things
|
||||
- Amazing project!
|
||||
\pagebreak
|
||||
|
||||
## Skills
|
||||
|
||||
|Skill|Experience|Skill Details|
|
||||
|---|---|---|
|
||||
|**skill1**|1 years|skill,1,details,and,stuff|
|
||||
|**skill2**|2 years|skill2,2,details,and,stuff,and,things|
|
BIN
build-output/job-board/Resume.pdf
Normal file
BIN
build-output/job-board/Resume.pdf
Normal file
Binary file not shown.
@ -4,4 +4,4 @@ header-center: "\\leftmark"
|
||||
header-right: "Page \\thepage"
|
||||
footer-left: "First Middle Last"
|
||||
urlcolor: blue
|
||||
page-background: "../vendor/git.knownelement.com/ExternalVendorCode/pandoc-latex-template/examples/page-background/backgrounds"
|
||||
page-background: "../vendor/git.knownelement.com/ExternalVendorCode/pandoc-latex-template/examples/page-background/backgrounds/background3.pdf"
|
4
build-temp/ContactInfo-ClientSubmit.md
Normal file
4
build-temp/ContactInfo-ClientSubmit.md
Normal file
@ -0,0 +1,4 @@
|
||||
First Middle Last
|
||||
=====
|
||||
|
||||
|
6
build-temp/ContactInfo-JobBoard.md
Normal file
6
build-temp/ContactInfo-JobBoard.md
Normal file
@ -0,0 +1,6 @@
|
||||
First Middle Last
|
||||
=====
|
||||
|
||||
|
||||
|
||||
[ [Github Profile](github.com) ] . [ [Linkedin Profile](linkedin.com) ] . [ candidate@domain.com ] . [ 1 123 456 7890 ] . [ Place 1/Place 2 ]
|
@ -7,6 +7,6 @@ header-center: "\\leftmark"
|
||||
header-right: "Page \\thepage"
|
||||
footer-left: "First Middle Last"
|
||||
footer-center: "Your.Tagline.Here."
|
||||
footer-right: "[Source code for this resume](https://github.com/reachableceo)"
|
||||
footer-right: "[Source code for this resume](https://git.knownelement.com/reachableceo/MarkdownResume-Pipeline)"
|
||||
urlcolor: blue
|
||||
page-background: "../vendor/git.knownelement.com/ExternalVendorCode/pandoc-latex-template/examples/page-background/backgrounds"
|
||||
page-background: "../vendor/git.knownelement.com/ExternalVendorCode/pandoc-latex-template/examples/page-background/backgrounds/background3.pdf"
|
@ -1,25 +1,191 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
#source "$(dirname "${BASH_SOURCE[0]}")/bash3boilerplate.sh"
|
||||
|
||||
# Setup globals
|
||||
#readonly BUILD_OUTPUT_DIR="../build-output"
|
||||
readonly BUILD_TEMP_DIR="../build-temp"
|
||||
readonly BUILDYAML_JOBBOARD="$BUILD_TEMP_DIR/JobBoard.yml"
|
||||
readonly BUILDYAML_CLIENTSUBMISSION="$BUILD_TEMP_DIR/ClientSubmission.yml"
|
||||
|
||||
#TODO make this work. For now, editing this script and setting the below export lines is required.
|
||||
#source ./ResumeVariables.env
|
||||
|
||||
export CandidateName="First Middle Last"
|
||||
export CandidatePhone="1 123 456 7890"
|
||||
export CandidateLocation="Place 1/Place 2"
|
||||
export CandidateEmail="candidate@domain.com"
|
||||
export CandidateOneLineSummary="Super awesome and stuff."
|
||||
export CandidateLinkedin="linkedin.com"
|
||||
export CandidateGithub="github.com"
|
||||
export CandidateLogo=""
|
||||
export CandidateTagline="Your.Tagline.Here."
|
||||
export ResumeSourceCode="https://git.knownelement.com/reachableceo/MarkdownResume-Pipeline"
|
||||
export URLCOLOR="blue"
|
||||
export PAGEBACKGROUND="../vendor/git.knownelement.com/ExternalVendorCode/pandoc-latex-template/examples/page-background/backgrounds"
|
||||
export PAGEBACKGROUND="../vendor/git.knownelement.com/ExternalVendorCode/pandoc-latex-template/examples/page-background/backgrounds/background3.pdf"
|
||||
|
||||
####################################################
|
||||
#DO NOT CHANGE ANYTHING BELOW THIS LINE
|
||||
####################################################
|
||||
|
||||
# shellcheck disable=SC1091
|
||||
#source "$(dirname "${BASH_SOURCE[0]}")/bash3boilerplate.sh"
|
||||
|
||||
############################################################
|
||||
# Setup globals
|
||||
############################################################
|
||||
|
||||
readonly BUILD_OUTPUT_DIR="../build-output"
|
||||
readonly BUILD_TEMP_DIR="../build-temp"
|
||||
readonly BUILDYAML_JOBBOARD="$BUILD_TEMP_DIR/JobBoard.yml"
|
||||
readonly BUILDYAML_CLIENTSUBMISSION="$BUILD_TEMP_DIR/ClientSubmission.yml"
|
||||
|
||||
echo "Cleaning up from previous runs..."
|
||||
|
||||
JobBoardMarkdownOutputFile="$BUILD_OUTPUT_DIR/job-board/Resume.md"
|
||||
JobBoardPDFOutputFile="$BUILD_OUTPUT_DIR/job-board/Resume.pdf"
|
||||
JobBoardMSWordOutputFile="$BUILD_OUTPUT_DIR/job-board/Resume.doc"
|
||||
|
||||
ClientSubmissionMarkdownOutputFile="$BUILD_OUTPUT_DIR/client-submission/Resume.md"
|
||||
ClientSubmissionPDFOutputFile="$BUILD_OUTPUT_DIR/client-submission//Resume.pdf"
|
||||
ClientSubmissionMSWordOutputFile="$BUILD_OUTPUT_DIR/client-submission/Resume.doc"
|
||||
|
||||
rm $BUILDYAML_JOBBOARD
|
||||
rm $JobBoardMarkdownOutputFile
|
||||
rm $JobBoardPDFOutputFile
|
||||
rm $JobBoardMSWordOutputFile
|
||||
|
||||
rm $BUILDYAML_CLIENTSUBMISSION
|
||||
rm $ClientSubmissionMarkdownOutputFile
|
||||
rm $ClientSubmissionPDFOutputFile
|
||||
rm $ClientSubmissionMSWordOutputFile
|
||||
|
||||
# Expand variables into rendered YAML files. These will be used by pandoc to create the output artifacts
|
||||
|
||||
./mo ./BuildTemplate-JobBoard.yml > $BUILDYAML_JOBBOARD
|
||||
./mo ./BuildTemplate-ClientSubmission.yml > $BUILDYAML_CLIENTSUBMISSION
|
||||
|
||||
echo "Combining markdown files into single input file for pandoc..."
|
||||
|
||||
# Create contact info md file
|
||||
./mo ../Templates/ContactInfo/ContactInfo-JobBoard.md > $BUILD_TEMP_DIR/ContactInfo-JobBoard.md
|
||||
./mo ../Templates/ContactInfo/ContactInfo-ClientSubmit.md > $BUILD_TEMP_DIR/ContactInfo-ClientSubmit.md
|
||||
|
||||
#Pull in contact info
|
||||
cat $BUILD_TEMP_DIR/ContactInfo-JobBoard.md >> $JobBoardMarkdownOutputFile
|
||||
echo " " >> $JobBoardMarkdownOutputFile
|
||||
|
||||
cat $BUILD_TEMP_DIR/ContactInfo-ClientSubmit.md >> $ClientSubmissionMarkdownOutputFile
|
||||
echo " " >> $ClientSubmissionMarkdownOutputFile
|
||||
|
||||
echo "## Career Highlights" >> $JobBoardMarkdownOutputFile
|
||||
echo "## Career Highlights" >> $ClientSubmissionMarkdownOutputFile
|
||||
|
||||
cat ../Templates/SkillsAndProjects/Projects.md >> $JobBoardMarkdownOutputFile
|
||||
echo "\pagebreak" >> $JobBoardMarkdownOutputFile
|
||||
|
||||
cat ../Templates/SkillsAndProjects/Projects.md >> $ClientSubmissionMarkdownOutputFile
|
||||
echo "\pagebreak" >> $ClientSubmissionMarkdownOutputFile
|
||||
|
||||
echo " " >> $JobBoardMarkdownOutputFile
|
||||
echo "## Employment History" >> $JobBoardMarkdownOutputFile
|
||||
echo " " >> $JobBoardMarkdownOutputFile
|
||||
|
||||
echo " " >> $ClientSubmissionMarkdownOutputFile
|
||||
echo "## Employment History" >> $ClientSubmissionMarkdownOutputFile
|
||||
echo " " >> $ClientSubmissionMarkdownOutputFile
|
||||
|
||||
#And here we do some magic...
|
||||
#Pull in :
|
||||
|
||||
# employer
|
||||
# title
|
||||
# start/end dates of employment
|
||||
# long form position summary data from each position
|
||||
|
||||
IFS=$'\n\t'
|
||||
for position in \
|
||||
$(cat ../Templates/WorkHistory/WorkHistory.csv); do
|
||||
|
||||
COMPANY="$(echo $position|awk -F ',' '{print $1}')"
|
||||
TITLE="$(echo $position|awk -F ',' '{print $2}')"
|
||||
DATEOFEMPLOY="$(echo $position|awk -F ',' '{print $3}')"
|
||||
|
||||
echo " " >> "$JobBoardMarkdownOutputFile"
|
||||
echo "**$COMPANY | $TITLE | $DATEOFEMPLOY**" >> $JobBoardMarkdownOutputFile
|
||||
echo " " >> "$JobBoardMarkdownOutputFile"
|
||||
|
||||
echo "**$COMPANY | $TITLE | $DATEOFEMPLOY**" >> $ClientSubmissionMarkdownOutputFile
|
||||
echo " " >> "$ClientSubmissionMarkdownOutputFile"
|
||||
|
||||
echo " " >> "$JobBoardMarkdownOutputFile"
|
||||
cat ../Templates/JobHistoryDetails/$COMPANY.md >> "$JobBoardMarkdownOutputFile"
|
||||
echo " " >> "$JobBoardMarkdownOutputFile"
|
||||
|
||||
cat ../Templates/JobHistoryDetails/$COMPANY.md >> "$ClientSubmissionMarkdownOutputFile"
|
||||
echo " " >> "$ClientSubmissionMarkdownOutputFile"
|
||||
done
|
||||
|
||||
#Pull in my skills and generate a beautiful table.
|
||||
|
||||
echo "\pagebreak" >> $JobBoardMarkdownOutputFile
|
||||
echo " " >> "$JobBoardMarkdownOutputFile"
|
||||
echo "## Skills" >> "$JobBoardMarkdownOutputFile"
|
||||
echo " " >> "$JobBoardMarkdownOutputFile"
|
||||
|
||||
echo "\pagebreak" >> $ClientSubmissionMarkdownOutputFile
|
||||
echo " " >> "$ClientSubmissionMarkdownOutputFile"
|
||||
echo "## Skills" >> "$ClientSubmissionMarkdownOutputFile"
|
||||
echo " " >> "$ClientSubmissionMarkdownOutputFile"
|
||||
|
||||
#Table heading
|
||||
echo "|Skill|Experience|Skill Details|" >> $JobBoardMarkdownOutputFile
|
||||
echo "|---|---|---|" >> $JobBoardMarkdownOutputFile
|
||||
|
||||
echo "|Skill|Experience|Skill Details|" >> $ClientSubmissionMarkdownOutputFile
|
||||
echo "|---|---|---|" >> $ClientSubmissionMarkdownOutputFile
|
||||
|
||||
#Table rows
|
||||
IFS=$'\n\t'
|
||||
for skill in \
|
||||
$(cat ../Templates/SkillsAndProjects/Skills.csv); do
|
||||
SKILL_NAME="$(echo $skill|awk -F '|' '{print $1}')"
|
||||
SKILL_YEARS="$(echo $skill|awk -F '|' '{print $2}')"
|
||||
SKILL_DETAIL="$(echo $skill|awk -F '|' '{print $3}')"
|
||||
echo "|**$SKILL_NAME**|$SKILL_YEARS|$SKILL_DETAIL|" >> $JobBoardMarkdownOutputFile
|
||||
echo "|**$SKILL_NAME**|$SKILL_YEARS|$SKILL_DETAIL|" >> $ClientSubmissionMarkdownOutputFile
|
||||
|
||||
done
|
||||
unset IFS
|
||||
|
||||
echo "Generating PDF output for job board version..."
|
||||
|
||||
pandoc \
|
||||
"$JobBoardMarkdownOutputFile" \
|
||||
--template eisvogel \
|
||||
--metadata-file="../build-temp/JobBoard.yml" \
|
||||
--from markdown \
|
||||
--to=pdf \
|
||||
--output $JobBoardPDFOutputFile
|
||||
|
||||
echo "Generating MSWord output for job board version..."
|
||||
|
||||
pandoc \
|
||||
"$JobBoardMarkdownOutputFile" \
|
||||
--metadata-file="../build-temp/JobBoard.yml" \
|
||||
--from markdown \
|
||||
--to=docx \
|
||||
--reference-doc=resume-docx-reference.docx \
|
||||
--output $JobBoardMSWordOutputFile
|
||||
|
||||
echo "Generating PDF output for client submission version..."
|
||||
|
||||
pandoc \
|
||||
"$ClientSubmissionMarkdownOutputFile" \
|
||||
--template eisvogel \
|
||||
--metadata-file="../build-temp/ClientSubmission.yml" \
|
||||
--from markdown \
|
||||
--to=pdf \
|
||||
--output $ClientSubmissionPDFOutputFile
|
||||
|
||||
echo "Generating MSWord output for client submission version..."
|
||||
|
||||
pandoc \
|
||||
"$ClientSubmissionMarkdownOutputFile" \
|
||||
--metadata-file="../build-temp/ClientSubmission.yml" \
|
||||
--from markdown \
|
||||
--to=docx \
|
||||
--reference-doc=resume-docx-reference.docx \
|
||||
--output $ClientSubmissionMSWordOutputFile
|
Loading…
Reference in New Issue
Block a user