aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper Van der Jeugt2020-08-22 14:47:58 +0200
committerJasper Van der Jeugt2020-08-22 14:47:58 +0200
commit7f5e0db31447cc612cf469ef07854677f9d25b83 (patch)
treea066c0ba7f22c32632c2427b6c17c5fa0c357e24
parent5a2a71cb50fd892585c7e5f3af726ac750ecb097 (diff)
Multiple card sets
-rw-r--r--Makefile8
-rw-r--r--black.txt60
-rw-r--r--cards.yaml234
-rw-r--r--client/src/Client.elm2
-rw-r--r--server/lib/Uplcg/Cards.hs17
-rw-r--r--server/lib/Uplcg/Game.hs2
-rw-r--r--server/lib/Uplcg/Main/Server.hs55
-rw-r--r--server/lib/Uplcg/Views.hs9
-rw-r--r--server/uplcg.cabal4
-rw-r--r--white.txt170
10 files changed, 292 insertions, 269 deletions
diff --git a/Makefile b/Makefile
index 840f46c..2036434 100644
--- a/Makefile
+++ b/Makefile
@@ -8,8 +8,7 @@ STACK_BIN=$(shell cd server && stack path --local-install-root)/bin
.PHONY: build
build: server/assets/client.js \
server/assets/style.css \
- server/assets/black.txt \
- server/assets/white.txt
+ server/assets/cards.yaml
.PHONY: docker
docker:
@@ -37,8 +36,5 @@ server/assets/client.js: $(ELM_MESSAGES_SOURCE) $(ELM_SOURCES)
server/assets/style.css: client/style.css
cp $< $@
-server/assets/black.txt: black.txt
- cp $< $@
-
-server/assets/white.txt: white.txt
+server/assets/cards.yaml: cards.yaml
cp $< $@
diff --git a/black.txt b/black.txt
deleted file mode 100644
index ed7232a..0000000
--- a/black.txt
+++ /dev/null
@@ -1,60 +0,0 @@
-# ICFP2020 Cards
-\BLANK is just \BLANK in the Category of \BLANK.
-My next paper title? The next 700 \BLANK.
-Procrastinating on my paper by working on \BLANK.
-\BLANK and \BLANK. A match made in heaven.
-Without \BLANK we wouldn't have \BLANK.
-Reviewer 2 found my paper guilty of \BLANK.
-\BLANK is just a special case of \BLANK.
-Listen, if you want to get involved with \BLANK, just stay clear of \BLANK.
-\BLANK would be woefully incomplete without \BLANK.
-\BLANK: Hours of fun. Easy to use. Perfect for \BLANK!
-
-# Some cards taken from:
-# https://github.com/CardsAgainstCryptography/CAC/blob/master/src/white.txt
-# Slightly modified to take out most sexist / racist / ... stuff and comply
-# with the uplcg format. Added more \BLANKs to a few because we can.
-A PL conference is never complete without \BLANK.
-Both Microsoft and Apple have concerns with \BLANK.
-Did you hear that \BLANK is the new hot topic?
-Due to the Covid crisis, I have rekindled my enthusiasm for \BLANK.
-I always include \BLANK in my reviewer feedback.
-I can't believe I got away with \BLANK.
-I can't believe my grant application for \BLANK was denied!
-I can't concentrate without \BLANK.
-I drink to forget \BLANK.
-I find that \BLANK relieves pre-submission stress.
-I get by with a little help from \BLANK.
-I got 99 problems but \BLANK ain't one.
-I hope no one finds out about \BLANK.
-I just got out of an incomprehensible talk on \BLANK and \BLANK.
-I just hope the reviewers don't notice \BLANK.
-I only got through my PhD because of a long-winded explanation of \BLANK.
-I think I will skip the session on \BLANK this year.
-I was surprised to get no questions about \BLANK the end of my presentation on \BLANK.
-I woke up drenched in sweat from a nightmare about \BLANK.
-I woke up filled with shame about \BLANK.
-I'm hoping to avoid 2/3 of the program committee, because my paper is on \BLANK.
-I'm sorry, Professor, but I couldn't complete my homework because of \BLANK.
-My academic CV says I'm an expert on \BLANK.
-My career started with \BLANK.
-My favourite thing about online conferences is \BLANK.
-One regret I have from my PhD is \BLANK.
-Putting \BLANK in my application helped me immensely.
-Remembering \BLANK, then immediately vomiting.
-Self-isolation is fantastic for \BLANK.
-The next big thing will almost certainly be \BLANK.
-The talk that had the most influence on my personal life was \BLANK.
-When I am President of the United States, I will create the Department of \BLANK.
-Why can't I sleep at night? \BLANK
-\BLANK kept me up all night.
-When all this is over, I'm not looking forward to \BLANK.
-What's a programmer's best friend? \BLANK
-What's my secret power? \BLANK
-
-# CaH with minor edits
-\BLANK + \BLANK = \BLANK
-Step 1: \BLANK. Step 2: \BLANK. Step 3: Profit.
-\BLANK is a slippery slope that leads to \BLANK.
-\BLANK & \BLANK: The Musical.
-I got 99 problems but \BLANK ain’t one.
diff --git a/cards.yaml b/cards.yaml
new file mode 100644
index 0000000..4b3d5cb
--- /dev/null
+++ b/cards.yaml
@@ -0,0 +1,234 @@
+icfp2020:
+ black:
+ # ICFP2020 Cards
+ - _ is just _ in the Category of _.
+ - My next paper title? The next 700 _.
+ - Procrastinating on my paper by working on _.
+ - _ and _. A match made in heaven.
+ - Without _ we wouldn't have _.
+ - Reviewer 2 found my paper guilty of _.
+ - _ is just a special case of _.
+ - Listen, if you want to get involved with _, just stay clear of _.
+ - _ would be woefully incomplete without _.
+ - "_: Hours of fun. Easy to use. Perfect for _!"
+
+ # Some cards taken from:
+ # https://github.com/CardsAgainstCryptography/CAC/blob/master/src/white.txt
+ # Slightly modified to take out most sexist / racist / ... stuff and comply
+ # with the uplcg format. Added more _s to a few because we can.
+ - A PL conference is never complete without _.
+ - Both Microsoft and Apple have concerns with _.
+ - Did you hear that _ is the new hot topic?
+ - Due to the Covid crisis, I have rekindled my enthusiasm for _.
+ - I always include _ in my reviewer feedback.
+ - I can't believe I got away with _.
+ - I can't believe my grant application for _ was denied!
+ - I can't concentrate without _.
+ - I drink to forget _.
+ - I find that _ relieves pre-submission stress.
+ - I get by with a little help from _.
+ - I got 99 problems but _ ain't one.
+ - I hope no one finds out about _.
+ - I just got out of an incomprehensible talk on _ and _.
+ - I just hope the reviewers don't notice _.
+ - I only got through my PhD because of a long-winded explanation of _.
+ - I think I will skip the session on _ this year.
+ - I was surprised to get no questions about _ the end of my presentation on _.
+ - I woke up drenched in sweat from a nightmare about _.
+ - I woke up filled with shame about _.
+ - I'm hoping to avoid 2/3 of the program committee, because my paper is on _.
+ - I'm sorry, Professor, but I couldn't complete my homework because of _.
+ - My academic CV says I'm an expert on _.
+ - My career started with _.
+ - My favourite thing about online conferences is _.
+ - One regret I have from my PhD is _.
+ - Putting _ in my application helped me immensely.
+ - Remembering _, then immediately vomiting.
+ - Self-isolation is fantastic for _.
+ - The next big thing will almost certainly be _.
+ - The talk that had the most influence on my personal life was _.
+ - When I am President of the United States, I will create the Department of _.
+ - Why can't I sleep at night? _
+ - _ kept me up all night.
+ - When all this is over, I'm not looking forward to _.
+ - What's a programmer's best friend? _
+ - What's my secret power? _
+
+ # CaH with minor edits
+ - _ + _ = _
+ - "Step 1: _. Step 2: _. Step 3: Profit."
+ - _ is a slippery slope that leads to _.
+ - "_ & _: The Musical."
+ - I got 99 problems but _ ain’t one.
+
+ white:
+ # ICFP2020 Cards
+ - a Monad
+ - a Monoid
+ - Endofunctors
+ - JavaScript
+ - Haskell
+ - Scheme
+ - Racket
+ - C
+ - C++
+ - abstract nonsense
+ - mutability
+ - type theory
+ - pointers
+ - a proof left as an exercise to the reader
+ - the independence of dependent types
+ - 100 pages of proof appendix
+ - the Vim vs Emacs dilemma
+ - the fear of side effects
+ - error reporting
+ - readable type errors
+ - Haskell wins at ICFP programming contest
+ - C++ wins at ICFP programming contest
+ - a cryptocurrency developed using Coq
+ - monads are like burritos
+ - the egg of Coq
+ - the real origin of the Coq name
+ - HoTT getting cold
+ - the lambdaman
+ - a presentation without a joke
+ - a french paper not formalized in Coq
+ - a non-poultry themed Coq library
+ - ICFP
+ - POPL
+ - PLDI
+ - OOPSLA
+ - cabal hell
+ - Category Theory
+ - executing Agda code
+ - a job talk starting with Heartbleed
+ - a type system that prevents planes from crashing
+ - pLdI iS bEtTeR tHaN iCfP
+ - a time when ML did not mean machine learning
+
+ # SML and formal semantics
+ - that CSmith found 0* bugs in CompCert
+ - well-typed programs don't go wrong
+ - a complete type system
+ - division by zero
+ - a Brief, Incomplete, and Mostly Wrong History of Programming Languages
+ # - no class, no state
+ # - soundy
+ - an abstract domain for neural networks
+ - a PhD office with windows
+ - a profile picture from 20 years ago
+ - an academic website powered by Hakyll
+ - continuations
+ - liberally adding axioms
+ - unironically using Windows
+ - my parents asking when I’ll get a real job
+ - PL memes
+ - not really caring about OOP
+ - endless discussions about syntax
+
+ # paper titles
+ - do be do be do
+ - the marriage of effects and monads
+ - Coq Coq Correct!
+ # - gradual typing is dead
+
+ # Cards including comminity people's names that we should ask for permission
+ - Conor's high tech presentation
+ - an ICFP with 0 SPJ accepted papers
+ - Ranjit's Lambda Style
+ # - Asking Annabelle
+ # - HIcks
+ # - a climate change talk by Benjamin Pierce
+ # - Stephanie
+ # - Adam
+ # - Phil Wadler
+ # - Ron + Tander
+
+ # Cards taken from
+ # https://github.com/CardsAgainstCryptography/CAC/blob/master/src/white.txt
+ # Filtered down to remove some sexism / racism / ... and irrelevant cards.
+ - 100% talks, 0% human interaction
+ - Thinking I'm so clever for using pictures of Alice (Cooper) and Bob (Marley)
+ - a career-limiting card game
+ - a hand wavy argument
+ - a proof that appears in the "full version"
+ - a violent and bloody PhD defence
+ - academic integrity
+ - actually being "sorry for the late reply"
+ - an "anonymous" reviewer insisting I cite 6 papers by the same author
+ - an overfull hbox
+ - arriving 13 minutes late to a 15 minute talk and having the gall to ask a question
+ - being the only smartly dressed person in the room
+ - best rejected paper award
+ - checking my Google Scholar profile daily
+ - citing personal communication.
+ - conferences with 5 submissions at 11:59pm
+ - crippling student debt
+ - day drinking
+ - deadline day flatulence
+ - deliberately hiding inefficiencies inside the big O
+ - deliberately not referencing a superior paper
+ - doing Facebook maths puzzles to show I am better than those idiot 97%.
+ - drinking alone
+ - explaining what my job is at a family reunion
+ - falling asleep in a 5-person meeting
+ - feeling flattered because a conference spam email addressed me as Professor
+ - fighting over LaTeX syntax
+ - forgetting my VGA adapter
+ - frantically taking notes during every talk
+ - getting a fourth cookie during a coffee break because I have no one to talk to
+ - getting stuck at the French-speaking banquet table
+ - getting tenure, then chilling out
+ - having time to catch up on my reading, then not doing it
+ - having to write a polite rebuttal to the reviewer who clearly didn't read past page 2
+ - hiding my conflict of interest
+ - ignoring reviewer comments and resubmitting immediately
+ - ignoring the session chair flashing 5 minutes left because I've got 23 slides to go
+ - including an XKCD comic in my slides because I'm so original
+ - making claims in the submission that you hope you can achieve before the rebuttal
+ - my dear friend the Program Chair overruling 3 borderline rejects on my paper
+ - my successful career at a patent troll company
+ - my supervisor's morning breath
+ - not feeling guilty about falling asleep during the keynote
+ - not having to wear pants
+ - not needing to pretend to listen to the other speakers in my session
+ - overselling it hard in the introduction
+ - politely starting an answer with "That's a good question...", when the question is actually idiotic
+ - preparing for two weeks to give a 15-minute presentation to a room of 7 people all on their laptops
+ - pretending to understand
+ - publishing anyway
+ - putting an outdoors-y photo on my academic webpage to look well-rounded
+ - quickly trying to peek at someone's badge as I shake their hand, but it's flipped backwards
+ - relatives who ask me to help them install their printer on Windows
+ - remembering when "working from home" meant a day off
+ - sending an email at 11pm so people think I work hard
+ - Zoom dropping out every 10 to 15 seconds
+ - social sciences
+ - someone less senior than me signing off with "Thanks in advance"
+ - starting a conversation with "When did you fly in?", because I have nothing interesting to say
+ - telling anyone who'll listen quite how busy I am
+ - thanking the anonymous reviewers for their "useful" comments
+ - the awkward question the chair asks when nobody understood the talk
+ - the awkward silence of 8 people standing in a circle during the afternoon coffee break
+ - the great paywall of IEEE
+ - the intoxicating aroma of 12 PhD students in one office
+ - the one suit I own for meetings with industry
+ - the person in the front row taking photos of every slide
+ - the sound of 50 people on a Zoom call all trying to speak at once
+ - the student body
+ - throwing a party for my next citation milestone
+ - turning up to one meeting and claiming co-authorship
+ - tweeting about my paper acceptance
+ - undergrads
+ - using Beamer because it's social suicide to use PowerPoint
+ - using "it clearly follows" when the implied following is anything but clear
+ - using "we should talk about this offline" because the question exposes holes in my paper
+ - using indecipherable, non-standard notation to hide a dodgy proof
+ - wearing a T-shirt with a Linux joke
+ - wearing a conference t-shirt... in public
+ - wistfully looking out of the window of my overly-cramped PhD office
+ - writing a reference for someone I can't remember meeting
+ - Ctrl+F'ing to see how many times I'm cited and finding "0 results"
+ - '"Working" remotely'
+ - a slide deck entirely in Comic Sans
+ - a shepherd that won't budge
diff --git a/client/src/Client.elm b/client/src/Client.elm
index 439acea..137ebbe 100644
--- a/client/src/Client.elm
+++ b/client/src/Client.elm
@@ -238,7 +238,7 @@ intersperseWith values def list = case list of
blackCardContent : Cards -> BlackCard -> List String
blackCardContent cards (Messages.BlackCard idx) =
- String.split "\\BLANK" <| Maybe.withDefault "" <| Array.get idx cards.black
+ String.split "_" <| Maybe.withDefault "" <| Array.get idx cards.black
blackCardBlanks : Cards -> BlackCard -> Int
blackCardBlanks cards c = List.length (blackCardContent cards c) - 1
diff --git a/server/lib/Uplcg/Cards.hs b/server/lib/Uplcg/Cards.hs
new file mode 100644
index 0000000..27d5240
--- /dev/null
+++ b/server/lib/Uplcg/Cards.hs
@@ -0,0 +1,17 @@
+module Uplcg.Cards
+ ( Deck
+ , CardSets
+ , loadCardSets
+ ) where
+
+import qualified Data.HashMap.Strict as HMS
+import qualified Data.Text as T
+import qualified Data.Yaml as Yaml
+import Uplcg.Messages
+
+type Deck = T.Text
+
+type CardSets = HMS.HashMap Deck Cards
+
+loadCardSets :: FilePath -> IO CardSets
+loadCardSets path = Yaml.decodeFileThrow path
diff --git a/server/lib/Uplcg/Game.hs b/server/lib/Uplcg/Game.hs
index 02e40cb..140f2b6 100644
--- a/server/lib/Uplcg/Game.hs
+++ b/server/lib/Uplcg/Game.hs
@@ -157,7 +157,7 @@ leaveGame pid game = case game ^? gamePlayers . ix pid of
blackCardBlanks :: Cards -> BlackCard -> Int
blackCardBlanks cards (BlackCard c) =
- maybe 0 (length . T.breakOnAll "\\BLANK") $ cardsBlack cards V.!? c
+ maybe 0 (length . T.breakOnAll "_") $ cardsBlack cards V.!? c
maximaOn :: Ord o => (a -> o) -> [a] -> [a]
maximaOn f = \case [] -> []; x : xs -> go [x] (f x) xs
diff --git a/server/lib/Uplcg/Main/Server.hs b/server/lib/Uplcg/Main/Server.hs
index 295b736..4a3829b 100644
--- a/server/lib/Uplcg/Main/Server.hs
+++ b/server/lib/Uplcg/Main/Server.hs
@@ -25,10 +25,8 @@ import Data.Maybe (isNothing)
import Data.String (fromString)
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
-import qualified Data.Text.IO as T
import qualified Data.Text.Lazy as TL
import Data.Traversable (for)
-import qualified Data.Vector as V
import qualified Network.HTTP.Types.Status as HttpStatus
import qualified Network.HTTP.Types.URI as HttpUri
import qualified Network.Wai as Wai
@@ -40,6 +38,7 @@ import System.Environment (getEnv)
import qualified System.Log.FastLogger as FL
import System.Random (StdGen, newStdGen)
import Text.Blaze.Html.Renderer.Text (renderHtml)
+import Uplcg.Cards
import qualified Uplcg.CookieSocket as CookieSocket
import Uplcg.Game
import Uplcg.Messages
@@ -63,21 +62,15 @@ data Room = Room
data Server = Server
{ serverLogger :: FL.FastLogger
, serverCookieSocket :: CookieSocket.Handle Player
- , serverCards :: Cards
+ , serverCards :: CardSets
, serverRooms :: MVar (HMS.HashMap RoomId Room)
}
-readCards :: IO Cards
-readCards = Cards
- <$> fmap parseCards (T.readFile "assets/black.txt")
- <*> fmap parseCards (T.readFile "assets/white.txt")
- where
- parseCards = V.fromList . filter (not . T.null) . map dropComment . T.lines
- dropComment = T.strip . fst . T.break (== '#')
-
withServer :: FL.FastLogger -> (Server -> IO a) -> IO a
-withServer fl f = CookieSocket.withHandle 5 $ \cs -> do
- f =<< Server fl cs <$> readCards <*> MVar.newMVar HMS.empty
+withServer fl f = CookieSocket.withHandle 5 $ \cs ->
+ f =<< Server fl cs
+ <$> loadCardSets "assets/cards.yaml"
+ <*> MVar.newMVar HMS.empty
newRoom :: RoomId -> RoomPassword -> Cards -> StdGen -> STM Room
newRoom rid rpw cards gen = Room rid rpw
@@ -148,12 +141,14 @@ scottyApp server = Scotty.scottyApp $ do
Scotty.get "/rooms" $ do
views <- liftIO $ roomViews server
- Scotty.html . renderHtml $ Views.rooms views
+ let decks = HMS.keys $ serverCards server
+ Scotty.html . renderHtml $ Views.rooms views decks
Scotty.post "/rooms" $ do
- rid <- getParam "id"
- rpw <- getParam "password"
- _ <- liftIO $ createRoom server rid rpw
+ rid <- getParam "id"
+ rpw <- getParam "password"
+ cards <- getParam "deck"
+ _ <- liftIO $ createRoom server rid rpw cards
Scotty.redirect $ TL.fromStrict $
"/rooms/" <> unRoomId rid <>
case rpw of
@@ -195,17 +190,21 @@ parsePendingConnection pending =
Just (r, maybe NoRoomPassword RoomPassword pwd)
_ -> Nothing
-createRoom :: Server -> RoomId -> RoomPassword -> IO Room
-createRoom server rid rpw = MVar.modifyMVar (serverRooms server) $ \rooms ->
- case HMS.lookup rid rooms of
- Just _ -> fail "Room already exists"
- Nothing -> do
- gen <- newStdGen
- serverLogger server $ "[" <> FL.toLogStr rid <> "] Created " <>
- (if rpw == NoRoomPassword then "" else "password-protected ") <>
- "room"
- room <- atomically $ newRoom rid rpw (serverCards server) gen
- pure (HMS.insert rid room rooms, room)
+createRoom :: Server -> RoomId -> RoomPassword -> Deck -> IO Room
+createRoom server rid rpw deck = do
+ cards <- maybe (fail "Deck not found") pure $
+ HMS.lookup deck (serverCards server)
+ MVar.modifyMVar (serverRooms server) $ \rooms -> do
+ case HMS.lookup rid rooms of
+ Just _ -> fail "Room already exists"
+ Nothing -> pure ()
+
+ gen <- newStdGen
+ serverLogger server $ "[" <> FL.toLogStr rid <> "] Created " <>
+ (if rpw == NoRoomPassword then "" else "password-protected ") <>
+ "room"
+ room <- atomically $ newRoom rid rpw cards gen
+ pure (HMS.insert rid room rooms, room)
getRoom :: Server -> RoomId -> IO Room
getRoom server rid = do
diff --git a/server/lib/Uplcg/Views.hs b/server/lib/Uplcg/Views.hs
index d25a9ce..9e453e8 100644
--- a/server/lib/Uplcg/Views.hs
+++ b/server/lib/Uplcg/Views.hs
@@ -13,6 +13,7 @@ import qualified Data.Text.Encoding as T
import qualified Network.HTTP.Types.URI as HttpUri
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A
+import Uplcg.Cards
import Uplcg.Version (version)
data RoomView = RoomView Text Bool Int
@@ -29,8 +30,8 @@ template title body = H.docTypeHtml $ do
body
H.footer $ "Untitled PL Card Game version " <> H.toHtml version
-rooms :: [RoomView] -> H.Html
-rooms rids = template "Untitled PL Card Game" $
+rooms :: [RoomView] -> [Deck] -> H.Html
+rooms rids decks = template "Untitled PL Card Game" $
H.div H.! A.class_ "rooms" $ do
H.h1 "Rooms"
if null rids
@@ -52,6 +53,10 @@ rooms rids = template "Untitled PL Card Game" $
H.label H.! A.for "name" $ "Password (optional): "
H.input H.! A.type_ "text" H.! A.name "password"
H.br
+ H.label H.! A.for "deck" $ "Cards: "
+ H.select H.! A.name "deck" $ for_ decks $ \deck ->
+ H.option H.! A.value (H.toValue deck) $ H.toHtml deck
+ H.br
H.input H.! A.type_ "submit" H.! A.value "Create room"
client :: Text -> Maybe Text -> H.Html
diff --git a/server/uplcg.cabal b/server/uplcg.cabal
index 5ed6d2f..2c8db7d 100644
--- a/server/uplcg.cabal
+++ b/server/uplcg.cabal
@@ -17,6 +17,7 @@ Library
Other-modules: Paths_uplcg
Exposed-modules:
+ Uplcg.Cards
Uplcg.CookieSocket
Uplcg.Game
Uplcg.Main.GenerateElmTypes
@@ -54,7 +55,8 @@ Library
wai-extra >= 3.0 && < 3.1,
wai-websockets >= 3.0 && < 3.1,
warp >= 3.3 && < 3.4,
- websockets >= 0.12 && < 0.13
+ websockets >= 0.12 && < 0.13,
+ yaml >= 0.11 && < 0.12
Executable uplcg-generate-elm-types
Hs-source-dirs: src
diff --git a/white.txt b/white.txt
deleted file mode 100644
index 902fec5..0000000
--- a/white.txt
+++ /dev/null
@@ -1,170 +0,0 @@
-# ICFP2020 Cards
-a Monad # Inline comment
-a Monoid
-Endofunctors
-JavaScript
-Haskell
-Scheme
-Racket
-C
-C++
-abstract nonsense
-mutability
-type theory
-pointers
-a proof left as an exercise to the reader
-the independence of dependent types
-100 pages of proof appendix
-the Vim vs Emacs dilemma
-the fear of side effects
-error reporting
-readable type errors
-Haskell wins at ICFP programming contest
-C++ wins at ICFP programming contest
-a cryptocurrency developed using Coq
-monads are like burritos
-the egg of Coq
-the real origin of the Coq name
-HoTT getting cold
-the lambdaman
-a presentation without a joke
-a french paper not formalized in Coq
-a non-poultry themed Coq library
-ICFP
-POPL
-PLDI
-OOPSLA
-cabal hell
-Category Theory
-executing Agda code
-a job talk starting with Heartbleed
-a type system that prevents planes from crashing
-pLdI iS bEtTeR tHaN iCfP
-a time when ML did not mean machine learning
-# SML and formal semantics
-that CSmith found 0* bugs in CompCert
-well-typed programs don't go wrong
-a complete type system
-division by zero
-a Brief, Incomplete, and Mostly Wrong History of Programming Languages
-# no class, no state
-# soundy
-an abstract domain for neural networks
-a PhD office with windows
-a profile picture from 20 years ago
-an academic website powered by Hakyll
-continuations
-liberally adding axioms
-unironically using Windows
-my parents asking when I’ll get a real job
-PL memes
-not really caring about OOP
-endless discussions about syntax
-
-# paper titles
-do be do be do
-the marriage of effects and monads
-Coq Coq Correct!
-# gradual typing is dead
-
-# Cards including comminity people's names that we should ask for permission
-Conor's high tech presentation
-an ICFP with 0 SPJ accepted papers
-Ranjit's Lambda Style
-# Asking Annabelle
-# HIcks
-# a climate change talk by Benjamin Pierce
-# Stephanie
-# Adam
-# Phil Wadler
-# Ron + Tander
-
-# Cards taken from
-# https://github.com/CardsAgainstCryptography/CAC/blob/master/src/white.txt
-# Filtered down to remove some sexism / racism / ... and irrelevant cards.
-100% talks, 0% human interaction
-Thinking I'm so clever for using pictures of Alice (Cooper) and Bob (Marley)
-a career-limiting card game
-a hand wavy argument
-a proof that appears in the "full version"
-a violent and bloody PhD defence
-academic integrity
-actually being "sorry for the late reply"
-an "anonymous" reviewer insisting I cite 6 papers by the same author
-an overfull hbox
-arriving 13 minutes late to a 15 minute talk and having the gall to ask a question
-being the only smartly dressed person in the room
-best rejected paper award
-checking my Google Scholar profile daily
-citing personal communication.
-conferences with 5 submissions at 11:59pm
-crippling student debt
-day drinking
-deadline day flatulence
-deliberately hiding inefficiencies inside the big O
-deliberately not referencing a superior paper
-doing Facebook maths puzzles to show I am better than those idiot 97%.
-drinking alone
-explaining what my job is at a family reunion
-falling asleep in a 5-person meeting
-feeling flattered because a conference spam email addressed me as Professor
-fighting over LaTeX syntax
-forgetting my VGA adapter
-frantically taking notes during every talk
-getting a fourth cookie during a coffee break because I have no one to talk to
-getting stuck at the French-speaking banquet table
-getting tenure, then chilling out
-having time to catch up on my reading, then not doing it
-having to write a polite rebuttal to the reviewer who clearly didn't read past page 2
-hiding my conflict of interest
-ignoring reviewer comments and resubmitting immediately
-ignoring the session chair flashing 5 minutes left because I've got 23 slides to go
-including an XKCD comic in my slides because I'm so original
-making claims in the submission that you hope you can achieve before the rebuttal
-my dear friend the Program Chair overruling 3 borderline rejects on my paper
-my successful career at a patent troll company
-my supervisor's morning breath
-not feeling guilty about falling asleep during the keynote
-not having to wear pants
-not needing to pretend to listen to the other speakers in my session
-overselling it hard in the introduction
-politely starting an answer with "That's a good question...", when the question is actually idiotic
-preparing for two weeks to give a 15-minute presentation to a room of 7 people all on their laptops
-pretending to understand
-publishing anyway
-putting an outdoors-y photo on my academic webpage to look well-rounded
-quickly trying to peek at someone's badge as I shake their hand, but it's flipped backwards
-relatives who ask me to help them install their printer on Windows
-remembering when "working from home" meant a day off
-sending an email at 11pm so people think I work hard
-Zoom dropping out every 10 to 15 seconds
-social sciences
-someone less senior than me signing off with "Thanks in advance"
-starting a conversation with "When did you fly in?", because I have nothing interesting to say
-telling anyone who'll listen quite how busy I am
-thanking the anonymous reviewers for their "useful" comments
-the awkward question the chair asks when nobody understood the talk
-the awkward silence of 8 people standing in a circle during the afternoon coffee break
-the great paywall of IEEE
-the intoxicating aroma of 12 PhD students in one office
-the one suit I own for meetings with industry
-the person in the front row taking photos of every slide
-the sound of 50 people on a Zoom call all trying to speak at once
-the student body
-throwing a party for my next citation milestone
-turning up to one meeting and claiming co-authorship
-tweeting about my paper acceptance
-undergrads
-using Beamer because it's social suicide to use PowerPoint
-using "it clearly follows" when the implied following is anything but clear
-using "we should talk about this offline" because the question exposes holes in my paper
-using indecipherable, non-standard notation to hide a dodgy proof
-wearing a T-shirt with a Linux joke
-wearing a conference t-shirt... in public.
-wistfully looking out of the window of my overly-cramped PhD office
-writing a reference for someone I can't remember meeting
-Ctrl+F'ing to see how many times I'm cited and finding "0 results"
-"Working" remotely
-a slide deck entirely in Comic Sans
-A shepherd that won't budge
-Starting a conversation with ``When did you fly in?'', because I have nothing interesting to say