[00:00.000 --> 00:02.060] you [00:30.040 --> 00:32.040] You [00:57.840 --> 00:59.840] through i yeah [00:59.840 --> 01:07.040] Somewhere here, and yes, what is going to poke? [01:07.040 --> 01:10.320] So the project has, [01:10.320 --> 01:14.740] you can say that it has many components on the way you count it. [01:14.740 --> 01:16.560] But in a simple way, you can say, [01:16.560 --> 01:18.620] okay, it's a leap poke which has [01:18.620 --> 01:24.600] the incremental compiler for the poke programming language. [01:24.600 --> 01:27.920] By incremental, you can add stuff, [01:27.920 --> 01:29.800] redefine things, redefine types, [01:29.800 --> 01:31.960] redefine variables over the time. [01:31.960 --> 01:35.280] And it also had the other part is the PVM, [01:35.280 --> 01:37.160] poke virtual machine which is powered by [01:37.160 --> 01:42.080] Ganujiter project by Luca Sayu. [01:42.080 --> 01:47.080] And yeah, it's a virtual machine generator, [01:47.080 --> 01:50.120] which is fun but no time for talking about that. [01:50.120 --> 01:51.240] Sorry, Luca. [01:51.240 --> 01:54.320] And the other part is the IOS space, [01:54.320 --> 01:56.560] which is the abstraction to make things you [01:56.560 --> 02:00.760] know you can address bits from the IOS devices. [02:00.760 --> 02:03.720] So these are the main components of the leap poke. [02:03.720 --> 02:08.080] The other component we have in the Ganujiter project is [02:08.080 --> 02:10.200] the poke the CLI application, [02:10.200 --> 02:13.680] which is based on user leap poke, [02:13.680 --> 02:17.160] and you can read line, [02:17.160 --> 02:20.560] you can write to this in and then it gives you [02:20.560 --> 02:23.800] error and output on the set out. [02:23.800 --> 02:27.800] But the third thing is we have is the poke D, [02:27.800 --> 02:32.560] poke demon, you know demon in the term of server or [02:32.560 --> 02:35.520] in the program that exists, [02:35.520 --> 02:38.400] we don't see it but it's doing something. [02:38.400 --> 02:39.720] So it's a demon for me. [02:39.720 --> 02:41.360] But some people believe that okay, [02:41.360 --> 02:45.400] demon is only system things but I don't think so. [02:45.400 --> 02:48.080] So I like to call it poke D. [02:48.080 --> 02:53.120] So a very brief looking at the components [02:53.120 --> 02:54.320] inside the leap poke. [02:54.320 --> 02:59.080] So if you go to the leap poke dot leap poke dot H file, [02:59.080 --> 03:01.520] you will see three opaque types. [03:01.520 --> 03:04.760] The PK compiler, which presents the interaction [03:04.760 --> 03:08.680] with the compiler, the PVM, which is PK Val. [03:08.680 --> 03:13.160] It is the values from the poke virtual machine [03:13.160 --> 03:15.480] and you have the peak IOS, [03:15.480 --> 03:19.800] which is the abstraction over different devices [03:19.800 --> 03:22.280] like we have network block device, [03:22.280 --> 03:24.560] we have zero device, we have sub device, [03:24.560 --> 03:28.040] file, stream, like it's in the set out there. [03:28.040 --> 03:32.360] And process, which is you can poke other processes, [03:32.360 --> 03:35.480] you attach using the PID or memory, [03:35.480 --> 03:40.480] which is a in process memory for doing temporary things. [03:42.360 --> 03:44.480] And we have also a foreign dev, [03:44.480 --> 03:47.120] which you can introduce a new device. [03:47.120 --> 03:50.040] Like you have, like as an example, [03:50.040 --> 03:51.440] I have, I can show that, [03:51.440 --> 03:55.960] but like reading from packets and writing to memory. [03:55.960 --> 03:58.400] And then in poke, you can poke the packets, [03:58.400 --> 04:02.720] no network packets given from like a network [04:02.720 --> 04:04.840] or for example, at my job, [04:04.840 --> 04:06.680] I have to work with Bluetooth things. [04:06.680 --> 04:09.960] So we verify the data formats, we read them, [04:09.960 --> 04:13.760] and then we verify with the poke that we are, [04:13.760 --> 04:15.320] we get what we expect to. [04:16.560 --> 04:18.520] So ended language. [04:18.520 --> 04:20.920] The language is procedural, of course, [04:20.920 --> 04:23.280] statically type, of course, interpreted [04:23.280 --> 04:25.480] because of no PVM stuff. [04:25.480 --> 04:28.920] And it's interactive DSL for binary data. [04:28.920 --> 04:33.920] It is designed to specifically be expressed, [04:33.920 --> 04:37.760] enough powerful to express binary formats. [04:37.760 --> 04:40.960] And yeah, so we can have variables, [04:40.960 --> 04:43.200] var a equals something. [04:43.200 --> 04:48.200] We can have a weird integers like I have here [04:48.200 --> 04:53.200] and int 32 literal, which I'm casting to you int 13. [04:55.400 --> 04:57.520] We have strings which are not terminated. [04:57.520 --> 05:01.440] There is no non-null terminated string in poke. [05:01.440 --> 05:03.400] If you want to use, you can use arrays. [05:04.760 --> 05:06.960] These, this is the offset. [05:06.960 --> 05:11.960] So in size and offsets in the poke are magnitude, [05:13.240 --> 05:17.760] which is an integer and a unit, which you can define. [05:17.760 --> 05:22.360] The basic unit is bit, but you can define your own unit [05:22.360 --> 05:26.040] like let me, no, let me not. [05:26.040 --> 05:31.040] Yeah, here we have a repel, which is poke repel. [05:31.240 --> 05:36.240] So I can say, okay, I have unit foo equals three. [05:39.680 --> 05:43.280] And then I can define one foo, [05:43.280 --> 05:48.280] which is here in the, this is the output, [05:48.400 --> 05:52.680] you know, the output of the results, which is one, three. [05:52.680 --> 05:56.960] An offset, one magnet, one thing of this foo things, [05:56.960 --> 05:59.720] which is three bits, white. [06:05.480 --> 06:08.560] 13 here, it's the bits of this integer. [06:08.560 --> 06:12.040] It's an integer of size 13. [06:12.040 --> 06:14.800] Yeah, I'm casting to that from 32. [06:14.800 --> 06:18.520] And yeah, this is syntax for array. [06:18.520 --> 06:22.960] So for literals, for unsigned byte things, [06:22.960 --> 06:24.640] you have to specify the UB. [06:24.640 --> 06:29.640] So this is an array of, I can copy actually [06:30.480 --> 06:34.840] var E equals 01 UB. [06:34.840 --> 06:39.240] And then E, which you can see here that 01, so it's an array. [06:39.240 --> 06:44.240] So units, like you can define, if you go to the, [06:44.280 --> 06:48.480] is it the pk in our repo, it's there, you know. [06:48.480 --> 06:52.560] B uppercase, B is eight, kb and kilobyte, [06:52.560 --> 06:54.120] the stuff we haven't managed. [06:54.120 --> 06:58.760] So you can also define types, like you have an structure, [06:58.760 --> 07:02.280] which is consist of a three bits bit integer, [07:02.280 --> 07:07.280] followed by an offset and signed int 40 bits number, [07:07.280 --> 07:12.280] 50 bits number, which represents offsets in unit bytes, [07:14.480 --> 07:19.160] and we call it J, and then we have three strings, [07:19.160 --> 07:22.040] you know, not terminated strings. [07:22.040 --> 07:27.040] And functions, you can use the syntax fun, [07:27.160 --> 07:30.640] my function equals, this is the input signature, [07:30.640 --> 07:33.800] output column, and then you can do the, [07:33.800 --> 07:38.800] this thing here is for attributes of this value, [07:39.520 --> 07:44.240] like the length, is it mapped or not or stuff like that. [07:44.240 --> 07:47.240] So the application, the poke, it's a repel, [07:47.240 --> 07:51.760] you can, you know, declare stuff, like what you see here, [07:51.760 --> 07:55.520] but it's not the poke application, it is something else. [07:55.520 --> 07:58.200] So, and it provides a bunch of utilities. [07:58.200 --> 08:03.200] So here I switch the, I'm opening a new terminal here, [08:04.000 --> 08:06.720] I open the poke, the program, the CLI, [08:06.720 --> 08:11.120] so we have here something like dot command, [08:11.120 --> 08:13.160] start with dots, so dot help, [08:13.160 --> 08:16.720] you see here that we have a bunch of, you know, things here. [08:16.720 --> 08:19.080] Or look, for example, dot set, if you set, [08:19.080 --> 08:20.680] okay, you can do print printing, [08:20.680 --> 08:24.440] or here you can define variables, [08:24.440 --> 08:29.440] like you can change the set, output base to 10, okay, [08:29.520 --> 08:31.280] this kind of thing is also possible here. [08:31.280 --> 08:35.400] So you can do anything, and you can redefine A again [08:35.400 --> 08:39.720] to be hello, and it will be hello, and yeah. [08:41.200 --> 08:46.200] So the next thing is, okay, I can run these things, [08:46.640 --> 08:49.040] which I ran so I don't go over there. [08:49.040 --> 08:54.040] So if we want to know how poke, the CLI works, [08:54.480 --> 08:57.520] a very simply, oversimplified view is that it's, [08:57.520 --> 09:01.720] uses these two leap poke functions, [09:01.720 --> 09:05.400] PK compile buffer and compile the statement. [09:07.200 --> 09:09.200] The trick in poke application is, [09:09.200 --> 09:12.720] if the input starts with these keywords, [09:12.720 --> 09:15.040] like vary unit type, find immutable, [09:15.040 --> 09:19.040] if you compile and run the thing using this dysfunction, [09:19.040 --> 09:22.520] which expects, you know, arbitrary poke code. [09:22.520 --> 09:25.200] But otherwise it uses a statement, [09:25.200 --> 09:27.640] which assumes that you are passing in a statement [09:27.640 --> 09:28.600] in the raffle. [09:30.000 --> 09:33.640] And despite the name, both of them compile [09:33.640 --> 09:36.480] and run the poke program, so yeah. [09:36.480 --> 09:40.280] And this is an example of, because this thing [09:40.280 --> 09:44.520] started with var, so you can add more than one statement [09:44.520 --> 09:46.760] to it, here is an statement, [09:46.760 --> 09:48.840] because there is no var immutable form, [09:48.840 --> 09:53.440] and this is also a syntax error in the poke raffle. [09:53.440 --> 09:55.400] I can show you, yeah, there is error, [09:55.400 --> 10:00.400] because it expects a statement, not arbitrary code. [10:01.960 --> 10:05.000] So you see that there are some limitations. [10:05.000 --> 10:10.000] So what is this thing called, let me, yeah. [10:10.000 --> 10:15.000] Yeah, so we read from terminal, it gives a structure [10:15.600 --> 10:17.120] called input somehow. [10:17.120 --> 10:20.320] The first var, we compare it with these things, [10:20.320 --> 10:25.320] if it's that, compile buffer, this check macro, [10:25.680 --> 10:27.880] this is also pseudocode, it's not real code. [10:27.880 --> 10:31.200] So checks for first the output of this [10:31.200 --> 10:34.800] compile buffer function, which is compile time error, [10:34.800 --> 10:39.800] and also the exception during the execution of this program. [10:40.280 --> 10:42.280] And if it's not, okay, it checks things, [10:42.280 --> 10:44.680] and then, you know, in the compile statement, [10:44.680 --> 10:48.520] you get the value back, and besides this exception. [10:48.520 --> 10:50.600] So, but what is poke t? [10:50.600 --> 10:54.240] So, here in the poke application, [10:54.240 --> 10:59.240] we have this layer of std in, std out, [10:59.240 --> 11:01.200] and std error over the lip poke. [11:01.200 --> 11:05.920] So what about, you know, generalizing this abstraction [11:05.920 --> 11:08.800] to Unix sockets, instead of getting information [11:08.800 --> 11:13.800] from the input, we can get information from Unix socket. [11:14.400 --> 11:16.760] Is a demon, acts like a broker, [11:16.760 --> 11:21.440] so it listens on this socket, [11:21.440 --> 11:23.560] and it has a concept of channels, [11:23.560 --> 11:26.160] like you have input channels and output channels, [11:27.320 --> 11:29.880] and are completely independent, [11:29.880 --> 11:33.560] and then a client, we call them pokelets, [11:33.560 --> 11:36.000] connects to this poke t, [11:36.000 --> 11:41.000] it should tell the poke t that what is its role. [11:43.160 --> 11:46.640] So the role is an 8-bit thing, [11:46.640 --> 11:49.240] which is integral struct, you know, the syntax, [11:49.240 --> 11:51.640] this is different from normal structs, [11:51.640 --> 11:54.880] but yeah, should I explain that? [11:54.880 --> 11:57.160] No, I don't know, no. [11:57.160 --> 12:01.600] So the most significant bit is a direction [12:01.600 --> 12:03.960] followed by seven-bit of channel, [12:03.960 --> 12:08.080] which is limited, we reserve them for future upgrades. [12:08.080 --> 12:09.880] So when you connect to this socket, [12:09.880 --> 12:12.640] you have to write this byte to the poke t, [12:12.640 --> 12:14.360] then he knows that, okay, your input, [12:14.360 --> 12:16.080] so expect something from you, [12:16.080 --> 12:17.720] or it's an output channel, [12:19.080 --> 12:23.320] then when some user code write to this channel, [12:23.320 --> 12:26.400] you will get the data, and it's distributed to all, [12:26.400 --> 12:27.800] and there is no addressing thing, [12:27.800 --> 12:28.960] it's a broadcast thing. [12:30.560 --> 12:35.000] So if you want to know how these things work, [12:35.000 --> 12:40.000] there is a pickle, I can show why not. [12:40.240 --> 12:44.640] If we go to the GNU poke poke program, okay, [12:44.640 --> 12:47.240] here in the, oh, I have to, sorry, [12:47.240 --> 12:51.200] I have to enable the syntax highlighter, [12:51.200 --> 12:56.200] so yeah, then pickles, pdap. [12:56.200 --> 13:00.080] So all this communication poke the application protocol, [13:00.080 --> 13:02.920] you can see here, you can see the description here, [13:02.920 --> 13:06.040] okay, this rolls, what is the outcome stage, [13:06.040 --> 13:07.880] what is the, all of them are there, [13:07.880 --> 13:11.000] so if you are curious, you can go there and study. [13:11.000 --> 13:14.320] So, but we'll now go to the more detail. [13:14.320 --> 13:18.800] So here is the poke the oversimplified view. [13:18.800 --> 13:21.960] So here we have reading from input channels, [13:21.960 --> 13:24.960] and we have a concept of iteration, [13:24.960 --> 13:27.680] you know, when you start sending something, [13:27.680 --> 13:31.600] because, you know, you can have different print of statements, [13:31.600 --> 13:34.720] so it should, you know, it's, you know, [13:34.720 --> 13:36.320] partially send data in chunks, [13:36.320 --> 13:40.000] so we have to somehow notify our user, okay, [13:40.000 --> 13:42.400] here you're starting a new iteration of compiling [13:42.400 --> 13:47.400] or something, and so if it's from input channel, [13:47.520 --> 13:50.960] which is channel number one, it's simpler, I think, [13:50.960 --> 13:53.400] it gives to the PK compile buffer, [13:53.400 --> 13:56.520] and if it's from command input, [13:56.520 --> 13:58.720] which is input channel number two, [13:58.720 --> 14:00.760] it will give it to the statement, [14:00.760 --> 14:03.640] and here we have this check publish instead of print, [14:03.640 --> 14:05.960] it publishes to all the subscriber, [14:05.960 --> 14:08.800] all the clients are, said that, okay, [14:08.800 --> 14:12.120] we are interested in getting data from this output channel. [14:12.960 --> 14:15.320] So, any question regarding these things, [14:15.320 --> 14:20.320] poke the poke, poke the CLI, pickles, nothing, great, [14:20.320 --> 14:24.600] nobody is following, so that's great. [14:24.600 --> 14:28.880] So, let's talk about Pac-Me, so, question? [14:28.880 --> 14:29.840] Where? [14:29.840 --> 14:32.720] No, if you, I'll open the questions. [14:34.880 --> 14:35.720] What? [14:35.720 --> 14:36.560] Okay. [14:36.560 --> 14:41.400] I'm trying to my best to answer questions, so. [14:42.400 --> 14:44.960] Okay, so now let's talk about Pac-Me, [14:47.360 --> 14:48.840] which is the title of this talk, [14:48.840 --> 14:52.800] so it's an ACME-inspired, you know, poke interface, [14:52.800 --> 14:57.080] it's not ACME, let me explain it. [14:57.080 --> 14:59.600] The reason is because text rocks and anything else, [14:59.600 --> 15:03.040] like the graphical interface, it sucks really, seriously, [15:03.040 --> 15:06.720] I'm not, this is in the line of code of conduct, [15:06.720 --> 15:08.920] of custom or not, I don't know. [15:08.920 --> 15:09.800] You talk bad about graphics. [15:09.800 --> 15:14.120] Anything else sucks, yeah, good, thank you for the support. [15:14.120 --> 15:19.120] So, examples of good interfaces, in my opinion, [15:20.240 --> 15:23.120] are list machines, small talk environments, [15:23.120 --> 15:27.680] Oberon, which is a desktop computer system written scratch [15:27.680 --> 15:30.760] from Nikolaus Wirth, the creator of the Pascal, [15:30.760 --> 15:33.160] for the students, but it's a very interesting [15:33.160 --> 15:36.520] text-oriented interface, and the ACME, [15:36.520 --> 15:38.920] which is the editor of a great operating system [15:38.920 --> 15:41.640] called Plan 9 from Bell Labs, written by Rob Pike, [15:41.640 --> 15:44.120] the co-inventor of co-programmed language, [15:45.600 --> 15:48.360] which is also inspired by Oberon. [15:49.360 --> 15:54.360] The good thing is text is the main thing there, [15:54.360 --> 15:58.000] so you can select text and execute text, [15:58.000 --> 16:02.640] so it is very interactive, but also you have the text, [16:02.640 --> 16:04.600] so you can compose things and then, okay, [16:04.600 --> 16:07.680] put them in a function, and these kind of things, [16:07.680 --> 16:09.840] you know, it's much powerful than, you know, [16:09.840 --> 16:12.920] this DOM button, you have to click on that, you know, [16:12.920 --> 16:14.400] you cannot even change it, you know, [16:14.400 --> 16:15.840] if it's not useful for you. [16:17.080 --> 16:21.680] So, the reason is, okay, easy to compose, [16:21.680 --> 16:24.240] automation-friendly, you can have, explore, [16:24.240 --> 16:25.880] it's very useful for binary data, [16:25.880 --> 16:28.200] you are exploring, you know, different things, [16:28.200 --> 16:31.160] and then over the time, you have a script, [16:31.160 --> 16:32.800] so copy, paste it in a function, [16:32.800 --> 16:34.680] and then call it later, why not? [16:34.680 --> 16:38.560] And it's extensible, you know, you need something more, [16:38.560 --> 16:41.520] which we don't know, you develop your own program, [16:41.520 --> 16:44.880] which is, you know, a very simple thing, you can do that, [16:44.880 --> 16:47.480] and for your information, I'm not against graphics, [16:47.480 --> 16:50.640] graphics is awesome, the way that we currently use, [16:50.640 --> 16:52.320] you know, graphical interfaces is bad, [16:52.320 --> 16:54.760] like I have a button, I cannot change the function [16:54.760 --> 16:58.240] attached to it, I cannot, you know, remove this button, [16:58.240 --> 17:00.840] put two buttons, which is more useful to my case, [17:00.840 --> 17:04.800] so yeah, I love graphics like formulas, visualization, [17:04.800 --> 17:08.360] because the best pattern matcher we already have [17:08.360 --> 17:10.840] and planned, there's our brain, so why not? [17:10.840 --> 17:15.840] Visualization is cool, so, but this, yeah, never mind. [17:18.960 --> 17:23.000] Yeah, it's getting out of contact, so, kind of talk. [17:23.000 --> 17:26.240] So, okay, Pac-V is pokelets plus T-box. [17:27.160 --> 17:31.400] So the idea is, okay, okay, this terminal thing [17:31.400 --> 17:33.840] is not the best thing we have, it's from 60s, [17:33.840 --> 17:38.200] but yes, it's by far the best thing we have today, so. [17:38.200 --> 17:41.000] Let's live there, so, the option is, [17:41.000 --> 17:44.040] one option is to implement everything from scratch, [17:44.040 --> 17:46.080] which is, I'm too lazy to do that, [17:46.080 --> 17:49.920] so we have already programmed like T-box and screen, [17:49.920 --> 17:53.360] which you can do interesting stuff with them, [17:53.360 --> 17:57.440] like let me, if you don't know about it, let me, [17:57.440 --> 17:59.960] okay, this is a normal, external thing, [17:59.960 --> 18:04.960] and I say like, let me use one specific configuration [18:04.960 --> 18:09.840] for that thing, so here I'm opening this thing, [18:09.840 --> 18:14.840] so I can like, I have, there is a prefix, [18:14.840 --> 18:19.840] so you want to say that, okay, please do this thing, [18:20.000 --> 18:25.000] or like resizing things, running commands, [18:25.000 --> 18:29.640] you can do many cool things here. [18:29.640 --> 18:32.960] I'm not, this is good, we have this kind of thing, [18:32.960 --> 18:35.280] so we can use this infrastructure, [18:35.280 --> 18:40.280] and with the power of little programs, [18:42.000 --> 18:47.000] the pokelets, which talk with the poke over the socket, [18:47.400 --> 18:50.240] we can create a user interface, which is dynamic, [18:51.840 --> 18:54.160] not the best, but yeah, we can improve it, [18:54.160 --> 18:58.120] it's more interactive, and also, because of this, [18:58.120 --> 19:01.240] there is no limit, here pack me, I'm talking about terminals, [19:01.240 --> 19:04.200] but you can run on Emacs, which is we have, [19:04.200 --> 19:06.600] these things can coexist together, [19:06.600 --> 19:08.640] you have pack me here, Emacs here, [19:08.640 --> 19:11.520] and even I have an implementation in WebSocket, [19:11.520 --> 19:15.160] but it's still in Python, so I'm not allowed to publish it, [19:15.160 --> 19:18.200] unless I have some C implementation for it, [19:18.200 --> 19:22.880] yeah, I'm not looking at you, yeah, [19:22.880 --> 19:27.760] and in future, we will have support for screen, [19:27.760 --> 19:31.400] I chose T-Max because I use it on a daily basis, [19:31.400 --> 19:36.400] so why not, and okay, so I showed the T-Max for you, [19:37.760 --> 19:41.600] so let me show you the pack me, [19:41.600 --> 19:44.480] if you like pack me, it's here, [19:44.480 --> 19:49.480] so home user bin pack me, da-da, this is it, [19:50.600 --> 19:55.360] so it's called the T-Max on a specific unique socket, [19:55.360 --> 19:57.800] which is a T-Max thing, not important for us, [19:57.800 --> 20:01.520] with this specifically, so pack me, [20:01.520 --> 20:03.640] this T-Max configuration file, [20:03.640 --> 20:06.560] so let's look at what is it, [20:06.560 --> 20:11.560] so here, share, pack me, yeah, here, [20:13.080 --> 20:17.840] so here, like we are, you know, the default, [20:17.840 --> 20:21.840] because when you want to do something to instruct the T-Max, [20:21.840 --> 20:24.000] you have to send the key combination, [20:24.000 --> 20:26.440] okay, now I'm talking to you T-Max, [20:26.440 --> 20:29.600] so by default, it's control B here, [20:29.600 --> 20:34.280] you're unbinding it, and here, I chose control G, [20:34.280 --> 20:35.600] you can choose whatever you want, [20:35.600 --> 20:38.960] and my favorite one is control O, [20:38.960 --> 20:41.760] because it doesn't conflict with anything, [20:41.760 --> 20:44.520] anything else, B, A, G are conflicting [20:44.520 --> 20:47.880] with the GNU read line, which I hate, [20:47.880 --> 20:51.280] but this is for you people, so you can change it, [20:51.280 --> 20:55.920] and so we are, like we can have control O, [20:55.920 --> 20:59.840] so if I press control G and uppercase O, [20:59.840 --> 21:03.760] I automatically split the window, [21:03.760 --> 21:08.600] send these literal things, like peel it out, enter, [21:08.600 --> 21:10.840] this is, you know, but you see here, [21:10.840 --> 21:14.280] and then select, you know, go back to my cursor [21:14.280 --> 21:18.160] to my current pane, which is this one, the upper one, [21:18.160 --> 21:21.480] so you can, now if I go to the, okay, [21:21.480 --> 21:26.480] I can new one, peel it, echo, print, [21:29.600 --> 21:33.640] it's better to be quoted, hello, fuss them, [21:35.160 --> 21:39.720] and I guess with this one, I have a very little program [21:39.720 --> 21:42.840] which reads from, is it in, and writes to the poke D, [21:42.840 --> 21:47.840] so you see here, this 73 is the iteration number, [21:48.480 --> 21:51.600] and that's the result of the execution, it's there, [21:51.600 --> 21:55.080] so if I rerun it again, a new thing, [21:55.080 --> 21:57.520] so here in this patch, peel it out, [21:57.520 --> 22:01.600] I decided to use this, but you can use anything [22:01.600 --> 22:05.880] you are interested in, and just for the record, [22:05.880 --> 22:10.480] this slide thing, it's a poke led too, [22:10.480 --> 22:15.480] and I can show the code to you, like user bin, [22:15.680 --> 22:20.240] peel it, slides, it's like peel it out, [22:20.240 --> 22:24.120] channel number 60, don't put the length, [22:24.120 --> 22:26.720] so it's not important, and this is the terminal [22:28.040 --> 22:31.160] code, escape code for clearing this thing, [22:31.160 --> 22:36.160] so it just, instead of writing this slash slash the number, [22:36.160 --> 22:40.360] it just clears this, so I have these slides here, [22:40.360 --> 22:44.440] so the other thing I can show you, [22:44.440 --> 22:48.280] so let me finish this thing, so now key bindings, [22:48.280 --> 22:52.200] normal key bindings, like I have this power here [22:52.200 --> 22:57.120] to like, let me, this is also cool, let's out, [22:58.200 --> 23:03.200] okay, here in my thing, I think let's define a variable, [23:03.200 --> 23:08.200] echo var a equals 100, and send it to the poke, [23:11.920 --> 23:16.920] okay, so we know that it has, but with the power of Tmax, [23:19.840 --> 23:24.840] I can go and select this a, and I'm telling the, [23:26.080 --> 23:28.880] this is the key binding, okay, execute it, [23:28.880 --> 23:33.080] the e, upper e, this key binding, so pipe and cancel, [23:33.080 --> 23:37.400] put a semicolon at the end, and give it to the [23:37.400 --> 23:41.920] pokelet in channel two, which is for the command, [23:41.920 --> 23:45.760] so if I press shift e, 100 you have c, [23:45.760 --> 23:48.960] so it executes this a, it's like that you've written [23:48.960 --> 23:53.960] the a on the command line, in the ripple, so very simple [23:55.920 --> 24:00.920] thing, so I have also, because I love users, [24:00.920 --> 24:04.200] so I provided predefined layouts for you, [24:04.200 --> 24:08.720] so you can hear, control GF1, like it's opened your [24:08.720 --> 24:13.720] editor here, which is hell, yeah, this is using [24:14.360 --> 24:18.640] this editor thing, so you can just use your favorite [24:18.640 --> 24:22.280] editor, you have here the pickle, which I write a, [24:22.280 --> 24:26.040] you see, the logic is in the poke t, so when you can [24:26.040 --> 24:30.840] connect, disconnect, everything is there, and another [24:30.840 --> 24:35.840] layout is f2, yeah, it worked, so let's show, [24:35.840 --> 24:38.640] let me show you something, maybe a little bit more [24:38.640 --> 24:43.640] interesting, yeah, yeah, yeah, var, let's open the file, [24:43.640 --> 24:54.640] which I have somewhere, now this is error, I, okay, home, [24:54.640 --> 25:04.640] caldron, I don't remember that, caldron, yeah, test 0, 1, [25:04.640 --> 25:13.640] elf, okay, it's an elf file, you see here the number 0, [25:13.640 --> 25:19.640] this is the handle to this IO thing, this file, so I can [25:19.640 --> 25:27.640] load elf module, and okay, and I know that it's a [25:27.640 --> 25:33.640] risk file elf, so let's load this risk v module, we [25:33.640 --> 25:41.640] call module pickles, if you wonder why, ask him, and so [25:41.640 --> 25:46.640] var file equals elf, it's an elf 6, I know that it's [25:46.640 --> 25:51.640] an elf 3rd, oh, I can like do the view, here you get [25:51.640 --> 25:55.640] a dump, and you can, the fun thing is you can add as [25:55.640 --> 25:58.640] many as viewer you want, so it's the same thing, you [25:58.640 --> 26:01.640] can have a viewer in web, so here you instruct your [26:01.640 --> 26:04.640] thing, and in the web you get your things, highlighting [26:04.640 --> 26:13.640] stuff, anything you want, yeah, and so let's do elf 64 [26:13.640 --> 26:19.640] file, add this IO space at offset 0, so I'm telling [26:19.640 --> 26:24.640] that, okay, go to this IO space, number 0, go to [26:24.640 --> 26:28.640] that offset, and give me the elf file there, there's [26:28.640 --> 26:32.640] no elf file there, and it's, okay, oh, and if I [26:32.640 --> 26:38.640] hear, oh, oh, oh, oh, yeah, in the, I can zoom in, so [26:38.640 --> 26:44.640] here you see that, you get all the elf stuff here, [26:44.640 --> 26:49.640] like e-edit, no type, machine, section header, and [26:49.640 --> 26:57.640] others, so let's get the text section of this [26:57.640 --> 27:05.640] thing, elf 32, no, we have the file, get sections [27:05.640 --> 27:11.640] by name, that text, I know that this elf file only [27:11.640 --> 27:14.640] has one, so it gives all the sections, so I have [27:14.640 --> 27:19.640] one, so sub zero, if I write text, so at the end [27:19.640 --> 27:24.640] you see, you get this section header with the [27:24.640 --> 27:30.640] offset and size, right, so this is the address [27:30.640 --> 27:34.640] where the code, the actual execution code resides [27:34.640 --> 27:38.640] in the binary, so, but you know, you can say, okay, [27:38.640 --> 27:42.640] give me the bytes, give me how much bytes, text [27:42.640 --> 27:49.640] SH size bytes is an, here, this is an offset, I'm [27:49.640 --> 27:53.640] telling that, okay, I need bytes of this size, at [27:53.640 --> 27:57.640] this ispace, and at this offset, you know, go to [27:57.640 --> 28:02.640] this offset, SH offset, so you get all the bytes [28:02.640 --> 28:09.640] here, I can VM set output base to 16 and do it [28:09.640 --> 28:14.640] again, so in more interesting things, so, but [28:14.640 --> 28:18.640] it is bytes, what else can we do, you can say, okay, [28:18.640 --> 28:24.640] I know that these are risks, risks 532 I [28:24.640 --> 28:28.640] instructions, you know, this subset, you know, this [28:28.640 --> 28:33.640] basic base component of this risk machine, so [28:33.640 --> 28:40.640] give me that amount of elements of instructions [28:40.640 --> 28:46.640] at this offset, so here, if we go to the end, so [28:46.640 --> 28:50.640] you get all these instructions, risk 5 instructions, [28:50.640 --> 28:54.640] which be written in poke, the description of this [28:54.640 --> 28:56.640] instruction, that's the extensible thing, so for [28:56.640 --> 28:59.640] example, here we have an instruction of format I, [28:59.640 --> 29:04.640] which immediate of this value, RS1, functionality 0, [29:04.640 --> 29:10.640] or the this one, and opcode stuff, I can show you the, [29:10.640 --> 29:13.640] I think I'm done, you know, I don't have any time, so [29:13.640 --> 29:19.640] let me just show this one and then to Radare, so [29:19.640 --> 29:32.640] poke, what was, yeah, pickles, what, yeah, yeah, yeah, [29:32.640 --> 29:37.640] hey, I didn't pay for them, you can, it's free from [29:37.640 --> 29:44.640] my point of view, you have to handle him, so this [29:44.640 --> 29:48.640] is risk 5, you see, we define the opcodes, different [29:48.640 --> 29:52.640] instructions, like this is the instruction type B, [29:52.640 --> 29:57.640] it's an integral structure, so you can read about this, [29:57.640 --> 30:00.640] so we can have very complex things, we have pretty [30:00.640 --> 30:03.640] printers, nice thing is we have, also I want to show [30:03.640 --> 30:09.640] this, this is from, okay, I can put it into [30:09.640 --> 30:18.640] incense variable, incense 0, which is, let me close [30:18.640 --> 30:22.640] this view, dumb view, yeah, yeah, here we have the [30:22.640 --> 30:27.640] thing, so you can give the, this is the actual [30:27.640 --> 30:33.640] number, which is there, in the memory it is stored [30:33.640 --> 30:37.640] in the little indian, so 1380, something like that, [30:37.640 --> 30:45.640] and one, what, what, yeah, as, as, so we have a [30:45.640 --> 30:50.640] method, you call this method, you don't need to [30:50.640 --> 30:54.640] print, if there is no argument, so it gives you [30:54.640 --> 30:58.640] a real valid instruction for the assembler, so this [30:58.640 --> 31:01.640] is part of the whole story, so you can add more [31:01.640 --> 31:04.640] pokelets, next year I will come back with more [31:04.640 --> 31:08.640] interesting things, no GUI, but the right way, and [31:08.640 --> 31:11.640] yeah, thank you, thank you, if there is any [31:11.640 --> 31:25.640] more, thank you, thank you, thank you, thank you.