changeset 531:b11374d8b745

wip fosdem
author Louis Opter <kalessin@kalessin.fr>
date Mon, 30 Jan 2017 23:02:28 +0100
parents f8d1c74a24c4
children de2d968228a0
files add_slides.patch docker_images.patch series
diffstat 3 files changed, 627 insertions(+), 204 deletions(-) [+]
line wrap: on
line diff
--- a/add_slides.patch	Sun Jan 29 13:39:55 2017 +0100
+++ b/add_slides.patch	Mon Jan 30 23:02:28 2017 +0100
@@ -1704,7 +1704,7 @@
 new file mode 100644
 --- /dev/null
 +++ b/slides/fosdem_2017/fosdem_2017.tex
-@@ -0,0 +1,813 @@
+@@ -0,0 +1,1261 @@
 +\documentclass[utf8x,xcolor={usenames,svgnames}]{beamer}
 +
 +\usepackage{tikz}
@@ -1770,39 +1770,253 @@
 +\subsection{About me}
 +
 +\begin{frame}{\LARGE{\texttt{\$ whoami}}}
-+\onslide<1->{%
 +Hello, my name is Louis (Opter) and I:\vspace{1em}
 +\begin{itemize}
-+\item am a good software engineer, a bad computer scientist;
-+\item am (distributed) systems oriented;
-+\item do hella C, Python and devops, use FOSS since '05;
++\item am a decent software engineer;
 +\item \emph{do not really know anything about hardware.}
 +\end{itemize}
 +\vspace{1em}
-+}
-+\onslide<2>{Anyway, it doesn't matter, let's get started!}
++Anyway, it doesn't really matter, let's get started!
++\end{frame}
++
++\subsection{Plan}
++
++\begin{frame}{Agenda}
++Two related projects to talk about:
++\vspace{1em}
++\begin{description}
++\item[monolight] An UI for a 128 buttons matrix and lightsd;
++\item[lightsd] A daemon to easily control LIFX light bulbs.
++\end{description}
++\pause
++\vspace{2em}
++Outline:
++\vspace{1em}
++\begin{itemize}
++\item monolight: explanation, demo, implementation, ideas;
++\item lightsd: API demo, implementation, ideas, about LIFX;
++\item Q\&A, discussion.
++\end{itemize}
 +\end{frame}
 +
-+\section{Monolight}
++\begin{frame}{High-level architecture}
++\begin{center}
++\begin{tikzpicture}[overlay]
++\coordinate (Origin) at (0,0);
++
++\fill[controlpt] (Origin) circle (0.1);
++
++\node[box] (monolight) at (3.5,0.75) {monolight};
++\node[box] (lightsd) at (0.5,-2) {lightsd};
++\draw[ultra thick] (-1.46, 1.5) -| (monolight);
++\node (monome) at (-3.5,1.5) {\begin{tikzpicture}[scale=0.5]
++\coordinate (NW) at (-4, 1.75);
++\coordinate (SE) at (3.86, -2.11);
++
++\fill[color=case,rounded corners=2pt] ($(NW) + (-0.18,0.18)$) rectangle ($(SE) + (0.18,-0.18)$);
++\fill[color=plate,rounded corners=2pt] ($(NW) + (-0.10,0.10)$) rectangle ($(SE) + (0.10,-0.10)$);
++
++\foreach \x in {-4,-3.5,...,3.5}
++\foreach \y in {1.75,1.25,...,-1.75}
++\fill[mbuttoff] (\x, \y) rectangle +(0.36, -0.36);
++\end{tikzpicture}};
++\node (bulbh) at (-4.2,-1.1) {%
++\colorlet{LightColor}{LightSlateBlue}
++\begin{tikzpicture}[scale=0.19,rotate=90]
++% main body
++\fill[color=BodyColor]
++    (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) --
++    ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle;
++% main body light
++\draw[line width=1.5mm,line cap=round,rounded corners=1pt,color=BodyColor!80!white]
++    (-16mm,0.5mm) .. controls (0,-0.4mm) .. (16mm,0.5mm);
++\draw[line width=2mm,rounded corners=1pt,color=BodyColor!80!white]
++    (16.5mm,32mm) -- ++(0,-32mm) -- ++(-15mm,-22mm);
++
++% led - body separator
++\fill[color=BodyColor!90!black] (-20mm,32mm) -- ++(0,2.5mm) -- ++(40mm,0) -- ++(0,-2.5mm) -- cycle;
++
++% led part
++\fill[color=LightColor]
++    (-28mm,34.5mm) -- ++(0,14mm)
++    .. controls ++(28mm,1mm) .. ++(56mm,0)
++    -- ++(0,-14mm) -- cycle;
++
++% lower body
++\fill[color=BodyColor!90!black]
++    (-14mm,-18mm) -- ++(0,-18mm) --
++    ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm)
++    -- ++(0,18mm);
++
++% socket
++\fill[color=SocketColor]
++    (-10mm,-38mm) -- ++(0,-4mm)
++    decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)}
++    -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm)
++    decorate[screw] {(10mm,-52mm) -- ++(0,10mm)}
++    -- (10mm,-38mm) -- ++(-20mm,0) -- ++(0,-4mm) -- cycle;
++\draw[thin,color=SocketColor] (-10mm,-42mm) -- (10mm,-52mm);
++
++% socket light
++\draw[line width=1mm,line cap=round,rounded corners=1pt,color=SocketColor!90!white]
++    (4.5mm,-38mm) -- ++(0,-14mm) -- ++(-4mm,-2.5mm);
++
++% lower body light
++\draw[line width=1.8mm,color=BodyColor]
++    (5mm,-18mm) -- ++(0,-20mm);
++
++% led - body separator light
++\draw[line width=1.6mm, color=BodyColor] (16mm,32mm) -- ++(0,2.5mm);
++% led - body separator shade
++\draw[thin, color=BodyColor!80!black] (-20mm,32mm) -- ++(0,2.5mm);
++\draw[thin, color=BodyColor!80!black] (20mm,32mm) -- ++(0,2.5mm);
++
++% socket shade
++\draw[color=SocketColor!80!black]
++    (-10mm,-38mm) -- ++(0,-4mm)
++    decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)}
++    -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm)
++    decorate[screw] {(10mm,-52mm) -- ++(0,10mm)}
++    -- (10mm,-38mm);
++\draw[color=fgcolor]
++    (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm);
++\draw[rounded corners=1pt,color=SocketColor!80!black]
++    (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm);
++
++% lower body shade
++\draw[rounded corners=1pt,color=BodyColor!50!black]
++    (-14mm,-18mm) -- ++(0,-18mm) --
++    ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm)
++    -- ++(0,18mm);
++
++% body shade
++\draw[thick,rounded corners=1pt,color=BodyColor!60!black]
++    (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) --
++    ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle;
++
++% led shade
++\draw[thick,rounded corners=1pt,color=LightColor!70!white]
++    (-28mm,34.5mm) -- ++(0,14mm)
++    .. controls ++(28mm,1mm) .. ++(56mm,0)
++    -- ++(0,-14mm) -- cycle;
++\end{tikzpicture}};
++\node (bulbl) at (-4.2,-2.9) {%
++\colorlet{LightColor}{IndianRed}
++\begin{tikzpicture}[scale=0.19,rotate=90]
++% main body
++\fill[color=BodyColor]
++    (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) --
++    ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle;
++% main body light
++\draw[line width=1.5mm,line cap=round,rounded corners=1pt,color=BodyColor!80!white]
++    (-16mm,0.5mm) .. controls (0,-0.4mm) .. (16mm,0.5mm);
++\draw[line width=2mm,rounded corners=1pt,color=BodyColor!80!white]
++    (16.5mm,32mm) -- ++(0,-32mm) -- ++(-15mm,-22mm);
++
++% led - body separator
++\fill[color=BodyColor!90!black] (-20mm,32mm) -- ++(0,2.5mm) -- ++(40mm,0) -- ++(0,-2.5mm) -- cycle;
++
++% led part
++\fill[color=LightColor]
++    (-28mm,34.5mm) -- ++(0,14mm)
++    .. controls ++(28mm,1mm) .. ++(56mm,0)
++    -- ++(0,-14mm) -- cycle;
++
++% lower body
++\fill[color=BodyColor!90!black]
++    (-14mm,-18mm) -- ++(0,-18mm) --
++    ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm)
++    -- ++(0,18mm);
++
++% socket
++\fill[color=SocketColor]
++    (-10mm,-38mm) -- ++(0,-4mm)
++    decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)}
++    -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm)
++    decorate[screw] {(10mm,-52mm) -- ++(0,10mm)}
++    -- (10mm,-38mm) -- ++(-20mm,0) -- ++(0,-4mm) -- cycle;
++\draw[thin,color=SocketColor] (-10mm,-42mm) -- (10mm,-52mm);
++
++% socket light
++\draw[line width=1mm,line cap=round,rounded corners=1pt,color=SocketColor!90!white]
++    (4.5mm,-38mm) -- ++(0,-14mm) -- ++(-4mm,-2.5mm);
++
++% lower body light
++\draw[line width=1.8mm,color=BodyColor]
++    (5mm,-18mm) -- ++(0,-20mm);
++
++% led - body separator light
++\draw[line width=1.6mm, color=BodyColor] (16mm,32mm) -- ++(0,2.5mm);
++% led - body separator shade
++\draw[thin, color=BodyColor!80!black] (-20mm,32mm) -- ++(0,2.5mm);
++\draw[thin, color=BodyColor!80!black] (20mm,32mm) -- ++(0,2.5mm);
++
++% socket shade
++\draw[color=SocketColor!80!black]
++    (-10mm,-38mm) -- ++(0,-4mm)
++    decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)}
++    -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm)
++    decorate[screw] {(10mm,-52mm) -- ++(0,10mm)}
++    -- (10mm,-38mm);
++\draw[color=fgcolor]
++    (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm);
++\draw[rounded corners=1pt,color=SocketColor!80!black]
++    (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm);
++
++% lower body shade
++\draw[rounded corners=1pt,color=BodyColor!50!black]
++    (-14mm,-18mm) -- ++(0,-18mm) --
++    ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm)
++    -- ++(0,18mm);
++
++% body shade
++\draw[thick,rounded corners=1pt,color=BodyColor!60!black]
++    (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) --
++    ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle;
++
++% led shade
++\draw[thick,rounded corners=1pt,color=LightColor!70!white]
++    (-28mm,34.5mm) -- ++(0,14mm)
++    .. controls ++(28mm,1mm) .. ++(56mm,0)
++    -- ++(0,-14mm) -- cycle;
++\end{tikzpicture}};
++
++\draw[ultra thick] (lightsd) -| (monolight);
++\draw[wifipath] (bulbh.east) -- (-2.2,-1.15);
++\draw[wifipath] (lightsd.west) -- (-1.1,-2);
++\draw[wifipath] (bulbl.east) -- (-2.2,-2.85);
++\onslide<2->{%
++\draw[ultra thick,dashed] (-6,-0.2) -- (6,-0.2);
++\draw (0,-0.2) node[above] {\emph{Talk part 1 (monolight)}}
++               node[below] {\emph{part 2 (lightsd)}};
++\fill[white,opacity=0.7] (-6,-6) rectangle (6,-0.2);
++}
++\end{tikzpicture}
++\end{center}
++\end{frame}
++
++\section{monolight}
 +
 +\subsection{Controller UI}
 +
-+\begin{frame}{What are we looking at?}
++\begin{frame}{monolight}
 +A controller (Monome grid 128 varibright):
 +\begin{itemize}
 +\item A matrix of 128 programmable button;
-+\item 16 levels of brightness per button.
++\item 16 levels of brightness per button;
++\item Serial/RS232 (FTDI) connection.
 +\end{itemize}
 +\pause
 +\vspace{1em}
 +Controlling a "smart" bulb (LIFX Original 1000):
 +\begin{itemize}
-+\item A 1000 lumens programmable light bulb;
-+\item Nice colors, nice range of whites.
++\item A \textasciitilde1000 lumens programmable light bulb;
++\item Nice colors, nice range of whites;
++\item Wi-Fi 802.11bgn, 2.4gHz.
 +\end{itemize}
 +\pause
 +\vspace{1em}
-+An uncomfortable amount of code.
++\emph{Let's have a look at the controller UI.}
 +\end{frame}
 +
 +\begin{frame}{The grid}
@@ -2021,12 +2235,11 @@
 +
 +\subsection{Demo}
 +
-+\begin{frame}{Live}
++\begin{frame}{monolight live}
 +\begin{itemize}
 +\item Controls;
-+\item CLI interface to lightsd;
 +\item UI feedback;
-+\item Monolight layer definitions.
++\item monolight layer definitions.
 +\end{itemize}
 +\vspace{1em}
 +\pause
@@ -2035,7 +2248,7 @@
 +
 +\subsection{One last idea}
 +
-+\begin{frame}{Timer/Repeat}
++\begin{frame}{Timer/Alert effect}
 +\begin{center}
 +\begin{tikzpicture}[overlay,scale=1.2]
 +\onslide<1->{%
@@ -2089,9 +2302,9 @@
 +\draw (caption) node[right] {Let's add two more functions:};
 +
 +\node (timer) [below=0.5cm of b117] {timer};
-+\node (repeat) [below=0.9cm of b118] {repeat};
++\node (alert) [below=0.9cm of b118] {alert};
 +\draw[arrow] (timer) -- (b117);
-+\draw[arrow] (repeat) -- (b118);
++\draw[arrow] (alert) -- (b118);
 +}
 +\onslide<2>{%
 +\draw (caption) node[right] {Time selection (1 lit button = 1 unit of time):};
@@ -2121,10 +2334,10 @@
 +\node (timectl) [below=0.5cm of b121] {dec/inc time unit};
 +}
 +\onslide<3>{%
-+\draw (caption) node[right] {Target selection, optional repeat selection:};
++\draw (caption) node[right] {Target and alert selection:};
 +
-+\node (repeat) [below=0.5cm of b118] {[repeat]};
-+\draw[arrow] (repeat) -- (b118);
++\node (alert) [below=0.5cm of b118] {alert};
++\draw[arrow] (alert) -- (b118);
 +
 +\node[rectangle,opacity=0] (b0) at (-3.82,1.57) {B};
 +\node[rectangle,opacity=0] (b4) at (-1.82,1.57) {B};
@@ -2144,16 +2357,38 @@
 +\fill[mbutton] (-3.5, 1.75) rectangle +(0.36, -0.36);
 +
 +\node[rectangle] (b1) at (-3.32,1.57) {};
-+\node (feedback) [above=0.5cm of b1] {Activity feedback};
-+\draw[arrow] (feedback) -- (b1);
++\node (feedback) [above right=0.5cm of b1] {Timer activity feedback};
++\draw[arrow] (feedback) -| (b1);
 +}
 +\end{tikzpicture}
 +\end{center}
 +\end{frame}
 +
-+\section{Implementation details}
++\subsection{Implementation details}
 +
-+\subsection{Architecture}
++\begin{frame}{monolight implementation}
++High-level details:
++\begin{itemize}
++\item Python ≥ 3.5 (pondering ≥ 3.6);
++\item Fully async (using \emph{asyncio} with the stream API);
++\item Fully typed, it's great;
++\item Very slow, no tests \Neutrey;
++\item Uses Artem Popov's \emph{pymonome/aiosc} libraries;
++\item 2/3 months of work, GPLv3.
++\end{itemize}
++\pause
++\vspace{1em}
++As we've seen, lot of fun stuff left:
++\begin{itemize}
++\item More UI features;
++\item UI animations;
++\item Control other things.
++\end{itemize}
++\end{frame}
++
++\section{lightsd}
++
++\subsection{Intro}
 +
 +\begin{frame}{High-level architecture}
 +\begin{center}
@@ -2162,8 +2397,367 @@
 +
 +\fill[controlpt] (Origin) circle (0.1);
 +
-+\node[box] (serialoscd) at (0.5,1.5) {serialoscd};
-+\draw[ultra thick] (-1.46, 2.2) -| node[above, pos=0.4] {RS232 \small{(FTDI)}} (serialoscd);
++\node[box] (monolight) at (3.5,0.75) {monolight};
++\node[box] (lightsd) at (0.5,-2) {lightsd};
++\draw[ultra thick] (-1.46, 1.5) -| (monolight);
++\node (monome) at (-3.5,1.5) {\begin{tikzpicture}[scale=0.5]
++\coordinate (NW) at (-4, 1.75);
++\coordinate (SE) at (3.86, -2.11);
++
++\fill[color=case,rounded corners=2pt] ($(NW) + (-0.18,0.18)$) rectangle ($(SE) + (0.18,-0.18)$);
++\fill[color=plate,rounded corners=2pt] ($(NW) + (-0.10,0.10)$) rectangle ($(SE) + (0.10,-0.10)$);
++
++\foreach \x in {-4,-3.5,...,3.5}
++\foreach \y in {1.75,1.25,...,-1.75}
++\fill[mbuttoff] (\x, \y) rectangle +(0.36, -0.36);
++\end{tikzpicture}};
++\node (bulbh) at (-4.2,-1.1) {%
++\colorlet{LightColor}{LightSlateBlue}
++\begin{tikzpicture}[scale=0.19,rotate=90]
++% main body
++\fill[color=BodyColor]
++    (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) --
++    ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle;
++% main body light
++\draw[line width=1.5mm,line cap=round,rounded corners=1pt,color=BodyColor!80!white]
++    (-16mm,0.5mm) .. controls (0,-0.4mm) .. (16mm,0.5mm);
++\draw[line width=2mm,rounded corners=1pt,color=BodyColor!80!white]
++    (16.5mm,32mm) -- ++(0,-32mm) -- ++(-15mm,-22mm);
++
++% led - body separator
++\fill[color=BodyColor!90!black] (-20mm,32mm) -- ++(0,2.5mm) -- ++(40mm,0) -- ++(0,-2.5mm) -- cycle;
++
++% led part
++\fill[color=LightColor]
++    (-28mm,34.5mm) -- ++(0,14mm)
++    .. controls ++(28mm,1mm) .. ++(56mm,0)
++    -- ++(0,-14mm) -- cycle;
++
++% lower body
++\fill[color=BodyColor!90!black]
++    (-14mm,-18mm) -- ++(0,-18mm) --
++    ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm)
++    -- ++(0,18mm);
++
++% socket
++\fill[color=SocketColor]
++    (-10mm,-38mm) -- ++(0,-4mm)
++    decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)}
++    -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm)
++    decorate[screw] {(10mm,-52mm) -- ++(0,10mm)}
++    -- (10mm,-38mm) -- ++(-20mm,0) -- ++(0,-4mm) -- cycle;
++\draw[thin,color=SocketColor] (-10mm,-42mm) -- (10mm,-52mm);
++
++% socket light
++\draw[line width=1mm,line cap=round,rounded corners=1pt,color=SocketColor!90!white]
++    (4.5mm,-38mm) -- ++(0,-14mm) -- ++(-4mm,-2.5mm);
++
++% lower body light
++\draw[line width=1.8mm,color=BodyColor]
++    (5mm,-18mm) -- ++(0,-20mm);
++
++% led - body separator light
++\draw[line width=1.6mm, color=BodyColor] (16mm,32mm) -- ++(0,2.5mm);
++% led - body separator shade
++\draw[thin, color=BodyColor!80!black] (-20mm,32mm) -- ++(0,2.5mm);
++\draw[thin, color=BodyColor!80!black] (20mm,32mm) -- ++(0,2.5mm);
++
++% socket shade
++\draw[color=SocketColor!80!black]
++    (-10mm,-38mm) -- ++(0,-4mm)
++    decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)}
++    -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm)
++    decorate[screw] {(10mm,-52mm) -- ++(0,10mm)}
++    -- (10mm,-38mm);
++\draw[color=fgcolor]
++    (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm);
++\draw[rounded corners=1pt,color=SocketColor!80!black]
++    (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm);
++
++% lower body shade
++\draw[rounded corners=1pt,color=BodyColor!50!black]
++    (-14mm,-18mm) -- ++(0,-18mm) --
++    ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm)
++    -- ++(0,18mm);
++
++% body shade
++\draw[thick,rounded corners=1pt,color=BodyColor!60!black]
++    (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) --
++    ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle;
++
++% led shade
++\draw[thick,rounded corners=1pt,color=LightColor!70!white]
++    (-28mm,34.5mm) -- ++(0,14mm)
++    .. controls ++(28mm,1mm) .. ++(56mm,0)
++    -- ++(0,-14mm) -- cycle;
++\end{tikzpicture}};
++\node (bulbl) at (-4.2,-2.9) {%
++\colorlet{LightColor}{IndianRed}
++\begin{tikzpicture}[scale=0.19,rotate=90]
++% main body
++\fill[color=BodyColor]
++    (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) --
++    ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle;
++% main body light
++\draw[line width=1.5mm,line cap=round,rounded corners=1pt,color=BodyColor!80!white]
++    (-16mm,0.5mm) .. controls (0,-0.4mm) .. (16mm,0.5mm);
++\draw[line width=2mm,rounded corners=1pt,color=BodyColor!80!white]
++    (16.5mm,32mm) -- ++(0,-32mm) -- ++(-15mm,-22mm);
++
++% led - body separator
++\fill[color=BodyColor!90!black] (-20mm,32mm) -- ++(0,2.5mm) -- ++(40mm,0) -- ++(0,-2.5mm) -- cycle;
++
++% led part
++\fill[color=LightColor]
++    (-28mm,34.5mm) -- ++(0,14mm)
++    .. controls ++(28mm,1mm) .. ++(56mm,0)
++    -- ++(0,-14mm) -- cycle;
++
++% lower body
++\fill[color=BodyColor!90!black]
++    (-14mm,-18mm) -- ++(0,-18mm) --
++    ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm)
++    -- ++(0,18mm);
++
++% socket
++\fill[color=SocketColor]
++    (-10mm,-38mm) -- ++(0,-4mm)
++    decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)}
++    -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm)
++    decorate[screw] {(10mm,-52mm) -- ++(0,10mm)}
++    -- (10mm,-38mm) -- ++(-20mm,0) -- ++(0,-4mm) -- cycle;
++\draw[thin,color=SocketColor] (-10mm,-42mm) -- (10mm,-52mm);
++
++% socket light
++\draw[line width=1mm,line cap=round,rounded corners=1pt,color=SocketColor!90!white]
++    (4.5mm,-38mm) -- ++(0,-14mm) -- ++(-4mm,-2.5mm);
++
++% lower body light
++\draw[line width=1.8mm,color=BodyColor]
++    (5mm,-18mm) -- ++(0,-20mm);
++
++% led - body separator light
++\draw[line width=1.6mm, color=BodyColor] (16mm,32mm) -- ++(0,2.5mm);
++% led - body separator shade
++\draw[thin, color=BodyColor!80!black] (-20mm,32mm) -- ++(0,2.5mm);
++\draw[thin, color=BodyColor!80!black] (20mm,32mm) -- ++(0,2.5mm);
++
++% socket shade
++\draw[color=SocketColor!80!black]
++    (-10mm,-38mm) -- ++(0,-4mm)
++    decorate[screw] {(-10mm,-42mm) -- ++(0,-10mm)}
++    -- ++(0,-0.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm) -- ++(0,0.5mm)
++    decorate[screw] {(10mm,-52mm) -- ++(0,10mm)}
++    -- (10mm,-38mm);
++\draw[color=fgcolor]
++    (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm);
++\draw[rounded corners=1pt,color=SocketColor!80!black]
++    (-10mm,-52.5mm) -- ++(7.5mm,-6mm) -- ++(5mm,0) -- ++(7.5mm,6mm);
++
++% lower body shade
++\draw[rounded corners=1pt,color=BodyColor!50!black]
++    (-14mm,-18mm) -- ++(0,-18mm) --
++    ++(2mm,-2mm) -- ++(24mm,0) -- ++(2mm,2mm)
++    -- ++(0,18mm);
++
++% body shade
++\draw[thick,rounded corners=1pt,color=BodyColor!60!black]
++    (-28mm,0) -- ++(0,32mm) -- ++(56mm,0) -- ++(0,-32mm) --
++    ++(-10mm,-18mm) -- ++(-36mm,0) -- cycle;
++
++% led shade
++\draw[thick,rounded corners=1pt,color=LightColor!70!white]
++    (-28mm,34.5mm) -- ++(0,14mm)
++    .. controls ++(28mm,1mm) .. ++(56mm,0)
++    -- ++(0,-14mm) -- cycle;
++\end{tikzpicture}};
++
++\draw[ultra thick] (lightsd) -| (monolight);
++\draw[wifipath] (bulbh.east) -- (-2.2,-1.15);
++\draw[wifipath] (lightsd.west) -- (-1.1,-2);
++\draw[wifipath] (bulbl.east) -- (-2.2,-2.85);
++\draw[ultra thick,dashed] (-6,-0.2) -- (6,-0.2);
++\draw (0,-0.2) node[above] {\emph{part 1 (monolight)}}
++               node[below] {\emph{Talk part 2 (lightsd)}};
++\fill[white,opacity=0.7] (-6,3) rectangle (6,-0.2);
++\end{tikzpicture}
++\end{center}
++\end{frame}
++
++\subsection{Demo}
++
++\begin{frame}{lightsd API live}
++\begin{itemize}
++\item get\_light\_state;
++\item power\_toggle, targeting;
++\item set\_light\_from\_hsbk;
++\item set\_waveform.
++\end{itemize}
++\end{frame}
++
++\subsection{Implementation details}
++
++\begin{frame}{lightsd}
++\only<1>{%
++The ``parent'' project:
++\vspace{1em}
++\begin{itemize}
++\item C99, libevent2, CMake --- that's all;
++\item Daemon, low memory footprint, fast enough\footnote{A bit of a CPU consumer.};
++\item 32/64 bits, big/little endian, FPU optional;
++\item Runs on nearly everything but Windows\footnote{LXSS will fix that though?};
++\item First PoC in 2014, mostly written through 2015.
++\end{itemize}
++}
++\only<2>{%
++Original ideas:
++\vspace{1em}
++\begin{itemize}
++\item Remove discovery delays and glitches;
++\item While exposing a high-level \emph{vendor agnostic} API;
++\item While offering network isolation;
++\item No cloud nor Internet required;
++\item GPLv3 with non-GPL users in mind;
++\item ``Accessible'': pretty good C, unit-tests, good docs.
++\end{itemize}
++}
++\only<3>{%
++Implementation details:
++\vspace{1em}
++\begin{itemize}
++\item Uses LIFX's faster and \emph{harder} LAN API;
++\item Proxies all communications to the bulb;
++\item Keeps track of the \emph{current} state of the bulbs (sampling);
++\item High-level API in JSON-RPC over TCP, Unix sockets or a named ``command'' pipe\footnote{The pipe is unidirectional: only usable to send commands.}.
++\end{itemize}
++}
++\end{frame}
++
++\begin{frame}{The {\LARGE\texttt{(\Walley\hspace{-1ex}|\Laughey)}} parts}
++\setlength{\arrayrulewidth}{1.5pt}
++In no particular order:
++\vspace{1em}
++\begin{center}
++\begin{tabular}{c|c}
++{\LARGE\Walley\hspace{-1ex}} & {\LARGE\Laughey} \\
++\hline
++C & C \\
++asyncio tasks cleanup & Python 3.5+ \\
++Buildbot & Continuous integration \\
++Portability & ``Stack position'' \\
++Wi-Fi & Playing with the lights \\
++Reverse engineering\ldots & in reasonable amounts \\
++Firmwares bugs & User feedback \\
++OS Packaging & \\
++\end{tabular}
++\end{center}
++\end{frame}
++
++\begin{frame}{``Stack position''}
++One thing I really like:
++\vspace{1em}
++\begin{center}
++\setlength{\tabcolsep}{15pt}
++\begin{tabular}{ccc}
++\textbf{LIFX} & \textbf{lightsd} & \textbf{monolight} \\
++\hline
++hardware & daemon & GUI \\
++\hline
++embedded & C & Python \\
++\end{tabular}
++\begin{tikzpicture}
++\fill[controlpt] (0,0) circle (0.1);
++\draw[arrow] (0,0) -- node[below,pos=0.6] {Lower-level} (-4.5,0);
++\draw[arrow] (0,0) -- node[below,pos=0.6] {Higher-level} (4.5,0);
++\fill[controlpt] (0,0.3) circle (0.1);
++\end{tikzpicture}
++\end{center}
++\pause
++\emph{lightsd opens-up to a wide range of topics.}
++\end{frame}
++
++\begin{frame}{Notes on the LIFX bulbs}
++\begin{itemize}
++\item Get them on sale;
++\item Best brightness/colors (AFAIK);
++\item Standby power consumption;
++\item Cool LAN API, hope they keep it;
++\item Only Gen 1 (EOLed in 2015) doesn't crash for me;
++\pause
++\item \large{\emph{Binary blobs suck.}}
++\end{itemize}
++\end{frame}
++
++\subsection{Next}
++
++\begin{frame}{``My Roadmap''}
++Things I wanna do:
++\vspace{1em}
++\begin{itemize}
++\item Time based releases;
++\item Better CI/automation;
++\item ``State-enforcement'';
++\item Effects API and effects plugins.
++\end{itemize}
++\end{frame}
++
++\begin{frame}{Not on my roadmap}
++Things I wanna have:
++\vspace{1em}
++\begin{itemize}
++\item JSON-RPC extensions: streaming, auth, server notifs;
++\item A reversed-engineered LIFX firmware;
++\item A firmware that doesn't crash;
++\item Support for other brands (Hue?);
++\item Color calibration;
++\item LIFX stripe support.
++\end{itemize}
++\end{frame}
++
++\section{Thanks}
++
++{\setbeamertemplate{headline}{}
++\begin{frame}
++\begin{center}\Huge{Thanks}\end{center}
++\vspace{1em}
++\begin{center}\Large{\emph{Time for Q\&A and discussion}}\end{center}
++\vspace{1em}
++\begin{itemize}
++\item \Large{\href{https://twitter.com/1opter}{@1opter}}
++\item \Large{\emph{\#lightsd} on IRC (\emph{chat.freenode.net})}
++\item \Large{\url{https://www.lightsd.io/}}
++\end{itemize}
++\end{frame}}
++
++\section{Extras}
++
++\begin{frame}{Links}
++\begin{description}[pymonome]
++\item[LIFX] \href{https://www.lifx.com/}{website}, \href{https://community.lifx.com/}{forum}, \href{https://github.com/lifx}{github}; 
++\item[lightsd] \href{https://docs.lightsd.io/current/}{docs}, \href{https://github.com/lopter/lightsd/}{sources}, \href{https://downloads.lightsd.io/}{downloads};
++\item[monolight] \href{https://github.com/lopter/lightsd/tree/master/apps/monolight}{sources};
++\item[monome] \href{http://www.monome.org/}{website}, \href{http://llllllll.co/}{forum}, \href{https://github.com/monome}{github};
++\item[pymonome] \href{https://github.com/artfwo/pymonome}{sources}.
++\end{description}
++\end{frame}
++
++\begin{frame}{Questions for you!}
++\begin{itemize}
++\item Hardware hacks?
++\item UX with other projects and products?
++\item ``Education'' opportunities opinions?
++\end{itemize}
++\end{frame}
++
++\begin{frame}{Detailed architecture}
++\begin{center}
++\begin{tikzpicture}[overlay]
++\coordinate (Origin) at (0,0);
++
++\fill[controlpt] (Origin) circle (0.1);
++
++\node[box,color=black] (serialoscd) at (0.5,1.5) {serialoscd};
++\draw[ultra thick] (-1.46, 2.2) -| node[above, pos=0.4] {Serial \small{(FTDI)}} (serialoscd);
 +\node (monome) at (-3.5,1.5) {\begin{tikzpicture}[scale=0.5]
 +\coordinate (NW) at (-4, 1.75);
 +\coordinate (SE) at (3.86, -2.11);
@@ -2338,161 +2932,17 @@
 +    -- ++(0,-14mm) -- cycle;
 +\end{tikzpicture}};
 +
-+\draw[ultra thick] (serialoscd) -| node[above left] {UDP} (monolight);
-+\draw[ultra thick] (lightsd) -| node[above,pos=0.25] {TCP/Unix} (monolight);
++\draw[ultra thick] (serialoscd) -| node[above,pos=0.25] {OSC} node[below,pos=0.25] {\small{(UDP)}} (monolight);
++\draw[ultra thick] (lightsd) -| node[above,pos=0.25] {JSON-RPC} node[below,pos=0.25] {\small{(TCP/Unix)}} (monolight);
 +\draw[wifipath] (bulbh.east) -- (-2.2,-1.15);
 +\draw[wifipath] (lightsd.west) -- (-1.1,-2);
 +\draw[wifipath] (bulbl.east) -- (-2.2,-2.85);
-+\node (wifi) at (-2.3,-2.25) {\small{(2.4gHz Wi-Fi)}};
-+\draw ($(wifi.north) + (0,0.2)$) node {UDP};
++\node (wifi) at (-2.1,-2.25) {\small{(UDP)}};
++\draw ($(wifi.north) + (0,0.2)$) node {LIFX-LAN};
 +\end{tikzpicture}
 +\end{center}
 +\end{frame}
 +
-+\subsection{About monolight}
-+
-+\begin{frame}{Monolight implementation}
-+High-level details:
-+\begin{itemize}
-+\item Python ≥ 3.5 (pondering ≥ 3.6);
-+\item Fully async (using \emph{asyncio} with the stream API);
-+\item Fully typed, it's great;
-+\item Very slow, no tests \Neutrey;
-+\item Uses Artem Popov's \emph{pymonome} library;
-+\item 2/3 months of work, GPLv3.
-+\end{itemize}
-+\pause
-+\vspace{1em}
-+It's really just the beginning, lot of fun stuff:
-+\begin{itemize}
-+\item More UI features;
-+\item UI animations;
-+\item Control other things.
-+\end{itemize}
-+\end{frame}
-+
-+\subsection{About lightsd}
-+
-+\begin{frame}{lightsd implementation}
-+\only<1>{%
-+The ``parent'' project:
-+\vspace{1em}
-+\begin{itemize}
-+\item C99, libevent2, CMake --- that's all;
-+\item Daemon, low memory footprint, fast enough\footnote{A bit of a CPU consumer.};
-+\item 32/64 bits, big/little endian, FPU optional;
-+\item Runs on nearly everything but Windows\footnote{LXSS will fix that though?};
-+\item First PoC in 2014, mostly written through 2015;
-+\item GPLv3 with non-GPL users in mind.
-+\end{itemize}
-+}
-+\only<2>{%
-+Original ideas:
-+\vspace{1em}
-+\begin{itemize}
-+\item Remove discovery delays and glitches;
-+\item While exposing a high-level \emph{vendor agnostic} API;
-+\item While offering network isolation;
-+\item No cloud nor Internet required;
-+\item ``Accessible''.
-+\end{itemize}
-+}
-+\only<3>{%
-+Implementation details:
-+\vspace{1em}
-+\begin{itemize}
-+\item Uses LIFX's faster and \emph{harder} LAN API;
-+\item Proxies all communications to the bulb;
-+\item Keeps track of the \emph{current} state of the bulbs (sampling);
-+\item High-level API in JSON-RPC over TCP, Unix sockets or a named ``command'' pipe\footnote{The pipe is unidirectional: only usable to send commands.};
-+\item Very good modular C, unit-tests, good docs.
-+\end{itemize}
-+}
-+\end{frame}
-+
-+\begin{frame}{The {\LARGE\texttt{(\Walley\hspace{-1ex}|\Laughey)}} parts}
-+\setlength{\arrayrulewidth}{1.5pt}
-+In no particular order:
-+\vspace{1em}
-+\begin{center}
-+\begin{tabular}{c|c}
-+{\LARGE\Walley\hspace{-1ex}} & {\LARGE\Laughey} \\
-+\hline
-+C & C \\
-+asyncio tasks cleanup & Python 3.5+ \\
-+Buildbot & Continuous integration \\
-+Portability & ``Stack position'' \\
-+Wi-Fi & Playing with the lights \\
-+Reverse engineering\ldots & in reasonable amounts \\
-+Firmwares bugs & User feedback \\
-+OS Packaging & \\
-+\end{tabular}
-+\end{center}
-+\end{frame}
-+
-+\begin{frame}{Notes on the LIFX bulbs}
-+\begin{itemize}
-+\item Get them on sale;
-+\item Best brightness/colors;
-+\item Standby power consumption;
-+\item Cool LAN API, hope they keep it;
-+\item Only Gen 1 (EOLed in 2015) doesn't crash for me;
-+\pause
-+\item \large{\emph{Binary blobs suck.}}
-+\end{itemize}
-+\end{frame}
-+
-+\subsection{Next}
-+
-+\begin{frame}{``My Roadmap''}
-+Things I wanna do:
-+\vspace{1em}
-+\begin{itemize}
-+\item Time based releases;
-+\item Better CI/automation;
-+\item ``State-enforcement'';
-+\item Effects API and effects plugins.
-+\end{itemize}
-+\end{frame}
-+
-+\begin{frame}{Not on my roadmap}
-+Things I wanna have:
-+\vspace{1em}
-+\begin{itemize}
-+\item JSON-RPC extensions: streaming, auth, server notifs;
-+\item A reversed-engineered LIFX firmware;
-+\item A firmware that doesn't crash;
-+\item Support for other brands (Hue?);
-+\item Color calibration;
-+\item LIFX stripe support.
-+\end{itemize}
-+\end{frame}
-+
-+\section{Thanks}
-+
-+\setbeamertemplate{headline}{}
-+
-+\begin{frame}
-+\begin{center}\Huge{Thanks}\end{center}
-+\vspace{1em}
-+\begin{center}\Large{\emph{Time for Q\&A and discussion}}\end{center}
-+\vspace{1em}
-+\begin{itemize}
-+\item \Large{\url{https://www.lightsd.io/}}
-+\item \Large{\emph{\#lightsd} on IRC (\emph{chat.freenode.net})}
-+\end{itemize}
-+\end{frame}
-+
-+\section{Extras}
-+
-+\begin{frame}{Questions for you!}
-+\begin{itemize}
-+\item Hardware hacks?
-+\item UX with other projects and products?
-+\item ``Education'' opportunities opinions?
-+\end{itemize}
-+\end{frame}
-+
 +\begin{frame}{LIFX products tables}
 +\begin{tabular}{lll}
 +\textbf{Generation} & \textbf{Models} & \textbf{Available} \\
@@ -2503,13 +2953,11 @@
 +\hline
 +Gen 3 & A19, BR30, Z (stripe) & Yes \\
 +\end{tabular}
-+
 +\par\vspace{2em}
-+
 +\begin{tabular}{ll}
 +\textbf{Generation} & \textbf{Notes} \\
 +\hline
-+Gen 1 & Has 802.15.4 \\
++Gen 1 & Has 802.11 and (unused) 802.15.4 \\
 +\hline
 +Gen 2 & QCA 4002, AllJoyn, \emph{crashes} \\
 +\hline
--- a/docker_images.patch	Sun Jan 29 13:39:55 2017 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-# HG changeset patch
-# Parent  598584f3f664456ec33a7a8baac2d1dc3be3b1b0
-Add a release command to generate Docker images
-
-diff --git a/dist/docker/Dockerfile b/dist/docker/Dockerfile
-new file mode 100644
---- /dev/null
-+++ b/dist/docker/Dockerfile
-@@ -0,0 +1,15 @@
-+FROM lopter/openwrt_designated_driver_{{ isa }}
-+MAINTAINER Louis Opter <louis@opter.org>
-+
-+ADD https://downloads.lightsd.io/openwrt/designated_driver_trunk/{{ isa }}/lightsd_{{ version }}_{{ isa }}.ipk /tmp/
-+
-+RUN opkg update \
-+    && opkg install \
-+        libevent2-core \
-+        /tmp/lightsd_{{ version }}_{{ isa }}.ipk \
-+    && rm -rf /tmp/*
-+
-+# TODO: figure out user creation and networking
-+
-+USER lightsd
-+ENTRYPOINT /usr/bin/lightsd -v warning -t -s /var/run/lightsd/socket -c /var/run/lightsd/pipe
--- a/series	Sun Jan 29 13:39:55 2017 +0100
+++ b/series	Mon Jan 30 23:02:28 2017 +0100
@@ -2,7 +2,6 @@
 fix_xcode_8_build.patch
 add_monolight.patch
 add_slides.patch
-docker_images.patch
 add_power_transition.patch #+future
 open_gateway_on_any_bulb_response.patch #+future
 make_gateway_write_callbacks_low_priority.patch #+future