From 7f5e0db31447cc612cf469ef07854677f9d25b83 Mon Sep 17 00:00:00 2001 From: Jasper Van der Jeugt Date: Sat, 22 Aug 2020 14:47:58 +0200 Subject: Multiple card sets --- Makefile | 8 +- black.txt | 60 ----------- cards.yaml | 234 ++++++++++++++++++++++++++++++++++++++++ client/src/Client.elm | 2 +- server/lib/Uplcg/Cards.hs | 17 +++ server/lib/Uplcg/Game.hs | 2 +- server/lib/Uplcg/Main/Server.hs | 55 +++++----- server/lib/Uplcg/Views.hs | 9 +- server/uplcg.cabal | 4 +- white.txt | 170 ----------------------------- 10 files changed, 292 insertions(+), 269 deletions(-) delete mode 100644 black.txt create mode 100644 cards.yaml create mode 100644 server/lib/Uplcg/Cards.hs delete mode 100644 white.txt 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 -- cgit v1.2.3