Compare commits

...

45 Commits

Author SHA1 Message Date
Jonathan Dahan 45df4976fb Plainer language
11 months ago
Jonathan Dahan 83d7018808 fix more links
11 months ago
Jonathan Dahan 93d74ab61b Fix some links
11 months ago
Jonathan Dahan 4b5e6fa218 recurse
11 months ago
Jonathan Dahan 55ccf38585 add robots.txt
11 months ago
Jonathan Dahan bf045f7fba use aria-current=page instead of .active
11 months ago
Jonathan Dahan b30a765a0b fix youtube embed sizes
11 months ago
Jonathan Dahan 55192fa895 embed flickr slideshow
11 months ago
Jonathan Dahan 80547800fb Fix links to code forges
11 months ago
Jonathan Dahan 8b63df13b0 arg ordering
11 months ago
Jonathan Dahan 1a2854d865 no logging on debian podman-compose :(
11 months ago
Jonathan Dahan 4dcd73a808 simpler descriptions
11 months ago
Jonathan Dahan 507638efec b
11 months ago
Jonathan Dahan d995b5b518 remove profile temporarily
11 months ago
Jonathan Dahan a9112f896b try separating the ssh host
11 months ago
Jonathan Dahan 61bf2819a5 separate
11 months ago
Jonathan Dahan e54be48ec1 separate
11 months ago
Jonathan Dahan f9f82c5fdc fix prepush dir
11 months ago
Jonathan Dahan 7722c11c31 actually push post-receive hook
11 months ago
Jonathan Dahan 67a044a765 empty commit for triggering hooks
11 months ago
Jonathan Dahan fbfea56629 podman build
11 months ago
Jonathan Dahan 1e9b80a60a pre-push update post-receive
11 months ago
Jonathan Dahan 17bbf141b9 b
11 months ago
Jonathan Dahan 012c3ae1f9 cleanup post-receive hook messages
11 months ago
Jonathan Dahan dddb2cbd60 switch to post-receive hook for CI
11 months ago
Jonathan Dahan 0cc5806183 Use pre-push as deploy
11 months ago
Jonathan Dahan 692d573770 checkbox hack
11 months ago
Jonathan Dahan a13758cfe2 hover for entire nav should work for dropdown
11 months ago
Jonathan Dahan 070478b1d9 only have a gap for landscape mode
11 months ago
Jonathan Dahan 282cbf35c5 Use neocities for hosting
11 months ago
Jonathan Dahan fdeced6a8d hardcode jonathan.is for deployment directory
11 months ago
Jonathan Dahan 7c33cc2e48 update todo
12 months ago
Jonathan Dahan 25e88101b6 v4 of podman-compose is external
12 months ago
Jonathan Dahan 5c2c4735e5 detach not daemon
12 months ago
Jonathan Dahan c7326d2f29 up only
12 months ago
Jonathan Dahan c81b85ab04 try manual compose down
12 months ago
Jonathan Dahan 7fb1b73e89 set image name
12 months ago
Jonathan Dahan 0fa13b70fa try hardcoding tags
12 months ago
Jonathan Dahan 48e1ab99d5 no pipefail for now
12 months ago
Jonathan Dahan 785c25d4a2 try just /data
12 months ago
Jonathan Dahan 508cd13c6c copy
12 months ago
Jonathan Dahan 947b7f234e self-updating post-receive. this is an awful idea
12 months ago
Jonathan Dahan 4af558d4ce use fqdn for docker image references
12 months ago
Jonathan Dahan f8a068a8ac empty commit for triggering hooks
12 months ago
Jonathan Dahan 7c39e75b89 chmod after copy
12 months ago

1
.gitignore vendored

@ -1 +1,2 @@
.pub .pub
production.env

@ -1,4 +0,0 @@
#!/bin/sh
# sets the 'active' class on an item if the url matches the directory
if [ "$(dirname "$ZS_URL")" = $1 ]; then printf ' class=active' ''; fi

@ -0,0 +1,4 @@
#!/bin/sh
# sets the 'aria-current=page' on an anchor if the url matches the directory
if [ "$(dirname "$ZS_URL")" = $1 ]; then printf ' aria-current=%s' 'page'; fi

@ -4,18 +4,21 @@
<meta name=viewport content="width=device-width,initial-scale=1" /> <meta name=viewport content="width=device-width,initial-scale=1" />
<header> <header>
<input type=checkbox id=check />
<label for=check class=menu>
<nav> <nav>
<a href=/>jonathan.is</a> <a href=/>jonathan.is</a>
<menu> <menu>
<li id=landing {{ active . }}><a href=#>/???</a> <li><a {{ aria-current . }} href=/>/???</a>
<li {{ active writing }}><a href=/writing>/writing</a> <li><a {{ aria-current writing }} href=/writing>/writing</a>
<li {{ active speaking }}><a href=/speaking>/speaking</a> <li><a {{ aria-current speaking }} href=/speaking>/speaking</a>
<li {{ active coding }}><a href=/coding>/coding</a> <li><a {{ aria-current coding }} href=/coding>/coding</a>
<li {{ active making }}><a href=/making>/making</a> <li><a {{ aria-current making }} href=/making>/making</a>
<li {{ active working }}><a href=/working>/working</a> <li><a {{ aria-current working }} href=/working>/working</a>
<li {{ active living }}><a href=/living>/living</a> <li><a {{ aria-current living }} href=/living>/living</a>
</menu> </menu>
</nav> </nav>
</label>
</header> </header>
<main> <main>

@ -5,4 +5,4 @@ data
backing-up backing-up
rss rss
hooks hooks
hooks production.env

@ -1,6 +1,10 @@
FROM prologic/zs AS build FROM docker.io/prologic/zs AS build
COPY . . COPY . .
RUN zs build --production RUN zs build --production
FROM caddy/caddy:2.8-alpine FROM docker.io/ruby:alpine AS deploy
COPY --from=build /data/.pub:/usr/share/caddy RUN gem install neocities
COPY --from=build /data/.pub /pub
FROM docker.io/caddy/caddy:2.8-alpine
COPY --from=build /data /srv

@ -1,3 +1,3 @@
[personal](git.woodbine.nyc/micro) [personal](//git.woodbine.nyc/micro)
[github](github.com/jedahan) [github](//github.com/jedahan)

@ -1,11 +1,30 @@
services: services:
jonathan.is: jonathan.is:
image: jonathan.is
pull_policy: never
build: build:
context: . context: .
dockerfile: Containerfile dockerfile: Containerfile
restart: unless-stopped restart: unless-stopped
ports: ports:
- "8081:80" - "8081:80"
- "8443:443"
- "8443:443/udp"
volumes: volumes:
- ./.pub:/usr/share/caddy - caddy_data:/data
- ./data:/data - caddy_config:/config
deploy:
image: localhost/jonathan.is:deploy
build:
context: .
dockerfile: Containerfile
target: deploy
pull_policy: never
env_file:
- production.env
command: "neocities push --prune /pub"
volumes:
caddy_data:
external: true
caddy_config:

@ -1,27 +1,22 @@
#!/bin/bash #!/bin/bash
set -e -u -o pipefail set -e -u
while read oldrev newrev ref while read oldrev newrev ref
do do
if [[ $ref =~ .*/main$ ]]; if [[ $ref =~ .*/main$ ]]; then
then echo "[deploy] main ref received"
echo "main ref received"
echo "moving into temporary work tree"; { echo "[deploy] moving into temporary work tree"; {
gitdir=$PWD gitdir=$PWD
cd $(mktemp -d) cd ~/jonathan.is
} }
echo "checking out latest source"; { echo "[deploy] checking out latest source"; {
git --work-tree=$PWD --git-dir=$gitdir checkout --force git --work-tree=$PWD --git-dir=$gitdir checkout --force
} }
echo "generating static site"; { echo "[deploy] building and deploying site"; {
podman compose build . --volume $PWD/.pub:/data/.pub podman-compose --podman-run-args='--log-driver=none' run deploy
}
echo "restarting server"; {
podman compose restart || podman compose up
} }
fi fi
done done

@ -0,0 +1,12 @@
#!/bin/bash
set -e -u
remote="$1"
url="$2"
echo "[deploy] updating post-receive hook"; {
ssh_host=$(echo $url | cut -d'/' -f3)
ssh_path=$(echo $url | cut -d'/' -f4-)
scp hooks/post-receive ${ssh_host}:${ssh_path}/hooks/post-receive
}

@ -2,29 +2,30 @@
title: jonathan.is title: jonathan.is
--- ---
a [hacker](images/me.jpg) of Computational Machinations, Digital Arts and Electronic Sounds, hailing from Brooklyn a [hacker](images/me.jpg) that [plays with the boundaries between the virtual and the physical](/making/12-living-room)
I am a programmer who likes to connect random inputs and outputs to see what people will do with them. a **facilitator** who teaches by learning, and learns through naive discovery with friends
I often take virtual streams and provide them physical facilities to exaggerate their impact on our lives.
I am equally uncomfortable coding in C, C++, Rust, Javascript, Typescript, Coffeescript, Python, Piet, Basic, Hypercard, and Bash.
I painted a simple [echo program](images/piet.png) and could very easily see myself holed up for the winter just with canvas and wine.
Some communities I'm a part of and love include [the school for poetic computation](sfpc.io), [~~hacker school~~ recurse center](recurse.com), [woodbine](woodbine.nyc), [arthackday](arthackday.net), [the medialab at the met](http://www.metmuseum.org/about-the-museum/museum-departments/office-of-the-director/digital-media-department/digital-underground/posts/2013/introducing-the-media-lab), and [itp camp](http://itp.nyu.edu/camp2014/). If you are interested in chatting about any of these, please reach out! a **programmer**, expressing ideas with C(++), Rust, Javascript, Hypercard, Bash, and others
a **loving participant** in communities such as [the school for poetic computation](//sfpc.io), [~~hacker school~~ recurse center](//recurse.com), [woodbine](//woodbine.nyc), [arthackday](//arthackday.net), [the medialab at the met](//www.metmuseum.org/about-the-museum/museum-departments/office-of-the-director/digital-media-department/digital-underground/posts/2013/introducing-the-media-lab), and [itp camp](//itp.nyu.edu/camp/). If you are interested in chatting about any of these, please reach out!
I painted a simple [echo program](images/piet.png) and could see myself holed up for the winter just with canvas and wine
# Creations and Consumptions # Creations and Consumptions
- <a href=github.com/jedahan rel=me>code</a> - <a href=//github.com/jedahan rel=me>code</a>
- [short thoughts](twitter.com/jedahan) - [short thoughts](//twitter.com/jedahan)
- [slightly longer thoughts](/writing) - [slightly longer thoughts](/writing)
- [where i've been](foursquare.com/jedahan) - [where i've been](//foursquare.com/jedahan)
- [oscillations](soundcloud.com/jedahan) - [oscillations](//soundcloud.com/jedahan)
- [static visuals](flickr.com/photos/37234044@N07/sets) - [static visuals](//flickr.com/photos/37234044@N07/sets)
- [motion pictures](youtube.com/jeadhan) - [motion pictures](//youtube.com/jedahan)
# Endeavours # Endeavours
- teaching at [parsons](http://jedahan.github.io/pucd2035d) - teaching at [parsons](//jedahan.github.io/pucd2035d)
- did not graduate [~~hackerschool~~ recurse center](recurse.com) - did not graduate [~~hackerschool~~ recurse center](//recurse.com)
- attended the [school for poetic computation](sfpc.io): first class - attended the [school for poetic computation](//sfpc.io): first class
- taught at the [school for poetic computation](sfpc.io) - taught at the [school for poetic computation](//sfpc.io)
- founded [Island Labs](islandlabs.org), a long island [hackerspace](wikipedia.org/HackerSpace) - founded [Island Labs](//islandlabs.org), a long island [hackerspace](//wikipedia.org/wiki/Hackerspace)
- maintain package repositories for [KISS](kisslinux.github.io), and [exherbo](exherbo.org) linux - maintain package repositories for [KISS](//kisslinux.github.io), and [exherbo](//exherbolinux.org) linux
- symposium [on programming old computers](https://www.youtube.com/watch?v=N6lX-Gxo3uM) - symposium [on programming old computers](//www.youtube.com/watch?v=N6lX-Gxo3uM)

@ -1,3 +1,3 @@
## japan visit ## japan visit
https://www.flickr.com/photos/37234044@N07/albums/72157650404738803 <a data-flickr-embed="true" href="https://www.flickr.com/photos/37234044@N07/albums/72157650404738803" title="japan"><img src="https://live.staticflickr.com/8803/17561771016_124c5f06d6.jpg" width="640" height="480" alt="japan"/></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

@ -14,8 +14,8 @@ One player is all the enemies
You only get 3 lives, and each time the game glitches out until it becomes unplayable You only get 3 lives, and each time the game glitches out until it becomes unplayable
[http://www.arthackday.net/projects/tyler-freeman-eric-van-der-molen-yodo-mario-you-only-die-once]() [//www.arthackday.net/projects/tyler-freeman-eric-van-der-molen-yodo-mario-you-only-die-once]()
<img src=tumblr_mf3ceyHjre1rlcnubo1_500_500.png width=500 height=377 /> <img src=tumblr_mf3ceyHjre1rlcnubo1_500_500.png width=500 height=377 />
<iframe width=640 height=510 src=https://www.youtube.com/embed/8g_GVGyM9rw frameborder=0 allowfullscreen></iframe> <iframe width=640 height=510 src=//www.youtube.com/embed/8g_GVGyM9rw frameborder=0 allowfullscreen></iframe>

@ -1,6 +1,6 @@
<video controls width=640><source src=banana.mp4 type="video/mp4" /></video> <video controls width=640><source src=banana.mp4 type="video/mp4" /></video>
physically programmable space, at [recurse center](recurse.com) physically programmable space, at [recurse center](//recurse.com)
# projects # projects
{{ index making }} {{ index making }}

@ -1,33 +1,26 @@
# https://jonathan.is # https://jonathan.is
## quickstart develop - using [zs](//git.mills.io/prologic/zs) built-in debug server
$ ssh server "git clone --bare https://git.woodbine.nyc/micro/jonathan.is.git" which zs || go install go.mills.io/zs@latest
$ ssh server "cd jonathan.is.git && git show HEAD:hooks/post-receive > hooks/post-receive" zs serve --debug
$ git remote add server ssh://server/~jonathan.is.git
$ git push server
## manual install test - runs a fresh build and serves with caddy
build podman compose up --build
podman build . --tag jonathan.is deploy - runs neocities cli
run podman compose run deploy
podman compose up ## continuous integration
deploy this will setup a post-receive hook, that does a fresh build + deploy
git push server git push
## todo ## todo
### deploy
- [ ] forgejo (or git?) post-receive hook -> docker build
- [ ] proxy nginx on digitalocean
- [ ] setup beta.jonathan.is dns to digitalocena
### features ### features
- [ ] generate rss feed - [ ] generate rss feed

@ -0,0 +1,33 @@
User-agent: AdsBot-Google
User-agent: Amazonbot
User-agent: anthropic-ai
User-agent: Applebot
User-agent: AwarioRssBot
User-agent: AwarioSmartBot
User-agent: Bytespider
User-agent: CCBot
User-agent: ChatGPT-User
User-agent: ClaudeBot
User-agent: Claude-Web
User-agent: cohere-ai
User-agent: DataForSeoBot
User-agent: Diffbot
User-agent: FacebookBot
User-agent: FriendlyCrawler
User-agent: Google-Extended
User-agent: GoogleOther
User-agent: GPTBot
User-agent: img2dataset
User-agent: ImagesiftBot
User-agent: magpie-crawler
User-agent: Meltwater
User-agent: omgili
User-agent: omgilibot
User-agent: peer39_crawler
User-agent: peer39_crawler/1.0
User-agent: PerplexityBot
User-agent: PiplBot
User-agent: scoop.it
User-agent: Seekr
User-agent: YouBot
Disallow: /

@ -1,19 +1,29 @@
/* single element niceties */
a { color: inherit }
img, video { max-width: 100% }
li { list-style: none }
/* for youtube embeds */
iframe { width: auto; height: auto; }
body { body {
font-size: medium; font-size: medium;
padding: 1em; padding: 1em;
max-width: 1280px; max-width: 1280px;
display: flex; display: flex;
@media(orientation: landscape) {
gap: 2em; gap: 2em;
}
} }
header { header {
background: white; background: white;
position: sticky; position: sticky;
top: 1em; top: 0;
& > nav { & nav {
background: white; background: white;
position: sticky; position: sticky;
top: 0.5em; top: 0;
display: flex; display: flex;
font-size: xx-large; font-size: xx-large;
& a { & a {
@ -33,50 +43,45 @@ main {
flex: 1; flex: 1;
} }
/* single element niceties */ menu { cursor: pointer }
a { color: inherit }
img, video { max-width: 100% }
li { list-style: none }
/* the /??? which shows in the nav on the homepage */ a[aria-current=page] {
#landing { pointer-events: none;
display: none;
text-decoration: underline; text-decoration: underline;
} }
#check { display: none; }
@media (hover: hover) {
menu:hover li {
visibility: inherit;
display: block;
}
}
/* turn the menu into a dynamic one for highly vertical devices */ /* turn the menu into a dynamic one for highly vertical devices */
@media (orientation: portrait) { @media (orientation: portrait) {
#landing.active { body {
display: block; flex-direction: column;
} }
main { main {
min-width: fit-content; min-width: fit-content;
} }
header { nav {
max-height: 1em;
top: 0em;
& > nav {
top: 1em; top: 1em;
& menu {
& li {
transition: display 3s ease;
visibility: collapse;
display: none;
} }
& li.active { #check:checked ~ .menu > nav > menu > li {
visibility: inherit; visibility: inherit;
display: block; display: block;
} }
&:hover li { nav > menu > li {
visibility: initial; visibility: collapse;
display: none;
& a[aria-current=page] {
visibility: inherit;
display: block; display: block;
} }
} }
}
}
body {
flex-direction: column;
}
} }
/* used mostly by .zs/index, should maybe class it? */ /* used mostly by .zs/index, should maybe class it? */
@ -114,26 +119,26 @@ ul {
} }
li:nth-of-type(6n + 1):hover, li:nth-of-type(6n + 1):hover,
li.active:nth-of-type(6n + 1) { a[aria-current=page]:nth-of-type(6n + 1) {
color: var(--red); color: var(--red);
} }
li:nth-of-type(6n + 2):hover, li:nth-of-type(6n + 2):hover,
li.active:nth-of-type(6n + 2) { a[aria-current=page]:nth-of-type(6n + 2) {
color: var(--orange); color: var(--orange);
} }
li:nth-of-type(6n + 3):hover, li:nth-of-type(6n + 3):hover,
li.active:nth-of-type(6n + 3) { a[aria-current=page]:nth-of-type(6n + 3) {
color: var(--pink); color: var(--pink);
} }
li:nth-of-type(6n + 4):hover, li:nth-of-type(6n + 4):hover,
li.active:nth-of-type(6n + 4) { a[aria-current=page]:nth-of-type(6n + 4) {
color: var(--green); color: var(--green);
} }
li:nth-of-type(6n + 5):hover, li:nth-of-type(6n + 5):hover,
li.active:nth-of-type(6n + 5) { a[aria-current=page]:nth-of-type(6n + 5) {
color: var(--blue); color: var(--blue);
} }
li:nth-of-type(6n + 6):hover, li:nth-of-type(6n + 6):hover,
li.active:nth-of-type(6n + 6) { a[aria-current=page]:nth-of-type(6n + 6) {
color: var(--purple); color: var(--purple);
} }

@ -1,17 +1,17 @@
[download as pdf](/resume.pdf) [download as pdf](/resume.pdf)
<section id="contact"> <section id=contact>
<h1>Jonathan Dahan</h1> <h1>Jonathan Dahan</h1>
<p>✉️ <a href="mailto:resume@jonathan.is">hi</a>@<a href="http://jonathan.is">jonathan.is</a> 🕸 <a href="http://jedahan.com">jedahan.com</a> <a href="https://github.com/jedahan">github.com/jedahan</a></p> <p>✉️ <a href="mailto:resume@jonathan.is">hi</a>@<a href="//jonathan.is">jonathan.is</a><a href="//github.com/jedahan">github.com/jedahan</a></p>
</section> </section>
<section id="experience"> <section id=experience>
<h2>experience</h2> <h2>experience</h2>
<div class="position"> <div class=position>
<div class="title"> <div class=title>
<h3>Fullstack Engineer at <a href="https://reaktor.com">Reaktor</a></h3> <h3>Fullstack Engineer at <a href="//reaktor.com">Reaktor</a></h3>
<div>September 2019 - Present</div> <div>September 2019 - Present</div>
</div> </div>
<ul> <ul>
@ -23,9 +23,9 @@
</ul> </ul>
</div> </div>
<div class="position"> <div class=position>
<div class="title"> <div class=title>
<h3>Founder of <a href="https://baculus.co">Baculus</a></h3> <h3>Founder of <a href="//baculus.co">Baculus</a></h3>
<div>August 2018 - August 2019</div> <div>August 2018 - August 2019</div>
</div> </div>
<ul> <ul>
@ -36,9 +36,9 @@
</ul> </ul>
</div> </div>
<div class="position"> <div class=position>
<div class="title"> <div class=title>
<h3>Technical Consultant for <a href="https://smalldata.industries">Small Data Industries</a></h3> <h3>Technical Consultant for <a href="//smalldata.industries">Small Data Industries</a></h3>
<div>October 2018 - August 2019</div> <div>October 2018 - August 2019</div>
</div> </div>
<ul> <ul>
@ -49,9 +49,9 @@
</ul> </ul>
</div> </div>
<div class="position"> <div class=position>
<div class="title"> <div class=title>
<h3>Fullstack Freelance Engineer for <a href="https://micahwalter.studio">Micah Walter Studio</a></h3> <h3>Fullstack Freelance Engineer for <a href="//micahwalter.studio">Micah Walter Studio</a></h3>
<div>September 2017 - June 2018</div> <div>September 2017 - June 2018</div>
</div> </div>
<ul> <ul>
@ -59,9 +59,9 @@
</ul> </ul>
</div> </div>
<div class="position"> <div class=position>
<div class="title"> <div class=title>
<h3>Software Engineer for <a href="https://etsy.com">Etsy</a></h3> <h3>Software Engineer for <a href="//etsy.com">Etsy</a></h3>
<div>December 2015 - August 2017</div> <div>December 2015 - August 2017</div>
</div> </div>
<ul> <ul>
@ -71,9 +71,9 @@
</ul> </ul>
</div> </div>
<div class="position"> <div class=position>
<div class="title"> <div class=title>
<h3>Freelance Developer for <a href="http://www.bgc.bard.edu/gallery/gallery-at-bgc/the-interface-experience.html">Bard Graduate Center</a></h3> <h3>Freelance Developer for <a href="//interface-experience.org">The Interface Experience</a> at <a href="//www.bgc.bard.edu/exhibitions/exhibitions/10/the-interface-experience">Bard Graduate Center</a></h3>
<div>September 2014 - July 2015</div> <div>September 2014 - July 2015</div>
</div> </div>
<ul> <ul>
@ -83,9 +83,9 @@
</ul> </ul>
</div> </div>
<div class="position"> <div class=position>
<div class="title"> <div class=title>
<h3>Freelance Developer for <a href="http://www.rockwellgroup.com/">Lab@Rockwell</a>, <a href="http://www.fakelove.tv/work/exhibit-growth">Fake Love</a></h3> <h3>Freelance Developer for <a href="//www.rockwellgroup.com">Lab@Rockwell</a>, <a href="//www.fakelove.tv/work/exhibit-growth">Fake Love</a></h3>
<div>October 2013 - October 2014</div> <div>October 2013 - October 2014</div>
</div> </div>
<ul> <ul>
@ -94,9 +94,9 @@
</ul> </ul>
</div> </div>
<div class="position"> <div class=position>
<div class="title"> <div class=title>
<h3>Media Technology Developer at <a href="http://www.metmuseum.org/about-the-museum/museum-departments/office-of-the-director/digital-media-department/medialab">Metropolitan Museum of Art</a></h3> <h3>Media Technology Developer at <a href="//www.metmuseum.org/about-the-museum/museum-departments/office-of-the-director/digital-media-department/medialab">Metropolitan Museum of Art</a></h3>
<div>February 2012 - August 2014</div> <div>February 2012 - August 2014</div>
</div> </div>
<ul> <ul>
@ -109,49 +109,49 @@
</ul> </ul>
</div> </div>
<div class="title"> <div class=title>
<div></div> <div></div>
<div>Previous experience available on request</div> <div>Previous experience available on request</div>
</div> </div>
</div> </div>
</section> </section>
<section id="communities"> <section id=communities>
<h2>communities</h2> <h2>communities</h2>
<h3><a href="https://nycresistor.org">NYC Resistor</a></h3> <h3><a href="//nycresistor.org">NYC Resistor</a></h3>
<p>Member and teacher. Built out <a href="https://baculus.co">Baculus</a>, program and repair of CNC milling machines.</p> <p>Member and teacher. Built out <a href="//baculus.co">Baculus</a>, program and repair of CNC milling machines.</p>
<h3><a href="http://recurse.com">Recurse Center</a></h3> <h3><a href="//recurse.com">Recurse Center</a></h3>
<ul> <ul>
<li>Participant. Created a custom NES/famicom controller (in C and arduino) that could playback emulator speedruns on real hardware, build the basics of a blockchain client in rust, and learned a bit about networking layers with an online MOOC. <li>Participant. Created a custom NES/famicom controller (in C and arduino) that could playback emulator speedruns on real hardware, build the basics of a blockchain client in rust, and learned a bit about networking layers with an online MOOC.
<li>Researched and built <a href="https://github.com/living-room">a programmable room</a>, including tools to introduce interactivity in a physical space. <li>Researched and built <a href="//github.com/living-room">a programmable room</a>, including tools to introduce interactivity in a physical space.
<li>Programmed C/C++/openFrameworks computer vision tools, and a node.js db/event queue to allow others to contribute new sensors and visualizers. <li>Programmed C/C++/openFrameworks computer vision tools, and a node.js db/event queue to allow others to contribute new sensors and visualizers.
</ul> </ul>
<h3><a href="http://sfpc.io">School for Poetic Computation</a></h3> <h3><a href="//sfpc.io">School for Poetic Computation</a></h3>
<p>Programmed and painted a <a href="http://www.dangermouse.net/esoteric/piet.html">piet</a> program whose source code is just a bitmap. Built a <a href="https://github.com/jedahan/pagesounds">network sonifier</a> to make it easier to understand what is going on with your machine and the rest of a local network. Made a collaborative light drawing robot out of an old pen plotter</p> <p>Programmed and painted a <a href="//www.dangermouse.net/esoteric/piet.html">piet</a> program whose source code is just a bitmap. Built a <a href="https://github.com/jedahan/pagesounds">network sonifier</a> to make it easier to understand what is going on with your machine and the rest of a local network. Made a collaborative light drawing robot out of an old pen plotter</p>
</section> </section>
<section id="projects"> <section id=projects>
<h2>projects</h2> <h2>projects</h2>
<p>Won Hackaday's superconference <a href="https://hackaday.com/2016/11/16/solving-hackadays-crypto-challenge/#more-230676">Badge CTF</a>!</p> <p>Won Hackaday's superconference <a href="//hackaday.com/2016/11/16/solving-hackadays-crypto-challenge/#more-230676">Badge CTF</a>!</p>
<p>Created a <a href="https://hackaday.io/project/7002-autones-zero-player-nesfamicom">0-Player Famicom</a> that played back speedruns on an unmodified famicom/NES using an arduino as a fake controller. <p>Created a <a href="//hackaday.io/project/7002-autones-zero-player-nesfamicom">0-Player Famicom</a> that played back speedruns on an unmodified famicom/NES using an arduino as a fake controller.
<p>Built a game of <a href="http://events.ccc.de/camp/2011/wiki/BadgeAssassin">assassin</a> at <a href="http://events.ccc.de/camp/2011">CCC</a> using the <a href="http://r0ket.badge.events.ccc.de/">camp badges</a> radio as local radar, confused all nonparticipants.</p> <p>Built a game of <a href="//events.ccc.de/camp/2011/wiki/BadgeAssassin">assassin</a> at <a href="//events.ccc.de/camp/2011">CCC</a> using the <a href="//github.com/r0ket/r0ket">camp badges</a> radio as local radar, confused all nonparticipants.</p>
<p>Creation of <a href="#">multiplayer synth</a> - a network/phone-controlled motors and relays using OSC and arduinos</p> <p>Creation of <a href="#">multiplayer synth</a> - a network/phone-controlled motors and relays using OSC and arduinos</p>
<p>Captured <a href="http://islandlabs.org/space">photography of space</a> and the tri-state area and captured the curvature of the earth from 34,000m with off-the-shelf hardware</p> <p>Captured <a href="//islandlabs.org/space">photography of space</a> and the tri-state area and captured the curvature of the earth from 34,000m with off-the-shelf hardware</p>
<p>Packaged around 100 applications for the <a href="http://exherbo.org/">exherbo linux</a> distribution, contributing to user documentation</p> <p>Packaged around 100 applications for the <a href="//exherbolinux.org/">exherbo linux</a> distribution, contributing to user documentation</p>
<p>Built API to access live position tracking of thousands of attendees as part of the <a href="http://amd.hope.net">AMD at HOPE</a> team, during a three-day conference. Enabled developers to create games on the platform</p> <p>Built API to access live position tracking of thousands of attendees as part of the <a href="//vii.hope.net/amd.php">AMD at HOPE</a> team, during a three-day conference. Enabled developers to create games on the platform</p>
</section> </section>
<section id="education"> <section id=education>
<h2>education</h2> <h2>education</h2>
<ul> <ul>

Loading…
Cancel
Save