-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
422 lines (402 loc) · 19.3 KB
/
index.html
File metadata and controls
422 lines (402 loc) · 19.3 KB
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
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>C653 Labs</title>
<link rel="canonical" href="https://c653labs.com/">
<meta name="description" content="Software and DevOps consulting">
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="brett_langdon">
<meta property="og:type" content="website">
<meta property="og:url" content="https://c653labs.com/">
<meta property="og:site_name" content="C653 Labs">
<meta property="og:title" content="C653 Labs">
<meta property="og:description" content="Software and DevOps consulting">
<meta property="og:image" content="https://c653labs.com/static/img/c653labs-dark.svg">
<link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
<link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/favicon-48x48.png" sizes="48x48">
<link rel="icon" type="image/svg+xml" href="/favicon.svg" sizes="any">
<link rel="stylesheet" href="/static/css/styles.css">
<script defer src="https://use.fontawesome.com/releases/v5.0.1/js/all.js"></script>
</head>
<body>
<a class="jump-to-top box is-hidden" style="background-color: rgba(255, 255, 255, 0.8); position: fixed; right: 1rem; bottom: 0.25rem; z-index: 90; border-radius: 0.5rem; width: 3rem; height: 3rem;">
<span class="icon is-large has-text-dark" style="padding: 0.5rem; width: 3rem; height: 3rem;">
<i class="fas fa-2x fa-chevron-up"></i>
</span>
</a>
<section class="hero is-dark is-bold is-medium">
<div class="hero-head">
<nav class="navbar">
<div class="navbar-menu">
<div class="navbar-start"></div>
<div class="navbar-end">
<span class="navbar-item">
<a class="button is-info" target="_blank" href="https://twitter.com/brett_langdon">
<span class="icon">
<i class="fab fa-twitter"></i>
</span>
<span>Twitter</span>
</a>
<a class="button" target="_blank" href="https://github.com/brettlangdon">
<span class="icon">
<i class="fab fa-github"></i>
</span>
<span>GitHub</span>
</a>
<a class="button is-info" target="_blank" href="https://www.linkedin.com/in/brettlangdon/">
<span class="icon">
<i class="fab fa-linkedin"></i>
</span>
<span>LinkedIn</span>
</a>
</span>
</div>
</div>
</nav>
</div>
<div class="hero-body has-text-centered">
<div class="container">
<img class="hero-logo" src="/static/img/c653labs-light.svg" />
<h2 class="subtitle">Software and DevOps consulting.</h2>
<div class="content">
<p>
<a class="button is-size-5" target="_blank" href="mailto:brett@c653labs.com">
<span class="icon">
<i class="far fa-envelope"></i>
</span>
<span>Contact us</span>
</a>
</p>
</div>
</div>
</div>
<div class="hero-foot">
<nav class="tabs is-medium">
<div class="container">
<ul>
<li><a href="#about">About</a></li>
<li><a href="#featured-work">Featured work</a></li>
<li><a href="#projects">Projects</a></li>
</ul>
</div>
</nav>
</div>
</section>
<section class="section">
<div class="container">
<div class="content">
<h2 id="about" class="title is-2">About</h2>
<p>
C653 Labs is a small software and DevOps consulting firm based in New York.
We love working with our clients to build performant web-scale projects using the right tool for each job.
Some of our recent projects have worked with <a href="https://www.docker.com/" target="_blank">Docker</a>,
<a href="https://aws.amazon.com/" target-"_blank">AWS</a>,
<a href="https://www.python.org/" target="_blank">Python</a>/<a href="http://flask.pocoo.org/" target="_blank">Flask</a>,
and <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript" target-"_blank">JavaScript</a>/<a href="https://nodejs.org/" target="_blank">Node.js</a>/<a href="https://vuejs.org/" target="_blank">Vue.js</a>.
</p>
<p>
C653 Labs was started in 2017 and is owned and operated by <a href="https://brett.is/" target="_blank">Brett Langdon</a>.
</p>
</div>
</div>
</section>
<section class="section is-light">
<div class="container">
<div class="content">
<h2 id="featured-work" class="title is-2">Featured work</h2>
<div class="columns first-column">
<div class="column">
<h3 class="title is-4">Résumé parsing with layout analysis</h3>
</div>
<div class="column">
<p>
While working for a client who processes a large number of résumés they wanted a way to parse text from PDF documents as well as to auto-fix malformed PDF links.
</p>
<p>
A common issue with parsing text from PDF documents is that you tend to get the text extracted in a typical left-to-right top-to-bottom order,
but as most résumés have non-traditional formatting this process can yield undesireable and unlegible results.
</p>
<p>
For this project we developed a customer PDF text extraction library which uses layout analysis to properly find and group text.
This library helped yield much more legible extracted text that could then be fed into a text analysis process used by the client.
</p>
<p>
Another issue that the client was seeing was malformed links embedded in the résumé PDFs that would either not work when clicked or would link to an incorrect location.
Part of our solution was to also provide a process for adding, removing, or fixing links inside of a PDF document.
As a result the number of valid and clickable links across all of their PDFs was drastically improved.
</p>
</div>
</div>
<div class="columns">
<div class="column">
<h3 class="title is-4">Terraform AWS configuration</h3>
</div>
<div class="column">
<p>
Client wanted an audit-friendly & testable way to provision their AWS environment.
</p>
<p>
We configured <a href="https://terraform.io" target="_blank">Terraform</a> to provision multiple <a href="https://aws.amazon.com/" target="_blank">AWS</a> environments utilizing
<a href="https://en.wikipedia.org/wiki/Continuous_integration" target="_blank">Continuous Integration</a> to ensure consistent configuration standards,
and <a href="https://en.wikipedia.org/wiki/Continuous_delivery" target="_blank">Continuous Delivery</a> to deploy any changes to their AWS environments.
</p>
<p>
Part of this project involved backfilling the client's existing AWS resources into Terraform as well as configuring new resources they required.
</p>
</div>
</div>
<div class="columns">
<div class="column">
<h3 class="title is-4">Oauth 2 single sign-on service</h3>
</div>
<div class="column">
<p>
Client was building multiple web products that required use authentication.
</p>
<p>
We developed a central shared OAuth2 single sign-on service for the client that allowed their users to re-use their login credentials between multiple applications.
</p>
<p>
This solution allowed them to abstract away the authentication from their web products and more easily integrate new applications with their existing user base.
</p>
</div>
</div>
<div class="columns">
<div class="column">
<h3 class="title is-4">Application migration to Docker</h3>
</div>
<div class="column">
<p>
Client wanted to move their application from AWS <a href="https://aws.amazon.com/ec2/" target="_blank">Elastic Compute Cloud</a> (EC2) instances <a href="https://aws.amazon.com/ecs/" target="_blank">Elastic Container Service</a> (ECS) to help increase developer velocity and reduce operational footprint.
</p>
<p>
We helped update their applications to allow running them in <a href="https://www.docker.com/" target="_blank">Docker</a> containers, which included integrating the <a href="https://12factor.net/" target="_blank">12-factor app</a> environment variable configuration pattern.
</p>
<p>
We migrated their <a href="https://jenkins.io/" target="_blank">Jenkins</a> testing environment to utilize Docker for running unit and integration tests.
</p>
<p>
Finally, we helped with make the final move of migrating their production environment from EC2 instances to ECS.
</p>
</div>
</div>
<div class="columns">
<div class="column">
<h3 class="title is-4">Technical interviewing</h3>
</div>
<div class="column">
<p>
Helped client develop their internal technical interviewing process and aid in the interviewing of technical candidates for various roles.
</p>
</div>
</div>
</div>
</div>
</section>
<section class="section">
<div class="container">
<div class="content">
<h2 id="projects" class="title is-2">Projects</h2>
<div class="columns first-column">
<div class="column">
<div class="media">
<figure class="media-left">
<p class="image is-48x48">
<img src="/static/img/open-source.svg" />
</p>
</figure>
<div class="media-content">
<h3 class="title is-4"><a href="https://github.com/brettlangdon" target="_blank">Open Source</a></h3>
</div>
</div>
</div>
<div class="column">
<p>
At C653 Labs we love to contribute to the open source community, here is a small sample of projects we have created or contributed to.
</p>
<p>
To see the latest and more please visit our <a href="https://github.com/brettlangdon" target="_blank">GitHub profile</a>.
</p>
<h3 class="title is-5">
<a href="https://www.npmjs.com/package/dogapi" target="_blank">dogapi</a>
</h3>
<p>
Most used <a href="https://datadoghq.com/" target="_blank">Datadog</a> HTTP API client for <a href="https://nodejs.org/" target="_blank">Node.js</a>.
</p>
<h3 class="title is-5">
<a href="https://github.com/brettlangdon/git-vendor" target="_blank">git-vendor</a>
</h3>
<p>
Custom <a href="https://git-scm.com/" target="_blank">git</a> command for managing vendored <a href="https://golang.org/" target="_blank">Go</a> dependencies via <a href="https://github.com/git/git/blob/e0aaa1b6532cfce93d87af9bc813fb2e7a7ce9d7/contrib/subtree/git-subtree.txt" target="_blank">git-subtree</a>.
</p>
<p>
Packaged and available to install via <a href="https://brew.sh/" target="_blank">Homebrew</a> on macOS.
</p>
<h3 class="title is-5">
<a href="https://github.com/brettlangdon/flask-env" target="_blank">flask-env</a>
</h3>
<p>
<a href="https://12factor.net/" target="_blank">12-factor app</a> compatible configuration helper for <a href="https://flask.pocoo.org/" target="_blank">Flask</a>
that lets you easily load configuration values from environment variables.
</p>
</div>
</div>
<div class="columns">
<div class="column">
<div class="media">
<figure class="media-left">
<p class="image is-48x48">
<img src="https://mailchemy.com/img/mailchemy-light-small.svg" />
</p>
</figure>
<div class="media-content">
<h3 class="title is-4"><a href="https://mailchemy.com/" target="_blank">Mailchemy</a></h3>
<h4 class="subtitle is-6">Transactional email simplified.</h4>
</div>
</div>
</div>
<div class="column">
<p>
Mailchemy is an easy to integrate API that allows your team to build and manage custom transactional email pipelines utilizing your favorite email provider and integrations.
</p>
<p>
Mailchemy is currently in private beta. To learn more sign up <a href="https://mailchemy.com" target="_blank">here</a>.
</p>
</div>
</div>
<div class="columns">
<div class="column">
<div class="media">
<figure class="media-left">
<p class="image is-48x48">
<img src="https://icanhazdadjoke.com/static/smile.svg" />
</p>
</figure>
<div class="media-content">
<h3 class="title is-4"><a href="https://icanhazdadjoke.com/" target="_blank">icanhazdadjoke</a></h3>
<h4 class="subtitle is-6">The largest selection of dad jokes on the internet.</h4>
</div>
</div>
</div>
<div class="column">
<p>
What started as a fun weekend project quickly turned into one of the best sources of dad jokes available on the internet, with over 10M unique website visits each month.
</p>
<p>
Our official Slack app is currently installed on over 3500 Slack teams and is a featured <a href="https://slack.com/apps/category/At0EFXUU0J-social-fun" target="_blank">Social & Fun</a> Slack app.
</p>
<p>
The Alexa skill has been enabled on over 600 Alexa devices and "Alexa, dad joke" is spoken over 80 times each day.
</p>
<p>
With an easy to use <a href="https://icanhazdadjoke.com/api" target="_blank">API</a>, including support for <a href="http://graphql.org/" target="_blank">GrapghQL</a>, icanhazdadjoke receives over 250,000 unique API requests per day.
</p>
<p>
Official integrations available for:
<ul>
<li><a href="https://slack.com/" target="_blank">Slack</a></li>
<li><a href="https://www.amazon.com/Brett-Langdon-icanhazdadjoke/dp/B01N6CQ3NZ/" target="_blank">Alexa</a></li>
<li><a href="https://twistapp.com/" target="_blank">Twist</a></li>
<li><a href="https://hipchat.com/" target="_blank">HipChat</a></li>
<li><a href="https://nightbot.tv/" target="_blank">Nightbot</a></li>
</ul>
</p>
</div>
</div>
</div>
</div>
</section>
<section class="hero is-dark is-bold is-small">
<div class="hero-body">
<div class="container has-text-centered">
<a class="button is-size-5" target="_blank" href="mailto:brett@c653labs.com">
<span class="icon">
<i class="far fa-envelope"></i>
</span>
<span>
Contact us today
</span>
</a>
</div>
</div>
</section>
<footer class="footer">
<div class="container">
<div class="content has-text-centered">
<p>
©2017-<span id="current-year">2018</span> C653 Labs, LLC
</p>
<a target="_blank" href="mailto:brett@c653labs.com">
<span class="icon">
<i class="far fa-envelope"></i>
</span>
</a>
<a target="_blank" href="https://twitter/brett_langdon">
<span class="icon">
<i class="fab fa-twitter"></i>
</span>
</a>
<a target="_blank" href="https://github.com/brettlangdon">
<span class="icon">
<i class="fab fa-github"></i>
</span>
</a>
<a target="_blank" href="https://www.linkedin.com/in/brettlangdon/">
<span class="icon">
<i class="fab fa-linkedin"></i>
</span>
</a>
</div>
</div>
</footer>
<script>document.getElementById('current-year').innerText = new Date().getFullYear();</script>
<script>
document.addEventListener('click', function (evt) {
if (evt.target.closest('.jump-to-top')) {
window.scrollTo(0, 0);
}
});
document.addEventListener('scroll', function () {
var jumpToTop = document.querySelector('.jump-to-top');
var hero = document.querySelector('.hero');
if (window.pageYOffset > (hero.clientHeight / 2)) {
jumpToTop.classList.remove('is-hidden');
} else {
jumpToTop.classList.add('is-hidden');
}
var sections = document.querySelectorAll('.section[id]');
var lowest = null;
for (var i = 0; i < sections.length; i++) {
if (window.pageYOffset >= sections[i].offsetTop) {
lowest = sections[i];
}
}
var currentActive = document.querySelector('.tabs .is-active a');
if (lowest === null) {
if (currentActive) {
if (window.history) {
window.history.replaceState({}, "", '/');
}
currentActive.parentNode.classList.remove('is-active');
}
} else {
if (currentActive && currentActive.attributes.href.value !== '#' + lowest.id) {
currentActive.parentNode.classList.remove('is-active');
}
var active = document.querySelector('.tabs a[href="#' + lowest.id + '"]');
if (active) {
if (window.history) {
window.history.replaceState({}, "", '/#' + lowest.id);
}
active.parentNode.classList.add('is-active');
}
}
});
</script>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-102144354-1"></script>
<script>window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-102144354-1');</script>
</body>
</html>