Rehearsed talk
This is the final state of the talk before it was presented. Note that what I presented does not match the notes exactly.master
parent
3d8d8a594e
commit
fad5b41407
267
slides.org
267
slides.org
|
@ -117,84 +117,81 @@
|
|||
- [ ] =vim=
|
||||
- [ ] =screen=
|
||||
|
||||
* LACKING Slides [4/6]
|
||||
* REHEARSED Slides [5/5]
|
||||
:PROPERTIES:
|
||||
:ID: slides
|
||||
:END:
|
||||
** Summary :noexport:
|
||||
#+BEGIN: columnview :hlines 2 :maxlevel 3 :indent t :id slides
|
||||
| ITEM | DURATION | TODO | ENVIRONMENT |
|
||||
|-------------------------------------------------------+----------+----------+-------------|
|
||||
| Slides | 0:40:59 | LACKING | |
|
||||
|-------------------------------------------------------+----------+----------+-------------|
|
||||
| \_ Summary | | | |
|
||||
|-------------------------------------------------------+----------+----------+-------------|
|
||||
| \_ Introduction | 0:01:50 | READY | |
|
||||
| \_ Spoken Intro | 0:00:50 | READY | note |
|
||||
| \_ Choreographed Workflows | 00:00:20 | READY | fullframe |
|
||||
| \_ Practical Freedom | 0:00:40 | READY | fullframe |
|
||||
|-------------------------------------------------------+----------+----------+-------------|
|
||||
| \_ Practical Example: Web Browser | 0:07:03 | READY | |
|
||||
| \_ Browser Topics | | | |
|
||||
| \_ Example: Web Browser | 0:00:20 | READY | frame |
|
||||
| \_ Finding Text (Mouse-Driven GUI Interaction) | 0:01:00 | READY | frame |
|
||||
| \_ GUIs Change Over Time | 0:00:45 | READY | frame |
|
||||
| \_ Muscle Memory | 0:00:40 | READY | fullframe |
|
||||
| \_ A Research Task | 0:00:20 | READY | fullframe |
|
||||
| \_ Executing the Research Task | 0:02:24 | READY | frame |
|
||||
| \_ GUIs of a Feather | 0:00:35 | READY | fullframe |
|
||||
| \_ Macro-Like Keyboard Instructions | 0:01:00 | READY | fullframe |
|
||||
|-------------------------------------------------------+----------+----------+-------------|
|
||||
| \_ A New Perspective | 0:12:58 | READY | |
|
||||
| \_ Perspective Topics | | | |
|
||||
| \_ Secrets? | 0:00:55 | READY | fullframe |
|
||||
| \_ Lifting the Curtain | 0:00:35 | READY | frame |
|
||||
| \_ Text | 0:00:35 | READY | fullframe |
|
||||
| \_ Text is a Universal Interface | 0:01:19 | READY | fullframe |
|
||||
| \_ The Shell Command Prompt | 0:00:55 | READY | frame |
|
||||
| \_ Eliminating the Web Browser | 0:01:04 | READY | frame |
|
||||
| \_ Browser vs. =wget= Comparison | 0:00:20 | READY | frame |
|
||||
| \_ Finding Text on the Command Line | 0:01:00 | READY | frame |
|
||||
| \_ A More Gentle Reply | 0:01:00 | READY | frame |
|
||||
| \_ Writing to Files (Redirection) | 0:00:55 | READY | frame |
|
||||
| \_ Starting Our List | 0:01:00 | READY | fullframe |
|
||||
| \_ Command Refactoring | 0:02:05 | READY | fullframe |
|
||||
| \_ Again: Text is a Universal Interface | 0:00:20 | READY | againframe |
|
||||
| \_ Pipelines | 0:00:15 | READY | fullframe |
|
||||
| \_ Summary of the Unix Philosophy | 0:00:40 | READY | fullframe |
|
||||
|-------------------------------------------------------+----------+----------+-------------|
|
||||
| \_ Program Composition | 0:09:15 | READY | |
|
||||
| \_ Composition Topics | | | |
|
||||
| \_ LP Sessions | 0:02:30 | READY | fullframe |
|
||||
| \_ Interactive, Incremental, Iterative Development | 0:01:10 | READY | fullframe |
|
||||
| \_ Discovering URLs | 0:02:15 | READY | fullframe |
|
||||
| \_ Go Grab a Coffee | 0:00:15 | READY | fullframe |
|
||||
| \_ Async Processes | 0:00:45 | READY | fullframe |
|
||||
| \_ Executable Shell Script and Concurrency | 0:01:30 | READY | fullframe |
|
||||
| \_ Execution Time | 0:00:50 | READY | frame |
|
||||
|-------------------------------------------------------+----------+----------+-------------|
|
||||
| \_ More Examples | 0:09:52 | REVIEWED | |
|
||||
| \_ More Example Topics | | | |
|
||||
| \_ Resize Images | 0:00:30 | REVIEWED | frame |
|
||||
| \_ Password Generation | 0:00:45 | REVIEWED | frame |
|
||||
| \_ Password Manager | 0:01:39 | REVIEWED | frame |
|
||||
| \_ Remote Password Manager With 2FA | 0:01:30 | REVIEWED | frame |
|
||||
| \_ Taking Screenshots | 0:00:35 | REVIEWED | frame |
|
||||
| \_ Screenshot OCR | 0:01:00 | REVIEWED | frame |
|
||||
| \_ Full Circle | 0:02:24 | REVIEWED | fullframe |
|
||||
| \_ Getting Help | 0:01:30 | REVIEWED | frame |
|
||||
|-------------------------------------------------------+----------+----------+-------------|
|
||||
| \_ Outro | | DEVOID | |
|
||||
| \_ Outro Topics | | | |
|
||||
|-------------------------------------------------------+----------+----------+-------------|
|
||||
| \_ Thank You | 00:00:01 | | fullframe |
|
||||
| ITEM | DURATION | TODO | ENVIRONMENT |
|
||||
|-------------------------------------------------------+----------+-----------+-------------|
|
||||
| Slides | 0:39:53 | REHEARSED | |
|
||||
|-------------------------------------------------------+----------+-----------+-------------|
|
||||
| \_ Summary | | | |
|
||||
|-------------------------------------------------------+----------+-----------+-------------|
|
||||
| \_ Introduction | 0:01:24 | REHEARSED | |
|
||||
| \_ Spoken Intro | 0:00:25 | REHEARSED | note |
|
||||
| \_ Choreographed Workflows | 00:00:20 | REHEARSED | fullframe |
|
||||
| \_ Practical Freedom | 0:00:40 | REHEARSED | fullframe |
|
||||
|-------------------------------------------------------+----------+-----------+-------------|
|
||||
| \_ Practical Example: Web Browser | 0:06:34 | REHEARSED | |
|
||||
| \_ Browser Topics | | | |
|
||||
| \_ Example: Web Browser | 0:00:10 | REHEARSED | frame |
|
||||
| \_ Finding Text (Mouse-Driven GUI Interaction) | 0:01:00 | REHEARSED | frame |
|
||||
| \_ GUIs Change Over Time | 0:00:45 | REHEARSED | frame |
|
||||
| \_ Muscle Memory | 0:00:40 | REHEARSED | fullframe |
|
||||
| \_ A Research Task | 0:00:20 | REHEARSED | fullframe |
|
||||
| \_ Executing the Research Task | 0:02:05 | REHEARSED | frame |
|
||||
| \_ GUIs of a Feather | 0:00:35 | REHEARSED | fullframe |
|
||||
| \_ Macro-Like Keyboard Instructions | 0:01:00 | REHEARSED | fullframe |
|
||||
|-------------------------------------------------------+----------+-----------+-------------|
|
||||
| \_ A New Perspective | 0:12:48 | REHEARSED | |
|
||||
| \_ Perspective Topics | | | |
|
||||
| \_ Secrets? | 0:00:55 | REHEARSED | fullframe |
|
||||
| \_ Lifting the Curtain | 0:00:35 | REHEARSED | frame |
|
||||
| \_ Text | 0:00:35 | REHEARSED | fullframe |
|
||||
| \_ Text is a Universal Interface | 0:01:10 | REHEARSED | fullframe |
|
||||
| \_ The Shell Command Prompt | 0:00:55 | REHEARSED | frame |
|
||||
| \_ Eliminating the Web Browser | 0:01:04 | REHEARSED | frame |
|
||||
| \_ Browser vs. =wget= Comparison | 0:00:20 | REHEARSED | frame |
|
||||
| \_ Finding Text on the Command Line | 0:01:00 | REHEARSED | frame |
|
||||
| \_ A More Gentle Reply | 0:01:00 | REHEARSED | frame |
|
||||
| \_ Writing to Files (Redirection) | 0:00:55 | REHEARSED | frame |
|
||||
| \_ Starting Our List | 0:01:00 | REHEARSED | fullframe |
|
||||
| \_ Command Refactoring | 0:02:05 | REHEARSED | fullframe |
|
||||
| \_ Again: Text is a Universal Interface | 0:00:20 | REHEARSED | againframe |
|
||||
| \_ Pipelines | 0:00:15 | REHEARSED | fullframe |
|
||||
| \_ Summary of the Unix Philosophy | 0:00:40 | REHEARSED | fullframe |
|
||||
|-------------------------------------------------------+----------+-----------+-------------|
|
||||
| \_ Program Composition | 0:09:15 | REHEARSED | |
|
||||
| \_ Composition Topics | | | |
|
||||
| \_ LP Sessions | 0:02:30 | REHEARSED | fullframe |
|
||||
| \_ Interactive, Incremental, Iterative Development | 0:01:10 | REHEARSED | fullframe |
|
||||
| \_ Discovering URLs | 0:02:15 | REHEARSED | fullframe |
|
||||
| \_ Go Grab a Coffee | 0:00:15 | REHEARSED | fullframe |
|
||||
| \_ Async Processes | 0:00:45 | REHEARSED | fullframe |
|
||||
| \_ Executable Shell Script and Concurrency | 0:01:30 | REHEARSED | fullframe |
|
||||
| \_ Execution Time | 0:00:50 | REHEARSED | frame |
|
||||
|-------------------------------------------------------+----------+-----------+-------------|
|
||||
| \_ More Examples | 0:09:52 | REHEARSED | |
|
||||
| \_ More Example Topics | | | |
|
||||
| \_ Resize Images | 0:00:30 | REHEARSED | frame |
|
||||
| \_ Password Generation | 0:00:45 | REHEARSED | frame |
|
||||
| \_ Password Manager | 0:01:39 | REHEARSED | frame |
|
||||
| \_ Remote Password Manager With 2FA | 0:01:30 | REHEARSED | frame |
|
||||
| \_ Taking Screenshots | 0:00:35 | REHEARSED | frame |
|
||||
| \_ Screenshot OCR | 0:01:00 | REHEARSED | frame |
|
||||
| \_ Full Circle | 0:02:24 | REHEARSED | fullframe |
|
||||
| \_ Getting Help | 0:01:30 | REHEARSED | frame |
|
||||
|-------------------------------------------------------+----------+-----------+-------------|
|
||||
| \_ Thank You | 00:00:01 | | fullframe |
|
||||
#+END:
|
||||
|
||||
** READY Introduction [3/3]
|
||||
*** READY Spoken Intro :B_note:
|
||||
** REHEARSED Introduction [3/3]
|
||||
*** REHEARSED Spoken Intro :B_note:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: note
|
||||
:DURATION: 0:00:50
|
||||
:DURATION: 0:00:25
|
||||
:END:
|
||||
|
||||
Hello, everyone!
|
||||
|
@ -202,27 +199,16 @@ Hello, everyone!
|
|||
My name is Mike Gerwitz.
|
||||
I am a free software hacker and activist with a focus on user privacy and
|
||||
security.
|
||||
I'm also a GNU Maintainer and software evaluator,
|
||||
and hold various administrative duties within GNU.
|
||||
I'm also a GNU Maintainer and volunteer.
|
||||
I have about twenty years of programming experience,
|
||||
half of that professionally.
|
||||
|
||||
And I've been a computer user for longer.
|
||||
So I've been around long enough to see a decent evolution in how we interact
|
||||
with machines.
|
||||
I've gotten a sense of what feels right and wrong as both a user and a
|
||||
hacker.
|
||||
|
||||
So I'm here today to try to explore a healthy balance,
|
||||
and walk you through what I see as an efficient means of computing,
|
||||
based on the problems that /I've/ encountered,
|
||||
and the problems I've seen /others/ encounter over the years.
|
||||
My hope is that the examples I have chosen will be useful not just to
|
||||
programmers,
|
||||
but to lightly technical users as well.
|
||||
|
||||
|
||||
*** READY Choreographed Workflows :B_fullframe:
|
||||
*** REHEARSED Choreographed Workflows :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:DURATION: 00:00:20
|
||||
|
@ -244,7 +230,7 @@ And I don't deny that this has been a useful method for making computers
|
|||
But it's important to understand where this trend falls short.
|
||||
|
||||
|
||||
*** READY Practical Freedom :B_fullframe:
|
||||
*** REHEARSED Practical Freedom :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -273,10 +259,11 @@ My goal here is to blur those lines between ``user'' and ``programmer'' and
|
|||
But it does require a different way of thinking.
|
||||
|
||||
To begin,
|
||||
let's start by exploring something most people are familiar with.
|
||||
let's start by exploring something that I think most people can relate to
|
||||
using.
|
||||
|
||||
|
||||
** READY Practical Example: Web Browser [8/8]
|
||||
** REHEARSED Practical Example: Web Browser [8/8]
|
||||
*** Browser Topics [3/3] :noexport:
|
||||
This example is the main segue from GUIs into the utility of keybindings
|
||||
into shell, so it has to be compelling. I chose something that is
|
||||
|
@ -316,7 +303,7 @@ frequently done by users: visiting webpages and searching for text.
|
|||
text editor.
|
||||
- [X] But what if I had 10? 100? 1000? This is still tedious and slow.
|
||||
|
||||
*** READY Example: Web Browser :B_frame:
|
||||
*** REHEARSED Example: Web Browser :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -326,7 +313,7 @@ frequently done by users: visiting webpages and searching for text.
|
|||
**** Notes :B_noteNH:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: noteNH
|
||||
:DURATION: 00:00:20
|
||||
:DURATION: 00:00:10
|
||||
:END:
|
||||
|
||||
The only GUI I use on a day-to-day basis is my web browser.
|
||||
|
@ -336,10 +323,7 @@ In this case,
|
|||
This is a screenshot of an admittedly staged session,
|
||||
and contains a number of addons.
|
||||
|
||||
I chose a graphical web browser as an example because I feel that it's
|
||||
something that almost everyone can relate to using,
|
||||
|
||||
*** READY Finding Text (Mouse-Driven GUI Interaction) :B_frame:
|
||||
*** REHEARSED Finding Text (Mouse-Driven GUI Interaction) :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -404,7 +388,7 @@ There is no canonical representation for these instructions,
|
|||
because it involves clicking on elements that have no clear name to the
|
||||
user.
|
||||
|
||||
*** READY GUIs Change Over Time :B_frame:
|
||||
*** REHEARSED GUIs Change Over Time :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -461,7 +445,7 @@ When you type =Ctrl+F=,
|
|||
it immediately opens that search bar and gives focus to the textbox,
|
||||
so you can just start typing.
|
||||
|
||||
*** READY Muscle Memory :B_fullframe:
|
||||
*** REHEARSED Muscle Memory :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -500,7 +484,7 @@ You develop muscle memory.
|
|||
/<Repeatedly make motion with hand and fingers like a madman during the
|
||||
above paragraph.>/
|
||||
|
||||
*** READY A Research Task :B_fullframe:
|
||||
*** REHEARSED A Research Task :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -529,7 +513,7 @@ And I want you to come up with a list of the webpages that /do not/ contain
|
|||
|
||||
How might we approach this problem as an average user?
|
||||
|
||||
*** READY Executing the Research Task :B_frame:
|
||||
*** REHEARSED Executing the Research Task :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -634,7 +618,7 @@ _Keyboard_
|
|||
******* Notes :B_noteNH:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: noteNH
|
||||
:DURATION: 00:01:10
|
||||
:DURATION: 00:00:50
|
||||
:END:
|
||||
|
||||
Fortunately we have /many/ more keybindings at our disposal!
|
||||
|
@ -674,7 +658,7 @@ We don't have to seek out our actions each time in the GUI---the
|
|||
operations are always at our fingertips,
|
||||
literally.
|
||||
|
||||
*** READY GUIs of a Feather :B_fullframe:
|
||||
*** REHEARSED GUIs of a Feather :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -708,7 +692,7 @@ Certain keybindings are ubiquitous---if
|
|||
Let's look at those keybindings a bit more concisely,
|
||||
since that last slide was a bit of a mess.
|
||||
|
||||
*** READY Macro-Like Keyboard Instructions :B_fullframe:
|
||||
*** REHEARSED Macro-Like Keyboard Instructions :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -772,7 +756,7 @@ I don't wish that suffering upon anyone.
|
|||
To get around that,
|
||||
we need to change how we think about our computing a bit.
|
||||
|
||||
** READY A New Perspective [15/15]
|
||||
** REHEARSED A New Perspective [15/15]
|
||||
*** Perspective Topics [13/13] :noexport:
|
||||
- [X] What if I could walk away and get a coffee, play with the kids,
|
||||
come back and have it done for me?
|
||||
|
@ -809,7 +793,7 @@ To get around that,
|
|||
- [X] Alias =fetch-url= for =wget -qO-=.
|
||||
- [X] Introduce the Unix philosophy
|
||||
|
||||
*** READY Secrets? :B_fullframe:
|
||||
*** REHEARSED Secrets? :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -848,9 +832,10 @@ It's because modern interfaces have come to completely mask it or provide
|
|||
alternatives to it that happen to be ``good enough'' for a particular use
|
||||
case.
|
||||
|
||||
But ``good enough'' is only good enough until it's not.
|
||||
But ``good enough'' is only good enough until it's not,
|
||||
until you need to do something /outside/ of that preconceived workflow.
|
||||
|
||||
*** READY Lifting the Curtain :B_frame:
|
||||
*** REHEARSED Lifting the Curtain :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -902,7 +887,7 @@ We don't need to view the webpage with all its fancy formatting.
|
|||
For the problem we're trying to solve,
|
||||
the graphical representation provides little benefit.
|
||||
|
||||
*** READY Text :B_fullframe:
|
||||
*** REHEARSED Text :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -935,7 +920,7 @@ And sure enough,
|
|||
Completely different program,
|
||||
and we can still find the text using the same keybinding.
|
||||
|
||||
*** READY Text is a Universal Interface :B_fullframe:
|
||||
*** REHEARSED Text is a Universal Interface :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -946,7 +931,7 @@ Text is a Universal Interface
|
|||
**** Notes :B_noteNH:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: noteNH
|
||||
:DURATION: 00:01:20
|
||||
:DURATION: 00:01:10
|
||||
:END:
|
||||
|
||||
Text is a universal interface.
|
||||
|
@ -984,7 +969,7 @@ Up until this point,
|
|||
an /alternative/ to something.
|
||||
Now we're going to venture into a world where it is /the/ interface.
|
||||
|
||||
*** READY The Shell Command Prompt :B_frame:
|
||||
*** REHEARSED The Shell Command Prompt :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -1034,7 +1019,7 @@ Bash is also the default on Mac OSX,
|
|||
you have no freedom there.
|
||||
And Windows now has something they call
|
||||
``Bash on Ubuntu on Windows'',
|
||||
which just is GNU/Linux running atop of the proprietary Windows kernel.
|
||||
which just is GNU running atop of the proprietary Windows kernel.
|
||||
You can do better that that!
|
||||
|
||||
When I present commands here,
|
||||
|
@ -1042,7 +1027,7 @@ When I present commands here,
|
|||
and the output immediately follows it,
|
||||
like so.
|
||||
|
||||
*** READY Eliminating the Web Browser :B_frame:
|
||||
*** REHEARSED Eliminating the Web Browser :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -1109,7 +1094,7 @@ If we open this file,
|
|||
and we never had to open a web browser.
|
||||
And we can search it all the same as before for ``free software''.
|
||||
|
||||
*** READY Browser vs. =wget= Comparison :B_frame:
|
||||
*** REHEARSED Browser vs. =wget= Comparison :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -1139,7 +1124,7 @@ It's hard to imagine a more direct line of communication with the computer
|
|||
for downloading a webpage,
|
||||
short of reading your mind.
|
||||
|
||||
*** READY Finding Text on the Command Line :B_frame:
|
||||
*** REHEARSED Finding Text on the Command Line :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -1190,7 +1175,7 @@ So while we have efficiently /conveyed/ a search string,
|
|||
we didn't receive an efficient /reply/---it's
|
||||
information overload.
|
||||
|
||||
*** READY A More Gentle Reply :B_frame:
|
||||
*** REHEARSED A More Gentle Reply :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -1255,7 +1240,7 @@ But if you recall our research task,
|
|||
We can do that too,
|
||||
by using two pipes in place of two ampersands.
|
||||
|
||||
*** READY Writing to Files (Redirection) :B_frame:
|
||||
*** REHEARSED Writing to Files (Redirection) :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -1310,7 +1295,7 @@ The second type,
|
|||
If the file doesn't yet exist,
|
||||
it will be created.
|
||||
|
||||
*** READY Starting Our List :B_fullframe:
|
||||
*** REHEARSED Starting Our List :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -1352,7 +1337,7 @@ At this point,
|
|||
But this is a hefty command to have to modify each time we want to try a
|
||||
different URL.
|
||||
|
||||
*** READY Command Refactoring :B_fullframe:
|
||||
*** REHEARSED Command Refactoring :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -1502,7 +1487,7 @@ By the way,
|
|||
But before we keep going,
|
||||
I want to go back to a point I mentioned previously.
|
||||
|
||||
*** READY Again: Text is a Universal Interface :B_againframe:
|
||||
*** REHEARSED Again: Text is a Universal Interface :B_againframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: againframe
|
||||
:BEAMER_ref: *Text is a Universal Interface
|
||||
|
@ -1526,7 +1511,7 @@ That's because text is something that both humans and computers can work
|
|||
This is a fundamental design principle in the Unix tools that I have begun
|
||||
to present to you.
|
||||
|
||||
*** READY Pipelines :B_fullframe:
|
||||
*** REHEARSED Pipelines :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -1551,7 +1536,7 @@ As part of the Unix philosophy,
|
|||
More broadly,
|
||||
the Unix philosophy can be summarized as:
|
||||
|
||||
*** READY Summary of the Unix Philosophy :B_fullframe:
|
||||
*** REHEARSED Summary of the Unix Philosophy :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:DURATION: 0:00:40
|
||||
|
@ -1588,7 +1573,7 @@ We start to think of how to decompose problems into small operations that
|
|||
We think of how to chain small, specialized programs together,
|
||||
transforming text at each step to make it more suitable for the next.
|
||||
|
||||
** READY Program Composition [7/7]
|
||||
** REHEARSED Program Composition [7/7]
|
||||
*** Composition Topics [6/6] :noexport:
|
||||
- [X] Clarify how pipelines work with existing =wget | grep=.
|
||||
- [X] More involved pipeline with more than two programs.
|
||||
|
@ -1609,7 +1594,7 @@ We think of how to chain small, specialized programs together,
|
|||
- [X] Extract =url-grep= into script.
|
||||
- [X] Demonstrate running jobs in parallel with =xargs=.
|
||||
|
||||
*** READY LP Sessions :B_fullframe:
|
||||
*** REHEARSED LP Sessions :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -1715,7 +1700,7 @@ $ fetch-url https://libreplanet.org/2019/speakers/ \
|
|||
| uniq -cd \
|
||||
| sort -nr \
|
||||
| head -n5 \
|
||||
| sed 's#^ *\(.\+\) <em>\(.*\)</em>#\2 has \1 speakers#g'
|
||||
| sed 's#^ *\(.\+\) <em>\(.*\)</em>#\2 has \1 speakers#'
|
||||
The Tor Project: State of the Onion has 5 speakers
|
||||
Large-scale collaboration with free software has 4 speakers
|
||||
The joy of bug reporting has 2 speakers
|
||||
|
@ -1817,7 +1802,7 @@ Your computer will speak the top five talks by presenter count to you.
|
|||
Listening to computers speak is all the rage right now,
|
||||
right?
|
||||
|
||||
*** READY Interactive, Incremental, Iterative Development :B_fullframe:
|
||||
*** REHEARSED Interactive, Incremental, Iterative Development :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -1866,7 +1851,7 @@ If something doesn't work,
|
|||
And because we're working with text as data,
|
||||
a human can replace any part of this process!
|
||||
|
||||
*** READY Discovering URLs :B_fullframe:
|
||||
*** REHEARSED Discovering URLs :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -2066,7 +2051,7 @@ We can do that too by reading =results.txt= in place of standard input to
|
|||
|
||||
Phew!
|
||||
|
||||
*** READY Go Grab a Coffee :B_fullframe:
|
||||
*** REHEARSED Go Grab a Coffee :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -2089,7 +2074,7 @@ The Internet is fast nowadays;
|
|||
ideally, we wouldn't have to wait long.
|
||||
Can we do better?
|
||||
|
||||
*** READY Async Processes :B_fullframe:
|
||||
*** REHEARSED Async Processes :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -2142,7 +2127,7 @@ But what if we have 1000?
|
|||
That isn't efficient,
|
||||
and it's a bit rude to server administrators.
|
||||
|
||||
*** READY Executable Shell Script and Concurrency :B_fullframe:
|
||||
*** REHEARSED Executable Shell Script and Concurrency :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -2171,7 +2156,7 @@ wget -qO- "$url" \
|
|||
$ chmod +x url-grep
|
||||
#+END_SRC
|
||||
|
||||
#+BEAMER: \begin{onlyenv}<1-2>
|
||||
#+BEAMER: \begin{onlyenv}<1>
|
||||
#+BEGIN_SRC sh
|
||||
$ while read URL; do
|
||||
./url-grep 'free software' "$URL" >> results.txt
|
||||
|
@ -2179,7 +2164,7 @@ $ while read URL; do
|
|||
#+END_SRC
|
||||
#+BEAMER: \end{onlyenv}
|
||||
|
||||
#+BEAMER: \begin{onlyenv}<3>
|
||||
#+BEAMER: \begin{onlyenv}<2>
|
||||
#+BEGIN_SRC sh
|
||||
$ xargs -n1 ./url-grep 'free software' > results.txt
|
||||
|
||||
|
@ -2187,7 +2172,7 @@ $ xargs -n1 ./url-grep 'free software' > results.txt
|
|||
#+END_SRC
|
||||
#+BEAMER: \end{onlyenv}
|
||||
|
||||
#+BEAMER: \begin{onlyenv}<4>
|
||||
#+BEAMER: \begin{onlyenv}<3>
|
||||
#+BEGIN_SRC sh
|
||||
$ xargs -n1 -P5 ./url-grep 'free software' > results.txt
|
||||
# ^ 5 concurrent processes
|
||||
|
@ -2244,7 +2229,7 @@ Here we specify =5=,
|
|||
meaning =xargs= will run five processes at a time.
|
||||
You can change that to whatever number makes sense for you.
|
||||
|
||||
*** READY Execution Time :B_frame:
|
||||
*** REHEARSED Execution Time :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -2292,7 +2277,7 @@ We've come a long way from using the web browser and a mouse.
|
|||
Now that we've finally completed our research task,
|
||||
let's look at a few more examples.
|
||||
|
||||
** REVIEWED More Examples [0/8]
|
||||
** REHEARSED More Examples [8/8]
|
||||
*** More Example Topics [7/7] :noexport:
|
||||
- [X] Screenshots with =import=.
|
||||
- Including copying to clipboard.
|
||||
|
@ -2310,7 +2295,7 @@ Now that we've finally completed our research task,
|
|||
- [X] Finding documentation with =info= and =man=.
|
||||
|
||||
|
||||
*** REVIEWED Resize Images :B_frame:
|
||||
*** REHEARSED Resize Images :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -2343,7 +2328,7 @@ The second example uses the =find= command and searches all child
|
|||
directories as well.
|
||||
Both examples produce a new set of images prefixed with =sm-=.
|
||||
|
||||
*** REVIEWED Password Generation :B_frame:
|
||||
*** REHEARSED Password Generation :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -2388,7 +2373,7 @@ The EFF recommends taking at least six words,
|
|||
This one is particularly memorable and morbid-sounding.
|
||||
I'm a little upset that I put it in the slide instead of using it!
|
||||
|
||||
*** REVIEWED Password Manager :B_frame:
|
||||
*** REHEARSED Password Manager :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -2470,7 +2455,7 @@ Since the decrypted data exist only as part of the pipeline,
|
|||
the decrypted passwords are only kept plaintext in memory for the duration
|
||||
of the script.
|
||||
|
||||
*** REVIEWED Remote Password Manager With 2FA :B_frame:
|
||||
*** REHEARSED Remote Password Manager With 2FA :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -2540,7 +2525,7 @@ But you could easily do both---
|
|||
|
||||
|
||||
|
||||
*** REVIEWED Taking Screenshots :B_frame:
|
||||
*** REHEARSED Taking Screenshots :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -2580,7 +2565,7 @@ Notice the new =image/png= type there.
|
|||
Now you can paste the image into other programs,
|
||||
like image editors or websites.
|
||||
|
||||
*** REVIEWED Screenshot OCR :B_frame:
|
||||
*** REHEARSED Screenshot OCR :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -2662,7 +2647,7 @@ And yet,
|
|||
YMMV though with tesseract,
|
||||
depending on your settings and training data.
|
||||
|
||||
*** REVIEWED Full Circle :B_fullframe:
|
||||
*** REHEARSED Full Circle :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
:END:
|
||||
|
@ -2764,7 +2749,7 @@ That also thwarts systems that implement the terrible anti-pattern of try to
|
|||
prevent you from pasting passwords.
|
||||
|
||||
|
||||
*** REVIEWED Getting Help :B_frame:
|
||||
*** REHEARSED Getting Help :B_frame:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: frame
|
||||
:END:
|
||||
|
@ -2832,10 +2817,6 @@ This is obviously a bit different than how people interact with GUIs,
|
|||
documentation.
|
||||
|
||||
|
||||
** DEVOID Outro
|
||||
*** Outro Topics :noexport:
|
||||
This section may be able to be merged into the previous; I have it here as a
|
||||
placeholder to show why the status of [[*Slides]] is =LACKING=.
|
||||
** Thank You :B_fullframe:
|
||||
:PROPERTIES:
|
||||
:BEAMER_env: fullframe
|
||||
|
@ -2855,7 +2836,7 @@ Mike Gerwitz
|
|||
|
||||
Slides and Source Code Available Online
|
||||
|
||||
<[[https://mikegerwitz.com/talks/cs4m]]>
|
||||
<[[https://mikegerwitz.com/talks/cs4m]].pdf>
|
||||
|
||||
\bigskip
|
||||
|
||||
|
|
Loading…
Reference in New Issue