summaryrefslogtreecommitdiffstats
path: root/2021/captions/dashboard.md
diff options
context:
space:
mode:
Diffstat (limited to '2021/captions/dashboard.md')
-rw-r--r--2021/captions/dashboard.md329
1 files changed, 329 insertions, 0 deletions
diff --git a/2021/captions/dashboard.md b/2021/captions/dashboard.md
new file mode 100644
index 00000000..71d332f3
--- /dev/null
+++ b/2021/captions/dashboard.md
@@ -0,0 +1,329 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hi everyone! I'm Mehmet Tekman," start="00:00:00.000" video="mainVideo" id=subtitle]]
+[[!template text="and I'm here to talk to you" start="00:00:01.567" video="mainVideo" id=subtitle]]
+[[!template text="about using Amazon Kindles" start="00:00:02.483" video="mainVideo" id=subtitle]]
+[[!template text="as a productivity dashboard for" start="00:00:03.700" video="mainVideo" id=subtitle]]
+[[!template text="your various projects." start="00:00:05.040" video="mainVideo" id=subtitle]]
+[[!template text="In a nutshell, you describe your machines," start="00:00:07.359" video="mainVideo" id=subtitle]]
+[[!template text="your commands, and your schedules" start="00:00:09.519" video="mainVideo" id=subtitle]]
+[[!template text="in an Org-Mode file," start="00:00:11.317" video="mainVideo" id=subtitle]]
+[[!template text="and then you just initialize" start="00:00:13.120" video="mainVideo" id=subtitle]]
+[[!template text="your Kindle devices." start="00:00:14.933" video="mainVideo" id=subtitle]]
+[[!template text="These devices are asleep" start="00:00:16.960" video="mainVideo" id=subtitle]]
+[[!template text="most of the time," start="00:00:18.367" video="mainVideo" id=subtitle]]
+[[!template text="but they wake up at scheduled times" start="00:00:19.117" video="mainVideo" id=subtitle]]
+[[!template text="to retrieve content" start="00:00:20.720" video="mainVideo" id=subtitle]]
+[[!template text="from the centralized server." start="00:00:22.033" video="mainVideo" id=subtitle]]
+[[!template text="Content can be Org mode and Emacs-based," start="00:00:24.800" video="mainVideo" id=subtitle]]
+[[!template text="or it can be from Web content," start="00:00:27.599" video="mainVideo" id=subtitle]]
+[[!template text="or it can just be static images and WAV." start="00:00:29.500" video="mainVideo" id=subtitle]]
+[[!template text="If you, like me, struggle to" start="00:00:42.840" video="mainVideo" id=subtitle]]
+[[!template text="keep your life under tabs," start="00:00:45.600" video="mainVideo" id=subtitle]]
+[[!template text="or find it very hard to separate" start="00:00:46.833" video="mainVideo" id=subtitle]]
+[[!template text="your work life from your home life," start="00:00:48.300" video="mainVideo" id=subtitle]]
+[[!template text="then you, like me, likely need" start="00:00:49.417" video="mainVideo" id=subtitle]]
+[[!template text="some kind of passive background service" start="00:00:51.283" video="mainVideo" id=subtitle]]
+[[!template text="that reminds you of where you are" start="00:00:52.917" video="mainVideo" id=subtitle]]
+[[!template text="and what you are supposed to be doing." start="00:00:54.083" video="mainVideo" id=subtitle]]
+[[!template text="Even if it's just a sign saying," start="00:00:55.267" video="mainVideo" id=subtitle]]
+[[!template text="&quot;You're at home! Relax!&quot;" start="00:00:56.960" video="mainVideo" id=subtitle]]
+[[!template text="An Amazon Kindle is perfect for this." start="00:00:58.640" video="mainVideo" id=subtitle]]
+[[!template text="In a nutshell, it's a cheap" start="00:01:00.400" video="mainVideo" id=subtitle]]
+[[!template text="black and white e-ink device" start="00:01:01.717" video="mainVideo" id=subtitle]]
+[[!template text="that can go for weeks" start="00:01:03.117" video="mainVideo" id=subtitle]]
+[[!template text="without needing a single charge." start="00:01:03.800" video="mainVideo" id=subtitle]]
+[[!template text="Every year, Amazon brings out" start="00:01:05.033" video="mainVideo" id=subtitle]]
+[[!template text="an incrementally better model," start="00:01:06.767" video="mainVideo" id=subtitle]]
+[[!template text="which makes the old devices obsolete," start="00:01:07.983" video="mainVideo" id=subtitle]]
+[[!template text="and you can find these older models" start="00:01:09.333" video="mainVideo" id=subtitle]]
+[[!template text="for 5 euros on second-hand websites." start="00:01:11.067" video="mainVideo" id=subtitle]]
+[[!template text="Plus it runs Linux, has WiFi networking," start="00:01:13.360" video="mainVideo" id=subtitle]]
+[[!template text="and has a dedicated forum of hackers" start="00:01:15.360" video="mainVideo" id=subtitle]]
+[[!template text="for getting the most out of the device." start="00:01:16.987" video="mainVideo" id=subtitle]]
+[[!template text="Some drawbacks of this is that" start="00:01:19.200" video="mainVideo" id=subtitle]]
+[[!template text="the device often comes with unwanted bloat:" start="00:01:20.366" video="mainVideo" id=subtitle]]
+[[!template text="over-the-air updates," start="00:01:22.799" video="mainVideo" id=subtitle]]
+[[!template text="it phones home to Amazon regularly," start="00:01:24.050" video="mainVideo" id=subtitle]]
+[[!template text="it has a secret microphone" start="00:01:25.833" video="mainVideo" id=subtitle]]
+[[!template text="embedded in the device," start="00:01:27.033" video="mainVideo" id=subtitle]]
+[[!template text="and it has a bunch of creepy" start="00:01:27.983" video="mainVideo" id=subtitle]]
+[[!template text="seemingly interdependent" start="00:01:29.433" video="mainVideo" id=subtitle]]
+[[!template text="background processes," start="00:01:30.633" video="mainVideo" id=subtitle]]
+[[!template text="where killing one kind of kills the others" start="00:01:31.439" video="mainVideo" id=subtitle]]
+[[!template text="risking that you will break the device." start="00:01:34.083" video="mainVideo" id=subtitle]]
+[[!template text="But this is where the community" start="00:01:36.560" video="mainVideo" id=subtitle]]
+[[!template text="really shines through," start="00:01:37.799" video="mainVideo" id=subtitle]]
+[[!template text="since the friendly (and not-so-friendly)" start="00:01:38.883" video="mainVideo" id=subtitle]]
+[[!template text="users (and developers)" start="00:01:40.483" video="mainVideo" id=subtitle]]
+[[!template text="from the MobileRead forums have pretty much" start="00:01:41.583" video="mainVideo" id=subtitle]]
+[[!template text="scraped out a good portion of the" start="00:01:43.200" video="mainVideo" id=subtitle]]
+[[!template text="harmful Amazon scripts from the device." start="00:01:44.560" video="mainVideo" id=subtitle]]
+[[!template text="Some of the devices even use" start="00:01:46.960" video="mainVideo" id=subtitle]]
+[[!template text="Awesome Window Manager," start="00:01:48.550" video="mainVideo" id=subtitle]]
+[[!template text="meaning you can really play around" start="00:01:49.483" video="mainVideo" id=subtitle]]
+[[!template text="with the existing system" start="00:01:50.800" video="mainVideo" id=subtitle]]
+[[!template text="without having to create" start="00:01:51.620" video="mainVideo" id=subtitle]]
+[[!template text="your own X11 server." start="00:01:52.633" video="mainVideo" id=subtitle]]
+[[!template text="This then empowers users" start="00:01:54.233" video="mainVideo" id=subtitle]]
+[[!template text="to display whatever they want on the device." start="00:01:55.377" video="mainVideo" id=subtitle]]
+[[!template text="One project that really got this going" start="00:01:57.600" video="mainVideo" id=subtitle]]
+[[!template text="was the Kindle-Dash dashboard from" start="00:01:59.040" video="mainVideo" id=subtitle]]
+[[!template text="Pascal Widdershoven, who really refined a" start="00:02:00.560" video="mainVideo" id=subtitle]]
+[[!template text="lot of the internal scripts" start="00:02:02.320" video="mainVideo" id=subtitle]]
+[[!template text="to stabilize the device." start="00:02:03.483" video="mainVideo" id=subtitle]]
+[[!template text="However, the project then" start="00:02:05.439" video="mainVideo" id=subtitle]]
+[[!template text="puts the onus on the device" start="00:02:06.600" video="mainVideo" id=subtitle]]
+[[!template text="to retrieve the data from" start="00:02:07.650" video="mainVideo" id=subtitle]]
+[[!template text="somewhere else over the internet," start="00:02:08.560" video="mainVideo" id=subtitle]]
+[[!template text="and so you still need to" start="00:02:09.950" video="mainVideo" id=subtitle]]
+[[!template text="generate the content" start="00:02:10.753" video="mainVideo" id=subtitle]]
+[[!template text="and place it on the web somewhere." start="00:02:11.440" video="mainVideo" id=subtitle]]
+[[!template text="Plus you need to do this and manage it" start="00:02:13.200" video="mainVideo" id=subtitle]]
+[[!template text="for every Kindle device that you have." start="00:02:14.640" video="mainVideo" id=subtitle]]
+[[!template text="Kindle-Sync, however," start="00:02:17.360" video="mainVideo" id=subtitle]]
+[[!template text="is an entirely different beast," start="00:02:18.500" video="mainVideo" id=subtitle]]
+[[!template text="albeit one that builds off of the works" start="00:02:19.867" video="mainVideo" id=subtitle]]
+[[!template text="of the aforementioned projects." start="00:02:21.800" video="mainVideo" id=subtitle]]
+[[!template text="It assumes that instead of just having" start="00:02:23.440" video="mainVideo" id=subtitle]]
+[[!template text="one Kindle device around" start="00:02:24.800" video="mainVideo" id=subtitle]]
+[[!template text="that you wish to re-purpose" start="00:02:26.050" video="mainVideo" id=subtitle]]
+[[!template text="for productivity purposes," start="00:02:27.133" video="mainVideo" id=subtitle]]
+[[!template text="that you actually have" start="00:02:28.080" video="mainVideo" id=subtitle]]
+[[!template text="multiple Kindle devices" start="00:02:28.983" video="mainVideo" id=subtitle]]
+[[!template text="that you want to manage" start="00:02:30.117" video="mainVideo" id=subtitle]]
+[[!template text="and configure in tandem." start="00:02:30.794" video="mainVideo" id=subtitle]]
+[[!template text="Everything is managed" start="00:02:32.720" video="mainVideo" id=subtitle]]
+[[!template text="from a dedicated server (or a raspberry pi)" start="00:02:33.633" video="mainVideo" id=subtitle]]
+[[!template text="which distributes jobs to multiple Kindles," start="00:02:35.667" video="mainVideo" id=subtitle]]
+[[!template text="running on different update timers." start="00:02:37.440" video="mainVideo" id=subtitle]]
+[[!template text="These timers are all managed" start="00:02:39.519" video="mainVideo" id=subtitle]]
+[[!template text="from the server," start="00:02:40.786" video="mainVideo" id=subtitle]]
+[[!template text="and all the Kindle device has to do is:" start="00:02:41.486" video="mainVideo" id=subtitle]]
+[[!template text="to wake up, power on the WiFi," start="00:02:43.017" video="mainVideo" id=subtitle]]
+[[!template text="receive some media, display the media, and" start="00:02:45.200" video="mainVideo" id=subtitle]]
+[[!template text="receive a barebones RTC sleep request." start="00:02:47.280" video="mainVideo" id=subtitle]]
+[[!template text="Then it sleeps for the requested time," start="00:02:49.680" video="mainVideo" id=subtitle]]
+[[!template text="consuming no power, whilst displaying the" start="00:02:51.040" video="mainVideo" id=subtitle]]
+[[!template text="desired media. That is maybe 10 seconds" start="00:02:52.800" video="mainVideo" id=subtitle]]
+[[!template text="of awake time between each request." start="00:02:55.200" video="mainVideo" id=subtitle]]
+[[!template text="Cron does not actually run" start="00:02:57.599" video="mainVideo" id=subtitle]]
+[[!template text="on the Kindle device itself," start="00:02:58.933" video="mainVideo" id=subtitle]]
+[[!template text="simply because it does not reliably work." start="00:02:59.933" video="mainVideo" id=subtitle]]
+[[!template text="All of this is handled by the server." start="00:03:01.600" video="mainVideo" id=subtitle]]
+[[!template text="With the server-client model," start="00:03:04.050" video="mainVideo" id=subtitle]]
+[[!template text="it also tries to restrict Amazon access." start="00:03:05.599" video="mainVideo" id=subtitle]]
+[[!template text="SSH keys are shared" start="00:03:08.000" video="mainVideo" id=subtitle]]
+[[!template text="only from the client to the server," start="00:03:09.517" video="mainVideo" id=subtitle]]
+[[!template text="but not from the server to the client," start="00:03:11.217" video="mainVideo" id=subtitle]]
+[[!template text="so the Kindle cannot connect" start="00:03:12.517" video="mainVideo" id=subtitle]]
+[[!template text="to the Raspberry Pi without a password." start="00:03:13.920" video="mainVideo" id=subtitle]]
+[[!template text="IPtables rules are also set" start="00:03:16.319" video="mainVideo" id=subtitle]]
+[[!template text="so that the Kindle cannot phone home" start="00:03:18.033" video="mainVideo" id=subtitle]]
+[[!template text="to Amazon, and the connections" start="00:03:19.483" video="mainVideo" id=subtitle]]
+[[!template text="are restricted to just the LAN." start="00:03:20.667" video="mainVideo" id=subtitle]]
+[[!template text="So I got very curious at one point" start="00:03:23.200" video="mainVideo" id=subtitle]]
+[[!template text="and decided to see how long" start="00:03:24.820" video="mainVideo" id=subtitle]]
+[[!template text="a Kindle could last on a single charge" start="00:03:26.133" video="mainVideo" id=subtitle]]
+[[!template text="in such an arrangement," start="00:03:27.599" video="mainVideo" id=subtitle]]
+[[!template text="so that every 15 minutes for 18 hours," start="00:03:28.560" video="mainVideo" id=subtitle]]
+[[!template text="I tested the device" start="00:03:30.640" video="mainVideo" id=subtitle]]
+[[!template text="by sending a media item" start="00:03:31.599" video="mainVideo" id=subtitle]]
+[[!template text="and recording the battery level." start="00:03:32.959" video="mainVideo" id=subtitle]]
+[[!template text="The Kindle doesn't seem to" start="00:03:35.200" video="mainVideo" id=subtitle]]
+[[!template text="report the battery level" start="00:03:36.159" video="mainVideo" id=subtitle]]
+[[!template text="very continuously," start="00:03:36.959" video="mainVideo" id=subtitle]]
+[[!template text="but at discrete percentages," start="00:03:37.760" video="mainVideo" id=subtitle]]
+[[!template text="so that you could end up with" start="00:03:39.040" video="mainVideo" id=subtitle]]
+[[!template text="a graph that looks like this." start="00:03:39.840" video="mainVideo" id=subtitle]]
+[[!template text="Assuming you have half the charge," start="00:03:42.159" video="mainVideo" id=subtitle]]
+[[!template text="and use it once every hour -" start="00:03:43.617" video="mainVideo" id=subtitle]]
+[[!template text="it will drop by 10% battery in 76 hours," start="00:03:45.200" video="mainVideo" id=subtitle]]
+[[!template text="which is roughly three days." start="00:03:48.319" video="mainVideo" id=subtitle]]
+[[!template text="It's hard to extrapolate" start="00:03:49.760" video="mainVideo" id=subtitle]]
+[[!template text="with only three good summarized data points," start="00:03:50.640" video="mainVideo" id=subtitle]]
+[[!template text="of which the number of requests" start="00:03:52.400" video="mainVideo" id=subtitle]]
+[[!template text="per battery level appear to diminish" start="00:03:53.519" video="mainVideo" id=subtitle]]
+[[!template text="as shown in the table below," start="00:03:54.879" video="mainVideo" id=subtitle]]
+[[!template text="but the final result yields 76 requests" start="00:03:56.640" video="mainVideo" id=subtitle]]
+[[!template text="with an average loss of 0.5% battery life" start="00:03:58.560" video="mainVideo" id=subtitle]]
+[[!template text="per request. Which is not bad!" start="00:04:00.799" video="mainVideo" id=subtitle]]
+[[!template text="Assuming you do a request every 2 hours" start="00:04:02.273" video="mainVideo" id=subtitle]]
+[[!template text="from 8am to 8pm," start="00:04:04.400" video="mainVideo" id=subtitle]]
+[[!template text="and let it sleep at night," start="00:04:06.000" video="mainVideo" id=subtitle]]
+[[!template text="then that's approximately 6 requests a day," start="00:04:07.040" video="mainVideo" id=subtitle]]
+[[!template text="which could easily last a device" start="00:04:09.040" video="mainVideo" id=subtitle]]
+[[!template text="for a month." start="00:04:10.400" video="mainVideo" id=subtitle]]
+[[!template text="The ksync script does" start="00:04:11.280" video="mainVideo" id=subtitle]]
+[[!template text="essentially everything:" start="00:04:12.586" video="mainVideo" id=subtitle]]
+[[!template text="from generating and fetching the media," start="00:04:13.200" video="mainVideo" id=subtitle]]
+[[!template text="to initializing all Kindle devices," start="00:04:14.799" video="mainVideo" id=subtitle]]
+[[!template text="generating the server cronjobs," start="00:04:16.720" video="mainVideo" id=subtitle]]
+[[!template text="log report summaries," start="00:04:18.160" video="mainVideo" id=subtitle]]
+[[!template text="editing the config tables," start="00:04:19.199" video="mainVideo" id=subtitle]]
+[[!template text="and much more." start="00:04:20.400" video="mainVideo" id=subtitle]]
+[[!template text="The media operations are comparatively" start="00:04:21.199" video="mainVideo" id=subtitle]]
+[[!template text="much more complex" start="00:04:22.880" video="mainVideo" id=subtitle]]
+[[!template text="and encompass a few media use cases" start="00:04:23.680" video="mainVideo" id=subtitle]]
+[[!template text="such as fetching the weather" start="00:04:25.280" video="mainVideo" id=subtitle]]
+[[!template text="(though only from Open Weather Maps)" start="00:04:26.400" video="mainVideo" id=subtitle]]
+[[!template text="and retrieving Google Calendar views" start="00:04:28.560" video="mainVideo" id=subtitle]]
+[[!template text="by week, month, agenda, and four day view." start="00:04:30.000" video="mainVideo" id=subtitle]]
+[[!template text="You can retrieve Org-Mode data" start="00:04:32.000" video="mainVideo" id=subtitle]]
+[[!template text="from an Emacs instance on the server," start="00:04:33.199" video="mainVideo" id=subtitle]]
+[[!template text="which in my case" start="00:04:34.639" video="mainVideo" id=subtitle]]
+[[!template text="I produce views for an agenda" start="00:04:35.360" video="mainVideo" id=subtitle]]
+[[!template text="or a sparse tree of my main projects file." start="00:04:36.720" video="mainVideo" id=subtitle]]
+[[!template text="Finally we have gallery and wavfile," start="00:04:39.360" video="mainVideo" id=subtitle]]
+[[!template text="which are static resources" start="00:04:41.120" video="mainVideo" id=subtitle]]
+[[!template text="which will never change once generated." start="00:04:42.240" video="mainVideo" id=subtitle]]
+[[!template text="The idea is that you feed it" start="00:04:44.000" video="mainVideo" id=subtitle]]
+[[!template text="text and an image location," start="00:04:45.199" video="mainVideo" id=subtitle]]
+[[!template text="and it generates" start="00:04:46.400" video="mainVideo" id=subtitle]]
+[[!template text="a Kindle-compatible image" start="00:04:47.040" video="mainVideo" id=subtitle]]
+[[!template text="using imagemagick as a backend for it." start="00:04:48.720" video="mainVideo" id=subtitle]]
+[[!template text="In the case of the wavfile," start="00:04:51.280" video="mainVideo" id=subtitle]]
+[[!template text="it uses espeak on the backend." start="00:04:52.240" video="mainVideo" id=subtitle]]
+[[!template text="The below is summarized" start="00:04:54.160" video="mainVideo" id=subtitle]]
+[[!template text="from the help-me text" start="00:04:55.280" video="mainVideo" id=subtitle]]
+[[!template text="in the main ksync file," start="00:04:56.317" video="mainVideo" id=subtitle]]
+[[!template text="but essentially, you need to" start="00:04:57.199" video="mainVideo" id=subtitle]]
+[[!template text="define your config in the CSV files," start="00:04:58.160" video="mainVideo" id=subtitle]]
+[[!template text="which we talk about in the next section;" start="00:04:59.919" video="mainVideo" id=subtitle]]
+[[!template text="initialize all your Kindle devices," start="00:05:01.440" video="mainVideo" id=subtitle]]
+[[!template text="i.e. copy over SSH keys," start="00:05:03.120" video="mainVideo" id=subtitle]]
+[[!template text="kill all the unnecessary services," start="00:05:04.720" video="mainVideo" id=subtitle]]
+[[!template text="and prime them for media collection;" start="00:05:06.160" video="mainVideo" id=subtitle]]
+[[!template text="and ensure that you have" start="00:05:07.840" video="mainVideo" id=subtitle]]
+[[!template text="all your static media generated" start="00:05:08.720" video="mainVideo" id=subtitle]]
+[[!template text="and fetchable; and finally" start="00:05:10.080" video="mainVideo" id=subtitle]]
+[[!template text="you then refresh the scheduling" start="00:05:11.440" video="mainVideo" id=subtitle]]
+[[!template text="on the server." start="00:05:12.720" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so this is all good and well," start="00:05:14.240" video="mainVideo" id=subtitle]]
+[[!template text="and we now know what the server does" start="00:05:15.759" video="mainVideo" id=subtitle]]
+[[!template text="and how to probe and inspect it -" start="00:05:17.039" video="mainVideo" id=subtitle]]
+[[!template text="but how does the server generate" start="00:05:18.400" video="mainVideo" id=subtitle]]
+[[!template text="much of the content?" start="00:05:19.759" video="mainVideo" id=subtitle]]
+[[!template text="So a lot of the content" start="00:05:21.120" video="mainVideo" id=subtitle]]
+[[!template text="will be dynamically generated," start="00:05:22.080" video="mainVideo" id=subtitle]]
+[[!template text="meaning it cannot be cached" start="00:05:23.360" video="mainVideo" id=subtitle]]
+[[!template text="and is likely to change from hour to hour." start="00:05:24.639" video="mainVideo" id=subtitle]]
+[[!template text="The media content that is generated here" start="00:05:26.720" video="mainVideo" id=subtitle]]
+[[!template text="are mostly PNG images" start="00:05:28.400" video="mainVideo" id=subtitle]]
+[[!template text="and have a timestamp" start="00:05:29.759" video="mainVideo" id=subtitle]]
+[[!template text="embedded in their filenames." start="00:05:30.567" video="mainVideo" id=subtitle]]
+[[!template text="The Emacs-specific content" start="00:05:32.320" video="mainVideo" id=subtitle]]
+[[!template text="consists of a few views," start="00:05:33.520" video="mainVideo" id=subtitle]]
+[[!template text="namely the org-gcal views," start="00:05:34.560" video="mainVideo" id=subtitle]]
+[[!template text="org-agenda, and org-calories --" start="00:05:36.000" video="mainVideo" id=subtitle]]
+[[!template text="essentially anything that Emacs can display" start="00:05:37.600" video="mainVideo" id=subtitle]]
+[[!template text="and that you want to capture into an image." start="00:05:39.520" video="mainVideo" id=subtitle]]
+[[!template text="Emacs can't (as far as I know)" start="00:05:42.000" video="mainVideo" id=subtitle]]
+[[!template text="render graphics in a headless way," start="00:05:43.360" video="mainVideo" id=subtitle]]
+[[!template text="so what we do instead" start="00:05:44.639" video="mainVideo" id=subtitle]]
+[[!template text="is run Emacs in a dummy minimal X11 session" start="00:05:45.600" video="mainVideo" id=subtitle]]
+[[!template text="via &quot;xvrb-run.&quot;" start="00:05:48.240" video="mainVideo" id=subtitle]]
+[[!template text="From inside, you can take screenshots" start="00:05:50.080" video="mainVideo" id=subtitle]]
+[[!template text="as you would in" start="00:05:51.680" video="mainVideo" id=subtitle]]
+[[!template text="a normal desktop environment," start="00:05:52.233" video="mainVideo" id=subtitle]]
+[[!template text="but with the benefit that" start="00:05:53.440" video="mainVideo" id=subtitle]]
+[[!template text="you don't actually need to invoke a desktop" start="00:05:54.400" video="mainVideo" id=subtitle]]
+[[!template text="or interfere with an existing one." start="00:05:56.479" video="mainVideo" id=subtitle]]
+[[!template text="The minimal elisp shown here" start="00:05:58.560" video="mainVideo" id=subtitle]]
+[[!template text="is all that is required" start="00:05:59.840" video="mainVideo" id=subtitle]]
+[[!template text="to output your desired image from Emacs" start="00:06:00.720" video="mainVideo" id=subtitle]]
+[[!template text="and configure it for the Kindle environment." start="00:06:02.400" video="mainVideo" id=subtitle]]
+[[!template text="On the web side of things," start="00:06:04.479" video="mainVideo" id=subtitle]]
+[[!template text="we don't really need to invoke" start="00:06:05.360" video="mainVideo" id=subtitle]]
+[[!template text="a dummy X11 session" start="00:06:06.400" video="mainVideo" id=subtitle]]
+[[!template text="because Chromium can run headless" start="00:06:07.520" video="mainVideo" id=subtitle]]
+[[!template text="and can be controlled" start="00:06:09.120" video="mainVideo" id=subtitle]]
+[[!template text="by the node library &quot;puppeteer&quot;" start="00:06:09.919" video="mainVideo" id=subtitle]]
+[[!template text="to render dynamic content," start="00:06:11.600" video="mainVideo" id=subtitle]]
+[[!template text="focus on regions of the webpage," start="00:06:13.039" video="mainVideo" id=subtitle]]
+[[!template text="and take snapshots." start="00:06:14.560" video="mainVideo" id=subtitle]]
+[[!template text="The static content comprises" start="00:06:16.080" video="mainVideo" id=subtitle]]
+[[!template text="of two types: images and audio." start="00:06:17.600" video="mainVideo" id=subtitle]]
+[[!template text="The content is accessed by a key," start="00:06:19.600" video="mainVideo" id=subtitle]]
+[[!template text="in this case Batman," start="00:06:21.520" video="mainVideo" id=subtitle]]
+[[!template text="and the content information" start="00:06:22.560" video="mainVideo" id=subtitle]]
+[[!template text="is given by the &quot;--extra&quot; parameter" start="00:06:23.600" video="mainVideo" id=subtitle]]
+[[!template text="which describes either or both" start="00:06:25.199" video="mainVideo" id=subtitle]]
+[[!template text="an image and text." start="00:06:26.960" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so now we have content," start="00:06:30.880" video="mainVideo" id=subtitle]]
+[[!template text="how do we schedule this content" start="00:06:32.248" video="mainVideo" id=subtitle]]
+[[!template text="to appear on our desired machines" start="00:06:33.600" video="mainVideo" id=subtitle]]
+[[!template text="at desired times?" start="00:06:34.960" video="mainVideo" id=subtitle]]
+[[!template text="Everything is run via cron." start="00:06:36.400" video="mainVideo" id=subtitle]]
+[[!template text="So previously we saw that" start="00:06:37.759" video="mainVideo" id=subtitle]]
+[[!template text="we only needed the tables MACHINES.csv," start="00:06:38.720" video="mainVideo" id=subtitle]]
+[[!template text="COMMANDS.csv, and multiple TIME_*.csv tables" start="00:06:40.880" video="mainVideo" id=subtitle]]
+[[!template text="for the shell script to work." start="00:06:43.440" video="mainVideo" id=subtitle]]
+[[!template text="But Org-Mode does this far easier," start="00:06:44.880" video="mainVideo" id=subtitle]]
+[[!template text="since you can just have everything" start="00:06:46.479" video="mainVideo" id=subtitle]]
+[[!template text="in the same file," start="00:06:47.919" video="mainVideo" id=subtitle]]
+[[!template text="and with the helper minor-mode," start="00:06:49.039" video="mainVideo" id=subtitle]]
+[[!template text="manage everything" start="00:06:50.720" video="mainVideo" id=subtitle]]
+[[!template text="from a single Org-Mode document." start="00:06:51.360" video="mainVideo" id=subtitle]]
+[[!template text="Here I have 4 kindles and their shortnames." start="00:06:53.120" video="mainVideo" id=subtitle]]
+[[!template text="Yes, I even have a Kindle" start="00:06:55.120" video="mainVideo" id=subtitle]]
+[[!template text="hanging outside my door." start="00:06:56.160" video="mainVideo" id=subtitle]]
+[[!template text="I have 11 defined commands" start="00:06:57.520" video="mainVideo" id=subtitle]]
+[[!template text="which represent the views I want to see," start="00:06:58.960" video="mainVideo" id=subtitle]]
+[[!template text="and there are 4 timetables I use," start="00:07:00.800" video="mainVideo" id=subtitle]]
+[[!template text="but you can have" start="00:07:02.319" video="mainVideo" id=subtitle]]
+[[!template text="everything on one, if you like." start="00:07:02.800" video="mainVideo" id=subtitle]]
+[[!template text="Rows are machine names," start="00:07:04.319" video="mainVideo" id=subtitle]]
+[[!template text="and columns are corresponding hours" start="00:07:05.360" video="mainVideo" id=subtitle]]
+[[!template text="at which they run." start="00:07:06.800" video="mainVideo" id=subtitle]]
+[[!template text="Trust me, it's easier to configure" start="00:07:07.840" video="mainVideo" id=subtitle]]
+[[!template text="repeating tasks just by repeating them" start="00:07:09.440" video="mainVideo" id=subtitle]]
+[[!template text="multiple times, because at least this way," start="00:07:10.960" video="mainVideo" id=subtitle]]
+[[!template text="it's human readable," start="00:07:12.720" video="mainVideo" id=subtitle]]
+[[!template text="and the script which converts these" start="00:07:13.680" video="mainVideo" id=subtitle]]
+[[!template text="to a cronjob" start="00:07:14.880" video="mainVideo" id=subtitle]]
+[[!template text="collapses the repeating tasks by itself." start="00:07:15.759" video="mainVideo" id=subtitle]]
+[[!template text="The ksync script can be called" start="00:07:18.800" video="mainVideo" id=subtitle]]
+[[!template text="from within the config.org file" start="00:07:20.560" video="mainVideo" id=subtitle]]
+[[!template text="using this convenient" start="00:07:23.120" video="mainVideo" id=subtitle]]
+[[!template text="use-package declaration." start="00:07:24.683" video="mainVideo" id=subtitle]]
+[[!template text="All that one needs to do" start="00:07:26.960" video="mainVideo" id=subtitle]]
+[[!template text="is to configure the ENVIRONMENT_VARIABLES" start="00:07:28.319" video="mainVideo" id=subtitle]]
+[[!template text="by setting them in this table" start="00:07:30.560" video="mainVideo" id=subtitle]]
+[[!template text="where you set the repo name," start="00:07:32.880" video="mainVideo" id=subtitle]]
+[[!template text="the config directory," start="00:07:34.479" video="mainVideo" id=subtitle]]
+[[!template text="where the media shall go," start="00:07:36.160" video="mainVideo" id=subtitle]]
+[[!template text="and the server IP," start="00:07:37.599" video="mainVideo" id=subtitle]]
+[[!template text="although this can be" start="00:07:38.960" video="mainVideo" id=subtitle]]
+[[!template text="automatically detected." start="00:07:39.919" video="mainVideo" id=subtitle]]
+[[!template text="The package allows you" start="00:07:41.360" video="mainVideo" id=subtitle]]
+[[!template text="to export your tables" start="00:07:42.240" video="mainVideo" id=subtitle]]
+[[!template text="by running C-c C-c on them," start="00:07:43.440" video="mainVideo" id=subtitle]]
+[[!template text="and allows you to update all the jobs" start="00:07:46.720" video="mainVideo" id=subtitle]]
+[[!template text="related to each of your clients." start="00:07:49.199" video="mainVideo" id=subtitle]]
+[[!template text="You can also initialize clients" start="00:07:52.319" video="mainVideo" id=subtitle]]
+[[!template text="using this package --" start="00:07:53.759" video="mainVideo" id=subtitle]]
+[[!template text="for either all of them" start="00:07:55.120" video="mainVideo" id=subtitle]]
+[[!template text="or individual clients --" start="00:07:56.479" video="mainVideo" id=subtitle]]
+[[!template text="and the package comes with" start="00:07:58.479" video="mainVideo" id=subtitle]]
+[[!template text="some convenience functions" start="00:07:59.599" video="mainVideo" id=subtitle]]
+[[!template text="to do this automatically" start="00:08:01.120" video="mainVideo" id=subtitle]]
+[[!template text="for all tables in the buffer." start="00:08:02.720" video="mainVideo" id=subtitle]]
+[[!template text="With this, I want to say a big thank you" start="00:08:06.720" video="mainVideo" id=subtitle]]
+[[!template text="to Takaaki Ishikawa" start="00:08:08.319" video="mainVideo" id=subtitle]]
+[[!template text="for his fantastic &quot;org-tree-slide&quot;" start="00:08:09.840" video="mainVideo" id=subtitle]]
+[[!template text="presentation package." start="00:08:11.520" video="mainVideo" id=subtitle]]
+[[!template text="To Pascal Widdershoven" start="00:08:12.879" video="mainVideo" id=subtitle]]
+[[!template text="and David Hamp-Gonsalves," start="00:08:14.136" video="mainVideo" id=subtitle]]
+[[!template text="for their fantastic" start="00:08:15.803" video="mainVideo" id=subtitle]]
+[[!template text="kindle-dash repositories," start="00:08:16.633" video="mainVideo" id=subtitle]]
+[[!template text="for which some of my internal Kindle scripts" start="00:08:17.840" video="mainVideo" id=subtitle]]
+[[!template text="are derived from." start="00:08:19.903" video="mainVideo" id=subtitle]]
+[[!template text="Also a big thanks to the friendly" start="00:08:20.720" video="mainVideo" id=subtitle]]
+[[!template text="and not-so-friendly users and hackers" start="00:08:22.160" video="mainVideo" id=subtitle]]
+[[!template text="in the MobileRead forums." start="00:08:23.520" video="mainVideo" id=subtitle]]
+[[!template text="And finally, a big thanks" start="00:08:24.960" video="mainVideo" id=subtitle]]
+[[!template text="to the Emacs community" start="00:08:25.919" video="mainVideo" id=subtitle]]
+[[!template text="and the conference organizers." start="00:08:26.960" video="mainVideo" id=subtitle]]
+[[!template text="Thank you! captions by Mehmet" start="00:08:28.270" video="mainVideo" id=subtitle]]