Compare commits

..

4 Commits

Author SHA1 Message Date
Greg Shuflin
aa1875cc75 add <wbr> tag in email
h/t wolf from noisebridge infra meetup
2024-10-21 19:19:14 -07:00
Greg Shuflin
d8e3848563 Rename files 2024-10-18 17:31:00 -07:00
Greg Shuflin
cd37aa2a0d Final css fixes 2024-10-18 17:28:03 -07:00
Greg Shuflin
d3446bffcc Final fixes - mobile and desktop versions both look decent now 2024-10-18 13:21:21 -07:00
4 changed files with 213 additions and 390 deletions

View File

@ -1,111 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Greg Shuflin — Software Developer</title>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width'>
<link href="style-mobile.css" rel="stylesheet">
<link rel="icon" type="image/x-icon" href="favicon.png">
</head>
<body>
<div class="container">
<header>
<div class="links">
<h1>Greg Shuflin — Software Developer</h1>
<ul>
<li>Download <a href="./resume/Greg-Shuflin-Resume.pdf">my resume</a></li>
<li>Contact me:
<ul>
<li><a class="emailLink" href="mailto:greg.shuflin+developerportfolio@protonmail.com">greg.shuflin@protonmail.com</a></li>
<li><a href='https://www.linkedin.com/in/gregshuflin/'>LinkedIn</a></li>
<li><a href="nostr:npub1t4tqw45837fzs0589jqqna0s5wcmzstnsvw2vlrj7934w9l25sgsgnjcsl">Nostr </a>
<code class="nostrPubkey">npub1t4tqw45837fzs0589jqqna0s5wcmzstnsvw2vlrj7934w9l25sgsgnjcsl</code>
</li>
<!--
<li>
<p>SSH public key:
<code>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBYZzw9jdXezBuENVPZ+p3FipNN2gT9BUo7nlCTIqLhE</code>
</li>
-->
</ul>
</div>
<div class="photo">
<img src='self.jpg' alt='Self-photo'>
</div>
</header>
<main>
<section>
<h2>About me</h2>
<p>I'm a software engineer with broad expertise across several different
disciplines of industry software development, particularly network
programming, full-stack web development, all things cryptocurrency, and
modern cloud-focused devops/Unix systems administration. On the side, I
dabble in 3d graphics, functional programming/type theory, programming
language design, and mucking about with microcontrollers.
<p>I've shipped code in <strong>Rust</strong>, <strong>Python</strong>,
<strong>C/C++</strong>, <strong>Ruby</strong> (on Rails),
<strong>Scala</strong>, <strong>Elm</strong>, and <strong>Haskell</strong>.
My educational credentials are B.A.s in <strong>Linguistics</strong>,
<strong>Computer Science</strong> and <strong>Japanese</strong> from the
<strong>University of California, Berkeley</strong>. My language of choice
for most sorts of software project is Rust these days, but there's a whole
wide world out there of interesting developments in programming language
research - I'd love to write, say, <a href="https://www.idris-lang.org/">Idris</a> for a living one day.
<p>My passion as a software developer is software correctness - I think the
industry as a whole places too little emphasis on writing software that does
the right thing from the beginning. I want to use the best tools and
practices available to write software that is easily maintainable and
minimizes bugs from the start of a project onwards.
</section>
<section>
<h2>Open-source contributions</h2>
<p>My professional Github profile is <a href="https://github.com/gshuflin">@gshuflin</a>. I have
used <a href="https://github.com/neunenak">@neunenak</a> as a personal Github profile in the past, and still use it
for contributing to projects that use Github as their main git repository host. I've moved most of my personal code
to a self-hosted <a href="https://gitea.com">Gitea</a> instance at <a href="https://code.everydayimshuflin.com/greg">code.everydayimshuflin.com</a>, to
reduce my dependency on cloud services I have no control over.
<ul>
<li>As part of my work at Toolchain Labs, I was a <a href="https://github.com/pantsbuild/pants/commits?author=gshuflin">contributor</a>
to the <a href="https://www.pantsbuild.org/">Pants</a> build system.
Much of my work on this project involved porting the codebase from a
legacy Python execution engine to a modern and more performant Rust
execution engine.</li>
<li>I maintain a <a href="https://github.com/typst/typst">typst</a> package
<a href="https://code.everydayimshuflin.com/greg/typst-lepizig-glossing">leipzig-glossing</a>
for typesetting linguistic interlinear glosses according to the Leipzig Glossing
Rules.</li>
<li>I'm a user of and <a href="https://github.com/casey/just/commits?author=neunenak">occasional
contributor to</a> the <a href="https://github.com/casey/just">just</a>
command runner, written in Rust.</li>
<li>A wrote a quick and dirty <a href="https://code.everydayimshuflin.com/greg/rust-parser-combinator">parser combinator
library</a> in Rust, mostly as a proof of concept. I'd like to see if I can incorporate some of the
ideas from the paper <a href="https://research.rug.nl/en/publications/efficient-parsing-with-parser-combinators">
Efficient parsing with parser combinators</a> to make it faster.</li>
<li>I contributed a basic <a href="https://github.com/koka-lang/koka/pull/193/commits/ab290a41a4249450d9934a4c23d2b8ed7e98b448">Vim
plugin</a> for the <a href="https://koka-lang.github.io/koka/doc/book.html">Koka</a> language,
an research programming language experimenting with the very neat idea of
algebraic effect systems.</li>
<li>I wrote a simple Rust command line program for <a href="https://github.com/neunenak/hilite">
for highlighting stderr console output</a>, inspired by Mike Schiraldi's hilite utility, which
I used at Meraki for making the actual errors more obvious in lengthy C++ compiler output. It
is published on <a href="https://crates.io/crates/hilite">crates.io</a>.</li>
</ul>
</section>
</main>
</div>
</body>
</html>

View File

@ -1,47 +1,41 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<title>Greg Shuflin — Software Developer</title>
<meta charset='utf-8'> <meta charset='utf-8'>
<meta name='viewport' content='width=device-width'> <meta name='viewport' content='width=device-width'>
<title>Greg Shuflin - Software Developer</title>
<link rel="icon" type="image/x-icon" href="favicon.png">
<link href="style.css" rel="stylesheet"> <link href="style.css" rel="stylesheet">
<link rel="icon" type="image/x-icon" href="favicon.png">
</head> </head>
<body> <body>
<div id='main'> <div class="container">
<header> <header>
<div> <div class="links">
<h1>Greg Shuflin - Software Developer</h1> <h1>Greg Shuflin — Software Developer</h1>
<div class="important-links"> <ul>
<p>Download a copy of <a href="./resume/Greg-Shuflin-Resume.pdf">my resume</a>. <li>Download <a href="./resume/Greg-Shuflin-Resume.pdf">my resume</a></li>
<li>Contact me:
<p>Contact me via <a class="emailLink" href="mailto:greg.shuflin+developerportfolio@protonmail.com">greg.shuflin@protonmail.com</a> <ul>
or <a href='https://www.linkedin.com/in/gregshuflin/'>LinkedIn</a>. <li><a class="emailLink" href="mailto:greg.shuflin+developerportfolio@protonmail.com">greg.shuflin<wbr/>@protonmail.com</a></li>
<li><a href='https://www.linkedin.com/in/gregshuflin/'>LinkedIn</a></li>
<p>My Nostr public key: <a href="nostr:npub1t4tqw45837fzs0589jqqna0s5wcmzstnsvw2vlrj7934w9l25sgsgnjcsl"> <li><a href="nostr:npub1t4tqw45837fzs0589jqqna0s5wcmzstnsvw2vlrj7934w9l25sgsgnjcsl">Nostr </a>
npub1t4tqw45837fzs0589jqqna0s5wcmzstnsvw2vlrj7934w9l25sgsgnjcsl <code class="nostrPubkey">npub1t4tqw45837fzs0589jqqna0s5wcmzstnsvw2vlrj7934w9l25sgsgnjcsl</code>
</a> </li>
<!--
<li>
<p>SSH public key: <p>SSH public key:
<code>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBYZzw9jdXezBuENVPZ+p3FipNN2gT9BUo7nlCTIqLhE</code> <code>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBYZzw9jdXezBuENVPZ+p3FipNN2gT9BUo7nlCTIqLhE</code>
</li>
-->
<p>See open-source code I've written:
<ul>
<li> <a href="https://github.com/gshuflin">@gshuflin</a> (professional GitHub account)
<li> <a href="https://github.com/neunenak">@neunenak</a> (personal GitHub account)
<li> <a href="https://code.everydayimshuflin.com/greg">code.everydayimshuflin.com</a> (self-hosted <a href="https://gitea.com/">Gitea</a> instance).
</ul> </ul>
</div> </div>
</div>
<div id='selfPhoto'>
<img src='self.jpg' alt='Self-photo' width='240'>
</div>
</header> </header>
<main>
<div class="photo">
<img src='self.jpg' alt='Self-photo'>
</div>
<section>
<h2>About me</h2> <h2>About me</h2>
<p>I'm a software engineer with broad expertise across several different <p>I'm a software engineer with broad expertise across several different
disciplines of industry software development, particularly network disciplines of industry software development, particularly network
programming, full-stack web development, all things cryptocurrency, and programming, full-stack web development, all things cryptocurrency, and
@ -57,17 +51,15 @@
<strong>University of California, Berkeley</strong>. My language of choice <strong>University of California, Berkeley</strong>. My language of choice
for most sorts of software project is Rust these days, but there's a whole for most sorts of software project is Rust these days, but there's a whole
wide world out there of interesting developments in programming language wide world out there of interesting developments in programming language
research - I'd love to write, say, <a research - I'd love to write, say, <a href="https://www.idris-lang.org/">Idris</a> for a living one day.
href="https://www.idris-lang.org/">Idris</a> for a living one
day.
<p>My passion as a software developer is software correctness - I think the <p>My passion as a software developer is software correctness - I think the
industry as a whole places too little emphasis on writing software that does industry as a whole places too little emphasis on writing software that does
the right thing from the beginning. I want to use the best tools and the right thing from the beginning. I want to use the best tools and
practices available to write software that is easily maintainable and practices available to write software that is easily maintainable and
minimizes bugs from the start of a project onwards. minimizes bugs from the start of a project onwards.
</section>
<section>
<h2>Open-source contributions</h2> <h2>Open-source contributions</h2>
<p>My professional Github profile is <a href="https://github.com/gshuflin">@gshuflin</a>. I have <p>My professional Github profile is <a href="https://github.com/gshuflin">@gshuflin</a>. I have
@ -78,63 +70,55 @@
<ul> <ul>
<li>As part of my work at Toolchain Labs, I was a <a <li>As part of my work at Toolchain Labs, I was a <a href="https://github.com/pantsbuild/pants/commits?author=gshuflin">contributor</a>
href="https://github.com/pantsbuild/pants/commits?author=gshuflin">contributor</a>
to the <a href="https://www.pantsbuild.org/">Pants</a> build system. to the <a href="https://www.pantsbuild.org/">Pants</a> build system.
Much of my work on this project involved porting the codebase from a Much of my work on this project involved porting the codebase from a
legacy Python execution engine to a modern and more performant Rust legacy Python execution engine to a modern and more performant Rust
execution engine execution engine.</li>
<li>I maintain a <a href="https://github.com/typst/typst">typst</a> package <li>I maintain a <a href="https://github.com/typst/typst">typst</a> package
<a href="https://code.everydayimshuflin.com/greg/typst-lepizig-glossing">leipzig-glossing</a> <a href="https://code.everydayimshuflin.com/greg/typst-lepizig-glossing">leipzig-glossing</a>
for typesetting linguistic interlinear glosses according to the Leipzig Glossing for typesetting linguistic interlinear glosses according to the Leipzig Glossing
Rules. Rules.</li>
<li>I'm a user of and <a <li>I'm a user of and <a href="https://github.com/casey/just/commits?author=neunenak">occasional
href="https://github.com/casey/just/commits?author=neunenak">occasional
contributor to</a> the <a href="https://github.com/casey/just">just</a> contributor to</a> the <a href="https://github.com/casey/just">just</a>
command runner, written in Rust. command runner, written in Rust.</li>
<li>A wrote a quick and dirty <a href="https://gitea.everydayimshuflin.com/greg/rust-parser-combinator">parser combinator <li>A wrote a quick and dirty <a href="https://code.everydayimshuflin.com/greg/rust-parser-combinator">parser combinator
library</a> in Rust, mostly as a proof of concept. I'd like to see if I can incorporate some of the library</a> in Rust, mostly as a proof of concept. I'd like to see if I can incorporate some of the
ideas from the paper <a href="https://research.rug.nl/en/publications/efficient-parsing-with-parser-combinators"> ideas from the paper <a href="https://research.rug.nl/en/publications/efficient-parsing-with-parser-combinators">
Efficient parsing with parser combinators</a> to make it faster. Efficient parsing with parser combinators</a> to make it faster.</li>
<li>I contributed a basic <a <li>I contributed a basic <a href="https://github.com/koka-lang/koka/pull/193/commits/ab290a41a4249450d9934a4c23d2b8ed7e98b448">Vim
href="https://github.com/koka-lang/koka/pull/193/commits/ab290a41a4249450d9934a4c23d2b8ed7e98b448">Vim plugin</a> for the <a href="https://koka-lang.github.io/koka/doc/book.html">Koka</a> language,
plugin</a> for the <a
href="https://koka-lang.github.io/koka/doc/book.html">Koka</a> language,
an research programming language experimenting with the very neat idea of an research programming language experimenting with the very neat idea of
algebraic effect systems. algebraic effect systems.</li>
<li>I wrote a simple Rust command line program for <a href="https://github.com/neunenak/hilite"> <li>I wrote a simple Rust command line program for <a href="https://github.com/neunenak/hilite">
for highlighting stderr console output</a>, inspired by Mike Schiraldi's hilite utility, which for highlighting stderr console output</a>, inspired by Mike Schiraldi's hilite utility, which
I used at Meraki for making the actual errors more obvious in lengthy C++ compiler output. It I used at Meraki for making the actual errors more obvious in lengthy C++ compiler output. It
is published on <a href="https://crates.io/crates/hilite">crates.io</a>. is published on <a href="https://crates.io/crates/hilite">crates.io</a>.</li>
<!-- <li>I recently started porting the <a href="https://github.com/neunenak/sshfs">SSHFS</a> UNIX utility -->
<!-- from C to Rust. -->
</ul> </ul>
</section>
<section>
<h2>Some personal projects</h2> <h2>Some personal projects</h2>
<p>A few side projects I've worked on <p>A few side projects I've worked on that I think are particularly interesting.</p>
that I think are particularly interesting.
<div> <section>
<h3>Schala</h3> <h3>Schala</h3>
<p>I've been interested in programming language implementations since my college compilers class, <p>I've been interested in programming language implementations since my college compilers class,
and interested in type theory ever since I learned about Haskell. <a href="https://gitea.everydayimshuflin.com/greg/schala"> and interested in type theory ever since I learned about Haskell. <a href="https://code.everydayimshuflin.com/greg/schala">
Schala</a> is a Rust framework I've been sporadically working on to give me a place to experiment with multiple programming Schala</a> is a Rust framework I've been sporadically working on to give me a place to experiment with multiple programming
language ideas, and also the name of the language I'm using this framework to implement. Schala is intended to be an language ideas, and also the name of the language I'm using this framework to implement. Schala is intended to be an
expression-based functional-encouraging programming language using ML-style types with Rust-like syntax. expression-based functional-encouraging programming language using ML-style types with Rust-like syntax.
</div> </section>
<div> <section>
<h3>Browser games</h3> <h3>Browser games</h3>
<p> These are all open-source collabrations with <p> These are all open-source collabrations with
<a href='https://github.com/AlexNisnevich'>Alex Nisnevich</a> and several <a href='https://github.com/AlexNisnevich'>Alex Nisnevich</a> and several
@ -172,19 +156,18 @@
is a <a href='https://github.com/neunenak/voluspa-server' class='codeLink'>fairly-simple Haskell server.</a> is a <a href='https://github.com/neunenak/voluspa-server' class='codeLink'>fairly-simple Haskell server.</a>
</li> </li>
</ul> </ul>
</div> </section>
<section>
<div>
<h3>Other projects</h3> <h3>Other projects</h3>
<ul> <ul>
<li><a href="https://gitea.everydayimshuflin.com/greg/SNES-ASM">SNES Assembly language</a>: some experiments in writing <li><a href="https://code.everydayimshuflin.com/greg/SNES-ASM">SNES Assembly language</a>: some experiments in writing
custom ROMs in the assembly language used by the Super Nintendo/Super Famicom/SNES. custom ROMs in the assembly language used by the Super Nintendo/Super Famicom/SNES.
</li> </li>
</ul> </ul>
</div> </section>
</section>
</main>
</div> </div>
</body> </body>
</html> </html>

View File

@ -1,61 +0,0 @@
* {
box-sizing: border-box;
}
body {
padding: 0em 0.5em;
background-color:#2B2B4D;
color: white;
font-family: "Fira Sans", sans-serif;
font-size: 20px;
line-height: 1.5;
display: flex;
flex-direction: column;
align-items: center;
}
.container {
max-width: 961px;
display: flex;
flex-direction: column;
align-items: center;
}
h1 {
text-align: center;
margin: 0;
}
code.nostrPubkey {
display: none;
}
a {
color: #f74848;
font-weight:bolder;
}
a:visited {
color:#f74848;
}
a.codeLink {
color:#31E631;
font-weight:normal;
}
a.emailLink {
color:#31E631;
font-family: "monospace";
text-decoration: none;
}
.photo img {
max-width: 100%;
}
/* Desktop */
@media only screen and (min-width: 961px) {
code.nostrPubkey {
display: revert;
}
}

View File

@ -1,62 +1,74 @@
@import url(https://fonts.googleapis.com/css?family=Ubuntu:400,700,400italic,700italic); * {
box-sizing: border-box;
h1 {
font-family: Ubuntu;
}
@media (min-width: 600px) {
header {
display: flex;
justify-content: space-between;
}
}
#selfPhoto {
margin-top: 20px;
margin-right: 30px;
}
@media (min-width: 80rem) {
#main {
margin-left:auto;
margin-right:auto;
width:960px;
}
}
section.important-links {
font-size: large;
} }
body { body {
padding: 0em 0.5em;
background-color:#2B2B4D; background-color:#2B2B4D;
color: white; color: white;
font-family: "Fira Sans", sans-serif; font-family: "Fira Sans", sans-serif;
font-size: 20px;
line-height: 1.5;
display: flex;
flex-direction: column;
align-items: center;
} }
b { .container {
font-weight:bolder; width: 100%;
max-width: 961px;
display: flex;
flex-direction: column;
align-items: center;
}
h1 {
text-align: center;
margin: 0;
}
code.nostrPubkey {
display: none;
} }
a { a {
color: #f74848; color: #f74848;
font-weight:bolder; font-weight:bolder;
} }
a:visited { a:visited {
color:#f74848; color:#f74848;
} }
li {
margin-bottom:10px;
}
a.codeLink { a.codeLink {
color:#31E631; color:#31E631;
font-weight:normal; font-weight:normal;
} }
a.emailLink { a.emailLink {
color:#31E631; color:#31E631;
font-family: "monospace"; font-family: "monospace";
text-decoration: none; text-decoration: none;
} }
.photo {
width: 100%;
}
.photo img {
width: 100%;
}
/* Desktop */
@media only screen and (min-width: 961px) {
code.nostrPubkey {
display: revert;
}
.photo {
float: right;
width: 400px;
margin: 1em;
}
}