Writing and Video Portfolio

TLDR

Robert Terakedis -- Turning Tech Chaos into Organized Harmony.

What I Do

I'm a passionate technologist with a knack for streamlining operations. I thrive on automating manual tasks, eliminating process debt, and building intuitive documentation that empowers teams and enhances supportability. I'm a strong believer in continuous improvement and collaboration, and I'm always eager to find innovative solutions to complex challenges.

My Toolkit

My documentation and video toolkit has spanned several different software titles over the years:

  • Git Repos: GitHub | Bitbucket
  • Git Clients: Tower | SourceTree | VS Code
  • Productivity: Google Workspace | Office 365
  • Developer Tools: VS Code | BBEdit | Postman | Chrome Developer Tools
  • Documentation & Training: Camtasia | SnagIt | Markdown | Hugo | Confluence | Readme.com
  • Task Management: Jira | Jira Service Manager | Trello | Microsoft Planner
  • Diagramming: Miro | LucidChart | Draw.io | Visio
  • Work OS: Apple iPadOS and macOS (preferred) | Windows 10/11 and ChromeOS (experienced)

This site uses the following technologies: Cloudflare (Websites, Analytics, Pages), Github, Hugo, Markdown, and the Hugo Clarity theme.

Writing Samples

About Public Content Below

Note that some of the content below was written by me but owned by another organization, and may be removed at any point in time. Additionally, much of the content I created at VMware has been removed due to the Broadcom/KKR transition.

Category Document The Problem The Solution
Hands-On Lab Getting Started with Digital Workspace Prospects and Customers new to Workspace ONE needed to quickly onboard with the unified endpoint mananagement (UEM) skills necessary to manage end-user devices. I designed and authored this lab's Apple iOS (Module 2) and macOS (Module 3) sections. In addition to the initial source, I maintained these modules every 6 months as the backing SaaS environment adopted new features.
Troubleshooting Troubleshooting macOS Management At the time, there was a significant skills gap in the Sales organization with regards to macOS Troubleshooting. I also noted a significant number of folks new to the macOS community with a background in Windows management that were new to macOS management (as organizations adopted device choice). This comprehensive troubleshooting document served as a tutorial to troubleshoot Workspace ONE functionality on macOS. I was responsible for the first three iterations of this guide. I wrote this content in ScreenSteps based on my own testing and research.
Tutorial Managing iOS Updates A number of customers were confused by the expected behavior when applying iOS Updates. I authored this tutorial to clarify the configuration process and expected behaviors for a Workspace ONE UEM feature (iOS Update Management) across multiple versions of iOS.
Glossary Mapping concepts from Munki to Workspace ONE UEM I was receiving numerous questions from the macOS community about a recently-released integration between Workspace ONE UEM and Munki. This content didn't fit the content strategy within our technical marketing site, but I knew it would be valuable to the macOS community. This glossary page linked the Workspace ONE equivalents to the Munki terminology many of the macOS community knew.
Best Practices Best Practices for Apple Admins in Workspace ONE UEM After reading a blog article about the loss of a system administrator, I realized that very little had been documented about survivability of Apple device management. This guide shows prospective Apple Administrators how to set their environments up for survivability of the unexpected (layoffs, catastrophic accident, etc).

More Writing Samples

For additional reference, I've included links to some additional documents that I've authored and/or contributed below:

Code Sample

I strive to find repeatable processes and automate them. At one employer, I created multiple product satisfaction surveys in Gainsight PX. I wrote a script to combine the responses from all the surveys into a single CSV file (that also integrated additional information about the respondents and the accounts to which they belong). In the snippet below, I use Python to aggregate the responses from a single survey in Gainsight PX. I subsequently posted this Github Gist to the Gainsight PX Community to assist others in learning how to leverage the scrollID to return multiple pages of data from the API. The full version of this script included additional helper functions for the additional API's (account/user info), multi-threading, and recursion (aggregating responses from multiple API calls).

 1# Example Gainsight Paging API Call
 2
 3##############################################################################
 4# Reference API documentation:
 5# https://gainsightpx.docs.apiary.io/#reference/surveyresponse
 6#
 7# Use the returned scrollId to make a request for the next page of results (i.e. /users?pageSize=100&scrollId=XXXXXXX)
 8# Scroll until the returned result list is less than the requested size. Do not depend on the scrollId becoming null,
 9# in some cases it does not be null even though the last page of results is returned.
10##############################################################################
11
12
13import json, requests, sys
14from datetime import datetime, timedelta, date
15
16##############################################################################
17## CONSTANTS
18##############################################################################
19
20# BaseURL for API calls
21BASE_URL = "BASE-URL-HERE"
22# API Key Name
23API_KEY_NAME = "X-APTRINSIC-API-KEY"
24# API Key Value
25API_KEY_VALUE = "GUID-HERE"
26# API Page Size
27API_PAGE_SIZE = 100
28# Survey Engagement ID
29ENGAGEMENT_ID = "ENGAGEMENT-ID-HERE"
30
31
32##############################################################################
33## HELPER FUNCTION
34##############################################################################
35
36# create a function to get the list of survey responses for a specific survey
37def get_surveyresponsesapi(engagementId, scrollId, datefiltertimestamp):
38
39    if scrollId == "":
40        # Set the request url for the first page of results
41        if datefiltertimestamp == "":
42
43            url = BASE_URL + "/v1/survey/responses?filter=engagementId=="+ engagementId + "&pageSize=" + str(API_PAGE_SIZE) + "&sort=-date"
44
45        else:
46
47            url = BASE_URL + "/v1/survey/responses?filter=engagementId=="+ engagementId + ";date>" + str(datefiltertimestamp) + "&pageSize=" + str(API_PAGE_SIZE) + "&sort=-date"
48
49    else:
50        # Set the request url for the subsequent pages of results
51        url = BASE_URL + "/v1/survey/responses?filter=engagementId=="+ engagementId + "&pageSize=" + str(API_PAGE_SIZE) + "&sort=-date" + "&scrollId=" + scrollId
52
53    payload={}
54    headers = {
55    'Accept': 'application/json',
56    API_KEY_NAME: API_KEY_VALUE
57    }
58
59    # Make the API call
60    return requests.request("GET", url, headers=headers, data=payload)

See more of this code at my Gist