-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathabout.html
303 lines (303 loc) · 15.5 KB
/
about.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
<!doctype html>
<html>
<head>
<title>Kenny Zhang - About</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="/styles/global.css" />
<link rel="icon" href="/images/icon16.png" type="image/png" sizes="16x16" />
<link rel="icon" href="/images/icon32.png" type="image/png" sizes="32x32" />
<script src="/scripts/includes.js"></script>
</head>
<body>
<div class="include include_main_header"></div>
<div class="include include_navbar"></div>
<div>
<h1 id="intro">
Introduction
</h1>
<figure>
<blockquote cite="http://catb.org/jargon/html/personality.html">
Hackers are ‘control freaks’ in a way that has nothing to
do with the usual coercive or authoritarian connotations of the term.
In the same way that children delight in making model trains go
forward and back by moving a switch, hackers love making complicated
things like computers do nifty stuff for them.
But it has to be their nifty stuff.
They don't like tedium, nondeterminism, or most of the fussy, boring,
ill-defined little tasks that go with maintaining a normal existence.
Accordingly, they tend to be careful and orderly in their intellectual
lives and chaotic elsewhere.
Their code will be beautiful, even if their desks are buried in 3 feet
of crap.
</blockquote>
<figcaption>
—<cite><a href="http://catb.org/jargon/html/personality.html">
The Jargon File 4.4.7, Appendix B, Personality Characteristics.
</a></cite>
</figcaption>
</figure>
<p>
There's so much nifty stuff to learn in Computer Science, and I enjoy
learning about all of it.
From your standard techniques like sorting, heaps, search trees, and
hash tables, to more obscure ones like union-find, tries, suffix arrays,
link-cut trees, and euler-tour trees, something about managing your data
in a clever way and being able to prove that your data structure is
asymptotically optimal is extraordinarilly satisfying to me.
</p>
<p>
Getting to see these algorithmic techniques in practice is why I like
competitive programming, and evidently I have a bit of a knack for it.
Freshman year, I got an email from a professor advertising Stony Brook
Competitive Programming Club's selection contest, and despite being an
anxious freshman, I decided to see what the club is about.
“Worst case I get free pizza and leave, no harm done,”
I thought.
</p>
<p>
Well, after the selection contest was over, I got third place.
The only people who scored better than me were graduate students.
At this point, I'm roped into the club, attending weekly practices,
preparing for the International Collegiate Programming Contest (ICPC) in
the Greater New York Region later in the year.
We placed 12th, the best team from Stony Brook, and the second best
freshman/sophomore team.
Sophomore year, in the selection contest I placed first overall, and in
the regional we placed 3rd overall.
We advanced to the North Americal Division Championships, and while
we found that there were lots of bigger fish in this ocean, we had a fun
time continuing to think about the problems after the contest.
Junior year, I repeated my first place performance in the selection
contest, and in the regional we placed 7th overall.
As of the time I am writing this, I am preparing for the next selection
contest, and hope to keep my algorithmic problem solving skills sharp!
</p>
<p>
This interest in algorithms is why instead of taking my Computer Science
degree and going straight for a well-paying job, I'm applying to PhD
programs.
Research seems like such a huge opportunity to continue to explore the
field of Computer Science, and maybe push the boundaries of what we can
make computers do.
</p>
</div>
<div>
<h1 id="hobbies">
Hobbies
</h1>
<figure>
<blockquote cite="http://catb.org/jargon/html/personality.html">
It is noticeable (and contrary to many outsiders' expectations) that
the better a hacker is at hacking, the more likely he or she is to
have outside interests at which he or she is more than merely
competent.
</blockquote>
<figcaption>
—<cite><a href="http://catb.org/jargon/html/personality.html">
The Jargon File 4.4.7, Appendix B, Personality Characteristics.
</a></cite>
</figcaption>
</figure>
<h2 id="minecraft">
Minecraft
</h2>
<p>
I enjoy playing video games, though my game library is quite small.
Once I get invested in a game, I will try to optimize my gameplay.
Call me a tryhard all you want, but once you've played a game long
enough, you need something extra to break the monotony.
The first game I really put time into was Minecraft.
Some redstone videos on YouTube had caught my interest, and the first
thing I did when I got the game was fire up a creative world and toy
around with making basic circuits.
My favorite creation out of all my time playing the game is a fairly
useless contraption that can send a block up and down a vertical shaft
at 10 blocks per second. To get blocks to move that fast, I had to use
(abuse?) a lot of technical mechanics hidden in the internals of
Minecraft.
</p>
<div class="hflex">
<div>
<p>
The first idea is that the game processes the world in a loop, and
that this loop is timed to run 20 times per second.
Each pass through the loop is a tick, and you start off doing
redstone by taking events that you want to happen in a certain
order, and using delay circuitry to orchestrate the events.
However, as you learn more about the game, about the order of events
withing a single pass through the loop, you can start to manipulate
events happening within a single tick.
You learn about block updates, how instead of updating every block
in the world on every game tick, changes made to the world are
processed locally by having block state changes send notifiers to
neighboring blocks, which may update their own state and recursively
propagate more notifiers.
You learn about how components like repeaters and redstone torches
create delay by scheduling ‘tile ticks,’ and you learn
how to manipulate this queue of tile ticks to order events within a
tick.
You learn about how pistons operate on a different system of
‘block events,’ and how manipulating block events
enables complex behaviors such as instant wire, 0-tick pulses,
deleting any block — even if you're not supposed to be able to
break it, and several duplication glitches.
In terms of what I needed for my block elevator, I heavily utilized
tile tick order to generate 0-tick pulses to transport blocks
instantly within a tick.
</p>
</div>
<div class="hfill"></div>
<figure>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/xCQAbt8utX0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<figcaption>
A contraption to move a block very quickly by carefully manipulating
events within a game tick.
</figcaption>
</figure>
</div>
<p>
Technical Minecraft has advanced to the point at which people are diving
into the game's code, tracing game execution to find ways to break the
game.
Watching a video on obtaining normally unobtainable items is the first
time I learned about word tearing, a programming error that shows up in
multithreading.
While Minecraft is largely single-threaded, people were able to trick
the game into keeping a second thread alive, and then were able to
coordinate the threads with precise timings induced by hash map
collisions to execute the word tearing bug in practice.
I suppose this is another example of how “making complicated
things do nifty stuff” is fascinating to me.
</p>
<p>
And I haven't even gotten into how the player factors into all of this,
how to optimize moving the player from point A to point B.
You'd think that this would be basic, but there's a whole wiki called
<a href="https://www.mcpk.wiki/wiki/Main_Page">
MCPK
</a>
devoted to just this topic.
There's also plenty of techniques for how to build bridges quickly, and
multitudes of minigames on servers that start with teams separated by
huge empty voids, and swiftly traversing these gaps is key to gaining an
advantage over enemy teams.
All this is to say that Minecraft is a game with a huge amount of depth,
and while I arguably may have spent too much time playing this game, I
have enjoyed every second of it.
</p>
<h2 id="celeste">
Celeste
</h2>
<div class="hflex">
<div>
<p>
Another game I have dumped several hundreds of hours into is
Celeste.
This game was designed with speedrunning and optimizing movement in
mind, as the developers put in many moves in the game that give you
speed.
Jumping out of a downwards-diagonal dash? You now have 325 speed.
You're jumping off the ground? +40 speed.
You're climbing over a wall? +40 speed.
You're jumping off a moving block? +moving block speed.
You're doing any action a short time after leaving a moving block?
+moving block speed.
But the most important technique the developers implemented: you've
dashed down diagonally? As long as you don't touch the ground during
the dash, you get to keep your speed, and the next time you touch
the ground, you get ×1.2 speed.
That's a multiplicative speed increase, which means doing this over
and over makes your speed grow exponentially.
</p>
<p>
Now, granted, in the base game, there aren't many human-viable
opportunities to see the huge effects of this exponential growth.
However, the game modding community is very active, and there have
been a plethora of maps that have been designed with the explicit
purpose of exploring just how far you can push the game while still
having everything be doable — and extraordinarily difficult
counts as doable — by a human.
I have sunken so many hours playing these maps because I enjoy the
challenge, and I have also made some maps of my own exploring
obscure techniques the game has to offer.
</p>
</div>
<div class="hfill"></div>
<div>
<figure>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/039AJu4sMc8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<figcaption>
One of my most difficult Celeste accomplishments.
</figcaption>
</figure>
<figure>
<video width="560" height="315" controls loop poster="/images/retainedspeed_thumb.png">
<source src="/images/retainedspeed.mp4" type="video/mp4" />
No video support? Well, the video is pretty hectic and
unintelligible, so you're not missing out on much. :P
</video>
<figcaption>
A video demonstrating obscure techniques in Celeste.
</figcaption>
</figure>
</div>
</div>
<h2 id="flow">
Poi Flow/Glowstringing
</h2>
<div class="hflex">
<div>
<p>
Outside of gaming, I enjoy practicing a form of dance involving
manipulating weighted objects on the end of strings.
If you've swung your lanyard around a lot, think about doing it with
two lanyards, and the types of patterns you can trace.
I've performed with a club on my campus called SBU Flow, and have
learned a lot of fancy tricks.
It's been quite fun to not just amaze audiences with complex light
patterns, but also teach the moves to other people.
So much of the art takes copius amounts of muscle memory, and trying
to transfer knowledge of something you do instinctively is a unique
and fun challenge.
</p>
<p>
There's also a surprising tidbit of math that shows up when you
start to practicing patterns called ‘inspin’ and
‘antispin’ patterns.
When you spin the poi in one direction, and move your arm in a
circle in the same direction as the poi, it is called an
‘inspin’ pattern.
When you move your arm in the opposite direction, it is called an
‘antispin’ pattern.
These patterns trace out interesting spirograph patterns.
Something strange arises when you start to practice these patterns.
A lot of people, including myself, tend to count poi rotations by
when the poi is pointing straight towards the ground.
If you count the number of poi rotations in a 4 petal inspin
pattern, you'll notice that there are 5 down beats — one extra
beat is present.
If you count the number of poi rotations in a 4 petal antispin
pattern, you'll notice that there are only 3 down beats — one
beat is missing.
This is because your arm moving in a circle either adds or removes
a rotation from the poi, depending on if you're following the poi's
direction or going the opposite direction.
To put it more mathematically, let
<i>f</i>(<i>t</i>)=(cos <i>t</i>,sin <i>t</i>).
Then <i>f</i>(<i>t</i>)+<i>f</i>(5<i>t</i>) and
<i>f</i>(<i>t</i>)+<i>f</i>(-3<i>t</i>) both produce 90°
rotationally symmetric patterns.
Isn't that just wild?
</p>
</div>
<div class="hfill"></div>
<figure>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/QeBqUIyZFPU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<figcaption>
An SBU Flow performance where I had a solo (at timestamp 1:05).
</figcaption>
</figure>
</div>
</div>
</body>
</html>