summaryrefslogtreecommitdiffstats
path: root/2023
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--2023/captions/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main--chapters.vtt38
-rw-r--r--2023/captions/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main.vtt803
-rw-r--r--2023/info/cubing-after.md267
-rw-r--r--2023/info/cubing-before.md16
4 files changed, 1123 insertions, 1 deletions
diff --git a/2023/captions/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main--chapters.vtt b/2023/captions/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main--chapters.vtt
new file mode 100644
index 00000000..2c46c976
--- /dev/null
+++ b/2023/captions/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main--chapters.vtt
@@ -0,0 +1,38 @@
+WEBVTT
+
+
+00:00:00.000 --> 00:01:35.399
+Introduction
+
+00:01:35.400 --> 00:02:01.159
+Cubing in Emacs
+
+00:02:01.160 --> 00:02:32.039
+Prior art
+
+00:02:32.040 --> 00:03:16.519
+The name
+
+00:03:16.520 --> 00:03:49.239
+What's in wca-prep
+
+00:03:49.240 --> 00:04:03.080
+Demo
+
+00:05:15.340 --> 00:07:09.219
+Challenges: Representing the cube
+
+00:07:09.220 --> 00:08:09.499
+Scrambling
+
+00:08:09.500 --> 00:08:56.419
+Visualization
+
+00:08:56.420 --> 00:09:55.579
+UI with Transient
+
+00:09:55.580 --> 00:11:12.579
+Book-keeping with SQLite
+
+00:11:12.580 --> 00:13:30.860
+Conclusion
diff --git a/2023/captions/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main.vtt b/2023/captions/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main.vtt
new file mode 100644
index 00000000..2ae22295
--- /dev/null
+++ b/2023/captions/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main.vtt
@@ -0,0 +1,803 @@
+WEBVTT captioned by sachac, checked by sachac
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:08.359
+Hello, everyone, and welcome to Speedcubing in Emacs.
+
+00:00:08.360 --> 00:00:10.119
+First of all, a little bit about myself.
+
+00:00:10.120 --> 00:00:13.679
+My name is Vasilij Schneidermann. Online, I go by wasamasa.
+
+00:00:13.680 --> 00:00:18.039
+I'm 31 years old. I work in information security,
+
+00:00:18.040 --> 00:00:20.479
+and I do consulting and hacking
+
+00:00:20.480 --> 00:00:22.479
+and stuff like figuring out
+
+00:00:22.480 --> 00:00:25.279
+how to break into other people's computers
+
+00:00:25.280 --> 00:00:29.359
+and how to secure their systems basically.
+
+00:00:29.360 --> 00:00:31.439
+You can reach me by email.
+
+00:00:31.440 --> 00:00:36.639
+I do have a self-hosted code repository thingy going on.
+
+00:00:36.640 --> 00:00:40.399
+I have a blog, and you can find me
+
+00:00:40.400 --> 00:00:45.919
+in some other places online, like IRC for example.
+
+00:00:45.920 --> 00:00:48.679
+So about the talk itself,
+
+00:00:48.680 --> 00:00:52.839
+I used to be into the Rubik's cube when I was in school.
+
+00:00:52.840 --> 00:00:54.039
+I forgot about it, though,
+
+00:00:54.040 --> 00:00:56.279
+because these cubes were not very good.
+
+00:00:56.280 --> 00:01:02.279
+Recently I did find some cheap looking cube at a shop.
+
+00:01:02.280 --> 00:01:04.119
+Did not pay terribly much for it.
+
+00:01:04.120 --> 00:01:07.039
+It was so, so much better than my old cube,
+
+00:01:07.040 --> 00:01:08.639
+it was unreal.
+
+00:01:08.640 --> 00:01:11.479
+This motivated me to get back into
+
+00:01:11.480 --> 00:01:13.559
+this really weird kind of hobby.
+
+00:01:13.560 --> 00:01:17.999
+For this, you need to be good at producing
+
+00:01:18.000 --> 00:01:19.399
+a truly random scramble
+
+00:01:19.400 --> 00:01:22.319
+and timing your attempts to get any better at it.
+
+00:01:22.320 --> 00:01:23.719
+There is, of course, existing software
+
+00:01:23.720 --> 00:01:26.239
+to do the scrambling for you and the recording
+
+00:01:26.240 --> 00:01:28.079
+and the timekeeping and such,
+
+00:01:28.080 --> 00:01:31.239
+but all the good options seem to be either web or mobile,
+
+00:01:31.240 --> 00:01:33.239
+for example the cstimer software
+
+00:01:33.240 --> 00:01:35.399
+or the twisty-timer app on Android.
+
+
+NOTE Cubing in Emacs
+
+00:01:35.400 --> 00:01:39.319
+To my surprise, I did not find a single decent option
+
+00:01:39.320 --> 00:01:41.959
+inside Emacs, so this is basically a case study
+
+00:01:41.960 --> 00:01:44.999
+how to do better. For this, I wanted to make use of
+
+00:01:45.000 --> 00:01:47.799
+all the cool new Emacs features that appeared,
+
+00:01:47.800 --> 00:01:50.879
+like the SVG library; Transient,
+
+00:01:50.880 --> 00:01:53.599
+the library used for the Magit-style interfaces;
+
+00:01:53.600 --> 00:01:56.439
+and the recently added sqlite-mode.
+
+00:01:56.440 --> 00:02:01.159
+And most importantly it was about having fun.
+
+NOTE Prior art
+
+00:02:01.160 --> 00:02:02.759
+So here's a full list of prior art,
+
+00:02:02.760 --> 00:02:04.279
+I will not go into detail about this,
+
+00:02:04.280 --> 00:02:06.239
+but basically we have things solving
+
+00:02:06.240 --> 00:02:08.039
+very different parts of this,
+
+00:02:08.040 --> 00:02:10.759
+but not all of it. For example: we have several,
+
+00:02:10.760 --> 00:02:14.239
+we have a timer. We have several solvers.
+
+00:02:14.240 --> 00:02:16.039
+We have some scramblers.
+
+00:02:16.040 --> 00:02:19.359
+We have some whole-cube simulators, including a 3D one.
+
+00:02:19.360 --> 00:02:20.759
+We have something for making it easier
+
+00:02:20.760 --> 00:02:23.119
+to enter your algorithms in the notation.
+
+00:02:23.120 --> 00:02:25.919
+But nothing that does all of those things in one package,
+
+00:02:25.920 --> 00:02:28.119
+which kind of surprised me.
+
+00:02:28.120 --> 00:02:32.039
+So I present the `wca-prep` package.
+
+NOTE The name
+
+00:02:32.040 --> 00:02:35.559
+So the name, I found it difficult
+
+00:02:35.560 --> 00:02:39.959
+to come up with a good name and so I looked
+
+00:02:39.960 --> 00:02:42.559
+and I saw, well there's this World Cube Association
+
+00:02:42.560 --> 00:02:46.039
+that holds these competitions where you compete.
+
+00:02:46.040 --> 00:02:47.759
+They do this for the Rubik's cube
+
+00:02:47.760 --> 00:02:48.919
+but also a few others,
+
+00:02:48.920 --> 00:02:50.799
+so there's like a standardized list
+
+00:02:50.800 --> 00:02:52.639
+of events they have for this.
+
+00:02:52.640 --> 00:02:55.159
+There is a standard notation for this
+
+00:02:55.160 --> 00:02:56.519
+and rules and everything.
+
+00:02:56.520 --> 00:02:58.199
+And the goal of my package is basically
+
+00:02:58.200 --> 00:03:01.279
+to help prepare myself for such a competition
+
+00:03:01.280 --> 00:03:03.679
+and in fact a week ago I went to my first one
+
+00:03:03.680 --> 00:03:06.719
+which was wild, but pretty cool.
+
+00:03:06.720 --> 00:03:10.919
+So for this reason I chose this name wca-prep,
+
+00:03:10.920 --> 00:03:13.639
+because it helps me prepare for this kind of competition
+
+00:03:13.640 --> 00:03:16.519
+and this limited the scope significantly,
+
+NOTE What's in wca-prep
+
+00:03:16.520 --> 00:03:18.999
+I have a scrambler, visualization of the scramble,
+
+00:03:19.000 --> 00:03:23.319
+timer, and statistics.
+
+00:03:23.320 --> 00:03:25.559
+I excluded pretty much everything else I've seen.
+
+00:03:25.560 --> 00:03:28.788
+For this reason, I only tried to focus on
+
+00:03:28.789 --> 00:03:32.199
+some very basic puzzles I can solve comfortably,
+
+00:03:32.200 --> 00:03:34.839
+and did not want to do anything else
+
+00:03:34.840 --> 00:03:36.439
+that may complicate things significantly.
+
+00:03:36.440 --> 00:03:40.479
+No other kinds of puzzles, no simulation, no solving,
+
+00:03:40.480 --> 00:03:43.919
+no exotic events, and no specialized scrambles
+
+00:03:43.920 --> 00:03:49.239
+that are only good for practicing specific algorithms.
+
+NOTE Demo
+
+00:03:49.240 --> 00:03:54.199
+So at this point the organizer should hopefully show
+
+00:03:54.200 --> 00:03:57.999
+a small video I've prepared, a one minute video showing how
+
+00:03:58.000 --> 00:04:03.080
+I actually use this to solve a cube and to time my solve.
+
+NOTE Challenges: Representing the cube
+
+00:05:19.840 --> 00:05:22.959
+Okay, so building this thing, there were several challenges.
+
+00:05:22.960 --> 00:05:24.959
+The first one was how do I even represent
+
+00:05:24.960 --> 00:05:26.919
+the state of a Rubik's cube.
+
+00:05:26.920 --> 00:05:29.959
+For this there are many possible representations,
+
+00:05:29.960 --> 00:05:32.159
+no obvious best solution.
+
+00:05:32.160 --> 00:05:34.079
+I did not, well, what helped me was that
+
+00:05:34.080 --> 00:05:36.439
+I did not have to programmatically solve this thing,
+
+00:05:36.440 --> 00:05:39.639
+so I picked the easiest possible representation
+
+00:05:39.640 --> 00:05:42.719
+which is just an array of every single facelet.
+
+00:05:42.720 --> 00:05:46.959
+For a 3x3 cube you have 9 facelets on one side,
+
+00:05:46.960 --> 00:05:51.719
+so times 6 sides you would have 54 elements in this array.
+
+00:05:51.720 --> 00:05:54.159
+So with this representation, it's very simple,
+
+00:05:54.160 --> 00:05:56.839
+but it's kind of weird to do scrambles with this.
+
+00:05:56.840 --> 00:05:59.359
+But otherwise, it worked very, very well.
+
+00:05:59.360 --> 00:06:01.719
+In the future, I plan to learn some group theory,
+
+00:06:01.720 --> 00:06:03.199
+pick a better representation
+
+00:06:03.200 --> 00:06:05.639
+and do this in a much, much more elegant way
+
+00:06:05.640 --> 00:06:12.319
+without compromising speed too much.
+
+00:06:12.320 --> 00:06:15.159
+Yes. Once I had the representation,
+
+00:06:15.160 --> 00:06:18.079
+the scrambling itself should not be too hard.
+
+00:06:18.080 --> 00:06:22.199
+For this, it's important to consider that basically
+
+00:06:22.200 --> 00:06:23.599
+if you do a face turn
+
+00:06:23.600 --> 00:06:26.879
+you end up swapping some facelets with other facelets,
+
+00:06:26.880 --> 00:06:30.479
+that's the easiest way to think about this.
+
+00:06:30.480 --> 00:06:33.719
+To determine which one goes into which one's position,
+
+00:06:33.720 --> 00:06:36.921
+it was pretty confusing to figure this out.
+
+00:06:36.922 --> 00:06:38.759
+For this I went through a few papers,
+
+00:06:38.760 --> 00:06:40.479
+and I found one which suggested
+
+00:06:40.480 --> 00:06:42.399
+to just build a cube out of paper,
+
+00:06:42.400 --> 00:06:44.479
+number every facelet, and turn it
+
+00:06:44.480 --> 00:06:48.799
+and keep track of which facelet moved into which position.
+
+00:06:48.800 --> 00:06:51.959
+And programmatically, the `cl-rotatef` macro
+
+00:06:51.960 --> 00:06:53.839
+was very, very useful for doing this kind of
+
+00:06:53.840 --> 00:06:56.079
+in-place swapping you need for this operation.
+
+00:06:56.080 --> 00:06:59.319
+So in the future, group theory would hopefully
+
+00:06:59.320 --> 00:07:02.439
+make this a bit less awkward.
+
+00:07:02.440 --> 00:07:04.559
+Here's a photo of this paper cube I made
+
+00:07:04.560 --> 00:07:08.319
+along with a real cube. As you can see
+
+00:07:08.320 --> 00:07:11.799
+mathematically speaking, they are the same thing,
+
+00:07:11.800 --> 00:07:13.719
+they just look very, very different.
+
+NOTE Scrambling
+
+00:07:13.720 --> 00:07:18.759
+So the scramble algorithm itself,
+
+00:07:18.760 --> 00:07:23.879
+I pondered how this would even be done. In the competitions,
+
+00:07:23.880 --> 00:07:26.039
+They do this in a very, very elaborate way.
+
+00:07:26.040 --> 00:07:27.199
+They generate a random cube,
+
+00:07:27.200 --> 00:07:29.839
+they try to solve it, and if it's solvable
+
+00:07:29.840 --> 00:07:32.999
+they use these solution moves
+
+00:07:33.000 --> 00:07:35.279
+to turn into a scramble basically.
+
+00:07:35.280 --> 00:07:39.399
+And they also make sure to canonicalize the moves,
+
+00:07:39.400 --> 00:07:42.999
+so if you have subsequent moves that can be simplified,
+
+00:07:43.000 --> 00:07:45.039
+they do simplify these as much as possible.
+
+00:07:45.040 --> 00:07:45.679
+For example,
+
+00:07:45.680 --> 00:07:48.199
+if you have two subsequent rotations in one direction,
+
+00:07:48.200 --> 00:07:51.119
+it's turned into a different kind of rotation,
+
+00:07:51.120 --> 00:07:53.839
+so 90 and 90 equals 180.
+
+00:07:53.840 --> 00:07:57.759
+And the other Elisp scramblers I looked at,
+
+00:07:57.760 --> 00:07:59.559
+they generate random moves.
+
+00:07:59.560 --> 00:08:01.959
+Some of them do canonicalize. Not all of them.
+
+00:08:01.960 --> 00:08:05.359
+This one tries to do the best low-fi thing,
+
+00:08:05.360 --> 00:08:06.839
+that is, generating random moves,
+
+00:08:06.840 --> 00:08:08.479
+canonicalizing and repeating
+
+00:08:08.480 --> 00:08:13.999
+until enough have been generated.
+
+NOTE Visualization
+
+00:08:14.000 --> 00:08:17.599
+For the visualization I had to figure out
+
+00:08:17.600 --> 00:08:18.959
+something else too complicated.
+
+00:08:18.960 --> 00:08:21.679
+For this, I tried to figure out
+
+00:08:21.680 --> 00:08:24.319
+where every facelift would end up in the puzzle view
+
+00:08:24.320 --> 00:08:25.879
+when you would unfold it.
+
+00:08:25.880 --> 00:08:30.119
+And for this, I did not consider the facelet orientation.
+
+00:08:30.120 --> 00:08:33.719
+This may be important later for some other puzzles
+
+00:08:33.720 --> 00:08:35.599
+where you can end up with very twisted faces,
+
+00:08:35.600 --> 00:08:37.479
+but for simple cubes, it's not a problem.
+
+00:08:37.480 --> 00:08:40.759
+My initial prototype used colored text,
+
+00:08:40.760 --> 00:08:43.199
+but later, I used the SVG library.
+
+00:08:43.200 --> 00:08:46.039
+It turned out to be easy enough to use, actually.
+
+00:08:46.040 --> 00:08:50.559
+Currently, I have hard-coded face-color mappings,
+
+00:08:50.560 --> 00:08:53.559
+but I plan to replace this so that theming is possible.
+
+00:08:53.560 --> 00:08:56.039
+For example, if you happen to have a cube
+
+00:08:56.040 --> 00:08:59.140
+that does not have the same color mappings as I do,
+
+00:08:59.141 --> 00:09:00.919
+then you should be able to fix this.
+
+NOTE UI with Transient
+
+00:09:00.920 --> 00:09:05.879
+Next challenge was to build
+
+00:09:05.880 --> 00:09:08.399
+a beautiful intuitive UI with Transient.
+
+00:09:08.400 --> 00:09:11.319
+The reason why I chose this is
+
+00:09:11.320 --> 00:09:14.799
+because it would be self-documenting and Magit-style,
+
+00:09:14.800 --> 00:09:16.799
+and everyone knows how Magit works basically.
+
+00:09:16.800 --> 00:09:19.759
+Since Transient has become part of Emacs,
+
+00:09:19.760 --> 00:09:21.679
+there is really no reason to not try it out.
+
+00:09:21.680 --> 00:09:26.119
+The problem was documentation is difficult to understand.
+
+00:09:26.120 --> 00:09:27.839
+It's very abstract and high level,
+
+00:09:27.840 --> 00:09:30.319
+and it's hard to figure out. "Okay,
+
+00:09:30.320 --> 00:09:31.239
+I want to do something,
+
+00:09:31.240 --> 00:09:33.359
+how am I supposed to do this?"
+
+00:09:33.360 --> 00:09:37.799
+I did find transient-showcase, which has lots of examples,
+
+00:09:37.800 --> 00:09:40.079
+but they don't really feel finished
+
+00:09:40.080 --> 00:09:43.519
+and not realistic enough.
+
+00:09:43.520 --> 00:09:45.199
+When I tried to use the package,
+
+00:09:45.200 --> 00:09:47.359
+I got plenty of unhelpful error messages
+
+00:09:47.360 --> 00:09:48.559
+when using it incorrectly.
+
+00:09:48.560 --> 00:09:50.399
+I did manage to figure it out,
+
+00:09:50.400 --> 00:09:55.039
+but I plan to find more actual examples of it,
+
+00:09:55.040 --> 00:09:57.879
+to have an executable reference basically
+
+00:09:57.880 --> 00:10:00.079
+and try to improve my use of it.
+
+NOTE Book-keeping with SQLite
+
+00:10:00.080 --> 00:10:05.999
+For the book-keeping, I used SQLite.
+
+00:10:06.000 --> 00:10:08.999
+This is a very recent addition to Emacs,
+
+00:10:09.000 --> 00:10:11.759
+it only appeared in the current major version.
+
+00:10:11.760 --> 00:10:13.839
+It's still very early days.
+
+00:10:13.840 --> 00:10:17.479
+I found some oddities, one of them turned out to be
+
+00:10:17.480 --> 00:10:19.279
+a bug in the transaction macro.
+
+00:10:19.280 --> 00:10:22.039
+Like basically, if you do an SQL transaction
+
+00:10:22.040 --> 00:10:24.639
+and an error happens, then every helper I found
+
+00:10:24.640 --> 00:10:25.399
+does a rollback on an error.
+
+00:10:25.400 --> 00:10:31.199
+But this one did not. It actually committed on an error,
+
+00:10:31.200 --> 00:10:34.319
+and this was very weird to figure out.
+
+00:10:34.320 --> 00:10:38.759
+I reported a bug. Eli was nice enough to send me a patch.
+
+00:10:38.760 --> 00:10:39.879
+We did some patch review,
+
+00:10:39.880 --> 00:10:42.439
+and he ended up fixing it properly.
+
+00:10:42.440 --> 00:10:50.119
+So yes, there's still a lot to be done there, and yeah,
+
+00:10:50.120 --> 00:10:51.359
+the API is very basic.
+
+00:10:51.360 --> 00:10:53.359
+You don't have convenience helpers
+
+00:10:53.360 --> 00:10:55.759
+like fetch the first row or fetch the first value
+
+00:10:55.760 --> 00:10:58.880
+or anything, but they're easy enough to write yourself.
+
+00:10:58.881 --> 00:11:00.820
+And the biggest challenge with this bookkeeping part
+
+00:11:00.821 --> 00:11:02.479
+was figuring out a decent schema,
+
+00:11:02.480 --> 00:11:04.599
+like how to organize data correctly
+
+00:11:04.600 --> 00:11:06.799
+so that it would not be awkward to manipulate.
+
+00:11:06.800 --> 00:11:10.199
+And with this, you can finally build a package
+
+00:11:10.200 --> 00:11:11.839
+that remembers its state properly
+
+00:11:11.840 --> 00:11:14.919
+and don't have to run into foot guns
+
+00:11:14.920 --> 00:11:17.079
+with Lisp-style serialization, deserialization.
+
+NOTE Conclusion
+
+00:11:17.080 --> 00:11:22.639
+So yes, that concludes it so far.
+
+00:11:22.640 --> 00:11:26.639
+So what did I learn from this exercise?
+
+00:11:26.640 --> 00:11:28.959
+Well, there are still plenty of packages
+
+00:11:28.960 --> 00:11:30.039
+for Emacs to be written.
+
+00:11:30.040 --> 00:11:33.359
+If you think everything you can think of
+
+00:11:33.360 --> 00:11:35.799
+or you need has already been written, well, guess what?
+
+00:11:35.800 --> 00:11:36.239
+No.
+
+00:11:36.240 --> 00:11:38.495
+These are still plenty of specialized things
+
+00:11:38.496 --> 00:11:41.239
+that could need your help.
+
+00:11:41.240 --> 00:11:44.239
+These cubes do not require advanced mathematics,
+
+00:11:44.240 --> 00:11:45.599
+contrary to what you may think.
+
+00:11:45.600 --> 00:11:49.159
+Yes, you can apply advanced mathematics to them
+
+00:11:49.160 --> 00:11:51.919
+if you want to, but you don't have to.
+
+00:11:51.920 --> 00:11:55.439
+What surprised me about this is basically group theory.
+
+00:11:55.440 --> 00:11:56.519
+I've heard of it before.
+
+00:11:56.520 --> 00:11:58.279
+It seemed to be a meme, basically,
+
+00:11:58.280 --> 00:12:00.919
+because it has been like mostly Haskell people
+
+00:12:00.920 --> 00:12:02.639
+being very excited about this
+
+00:12:02.640 --> 00:12:06.959
+and it seemed kind of, like, divorced from reality, basically.
+
+00:12:06.960 --> 00:12:10.399
+But this puzzle, it actually proves that yes,
+
+00:12:10.400 --> 00:12:11.399
+it has its use.
+
+00:12:11.400 --> 00:12:12.879
+It definitely has.
+
+00:12:12.880 --> 00:12:15.839
+You just have to find the right problem matching it,
+
+00:12:15.840 --> 00:12:17.919
+and yeah.
+
+00:12:17.920 --> 00:12:19.839
+So yeah, once I understand it better,
+
+00:12:19.840 --> 00:12:22.999
+the topic, I expect to write better code.
+
+00:12:23.000 --> 00:12:28.919
+These new Emacs features, they work well enough.
+
+00:12:28.920 --> 00:12:30.359
+There are some rough edges.
+
+00:12:30.360 --> 00:12:31.879
+They definitely need more testing.
+
+00:12:31.880 --> 00:12:35.119
+So please, please, everyone,
+
+00:12:35.120 --> 00:12:38.999
+if you write Elisp, please try SQLite or Transient
+
+00:12:39.000 --> 00:12:41.159
+or anything else that looks cool and shiny.
+
+00:12:41.160 --> 00:12:42.919
+Report bugs.
+
+00:12:42.920 --> 00:12:46.039
+Find ways to improve them, anything. And yeah,
+
+00:12:46.040 --> 00:12:49.319
+I'm sure that if we do this,
+
+00:12:49.320 --> 00:12:52.119
+then Emacs will continue to get even better.
+
+00:12:52.120 --> 00:12:56.239
+So yeah, what's next for this package?
+
+00:12:56.240 --> 00:13:00.439
+Well, I could... There are lots of obvious UI improvements
+
+00:13:00.440 --> 00:13:01.799
+and testing to be done.
+
+00:13:01.800 --> 00:13:04.159
+I basically want to reach feature parity
+
+00:13:04.160 --> 00:13:06.879
+with the twisty-timer app, which this is very much inspired by.
+
+00:13:06.880 --> 00:13:11.119
+I want nice-looking stats like graphical ones
+
+00:13:11.120 --> 00:13:13.239
+instead of just a simple list of times.
+
+00:13:13.240 --> 00:13:15.679
+And I want support for more puzzles, of course,
+
+00:13:15.680 --> 00:13:16.999
+not just the simple cubes,
+
+00:13:17.000 --> 00:13:19.039
+but as I progress learning these puzzles,
+
+00:13:19.040 --> 00:13:22.519
+I want to have Emacs supporting me for this.
+
+00:13:22.520 --> 00:13:26.879
+But generally, it's a very open-ended package.
+
+00:13:26.880 --> 00:13:31.079
+And this concludes the talk.
+
+00:13:31.080 --> 00:13:35.360
+Thank you very much.
diff --git a/2023/info/cubing-after.md b/2023/info/cubing-after.md
index cd6e5d05..cec619c1 100644
--- a/2023/info/cubing-after.md
+++ b/2023/info/cubing-after.md
@@ -1,6 +1,273 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<a name="cubing-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hello, everyone, and welcome to Speedcubing in Emacs.""" start="00:00:00.000" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""First of all, a little bit about myself.""" start="00:00:08.360" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""My name is Vasilij Schneidermann. Online, I go by wasamasa.""" start="00:00:10.120" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I'm 31 years old. I work in information security,""" start="00:00:13.680" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and I do consulting and hacking""" start="00:00:18.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and stuff like figuring out""" start="00:00:20.480" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""how to break into other people's computers""" start="00:00:22.480" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and how to secure their systems basically.""" start="00:00:25.280" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""You can reach me by email.""" start="00:00:29.360" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I do have a self-hosted code repository thingy going on.""" start="00:00:31.440" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I have a blog, and you can find me""" start="00:00:36.640" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""in some other places online, like IRC for example.""" start="00:00:40.400" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""So about the talk itself,""" start="00:00:45.920" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I used to be into the Rubik's cube when I was in school.""" start="00:00:48.680" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I forgot about it, though,""" start="00:00:52.840" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""because these cubes were not very good.""" start="00:00:54.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""Recently I did find some cheap looking cube at a shop.""" start="00:00:56.280" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""Did not pay terribly much for it.""" start="00:01:02.280" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""It was so, so much better than my old cube,""" start="00:01:04.120" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""it was unreal.""" start="00:01:07.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""This motivated me to get back into""" start="00:01:08.640" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""this really weird kind of hobby.""" start="00:01:11.480" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""For this, you need to be good at producing""" start="00:01:13.560" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""a truly random scramble""" start="00:01:18.000" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and timing your attempts to get any better at it.""" start="00:01:19.400" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""There is, of course, existing software""" start="00:01:22.320" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""to do the scrambling for you and the recording""" start="00:01:23.720" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and the timekeeping and such,""" start="00:01:26.240" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""but all the good options seem to be either web or mobile,""" start="00:01:28.080" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""for example the cstimer software""" start="00:01:31.240" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""or the twisty-timer app on Android.""" start="00:01:33.240" video="mainVideo-cubing" id="subtitle"]]
+[[!template new="1" text="""To my surprise, I did not find a single decent option""" start="00:01:35.400" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""inside Emacs, so this is basically a case study""" start="00:01:39.320" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""how to do better. For this, I wanted to make use of""" start="00:01:41.960" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""all the cool new Emacs features that appeared,""" start="00:01:45.000" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""like the SVG library; Transient,""" start="00:01:47.800" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""the library used for the Magit-style interfaces;""" start="00:01:50.880" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and the recently added sqlite-mode.""" start="00:01:53.600" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""And most importantly it was about having fun.""" start="00:01:56.440" video="mainVideo-cubing" id="subtitle"]]
+[[!template new="1" text="""So here's a full list of prior art,""" start="00:02:01.160" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I will not go into detail about this,""" start="00:02:02.760" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""but basically we have things solving""" start="00:02:04.280" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""very different parts of this,""" start="00:02:06.240" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""but not all of it. For example: we have several,""" start="00:02:08.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""we have a timer. We have several solvers.""" start="00:02:10.760" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""We have some scramblers.""" start="00:02:14.240" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""We have some whole-cube simulators, including a 3D one.""" start="00:02:16.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""We have something for making it easier""" start="00:02:19.360" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""to enter your algorithms in the notation.""" start="00:02:20.760" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""But nothing that does all of those things in one package,""" start="00:02:23.120" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""which kind of surprised me.""" start="00:02:25.920" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""So I present the `wca-prep` package.""" start="00:02:28.120" video="mainVideo-cubing" id="subtitle"]]
+[[!template new="1" text="""So the name, I found it difficult""" start="00:02:32.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""to come up with a good name and so I looked""" start="00:02:35.560" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and I saw, well there's this World Cube Association""" start="00:02:39.960" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""that holds these competitions where you compete.""" start="00:02:42.560" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""They do this for the Rubik's cube""" start="00:02:46.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""but also a few others,""" start="00:02:47.760" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""so there's like a standardized list""" start="00:02:48.920" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""of events they have for this.""" start="00:02:50.800" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""There is a standard notation for this""" start="00:02:52.640" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and rules and everything.""" start="00:02:55.160" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""And the goal of my package is basically""" start="00:02:56.520" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""to help prepare myself for such a competition""" start="00:02:58.200" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and in fact a week ago I went to my first one""" start="00:03:01.280" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""which was wild, but pretty cool.""" start="00:03:03.680" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""So for this reason I chose this name wca-prep,""" start="00:03:06.720" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""because it helps me prepare for this kind of competition""" start="00:03:10.920" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and this limited the scope significantly,""" start="00:03:13.640" video="mainVideo-cubing" id="subtitle"]]
+[[!template new="1" text="""I have a scrambler, visualization of the scramble,""" start="00:03:16.520" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""timer, and statistics.""" start="00:03:19.000" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I excluded pretty much everything else I've seen.""" start="00:03:23.320" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""For this reason, I only tried to focus on""" start="00:03:25.560" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""some very basic puzzles I can solve comfortably,""" start="00:03:28.789" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and did not want to do anything else""" start="00:03:32.200" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""that may complicate things significantly.""" start="00:03:34.840" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""No other kinds of puzzles, no simulation, no solving,""" start="00:03:36.440" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""no exotic events, and no specialized scrambles""" start="00:03:40.480" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""that are only good for practicing specific algorithms.""" start="00:03:43.920" video="mainVideo-cubing" id="subtitle"]]
+[[!template new="1" text="""So at this point the organizer should hopefully show""" start="00:03:49.240" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""a small video I've prepared, a one minute video showing how""" start="00:03:54.200" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I actually use this to solve a cube and to time my solve.""" start="00:03:58.000" video="mainVideo-cubing" id="subtitle"]]
+[[!template new="1" text="""Okay, so building this thing, there were several challenges.""" start="00:05:19.840" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""The first one was how do I even represent""" start="00:05:22.960" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""the state of a Rubik's cube.""" start="00:05:24.960" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""For this there are many possible representations,""" start="00:05:26.920" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""no obvious best solution.""" start="00:05:29.960" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I did not, well, what helped me was that""" start="00:05:32.160" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I did not have to programmatically solve this thing,""" start="00:05:34.080" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""so I picked the easiest possible representation""" start="00:05:36.440" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""which is just an array of every single facelet.""" start="00:05:39.640" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""For a 3x3 cube you have 9 facelets on one side,""" start="00:05:42.720" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""so times 6 sides you would have 54 elements in this array.""" start="00:05:46.960" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""So with this representation, it's very simple,""" start="00:05:51.720" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""but it's kind of weird to do scrambles with this.""" start="00:05:54.160" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""But otherwise, it worked very, very well.""" start="00:05:56.840" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""In the future, I plan to learn some group theory,""" start="00:05:59.360" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""pick a better representation""" start="00:06:01.720" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and do this in a much, much more elegant way""" start="00:06:03.200" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""without compromising speed too much.""" start="00:06:05.640" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""Yes. Once I had the representation,""" start="00:06:12.320" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""the scrambling itself should not be too hard.""" start="00:06:15.160" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""For this, it's important to consider that basically""" start="00:06:18.080" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""if you do a face turn""" start="00:06:22.200" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""you end up swapping some facelets with other facelets,""" start="00:06:23.600" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""that's the easiest way to think about this.""" start="00:06:26.880" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""To determine which one goes into which one's position,""" start="00:06:30.480" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""it was pretty confusing to figure this out.""" start="00:06:33.720" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""For this I went through a few papers,""" start="00:06:36.922" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and I found one which suggested""" start="00:06:38.760" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""to just build a cube out of paper,""" start="00:06:40.480" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""number every facelet, and turn it""" start="00:06:42.400" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and keep track of which facelet moved into which position.""" start="00:06:44.480" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""And programmatically, the `cl-rotatef` macro""" start="00:06:48.800" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""was very, very useful for doing this kind of""" start="00:06:51.960" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""in-place swapping you need for this operation.""" start="00:06:53.840" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""So in the future, group theory would hopefully""" start="00:06:56.080" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""make this a bit less awkward.""" start="00:06:59.320" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""Here's a photo of this paper cube I made""" start="00:07:02.440" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""along with a real cube. As you can see""" start="00:07:04.560" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""mathematically speaking, they are the same thing,""" start="00:07:08.320" video="mainVideo-cubing" id="subtitle"]]
+[[!template new="1" text="""they just look very, very different.""" start="00:07:11.800" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""So the scramble algorithm itself,""" start="00:07:13.720" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I pondered how this would even be done. In the competitions,""" start="00:07:18.760" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""They do this in a very, very elaborate way.""" start="00:07:23.880" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""They generate a random cube,""" start="00:07:26.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""they try to solve it, and if it's solvable""" start="00:07:27.200" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""they use these solution moves""" start="00:07:29.840" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""to turn into a scramble basically.""" start="00:07:33.000" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""And they also make sure to canonicalize the moves,""" start="00:07:35.280" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""so if you have subsequent moves that can be simplified,""" start="00:07:39.400" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""they do simplify these as much as possible.""" start="00:07:43.000" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""For example,""" start="00:07:45.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""if you have two subsequent rotations in one direction,""" start="00:07:45.680" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""it's turned into a different kind of rotation,""" start="00:07:48.200" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""so 90 and 90 equals 180.""" start="00:07:51.120" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""And the other Elisp scramblers I looked at,""" start="00:07:53.840" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""they generate random moves.""" start="00:07:57.760" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""Some of them do canonicalize. Not all of them.""" start="00:07:59.560" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""This one tries to do the best low-fi thing,""" start="00:08:01.960" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""that is, generating random moves,""" start="00:08:05.360" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""canonicalizing and repeating""" start="00:08:06.840" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""until enough have been generated.""" start="00:08:08.480" video="mainVideo-cubing" id="subtitle"]]
+[[!template new="1" text="""For the visualization I had to figure out""" start="00:08:14.000" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""something else too complicated.""" start="00:08:17.600" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""For this, I tried to figure out""" start="00:08:18.960" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""where every facelift would end up in the puzzle view""" start="00:08:21.680" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""when you would unfold it.""" start="00:08:24.320" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""And for this, I did not consider the facelet orientation.""" start="00:08:25.880" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""This may be important later for some other puzzles""" start="00:08:30.120" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""where you can end up with very twisted faces,""" start="00:08:33.720" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""but for simple cubes, it's not a problem.""" start="00:08:35.600" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""My initial prototype used colored text,""" start="00:08:37.480" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""but later, I used the SVG library.""" start="00:08:40.760" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""It turned out to be easy enough to use, actually.""" start="00:08:43.200" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""Currently, I have hard-coded face-color mappings,""" start="00:08:46.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""but I plan to replace this so that theming is possible.""" start="00:08:50.560" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""For example, if you happen to have a cube""" start="00:08:53.560" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""that does not have the same color mappings as I do,""" start="00:08:56.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template new="1" text="""then you should be able to fix this.""" start="00:08:59.141" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""Next challenge was to build""" start="00:09:00.920" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""a beautiful intuitive UI with Transient.""" start="00:09:05.880" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""The reason why I chose this is""" start="00:09:08.400" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""because it would be self-documenting and Magit-style,""" start="00:09:11.320" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and everyone knows how Magit works basically.""" start="00:09:14.800" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""Since Transient has become part of Emacs,""" start="00:09:16.800" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""there is really no reason to not try it out.""" start="00:09:19.760" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""The problem was documentation is difficult to understand.""" start="00:09:21.680" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""It's very abstract and high level,""" start="00:09:26.120" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and it's hard to figure out. &quot;Okay,""" start="00:09:27.840" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I want to do something,""" start="00:09:30.320" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""how am I supposed to do this?&quot;""" start="00:09:31.240" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I did find transient-showcase, which has lots of examples,""" start="00:09:33.360" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""but they don't really feel finished""" start="00:09:37.800" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and not realistic enough.""" start="00:09:40.080" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""When I tried to use the package,""" start="00:09:43.520" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I got plenty of unhelpful error messages""" start="00:09:45.200" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""when using it incorrectly.""" start="00:09:47.360" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I did manage to figure it out,""" start="00:09:48.560" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""but I plan to find more actual examples of it,""" start="00:09:50.400" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""to have an executable reference basically""" start="00:09:55.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template new="1" text="""and try to improve my use of it.""" start="00:09:57.880" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""For the book-keeping, I used SQLite.""" start="00:10:00.080" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""This is a very recent addition to Emacs,""" start="00:10:06.000" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""it only appeared in the current major version.""" start="00:10:09.000" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""It's still very early days.""" start="00:10:11.760" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I found some oddities, one of them turned out to be""" start="00:10:13.840" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""a bug in the transaction macro.""" start="00:10:17.480" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""Like basically, if you do an SQL transaction""" start="00:10:19.280" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and an error happens, then every helper I found""" start="00:10:22.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""does a rollback on an error.""" start="00:10:24.640" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""But this one did not. It actually committed on an error,""" start="00:10:25.400" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and this was very weird to figure out.""" start="00:10:31.200" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I reported a bug. Eli was nice enough to send me a patch.""" start="00:10:34.320" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""We did some patch review,""" start="00:10:38.760" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and he ended up fixing it properly.""" start="00:10:39.880" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""So yes, there's still a lot to be done there, and yeah,""" start="00:10:42.440" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""the API is very basic.""" start="00:10:50.120" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""You don't have convenience helpers""" start="00:10:51.360" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""like fetch the first row or fetch the first value""" start="00:10:53.360" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""or anything, but they're easy enough to write yourself.""" start="00:10:55.760" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""And the biggest challenge with this bookkeeping part""" start="00:10:58.881" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""was figuring out a decent schema,""" start="00:11:00.821" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""like how to organize data correctly""" start="00:11:02.480" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""so that it would not be awkward to manipulate.""" start="00:11:04.600" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""And with this, you can finally build a package""" start="00:11:06.800" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""that remembers its state properly""" start="00:11:10.200" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and don't have to run into foot guns""" start="00:11:11.840" video="mainVideo-cubing" id="subtitle"]]
+[[!template new="1" text="""with Lisp-style serialization, deserialization.""" start="00:11:14.920" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""So yes, that concludes it so far.""" start="00:11:17.080" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""So what did I learn from this exercise?""" start="00:11:22.640" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""Well, there are still plenty of packages""" start="00:11:26.640" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""for Emacs to be written.""" start="00:11:28.960" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""If you think everything you can think of""" start="00:11:30.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""or you need has already been written, well, guess what?""" start="00:11:33.360" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""No.""" start="00:11:35.800" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""These are still plenty of specialized things""" start="00:11:36.240" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""that could need your help.""" start="00:11:38.496" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""These cubes do not require advanced mathematics,""" start="00:11:41.240" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""contrary to what you may think.""" start="00:11:44.240" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""Yes, you can apply advanced mathematics to them""" start="00:11:45.600" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""if you want to, but you don't have to.""" start="00:11:49.160" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""What surprised me about this is basically group theory.""" start="00:11:51.920" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I've heard of it before.""" start="00:11:55.440" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""It seemed to be a meme, basically,""" start="00:11:56.520" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""because it has been like mostly Haskell people""" start="00:11:58.280" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""being very excited about this""" start="00:12:00.920" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and it seemed kind of, like, divorced from reality, basically.""" start="00:12:02.640" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""But this puzzle, it actually proves that yes,""" start="00:12:06.960" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""it has its use.""" start="00:12:10.400" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""It definitely has.""" start="00:12:11.400" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""You just have to find the right problem matching it,""" start="00:12:12.880" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and yeah.""" start="00:12:15.840" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""So yeah, once I understand it better,""" start="00:12:17.920" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""the topic, I expect to write better code.""" start="00:12:19.840" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""These new Emacs features, they work well enough.""" start="00:12:23.000" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""There are some rough edges.""" start="00:12:28.920" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""They definitely need more testing.""" start="00:12:30.360" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""So please, please, everyone,""" start="00:12:31.880" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""if you write Elisp, please try SQLite or Transient""" start="00:12:35.120" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""or anything else that looks cool and shiny.""" start="00:12:39.000" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""Report bugs.""" start="00:12:41.160" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""Find ways to improve them, anything. And yeah,""" start="00:12:42.920" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I'm sure that if we do this,""" start="00:12:46.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""then Emacs will continue to get even better.""" start="00:12:49.320" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""So yeah, what's next for this package?""" start="00:12:52.120" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""Well, I could... There are lots of obvious UI improvements""" start="00:12:56.240" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""and testing to be done.""" start="00:13:00.440" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I basically want to reach feature parity""" start="00:13:01.800" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""with the twisty-timer app, which this is very much inspired by.""" start="00:13:04.160" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I want nice-looking stats like graphical ones""" start="00:13:06.880" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""instead of just a simple list of times.""" start="00:13:11.120" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""And I want support for more puzzles, of course,""" start="00:13:13.240" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""not just the simple cubes,""" start="00:13:15.680" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""but as I progress learning these puzzles,""" start="00:13:17.000" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""I want to have Emacs supporting me for this.""" start="00:13:19.040" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""But generally, it's a very open-ended package.""" start="00:13:22.520" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""And this concludes the talk.""" start="00:13:26.880" video="mainVideo-cubing" id="subtitle"]]
+[[!template text="""Thank you very much.""" start="00:13:31.080" video="mainVideo-cubing" id="subtitle"]]
+
+
+
+Captioner: sachac
+
Questions or comments? Please e-mail [mail@vasilij.de](mailto:mail@vasilij.de?subject=Comment%20for%20EmacsConf%202022%20cubing%3A%20Speedcubing%20in%20Emacs)
diff --git a/2023/info/cubing-before.md b/2023/info/cubing-before.md
index 8ce89cbb..bb58c7c1 100644
--- a/2023/info/cubing-before.md
+++ b/2023/info/cubing-before.md
@@ -8,12 +8,26 @@ The following image shows where the talk is in the schedule for Sun 2023-12-03.
Format: 14-min talk; Q&A: IRC <https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen>
Etherpad: <https://pad.emacsconf.org/2023-cubing>
Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
-Status: Ready to stream
+Status: Now playing on the conference livestream
<div>Times in different timezones:</div><div class="times" start="2023-12-03T16:35:00Z" end="2023-12-03T16:55:00Z"><div class="conf-time">Sunday, Dec 3 2023, ~11:35 AM - 11:55 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Sunday, Dec 3 2023, ~10:35 AM - 10:55 AM CST (US/Central)<br />Sunday, Dec 3 2023, ~9:35 AM - 9:55 AM MST (US/Mountain)<br />Sunday, Dec 3 2023, ~8:35 AM - 8:55 AM PST (US/Pacific)<br />Sunday, Dec 3 2023, ~4:35 PM - 4:55 PM UTC <br />Sunday, Dec 3 2023, ~5:35 PM - 5:55 PM CET (Europe/Paris)<br />Sunday, Dec 3 2023, ~6:35 PM - 6:55 PM EET (Europe/Athens)<br />Sunday, Dec 3 2023, ~10:05 PM - 10:25 PM IST (Asia/Kolkata)<br />Monday, Dec 4 2023, ~12:35 AM - 12:55 AM +08 (Asia/Singapore)<br />Monday, Dec 4 2023, ~1:35 AM - 1:55 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2023/watch/gen/">Find out how to watch and participate</a></strong></div>
+<div class="vid"><video controls preload="none" id="cubing-mainVideo"><source src="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2023/captions/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2023/captions/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="cubing-mainVideo" data="""
+00:00.000 Introduction
+01:35.400 Cubing in Emacs
+02:01.160 Prior art
+02:32.040 The name
+03:16.520 What's in wca-prep
+03:49.240 Demo
+05:15.340 Challenges: Representing the cube
+07:09.220 Scrambling
+08:09.500 Visualization
+08:56.420 UI with Transient
+09:55.580 Book-keeping with SQLite
+11:12.580 Conclusion
+"""]]<div></div>Duration: 13:35 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2023-cubing">Open Etherpad</a></li><li><a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--alternative.webm">Download --alternative.webm (16MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--final.webm">Download --final.webm (57MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main.opus">Download --main.opus (8.6MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main.txt">Download --main.txt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main.vtt.diff">Download --main.vtt.diff</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--main.webm">Download --main.webm (57MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--normalized.opus">Download --normalized.opus (12MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--original.mkv">Download --original.mkv (11MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--presentation.webm">Download --presentation.webm (16MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--reencoded.webm">Download --reencoded.webm (73MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann--solve-demo.webm">Download --solve-demo.webm (11MB)</a></li><li><a href="https://media.emacsconf.org/2023/emacsconf-2023-cubing--speedcubing-in-emacs--vasilij-wasamasa-schneidermann.pdf">Download .pdf</a></li><li><a href="https://toobnix.org/w/wNTqAAug9r21yyUaTi6LW7">View on Toobnix</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file