Compare commits

..

No commits in common. '45df4976fbee3c0f71fee606e59301d8ab2354b5' and '1fa501d50886d761adf0759e0409c3f33f32bf5a' have entirely different histories.

1
.gitignore vendored

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

@ -0,0 +1,4 @@
#!/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

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

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

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

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

@ -1,30 +1,11 @@
services:
jonathan.is:
image: jonathan.is
pull_policy: never
build:
context: .
dockerfile: Containerfile
restart: unless-stopped
ports:
- "8081:80"
- "8443:443"
- "8443:443/udp"
volumes:
- caddy_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:
- ./.pub:/usr/share/caddy
- ./data:/data

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

@ -1,12 +0,0 @@
#!/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,30 +2,29 @@
title: jonathan.is
---
a [hacker](images/me.jpg) that [plays with the boundaries between the virtual and the physical](/making/12-living-room)
a [hacker](images/me.jpg) of Computational Machinations, Digital Arts and Electronic Sounds, hailing from Brooklyn
a **facilitator** who teaches by learning, and learns through naive discovery with friends
I am a programmer who likes to connect random inputs and outputs to see what people will do with them.
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.
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
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!
# Creations and Consumptions
- <a href=//github.com/jedahan rel=me>code</a>
- [short thoughts](//twitter.com/jedahan)
- <a href=github.com/jedahan rel=me>code</a>
- [short thoughts](twitter.com/jedahan)
- [slightly longer thoughts](/writing)
- [where i've been](//foursquare.com/jedahan)
- [oscillations](//soundcloud.com/jedahan)
- [static visuals](//flickr.com/photos/37234044@N07/sets)
- [motion pictures](//youtube.com/jedahan)
- [where i've been](foursquare.com/jedahan)
- [oscillations](soundcloud.com/jedahan)
- [static visuals](flickr.com/photos/37234044@N07/sets)
- [motion pictures](youtube.com/jeadhan)
# Endeavours
- teaching at [parsons](//jedahan.github.io/pucd2035d)
- did not graduate [~~hackerschool~~ recurse center](//recurse.com)
- attended the [school for poetic computation](//sfpc.io): first class
- taught at the [school for poetic computation](//sfpc.io)
- founded [Island Labs](//islandlabs.org), a long island [hackerspace](//wikipedia.org/wiki/Hackerspace)
- maintain package repositories for [KISS](//kisslinux.github.io), and [exherbo](//exherbolinux.org) linux
- symposium [on programming old computers](//www.youtube.com/watch?v=N6lX-Gxo3uM)
- teaching at [parsons](http://jedahan.github.io/pucd2035d)
- did not graduate [~~hackerschool~~ recurse center](recurse.com)
- attended the [school for poetic computation](sfpc.io): first class
- taught at the [school for poetic computation](sfpc.io)
- founded [Island Labs](islandlabs.org), a long island [hackerspace](wikipedia.org/HackerSpace)
- maintain package repositories for [KISS](kisslinux.github.io), and [exherbo](exherbo.org) linux
- symposium [on programming old computers](https://www.youtube.com/watch?v=N6lX-Gxo3uM)

@ -1,3 +1,3 @@
## japan visit
<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>
https://www.flickr.com/photos/37234044@N07/albums/72157650404738803

@ -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
[//www.arthackday.net/projects/tyler-freeman-eric-van-der-molen-yodo-mario-you-only-die-once]()
[http://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 />
<iframe width=640 height=510 src=//www.youtube.com/embed/8g_GVGyM9rw frameborder=0 allowfullscreen></iframe>
<iframe width=640 height=510 src=https://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>
physically programmable space, at [recurse center](//recurse.com)
physically programmable space, at [recurse center](recurse.com)
# projects
{{ index making }}

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

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

@ -1,17 +1,17 @@
[download as pdf](/resume.pdf)
<section id=contact>
<section id="contact">
<h1>Jonathan Dahan</h1>
<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>
<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>
</section>
<section id=experience>
<section id="experience">
<h2>experience</h2>
<div class=position>
<div class=title>
<h3>Fullstack Engineer at <a href="//reaktor.com">Reaktor</a></h3>
<div class="position">
<div class="title">
<h3>Fullstack Engineer at <a href="https://reaktor.com">Reaktor</a></h3>
<div>September 2019 - Present</div>
</div>
<ul>
@ -23,9 +23,9 @@
</ul>
</div>
<div class=position>
<div class=title>
<h3>Founder of <a href="//baculus.co">Baculus</a></h3>
<div class="position">
<div class="title">
<h3>Founder of <a href="https://baculus.co">Baculus</a></h3>
<div>August 2018 - August 2019</div>
</div>
<ul>
@ -36,9 +36,9 @@
</ul>
</div>
<div class=position>
<div class=title>
<h3>Technical Consultant for <a href="//smalldata.industries">Small Data Industries</a></h3>
<div class="position">
<div class="title">
<h3>Technical Consultant for <a href="https://smalldata.industries">Small Data Industries</a></h3>
<div>October 2018 - August 2019</div>
</div>
<ul>
@ -49,9 +49,9 @@
</ul>
</div>
<div class=position>
<div class=title>
<h3>Fullstack Freelance Engineer for <a href="//micahwalter.studio">Micah Walter Studio</a></h3>
<div class="position">
<div class="title">
<h3>Fullstack Freelance Engineer for <a href="https://micahwalter.studio">Micah Walter Studio</a></h3>
<div>September 2017 - June 2018</div>
</div>
<ul>
@ -59,9 +59,9 @@
</ul>
</div>
<div class=position>
<div class=title>
<h3>Software Engineer for <a href="//etsy.com">Etsy</a></h3>
<div class="position">
<div class="title">
<h3>Software Engineer for <a href="https://etsy.com">Etsy</a></h3>
<div>December 2015 - August 2017</div>
</div>
<ul>
@ -71,9 +71,9 @@
</ul>
</div>
<div class=position>
<div class=title>
<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 class="position">
<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>
<div>September 2014 - July 2015</div>
</div>
<ul>
@ -83,9 +83,9 @@
</ul>
</div>
<div class=position>
<div class=title>
<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 class="position">
<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>
<div>October 2013 - October 2014</div>
</div>
<ul>
@ -94,9 +94,9 @@
</ul>
</div>
<div class=position>
<div class=title>
<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 class="position">
<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>
<div>February 2012 - August 2014</div>
</div>
<ul>
@ -109,49 +109,49 @@
</ul>
</div>
<div class=title>
<div class="title">
<div></div>
<div>Previous experience available on request</div>
</div>
</div>
</section>
<section id=communities>
<section id="communities">
<h2>communities</h2>
<h3><a href="//nycresistor.org">NYC Resistor</a></h3>
<p>Member and teacher. Built out <a href="//baculus.co">Baculus</a>, program and repair of CNC milling machines.</p>
<h3><a href="https://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>
<h3><a href="//recurse.com">Recurse Center</a></h3>
<h3><a href="http://recurse.com">Recurse Center</a></h3>
<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>Researched and built <a href="//github.com/living-room">a programmable room</a>, including tools to introduce interactivity in a physical space.
<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>Programmed C/C++/openFrameworks computer vision tools, and a node.js db/event queue to allow others to contribute new sensors and visualizers.
</ul>
<h3><a href="//sfpc.io">School for Poetic Computation</a></h3>
<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>
<h3><a href="http://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>
</section>
<section id=projects>
<section id="projects">
<h2>projects</h2>
<p>Won Hackaday's superconference <a href="//hackaday.com/2016/11/16/solving-hackadays-crypto-challenge/#more-230676">Badge CTF</a>!</p>
<p>Won Hackaday's superconference <a href="https://hackaday.com/2016/11/16/solving-hackadays-crypto-challenge/#more-230676">Badge CTF</a>!</p>
<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>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>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>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>Creation of <a href="#">multiplayer synth</a> - a network/phone-controlled motors and relays using OSC and arduinos</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>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>Packaged around 100 applications for the <a href="//exherbolinux.org/">exherbo linux</a> distribution, contributing to user documentation</p>
<p>Packaged around 100 applications for the <a href="http://exherbo.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="//vii.hope.net/amd.php">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="http://amd.hope.net">AMD at HOPE</a> team, during a three-day conference. Enabled developers to create games on the platform</p>
</section>
<section id=education>
<section id="education">
<h2>education</h2>
<ul>

Loading…
Cancel
Save