summaryrefslogblamecommitdiffstats
path: root/2020/subtitles/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon-autogen.sbv
blob: 1c88545fd3df1920312486d2b82e0abbad6cec84 (plain) (tree)


















                                        
                                        







                                    
                                     







                              
                                        




























                                        
                                        







                                     
               



























































































                                        
                                        










                                   
                                        
















                                        
                                      



































































                                        
                                       




                       
                                       










                                      
                        




























                                        
                                       


































                                        
                                        







                                     
                                      




                       
                                        




                       
                                      




                       
                                

                       
                                       




                       
                                        




                                
                                       







                                  
                                       







                               
                   

                       
                   

                       
                                 




                                        
     




























                                       
        













                                     
                                    










                                    
            







                                   
                              

                       
                                     






















                                        
                                







                                 
                                  





































                                       
                                     



















                                        
                                




                           
                                   




                       
                                    










                                    
                    




















































                                        
                                    







                             
                                      

                       
                                     



















                                      
                                    

















































                                        
                                       




                       
                                
 
0:00:00.799,0:00:05.520
hello everyone and welcome to this short

0:00:04.000,0:00:08.160
lightning talk

0:00:05.520,0:00:09.519
traverse complex json structures with

0:00:08.160,0:00:13.040
live feedback

0:00:09.519,0:00:18.000
this is a pre-recorded talk and part of

0:00:13.040,0:00:19.920
the e-max conf 2020 schedule

0:00:18.000,0:00:21.840
this is what we're going to do I'll make

0:00:19.920,0:00:22.320
a quick introduction to the topic at

0:00:21.840,0:00:23.920
hand

0:00:22.320,0:00:25.760
I'll give you a demonstration of some

0:00:23.920,0:00:29.199
tools and then we'll leave you

0:00:25.760,0:00:31.920
with the links to set tools

0:00:29.199,0:00:32.399
before that just a little bit about me I

0:00:31.920,0:00:36.079
am the

0:00:32.399,0:00:39.520
ceo and co-founder of a company

0:00:36.079,0:00:40.399
based in the swiss mountains called 200

0:00:39.520,0:00:43.600
okay

0:00:40.399,0:00:46.160
we are a product incubator and

0:00:43.600,0:00:47.200
service consultancy but we like to spend

0:00:46.160,0:00:50.719
most or at least

0:00:47.200,0:00:52.719
as much time as we can building free

0:00:50.719,0:00:55.520
software

0:00:52.719,0:00:56.879
I'm also an ordained zen monk and abbott

0:00:55.520,0:01:00.160
of the lambda zen temple

0:00:56.879,0:01:01.359
you can reach me anytime on questions

0:01:00.160,0:01:05.860
regarding Emacs

0:01:01.359,0:01:07.200
for example at ala at 200ok.ch

0:01:05.860,0:01:09.600
[Music]

0:01:07.200,0:01:11.760
but back to the topic at hand the

0:01:09.600,0:01:13.680
proposition is as following

0:01:11.760,0:01:15.520
most work on the computer is based on

0:01:13.680,0:01:16.479
either text processing or text

0:01:15.520,0:01:19.920
consumption

0:01:16.479,0:01:20.880
and very often the text which you need

0:01:19.920,0:01:23.520
to process

0:01:20.880,0:01:24.560
is in a structured format for example in

0:01:23.520,0:01:26.640
json

0:01:24.560,0:01:28.560
that might even be if your job is not

0:01:26.640,0:01:30.400
programming per se

0:01:28.560,0:01:33.119
and reading through such a bigger chunk

0:01:30.400,0:01:36.479
of json can be non-trivial however

0:01:33.119,0:01:39.119
while just reading and understanding it

0:01:36.479,0:01:40.320
will be essential to getting your job

0:01:39.119,0:01:43.680
done

0:01:40.320,0:01:47.200
so let's quickly check out an example

0:01:43.680,0:01:50.560
json file this is from the github api

0:01:47.200,0:01:53.119
where which is a request sorry the

0:01:50.560,0:01:55.280
response to a request for a specific

0:01:53.119,0:01:58.560
issue on the github api so let's

0:01:55.280,0:01:58.560
quickly check that one out

0:01:58.799,0:02:03.280
okay so here it is open and we can

0:02:01.280,0:02:05.439
already see that there is lots of stuff

0:02:03.280,0:02:08.319
going on here

0:02:05.439,0:02:10.319
it's uh 200 lines it's not going to be

0:02:08.319,0:02:12.160
very easy just just to find out what are

0:02:10.319,0:02:13.920
the top level things in here what are

0:02:12.160,0:02:14.560
the top level attributes of course I can

0:02:13.920,0:02:16.480
do this

0:02:14.560,0:02:17.840
and maybe it would by hand but that

0:02:16.480,0:02:20.560
doesn't scale

0:02:17.840,0:02:22.560
I can use cool Emacs facilities like the

0:02:20.560,0:02:24.720
height show mode and try to

0:02:22.560,0:02:27.200
fold all the things that are top level

0:02:24.720,0:02:29.760
but that also doesn't really scale

0:02:27.200,0:02:32.000
there must be a better way and of course

0:02:29.760,0:02:34.959
there is there is prior art

0:02:32.000,0:02:36.080
there is a tool called jq I'm going to

0:02:34.959,0:02:39.120
quote the usp

0:02:36.080,0:02:42.959
from their website jq is like

0:02:39.120,0:02:44.720
sed said for json data you can use it to

0:02:42.959,0:02:46.720
slice and filter and map

0:02:44.720,0:02:47.840
and transform structured data with the

0:02:46.720,0:02:51.519
same ease that

0:02:47.840,0:02:53.920
z awk grep and friends let you play with

0:02:51.519,0:02:53.920
text

0:02:54.000,0:02:57.519
let me give you a quick demonstration of

0:02:56.160,0:02:59.680
it by the way

0:02:57.519,0:03:01.920
it's written in portable c it has zero

0:02:59.680,0:03:04.959
runtime dependency so it's very easy

0:03:01.920,0:03:09.040
to get started with it and use it on

0:03:04.959,0:03:12.800
pretty much any unix-based

0:03:09.040,0:03:16.159
computer sorry no linux based computer

0:03:12.800,0:03:19.599
apologies okay so let's explore a

0:03:16.159,0:03:21.120
json file with it it's a command line

0:03:19.599,0:03:24.640
tool and it has a very

0:03:21.120,0:03:26.799
simple command line syntax so you

0:03:24.640,0:03:27.840
call the binary and then you give it a

0:03:26.799,0:03:31.680
query

0:03:27.840,0:03:33.840
and a file and then we'll return

0:03:31.680,0:03:35.440
its answer so for example if I want the

0:03:33.840,0:03:38.319
top level keys

0:03:35.440,0:03:39.840
I will just say jq keys the file and it

0:03:38.319,0:03:42.319
will return the keys

0:03:39.840,0:03:43.519
simple as that so let's check this out

0:03:42.319,0:03:46.879
in a real

0:03:43.519,0:03:50.080
shell here I am in eshel

0:03:46.879,0:03:53.200
let's run jq keys on the github

0:03:50.080,0:03:56.959
issue comment and we can see

0:03:53.200,0:04:00.000
that we have actually received a list

0:03:56.959,0:04:02.000
back here with the top level

0:04:00.000,0:04:04.319
things okay so this issue it looks very

0:04:02.000,0:04:06.239
very interesting so let's uh ask it to

0:04:04.319,0:04:10.080
give me more information on this

0:04:06.239,0:04:11.360
issue then it's hairy again that's a lot

0:04:10.080,0:04:14.319
of stuff

0:04:11.360,0:04:17.759
I mean lucky for for us we are in Emacs

0:04:14.319,0:04:21.040
here so we can use nice shortcuts we can

0:04:17.759,0:04:22.000
copy this we go can go in here just

0:04:21.040,0:04:24.400
select that

0:04:22.000,0:04:25.600
get that out or something like this but

0:04:24.400,0:04:28.320
still

0:04:25.600,0:04:29.600
this is not really it's not really the

0:04:28.320,0:04:34.080
best way

0:04:29.600,0:04:36.639
to do that right it gets kind of tedious

0:04:34.080,0:04:37.680
at this point the output can be

0:04:36.639,0:04:39.360
humongous

0:04:37.680,0:04:42.479
the shell is not really the best place

0:04:39.360,0:04:43.600
to read through such big output I mean e

0:04:42.479,0:04:45.440
shell is

0:04:43.600,0:04:47.440
probably one of the better shells for

0:04:45.440,0:04:48.560
this because it's just a regular Emacs

0:04:47.440,0:04:51.199
buffer but still

0:04:48.560,0:04:52.720
it's not really the best tool and I need

0:04:51.199,0:04:55.280
to repeat the command

0:04:52.720,0:04:56.000
all the time until I finally build the

0:04:55.280,0:04:59.120
right query

0:04:56.000,0:05:02.080
and all the time I use I lose my

0:04:59.120,0:05:02.800
focus I lose what I'm currently looking

0:05:02.080,0:05:06.080
at

0:05:02.800,0:05:08.160
I'm seeing the new result it would be so

0:05:06.080,0:05:10.080
much nicer to have live feedback

0:05:08.160,0:05:11.600
and when working with Emacs we're quite

0:05:10.080,0:05:12.320
used to that so there should be an

0:05:11.600,0:05:15.120
option

0:05:12.320,0:05:17.759
and of course there is it's Emacs right

0:05:15.120,0:05:20.880
so you can do anything

0:05:17.759,0:05:22.960
there is various good tools for

0:05:20.880,0:05:26.000
completion in Emacs

0:05:22.960,0:05:29.039
I used ivy for this

0:05:26.000,0:05:31.840
I'm going to code the usp for ivy

0:05:29.039,0:05:32.639
iv is a generic completion mechanism for

0:05:31.840,0:05:34.639
Emacs

0:05:32.639,0:05:35.919
while it operates similarly to other

0:05:34.639,0:05:38.960
completion schemes

0:05:35.919,0:05:40.400
such as icomplete mode iv aims to be

0:05:38.960,0:05:43.120
more efficient smaller

0:05:40.400,0:05:45.199
simpler and smoother to use yet highly

0:05:43.120,0:05:47.840
customizable

0:05:45.199,0:05:49.440
and that's true one of the cool things

0:05:47.840,0:05:52.479
of iv

0:05:49.440,0:05:54.320
compared to other completion mechanisms

0:05:52.479,0:05:58.160
in Emacs

0:05:54.320,0:06:01.600
is that it can be used on dynamic

0:05:58.160,0:06:03.520
data so usually completion works on a

0:06:01.600,0:06:05.360
static input for example you're in a

0:06:03.520,0:06:08.800
buffer a text buffer

0:06:05.360,0:06:09.600
and you use I search maybe with idle

0:06:08.800,0:06:12.400
mode

0:06:09.600,0:06:13.360
and you find your results that's all

0:06:12.400,0:06:16.960
nice

0:06:13.360,0:06:19.840
however if I

0:06:16.960,0:06:20.720
want to search on dynamic data that

0:06:19.840,0:06:23.759
doesn't work

0:06:20.720,0:06:27.039
so whenever I type in my query

0:06:23.759,0:06:28.000
for jq I actually need to call the jq

0:06:27.039,0:06:30.160
binary

0:06:28.000,0:06:32.840
and it will give a different result set

0:06:30.160,0:06:36.319
back so it's a really

0:06:32.840,0:06:38.240
dynamic mechanism that we need here it's

0:06:36.319,0:06:41.440
much more like a search engine

0:06:38.240,0:06:42.560
and ivy luckily has something built in

0:06:41.440,0:06:46.000
and it's called

0:06:42.560,0:06:48.160
console so I used council and jq

0:06:46.000,0:06:49.199
and combined them and build a new

0:06:48.160,0:06:52.960
package

0:06:49.199,0:06:56.000
with which we can use Emacs and jq

0:06:52.960,0:06:58.800
to have live feedback

0:06:56.000,0:06:59.840
it's very easy to use so you just call

0:06:58.800,0:07:02.800
console.jq

0:06:59.840,0:07:04.319
on a buffer containing json for example

0:07:02.800,0:07:07.280
the one we have here

0:07:04.319,0:07:08.319
let's call console.jq on it and we

0:07:07.280,0:07:11.280
already

0:07:08.319,0:07:13.039
get a default query the dot query which

0:07:11.280,0:07:16.080
just gives us

0:07:13.039,0:07:17.280
the same file but now we can change it

0:07:16.080,0:07:19.039
and for example

0:07:17.280,0:07:21.039
find all the keys in here and then we

0:07:19.039,0:07:22.800
see I had this issue this was the one

0:07:21.039,0:07:24.639
that we were interested in

0:07:22.800,0:07:26.479
so let's find more information on the

0:07:24.639,0:07:28.800
issue what

0:07:26.479,0:07:31.680
keys does it have actually have uh it

0:07:28.800,0:07:34.800
has assignees that that interests me

0:07:31.680,0:07:37.039
so let's check out the assignees in here

0:07:34.800,0:07:39.759
there's two of them but I'm only

0:07:37.039,0:07:42.000
interested in the first one

0:07:39.759,0:07:43.599
I'm making stuff up as I go here of

0:07:42.000,0:07:46.000
course

0:07:43.599,0:07:47.039
and whenever I hit enter I get a new

0:07:46.000,0:07:50.160
buffer

0:07:47.039,0:07:53.520
which just shows me this

0:07:50.160,0:07:55.599
particular result for the particular

0:07:53.520,0:07:59.199
query that I entered

0:07:55.599,0:08:03.199
so let me do that again we are in here

0:07:59.199,0:08:05.840
we are looking at a

0:08:03.199,0:08:07.520
json file this can be very very big

0:08:05.840,0:08:09.520
doesn't also need to be a file just

0:08:07.520,0:08:12.160
needs to be a buffer

0:08:09.520,0:08:13.599
you call console.jq on it and you can do

0:08:12.160,0:08:16.479
any kind of

0:08:13.599,0:08:18.080
query on it for example let's see if

0:08:16.479,0:08:20.319
there is a url here

0:08:18.080,0:08:23.759
yes there's a url let's see if there's a

0:08:20.319,0:08:26.879
repository here repository

0:08:23.759,0:08:33.360
no there isn't what was it called issue

0:08:26.879,0:08:33.360
keys repository url it was called okay

0:08:33.440,0:08:40.240
so let's see issue pause

0:08:36.640,0:08:42.959
url and then we see so

0:08:40.240,0:08:44.159
apparently this issue command is for a

0:08:42.959,0:08:47.839
repository called

0:08:44.159,0:08:50.320
organize I wonder what that might be

0:08:47.839,0:08:52.640
okay so that was a very short

0:08:50.320,0:08:54.800
introduction to console jq

0:08:52.640,0:08:56.800
you can see the timer here I only have

0:08:54.800,0:08:57.440
one minute left to go so I'm going to

0:08:56.800,0:08:59.760
leave

0:08:57.440,0:09:01.519
with a very very short introduction to

0:08:59.760,0:09:05.040
the console gq

0:09:01.519,0:09:07.519
code it's not even 60 lines

0:09:05.040,0:09:09.600
of e-lisp so building something like

0:09:07.519,0:09:12.800
this is very very easy

0:09:09.600,0:09:14.560
I would encourage you to go and read

0:09:12.800,0:09:16.160
through the code in your own time

0:09:14.560,0:09:18.320
if you're interested in building

0:09:16.160,0:09:19.600
something like this if you're interested

0:09:18.320,0:09:22.720
in just using

0:09:19.600,0:09:24.320
jq or you're done

0:09:22.720,0:09:25.839
these are the links to all the tools

0:09:24.320,0:09:28.800
console.jq of course

0:09:25.839,0:09:29.519
is readily available on melpah also

0:09:28.800,0:09:32.959
developed

0:09:29.519,0:09:36.080
under the agpl license on github

0:09:32.959,0:09:37.839
and disorganized thing by the way it's

0:09:36.080,0:09:39.839
orig mode for mobile and desktop

0:09:37.839,0:09:42.399
browsers also a great

0:09:39.839,0:09:43.120
free software tool maybe that interests

0:09:42.399,0:09:46.240
you

0:09:43.120,0:09:48.800
thank you for listening have great time

0:09:46.240,0:09:49.360
10 seconds left I am going to stop this

0:09:48.800,0:09:53.920
now

0:09:49.360,0:09:53.920
enjoy EmacsConf have a great day