-
Notifications
You must be signed in to change notification settings - Fork 0
/
more.html
347 lines (342 loc) · 17.1 KB
/
more.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
---
layout: default
title: More
---
<!-- Timeline component referenced from: https://codepen.io/alvarotrigo/pen/ExwYyNW -->
<!DOCTYPE html>
<html>
<head>
<title>More</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style type="text/css" media="screen">
@import url('https://fonts.googleapis.com/css2?family=Poppins&display=swap');
*, html,body{
padding:0px;
margin:0px;
box-sizing:border-box;
perspective:800px;
}
body{
background-color:#227093;
width:100%;
min-height:100vh;
display:flex;
justify-content:center;
align-items:center;
}
.timeline{
width:800px;
background-color:#072736;
color:#fff;
padding:30px 20px;
box-shadow:0px 0px 10px rgba(0,0,0,.5);
}
.timeline ul{
list-style-type:none;
border-left:2px solid #094a68;
padding:10px 5px;
}
.timeline ul li{
padding:20px 20px;
position:relative;
cursor:pointer;
transition:.5s;
}
.timeline ul li span{
display:inline-block;
background-color:#1685b8;
border-radius:25px;
padding:2px 5px;
font-size:15px;
text-align:center;
}
.timeline ul li .content h3{
color:#34ace0;
font-size:17px;
padding-top:5px;
}
.timeline ul li .content p{
padding:5px 0px 15px 0px;
font-size:15px;
}
.timeline ul li:before{
position:absolute;
content:'';
width:10px;
height:10px;
background-color:#34ace0;
border-radius:50%;
left:-11px;
top:28px;
transition:.5s;
}
.timeline ul li:hover{
background-color:#071f2a;
}
.timeline ul li:hover:before{
background-color:#0F0;
box-shadow:0px 0px 10px 2px #0F0;
}
@media (max-width:300px){
.timeline{
width:100%;
padding:30px 5px 30px 10px;
}
.timeline ul li .content h3{
color:#34ace0;
font-size:15px;
}
}
.profile {
text-align: center;
}
.headshot {
border-radius: 50%;
width: 30%;
height: auto;
}
</style>
</head>
<body>
<div class="timeline">
<div class="profile">
<!-- <img class="headshot" src="https://pro2-bar-s3-cdn-cf4.myportfolio.com/032cf3e4a6a5fa83f4f76c481d658188/562e442594edc6f30bc4fa1b_rw_600.jpg?h=ad3aaffba1ac7e48d30cdfba2911ea49" alt="Profile Picture"> -->
<img class="headshot" src="https://media.licdn.com/dms/image/v2/D5603AQFdxh2pzAQgYA/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1724884755496?e=1730332800&v=beta&t=keKuWagn8oZ7b_0u-Y1zDNy9SPuiZkaoOuYoyB_NkZg" alt="Profile Picture">
<h2>Drew Yang</h2>
<div>DevOps Engineer</div>
<div><a href="https://www.linkedin.com/in/drewyang/">LinkedIn</a> | <a href="https://github.com/yambottle">Github</a></div>
</div>
<br>
<div>
<p></p>
</div>
<br>
<div>
<div>- <b>Programming Languages: </b>Python, bash, SQL, powershell, Java, R, HTML/CSS, JavaScript, C/C++</div>
<div>- <b>Continuous Integration/Deployment: </b>Github Actions, Azure DevOps, Jenkins, ArgoCD</div>
<div>- <b>Infrastructure as Code: </b>AWS, Azure, Terraform, Packer, Ansible</div>
<div>- <b>Configuration Management: </b>cloud-init, SaltStack</div>
<div>- <b>Containerization: </b>Docker, Podman, Kubernetes(kOps, kubectl, helm), Dev Container</div>
<div>- <b>Monitoring: </b>OpenTelemetry, CloudWatch, Datadog, Grafana</div>
<div>- <b>Workflow Orchestration: </b>Flyte, MLflow, Airflow</div>
</div>
<br>
<ul>
<li>
<span>July 2021 - Present</span>
<div id="datajoint" class="content">
<h3>Software Engineer(DevOps) - DataJoint</h3>
<div>
Company's [<a href="https://github.com/datajoint">Open-source Github</a>] and [<a href="https://datajoint.com/works">Commercialized Product</a>]
</div>
<div>
<b class="italic-text">* AWS:</b> Administrated DataJoint's AWS account and several other customers' AWS accounts. Configured <b>VPC</b>, <b>Subnet</b>, <b>Security Groups</b>, <b>IAM</b> role and policies, <b>S3</b> lifecycle management, <b>EFS</b> access point, <b>EC2</b> instances, <b>RDS</b> instances, <b>Lambda</b> triggered by <b>SQS</b> or <b>EventBridge</b>, <b>SNS</b> and <b>SES</b>, <b>CloudWatch</b> metrics and alarms, <b>Route 53</b> DNS records, <b>Secrets Manager</b> for deployment secrets.
</div>
<div>
<b class="italic-text">* CI/CD: </b> Developed generic <b>Github Actions</b> reusable workflows used by <b>30+</b> repositories followed by <a href="https://www.conventionalcommits.org/en/v1.0.0/">Conventional Commits</a>, <a href="https://learn.microsoft.com/en-us/devops/develop/how-microsoft-develops-devops">Release Flow</a> and <a href="https://opengitops.dev/">GitOps</a> best practices, to automate build, test, release, publish private or open-source <b>Python</b> packages[<a href="https://pypi.org/search/?q=datajoint">PyPI</a>] or deploy <b>Docker</b> images[<a href="https://hub.docker.com/u/datajoint">Dockerhub</a>].
</div>
<div>
<b class="italic-text">* Kubernetes: </b> Provisioned Kubernetes clusters hosted on EC2 instances for development, staging and production environments using <b>k3d or kOps</b>. Developed utility <b>bash</b> scripts with <b>helm</b> and <b>kubectl</b> to manage Kubernetes clusters more efficiently, including configuring <b>Nginx ingress</b> controller, cert manager with <b>Let's encrypt</b> issuer, <b>Cillium</b> Container Network Interface(CNI), IAM Roles for Service Account(<b>IRSA</b>), <b>Cluster Autoscaler</b>, AWS Elastic Load Balancer(<b>ELB</b>) or deploying applications like Percona XtraDB Clusters, Keycloak, JupyterHub, Flask and ReactJS based web application, etc.
</div>
<div>
<b class="italic-text">* Ephemeral Worker Clusters: </b> Designed and developed a worker lifecycle manager using Python within one month to fulfill an <b>urgent</b> business requirement. This development <b>polls</b> jobs from a MySQL database, then provisions and configures ephemeral EC2 instances by <b>Packer(pre-build AMI), Terraform and cloud-init</b> to compute jobs <b>at scale</b>; implemented AWS S3 mount to significantly reduce raw data downloading <b>overhead</b> and added EFS as a file cache for intermediate steps to improve computation <b>failover</b>; configured <b>NVIDIA CUDA toolkit</b> and <b>NVIDIA container runtime</b> for <b>GPU</b> workers.
</div>
<div>
<b class="italic-text">* Platform Automation: </b> To provision or terminate AWS resources using <b>boto3</b> or <b>Terraform</b>; manage customers' <b>RBAC</b> permissions using Keycloak and Github REST API; generating usage and billing report with <b>AWS S3 Inventory</b> report, <b>AWS CloudTrail</b> and <b>AWS Cost and Usage</b> report, made a <b>Plotly Dash</b> to analyze cost and usage efficiency.
</div>
<div>
<b class="italic-text">* Jupyterhub: </b> Configured and maintained Jupyterhub deployment on a Kubernetes cluster with <b>Node Affinity</b> to assign pods onto different nodes by requirements and <b>Cluster Autoscaler</b> along with <b>AWS Auto Scaling Group</b> to accommodate <b>100+</b> active users; improved base images' <b>build time</b> and maintenance <b>overhead</b>.
</div>
<div>
<b class="italic-text">* Observability:</b> Implemented a small part of the metrics and alerts using <b>AWS CloudWatch</b>, and then later integrated <b>Datadog</b> for Kubernetes clusters' and ephemeral EC2 instances' metrics and logging through <b>OpenTelemetry</b> protocol, synthetic API testing, and UI/UX monitoring.
</div>
<div>
<b class="italic-text">* Security:</b> Set up codebase <b>vulnerability</b> scan with FOSSA; Set up <b>AWS Secrets Manager</b> working with <b>External Secret Store Operator</b> to secure Kubernetes secrets; Deployed and administrated self-hosted <b>Keycloak</b> for <b>RABC</b> authentication, further integrated it with <b>AWS IAM</b> as an <b>identity provider</b> to access AWS resources through <b>STS</b>, enabled OpenID Connect(<b>OIDC</b>) authentication flows such as authorization code flow, client credential flow, password grant flow etc.
</div>
<div>
<b class="italic-text">* MySQL Database:</b> Maintained a self-hosted <b>Percona XtraDB Clusters</b> on database <b>daily backup</b> stored on <b>S3</b>, <b>mysqldump</b> backup redundancy, Point-in-Time Recovery(<b>PITR</b>), <b>deadlock</b> detection, and slow query log.
</div>
</div>
</li>
<li>
<span>May 2019 - July 2021</span>
<div id="datavedik" class="content">
<h3>Software Engineer(MLOps) - dataVediK</h3>
<div>
Company's commercialized product [<a href="https://www.agoraiot.com/marketplace/drillvedik">DrillVedik</a>]
</div>
<div>
<b class="italic-text">* Interactive Drilling Dashboard: </b>Developed an enterprise <b>Plotly Dash</b> dashboard in collaboration with two more engineers that visualizes processed data using Bootstrap, CSS media query, <b>Redis</b> and sqlalchemy. Also, implemented a <b>socket</b> service that will notify when <b>Airflow</b> pipeline is finished processing in order to <b>synchronize</b>(refresh) the dashboard's data.
</div>
<div>
<b class="italic-text">* CI/CD Pipeline: </b>Set up several <b>Azure Pipelines</b> for continuous development, testing and continuous deployment in <b>dev, test and prod</b> stages. Additionally, made a <b>Jenkins</b> pipeline to work with on-premise infrastructures.
</div>
<div>
<b class="italic-text">* ML Pipeline: </b>Hosted a <b>MLflow</b> server for machine learning experiment logging, parameter tuning, continuous training, model management and model serving.
</div>
<div>
<b class="italic-text">* ETL Pipeline: </b>Deployed an <b>Airflow</b> server in collaboration with another data engineer, for our data ETL pipeline.
</div>
<div>
<b class="italic-text">* Prediction Task Manager: </b>Designed and developed a <b>production</b> web application in collaboration with a front-end developer that supports job queuing and parallel processing for drilling speed prediction using JavaScript, <b>flask</b>, sqlalchemy, <b>celery</b>, RabbitMQ, gunicorn, Nginx, supervisord, Docker and AWS EC2, AWS Cognito Authentication, HTTPS
</div>
<div>
<b class="italic-text">* Drilling Status Detection: </b>Developed two <b>classification</b> models in collaboration with a domain expert for detecting drilling status using Logistic Regression and Random Forest with the convenience of the MLflow server
</div>
<div>
<b class="italic-text">* Drilling Speed Prediction: </b>In collaboration with a domain expert, applied Gaussian Process <b>Regression</b> for feature synthesis based on geographical information as well as <b>feature engineering</b> based on correlation matrix and F1 score ranking, and built a non-linear regression model using LSTM RNN.
</div>
</div>
</li>
<li>
<span>May 2019</span>
<div class="content">
<h3>Graduated Master of Computer Science - Southern Methodist University</h3>
</div>
</li>
<li>
<span>Mar 2019 - May 2019</span>
<div id="blox" class="content">
<h3>Guest Promotion Management App - Android Developer @ BLOX Group</h3>
<div>
<b class="italic-text">* Company:</b> startup
</div>
<div>
<b class="italic-text">* User:</b> potential
</div>
<div>
<b class="italic-text">* Duties:</b> Implemented layouts, activities, customized widgets, screen adaption
</div>
<div>
<b class="italic-text">* Gains:</b> Git Version control, Android updated version features, more customized widgets
</div>
<div>
<b class="italic-text">* Self assessment:</b> it's good to work remotely in a professional team included designers and developers, however, I still need more understanding in an entire software development lifecycle, not just coding.
</div>
</div>
</li>
<li>
<span>Sept 2018 - Dec 2018</span>
<div class="content">
<h3>Hospitalization Data Mining - Course Project</h3>
<div>
</div>
</div>
</li>
<li>
<span>Apr 2018 - May 2018</span>
<div class="content">
<h3>Web Crawler and Search Engine - Course Project</h3>
<div>
</div>
</div>
</li>
<li>
<span>Feb 2018 - May 2019</span>
<div class="content">
<h3>Teaching Assistant - Southern Methodist University</h3>
<div>
<b class="italic-text">* Supervisor:</b> Dr. Frank Coyle
</div>
<div>
<b class="italic-text">* CSE 3342 Undergrad:</b> Programming Language
</div>
<div>
<b class="italic-text">* CSE 8/7345 Grad:</b> Advanced Application Programming
</div>
<div>
<b class="italic-text">* CSE 8/7320 Grad:</b> Artificial Intelligence
</div>
<div>
<b class="italic-text">* CSE 8/7347 Grad:</b> XML and the Enterprise
</div>
</div>
</li>
<li>
<span>Feb 2018 - Mar 2018</span>
<div class="content">
<h3>Image Classification Algorithm Analysis - Course Project</h3>
</div>
</li>
<li>
<span>Nov 2017 - Jan 2018</span>
<div class="content">
<h3>Wireless Sensor Network Modeling - Course Project</h3>
</div>
</li>
<li>
<span>Aug 2017</span>
<div class="content">
<h3>Started Master of Computer Science - Southern Methodist University</h3>
</div>
</li>
<li>
<span>May 2017</span>
<div class="content">
<h3>Graduated Bachelor of Software Engineering - Qingdao University</h3>
</div>
</li>
<li>
<span>Feb 2017 - Sept 2017</span>
<div id="construction" class="content">
<h3>Road Construction Management App - Android Developer @ City Construction Company</h3>
<div>
<b class="italic-text">* Company:</b> The largest public construction company in my hometown Qingdao with 91 million dollars total assets
</div>
<div>
<b class="italic-text">* Users:</b> 10+ construction teams and supervisors
</div>
<div>
<b class="italic-text">* Functions:</b> Draw lines or marks and pin icons of machine or labor on a 2D map API(Baidu Map API); update each operation and status of machine or labor then calculate and report daily cost in analytic plots; with different four types of permissions accessing individually
</div>
<div>
<b class="italic-text">* Duties:</b> Implemented layouts, activities, customized widgets, screen adaption, data synchronization and HTTP request/respond between server and users based on Java
</div>
<div>
<b class="italic-text">* Gains:</b> SVN Version control, How to customize widget, UML is important, Debugging and testing, Prototype Demo Tool is a saver to know client's demand better, code/material reusability, comment is important
</div>
<div>
<b class="italic-text">* Self assessment:</b> Fresh try in Android after academic classes, having fun and learning stuffs. Switching between Google and coding all the time, however make it work finally anyway. It doesn't look professionally pretty in graphic, but it works functionally well and indeed saves money for the company
</div>
</div>
</li>
<li>
<span>2016</span>
<div class="content">
<h3>Preparing TOFEL and GRE to study in the US</h3>
</div>
</li>
<li>
<span>Oct 2015</span>
<div class="content">
<h3>Won 1st Place Cash Prize of Hackthon - Sponsored School Event</h3>
</div>
</li>
<li>
<span>May 2015 - May 2016</span>
<div class="content">
<h3>Remote Sensing Image Processing for City Planning - Lab Collaboration</h3>
</div>
</li>
<li>
<span>Apr 2015</span>
<div class="content">
<h3>Won 2nd Place of Coding Challenge - National Coding Challenge</h3>
</div>
</li>
<li>
<span>May 2014 - May 2015</span>
<div class="content">
<h3>Remote Sensing Image Processing for Coastline Extraction - Lab Collaboration</h3>
</div>
</li>
<li>
<span>Aug 2013</span>
<div class="content">
<h3>Started Bachelor of Software Engineering - Qingdao University</h3>
</div>
</li>
</ul>
</div>
</body>
</html>