-
Notifications
You must be signed in to change notification settings - Fork 0
/
portfolio.html
271 lines (235 loc) · 9.54 KB
/
portfolio.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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="description" content="Amy Liang's personal website" />
<meta
name="keywords"
content="amiaxys, Amy Liang, Yuqi, Portfolio, Resume, Computer Science, UTSC"
/>
<meta name="author" content="Amy Liang" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="css/style.css" />
<link
href="https://fonts.googleapis.com/css?family=Overpass"
rel="stylesheet"
type="text/css"
/>
<link
href="https://fonts.googleapis.com/css?family=Jaldi"
rel="stylesheet"
type="text/css"
/>
<title>amiaxys | Portfolio</title>
<script
data-search-pseudo-elements
src="https://kit.fontawesome.com/5d318c7757.js"
crossorigin="anonymous"
></script>
</head>
<body>
<header>
<nav class="bar">
<div class="bubble">
<a class="bar-link" href="index.html">Home</a>
</div>
<div class="bubble">
<a class="bar-link" href="resume.html">Resume</a>
</div>
<div class="bubble select">
<a class="bar-link" href="portfolio.html">Portfolio</a>
</div>
</nav>
</header>
<div class="content">
<h1>Projects & Portfolio</h1>
<hr />
<section>
<h2>Audio Visualizers</h2>
<p>
I created a
<a href="/audio-visualizer">simple audio visualizer</a> created to
test Web Audio API functionality with multiple choices of 2D graphics.
</p>
<p>
Using the experience I gained from the first audio visualizer, I
developed an
<a href="https://github.com/amiaxys/project-c01-dropouts"
>augmented reality audio visualizer</a
>
with more detailed options to configure a specific 3D visualization,
user login and more.
</p>
<p>
In the video below is the the prototype, but the features have not
changed much.
</p>
<iframe
width="560"
height="315"
src="https://www.youtube.com/embed/NE4l6bfglJc?si=G4-hv3vnpHubw2He"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
</section>
<hr />
<!-- Artifact 1 -->
<section>
<div>
<h2>Now Mobile Application</h2>
<span class="subtitle">
This app was developed as a mobile version of MyMarketPlace, a
platform mainly for submitting requests, and was presented to RBC
executives on December 13, 2022.
</span>
</div>
<img
src="img/Now_Mobile_Slide_Screenshot.png"
alt="Now Mobile Title Slide"
/>
<p>
During my RBC work term, it was decided from the beginning of the term
that I would be working on a project with a team of co-op students,
two developers and two business systems analysts. The goal was to
develop an app called Now Mobile, and the app was to be a mobile
version of an already existing platform within the ServiceNow product
suite. It resolved a business need for work during travel, since
opening up an app during commute or a business trip was more efficient
than booting up a laptop.
</p>
<p>
Working together with the Now Mobile team as a developer co-op
student, we designed a mobile application that would allow internal
RBC employees to request items, read knowledge articles, approve
requests and delegate tasks to other employees when they are away.
Using the app builder available within the ServiceNow platform and
JavaScript syntax, we created new components, debugged existing ones
and rearranged the UI so that it would match RBC branding. The final
application was presented to executives after it entered the final
stages of testing, and the feedback was overwhelmingly positive.
</p>
<p>
Through the process of creating the Now Mobile application, I learned
about the ServiceNow platform, how to work with another developer in a
team, and all the formal stages of software development. App builder
documentation, free ServiceNow courses, and fellow employees who took
time out of their day to help me when I had trouble were all helpful
in my journey to develop the mobile application. I believe if I had
the chance to recreate the artifact, I might remove some redundant
changes and speed up the solving of early technical issues, but
overall, it would not change all that much.
</p>
</section>
<hr />
<!-- Artifact 2 -->
<section>
<div>
<h2>Estimated Time Application</h2>
<span class="subtitle">
This program was created as a small stand-alone application to
calculate estimated time for epics in Jira Software projects and was
presented on February 17, 2022.
</span>
</div>
<button type="button" class="accordion">EstimatedTime.Groovy</button>
<div class="accordion-body">
<pre>
import groovy.json.JsonSlurper
import groovy.json.JsonOutput
String project = "" // change to project key
String auth = "" // change to authentication string
String url = "" // change to root/domain string
String inUrl = "${url}search?jql=project=${project}"
def inConnection = inUrl.toURL().openConnection()
inConnection.addRequestProperty("Authorization", "Basic ${auth}")
inConnection.addRequestProperty("Accept", "application/json")
inConnection.addRequestProperty("Content-Type", "application/json")
inConnection.setRequestMethod("GET")
inConnection.doInput = true
inConnection.doOutput = false
inConnection.connect()
JsonSlurper json = new JsonSlurper()
def projMap = json.parseText(inConnection.content.text)
def epicMap = [:]
for (issue in projMap.issues) {
def epic = issue.fields.customfield // change customfield to Epic Link field ID
def effort = issue.fields.customfield // change customfield to Effort field ID
print issue.key + "\t" + effort + "\t" + epic
if (epic != null && effort != null) {
if (epicMap.containsKey(epic) == false) {
epicMap[epic] = effort
} else {
epicMap[epic] += effort
}
}
println "\t" + epicMap
}
epicMap.each{
epic, time ->
String outUrl = "${url}issue/${epic}"
def outConnection = outUrl.toURL().openConnection()
outConnection.addRequestProperty("Authorization", "Basic ${auth}")
outConnection.addRequestProperty("Accept", "application/json")
outConnection.addRequestProperty("Content-Type", "application/json")
outConnection.setRequestMethod("PUT")
outConnection.doInput = true
outConnection.doOutput = true
String update = """
{
"fields" : {
"customfield" : ${time}
}
}""" // change customfield to Estimated Time field ID
outConnection.outputStream.withWriter{
t.write(update)
it.flush()
}
outConnection.connect()
try {
outConnection.content.text
} catch (IOException e) {
try {
((HttpURLConnection)outConnection).errorStream.text
} catch (Exception ignored) {
throw e
}
}
}</pre
>
</div>
<p>
During my Innovapost work term, it was decided from the first goal
planning meeting that I would be showcasing the research and knowledge
gained during the first month of work by creating a small program.
Calculating the estimated time for an epic was a useful endeavour that
tied all the topics and that no one had yet created anything for, so
the task was assigned to me.
</p>
<p>
Working independently as a DevOps engineer co-op student, I created an
application that could be run from command line using Groovy and the
Jira REST API. Using the “GET” request method from the URLConnection
class, I requested JSON content to parse using JsonSlurper into a map.
The map was then iterated through, and the estimated times for each
story within the epic were added together and sent back to update the
proper field in the parent epic using the “PUT” method. The final
application was presented to the team during one of the daily stand-up
meetings, and no flaws were picked out.
</p>
<p>
Through the process of creating the Estimated Time application, I
learned about REST APIs, how to connect to URLs with an application,
the Groovy language and how it ties to Java. Groovy and Jira Cloud
REST API documentation, sample code in GitHub repositories and
confused forum posters were all helpful in my journey to complete the
estimated time application. I believe if I had the chance to recreate
the artifact, I might remove some redundant code and clean up the
formatting, but overall, it would not change all that much.
</p>
</section>
</div>
<script type="text/javascript" src="js/accordion.js"></script>
</body>
</html>