summaryrefslogtreecommitdiffstats
path: root/2023/info/cubing-after.md
blob: 52a4f0dc6dee888abd637e3808d83012724c655b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
<!-- Automatically generated by emacsconf-publish-after-page -->


<a name="cubing-mainVideo-transcript"></a>
# Transcript


Introduction

[[!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"]]

Cubing in Emacs

[[!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"]]

Prior art

[[!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"]]

The name

[[!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"]]

What's in wca-prep

[[!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"]]

Demo

[[!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"]]

Challenges: Representing the cube

[[!template text="""Okay, so building this thing, there were several challenges.""" start="00:05:15.240" video="mainVideo-cubing" id="subtitle"]]
[[!template new="1" text="""The first one was how do I even represent""" start="00:05:18.509" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""the state of a Rubik's cube.""" start="00:05:20.509" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""For this there are many possible representations,""" start="00:05:22.469" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""no obvious best solution.""" start="00:05:25.509" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""I did not, well, what helped me was that""" start="00:05:27.709" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""I did not have to programmatically solve this thing,""" start="00:05:29.629" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""so I picked the easiest possible representation""" start="00:05:31.989" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""which is just an array of every single facelet.""" start="00:05:35.189" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""For a 3x3 cube you have 9 facelets on one side,""" start="00:05:38.269" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""so times 6 sides you would have 54 elements in this array.""" start="00:05:42.509" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""So with this representation, it's very simple,""" start="00:05:47.269" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""but it's kind of weird to do scrambles with this.""" start="00:05:49.709" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""But otherwise, it worked very, very well.""" start="00:05:52.389" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""In the future, I plan to learn some group theory,""" start="00:05:54.909" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""pick a better representation""" start="00:05:57.269" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""and do this in a much, much more elegant way""" start="00:05:58.749" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""without compromising speed too much.""" start="00:06:01.189" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""Yes. Once I had the representation,""" start="00:06:07.869" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""the scrambling itself should not be too hard.""" start="00:06:10.709" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""For this, it's important to consider that basically""" start="00:06:13.629" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""if you do a face turn""" start="00:06:17.749" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""you end up swapping some facelets with other facelets,""" start="00:06:19.149" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""that's the easiest way to think about this.""" start="00:06:22.429" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""To determine which one goes into which one's position,""" start="00:06:26.029" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""it was pretty confusing to figure this out.""" start="00:06:29.269" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""For this I went through a few papers,""" start="00:06:32.471" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""and I found one which suggested""" start="00:06:34.309" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""to just build a cube out of paper,""" start="00:06:36.029" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""number every facelet, and turn it""" start="00:06:37.949" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""and keep track of which facelet moved into which position.""" start="00:06:40.029" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""And programmatically, the `cl-rotatef` macro""" start="00:06:44.349" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""was very, very useful for doing this kind of""" start="00:06:47.509" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""in-place swapping you need for this operation.""" start="00:06:49.389" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""So in the future, group theory would hopefully""" start="00:06:51.629" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""make this a bit less awkward.""" start="00:06:54.869" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""Here's a photo of this paper cube I made""" start="00:06:57.989" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""along with a real cube. As you can see""" start="00:07:00.109" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""mathematically speaking, they are the same thing,""" start="00:07:03.869" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""they just look very, very different.""" start="00:07:07.349" video="mainVideo-cubing" id="subtitle"]]

Scrambling

[[!template new="1" text="""So the scramble algorithm itself,""" start="00:07:09.269" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""I pondered how this would even be done. In the competitions,""" start="00:07:14.309" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""They do this in a very, very elaborate way.""" start="00:07:19.429" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""They generate a random cube,""" start="00:07:21.589" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""they try to solve it, and if it's solvable""" start="00:07:22.749" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""they use these solution moves""" start="00:07:25.389" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""to turn into a scramble basically.""" start="00:07:28.549" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""And they also make sure to canonicalize the moves,""" start="00:07:30.829" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""so if you have subsequent moves that can be simplified,""" start="00:07:34.949" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""they do simplify these as much as possible.""" start="00:07:38.549" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""For example,""" start="00:07:40.589" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""if you have two subsequent rotations in one direction,""" start="00:07:41.229" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""it's turned into a different kind of rotation,""" start="00:07:43.749" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""so 90 and 90 equals 180.""" start="00:07:46.669" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""And the other Elisp scramblers I looked at,""" start="00:07:49.389" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""they generate random moves.""" start="00:07:53.309" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""Some of them do canonicalize. Not all of them.""" start="00:07:55.109" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""This one tries to do the best low-fi thing,""" start="00:07:57.509" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""that is, generating random moves,""" start="00:08:00.909" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""canonicalizing and repeating""" start="00:08:02.389" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""until enough have been generated.""" start="00:08:04.029" video="mainVideo-cubing" id="subtitle"]]

Visualization

[[!template new="1" text="""For the visualization I had to figure out""" start="00:08:09.549" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""something else too complicated.""" start="00:08:13.149" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""For this, I tried to figure out""" start="00:08:14.509" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""where every facelift would end up in the puzzle view""" start="00:08:17.229" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""when you would unfold it.""" start="00:08:19.869" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""And for this, I did not consider the facelet orientation.""" start="00:08:21.429" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""This may be important later for some other puzzles""" start="00:08:25.669" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""where you can end up with very twisted faces,""" start="00:08:29.269" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""but for simple cubes, it's not a problem.""" start="00:08:31.149" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""My initial prototype used colored text,""" start="00:08:33.029" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""but later, I used the SVG library.""" start="00:08:36.309" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""It turned out to be easy enough to use, actually.""" start="00:08:38.749" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""Currently, I have hard-coded face-color mappings,""" start="00:08:41.589" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""but I plan to replace this so that theming is possible.""" start="00:08:46.109" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""For example, if you happen to have a cube""" start="00:08:49.109" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""that does not have the same color mappings as I do,""" start="00:08:51.589" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""then you should be able to fix this.""" start="00:08:54.690" video="mainVideo-cubing" id="subtitle"]]

UI with Transient

[[!template new="1" text="""Next challenge was to build""" start="00:08:56.469" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""a beautiful intuitive UI with Transient.""" start="00:09:01.429" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""The reason why I chose this is""" start="00:09:03.949" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""because it would be self-documenting and Magit-style,""" start="00:09:06.869" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""and everyone knows how Magit works basically.""" start="00:09:10.349" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""Since Transient has become part of Emacs,""" start="00:09:12.349" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""there is really no reason to not try it out.""" start="00:09:15.309" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""The problem was documentation is difficult to understand.""" start="00:09:17.229" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""It's very abstract and high level,""" start="00:09:21.669" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""and it's hard to figure out. &quot;Okay,""" start="00:09:23.389" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""I want to do something,""" start="00:09:25.869" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""how am I supposed to do this?&quot;""" start="00:09:26.789" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""I did find transient-showcase, which has lots of examples,""" start="00:09:28.909" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""but they don't really feel finished""" start="00:09:33.349" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""and not realistic enough.""" start="00:09:35.629" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""When I tried to use the package,""" start="00:09:39.069" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""I got plenty of unhelpful error messages""" start="00:09:40.749" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""when using it incorrectly.""" start="00:09:42.909" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""I did manage to figure it out,""" start="00:09:44.109" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""but I plan to find more actual examples of it,""" start="00:09:45.949" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""to have an executable reference basically""" start="00:09:50.589" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""and try to improve my use of it.""" start="00:09:53.429" video="mainVideo-cubing" id="subtitle"]]

Book-keeping with SQLite

[[!template new="1" text="""For the book-keeping, I used SQLite.""" start="00:09:55.629" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""This is a very recent addition to Emacs,""" start="00:10:01.549" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""it only appeared in the current major version.""" start="00:10:04.549" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""It's still very early days.""" start="00:10:07.309" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""I found some oddities, one of them turned out to be""" start="00:10:09.389" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""a bug in the transaction macro.""" start="00:10:13.029" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""Like basically, if you do an SQL transaction""" start="00:10:14.829" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""and an error happens, then every helper I found""" start="00:10:17.589" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""does a rollback on an error.""" start="00:10:20.189" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""But this one did not. It actually committed on an error,""" start="00:10:20.949" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""and this was very weird to figure out.""" start="00:10:26.749" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""I reported a bug. Eli was nice enough to send me a patch.""" start="00:10:29.869" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""We did some patch review,""" start="00:10:34.309" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""and he ended up fixing it properly.""" start="00:10:35.429" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""So yes, there's still a lot to be done there, and yeah,""" start="00:10:37.989" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""the API is very basic.""" start="00:10:45.669" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""You don't have convenience helpers""" start="00:10:46.909" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""like fetch the first row or fetch the first value""" start="00:10:48.909" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""or anything, but they're easy enough to write yourself.""" start="00:10:51.309" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""And the biggest challenge with this bookkeeping part""" start="00:10:54.430" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""was figuring out a decent schema,""" start="00:10:56.370" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""like how to organize data correctly""" start="00:10:58.029" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""so that it would not be awkward to manipulate.""" start="00:11:00.149" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""And with this, you can finally build a package""" start="00:11:02.349" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""that remembers its state properly""" start="00:11:05.749" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""and don't have to run into foot guns""" start="00:11:07.389" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""with Lisp-style serialization, deserialization.""" start="00:11:10.469" video="mainVideo-cubing" id="subtitle"]]

Conclusion

[[!template new="1" text="""So yes, that concludes it so far.""" start="00:11:12.629" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""So what did I learn from this exercise?""" start="00:11:18.189" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""Well, there are still plenty of packages""" start="00:11:22.189" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""for Emacs to be written.""" start="00:11:24.509" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""If you think everything you can think of""" start="00:11:25.589" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""or you need has already been written, well, guess what?""" start="00:11:28.909" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""No.""" start="00:11:31.349" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""These are still plenty of specialized things""" start="00:11:31.789" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""that could need your help.""" start="00:11:34.045" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""These cubes do not require advanced mathematics,""" start="00:11:36.789" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""contrary to what you may think.""" start="00:11:39.789" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""Yes, you can apply advanced mathematics to them""" start="00:11:41.149" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""if you want to, but you don't have to.""" start="00:11:44.709" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""What surprised me about this is basically group theory.""" start="00:11:47.469" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""I've heard of it before.""" start="00:11:50.989" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""It seemed to be a meme, basically,""" start="00:11:52.069" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""because it has been like mostly Haskell people""" start="00:11:53.829" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""being very excited about this""" start="00:11:56.469" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""and it seemed kind of, like, divorced from reality, basically.""" start="00:11:58.189" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""But this puzzle, it actually proves that yes,""" start="00:12:02.509" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""it has its use.""" start="00:12:05.949" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""It definitely has.""" start="00:12:06.949" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""You just have to find the right problem matching it,""" start="00:12:08.429" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""and yeah.""" start="00:12:11.389" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""So yeah, once I understand it better,""" start="00:12:13.469" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""the topic, I expect to write better code.""" start="00:12:15.389" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""These new Emacs features, they work well enough.""" start="00:12:18.549" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""There are some rough edges.""" start="00:12:24.469" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""They definitely need more testing.""" start="00:12:25.909" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""So please, please, everyone,""" start="00:12:27.429" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""if you write Elisp, please try SQLite or Transient""" start="00:12:30.669" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""or anything else that looks cool and shiny.""" start="00:12:34.549" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""Report bugs.""" start="00:12:36.709" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""Find ways to improve them, anything. And yeah,""" start="00:12:38.469" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""I'm sure that if we do this,""" start="00:12:41.589" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""then Emacs will continue to get even better.""" start="00:12:44.869" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""So yeah, what's next for this package?""" start="00:12:47.669" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""Well, I could... There are lots of obvious UI improvements""" start="00:12:51.789" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""and testing to be done.""" start="00:12:55.989" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""I basically want to reach feature parity""" start="00:12:57.349" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""with the twisty-timer app, which this is very much inspired by.""" start="00:12:59.709" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""I want nice-looking stats like graphical ones""" start="00:13:02.429" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""instead of just a simple list of times.""" start="00:13:06.669" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""And I want support for more puzzles, of course,""" start="00:13:08.789" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""not just the simple cubes,""" start="00:13:11.229" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""but as I progress learning these puzzles,""" start="00:13:12.549" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""I want to have Emacs supporting me for this.""" start="00:13:14.589" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""But generally, it's a very open-ended package.""" start="00:13:18.069" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""And this concludes the talk.""" start="00:13:22.429" video="mainVideo-cubing" id="subtitle"]]
[[!template text="""Thank you very much.""" start="00:13:26.629" video="mainVideo-cubing" id="subtitle"]]



Captioner: sachac

Questions or comments? Please e-mail [mail@vasilij.de](mailto:mail@vasilij.de?subject=Comment%20for%20EmacsConf%202023%20cubing%3A%20Speedcubing%20in%20Emacs)


<!-- End of emacsconf-publish-after-page -->