blob: e7eada5b8257ab51e544a07667d88bfa0d4a32e1 (
plain) (
tree)
|
|
WEBVTT
00:00:00.799 --> 00:00:04.000
hello everyone and welcome to this short
00:00:04.000 --> 00:00:05.520
lightning talk
00:00:05.520 --> 00:00:08.160
traverse complex json structures with
00:00:08.160 --> 00:00:09.519
live feedback
00:00:09.519 --> 00:00:13.040
this is a pre-recorded talk and part of
00:00:13.040 --> 00:00:18.000
the e-max conf 2020 schedule
00:00:18.000 --> 00:00:19.920
this is what we're going to do I'll make
00:00:19.920 --> 00:00:21.840
a quick introduction to the topic at
00:00:21.840 --> 00:00:22.320
hand
00:00:22.320 --> 00:00:23.920
I'll give you a demonstration of some
00:00:23.920 --> 00:00:25.760
tools and then we'll leave you
00:00:25.760 --> 00:00:29.199
with the links to set tools
00:00:29.199 --> 00:00:31.920
before that just a little bit about me I
00:00:31.920 --> 00:00:32.399
am the
00:00:32.399 --> 00:00:36.079
ceo and co-founder of a company
00:00:36.079 --> 00:00:39.520
based in the swiss mountains called 200
00:00:39.520 --> 00:00:40.399
okay
00:00:40.399 --> 00:00:43.600
we are a product incubator and
00:00:43.600 --> 00:00:46.160
service consultancy but we like to spend
00:00:46.160 --> 00:00:47.200
most or at least
00:00:47.200 --> 00:00:50.719
as much time as we can building free
00:00:50.719 --> 00:00:52.719
software
00:00:52.719 --> 00:00:55.520
I'm also an ordained zen monk and abbott
00:00:55.520 --> 00:00:56.879
of the lambda zen temple
00:00:56.879 --> 00:01:00.160
you can reach me anytime on questions
00:01:00.160 --> 00:01:01.359
regarding Emacs
00:01:01.359 --> 00:01:05.860
for example at ala at 200ok.ch
00:01:05.860 --> 00:01:07.200
[Music]
00:01:07.200 --> 00:01:09.600
but back to the topic at hand the
00:01:09.600 --> 00:01:11.760
proposition is as following
00:01:11.760 --> 00:01:13.680
most work on the computer is based on
00:01:13.680 --> 00:01:15.520
either text processing or text
00:01:15.520 --> 00:01:16.479
consumption
00:01:16.479 --> 00:01:19.920
and very often the text which you need
00:01:19.920 --> 00:01:20.880
to process
00:01:20.880 --> 00:01:23.520
is in a structured format for example in
00:01:23.520 --> 00:01:24.560
json
00:01:24.560 --> 00:01:26.640
that might even be if your job is not
00:01:26.640 --> 00:01:28.560
programming per se
00:01:28.560 --> 00:01:30.400
and reading through such a bigger chunk
00:01:30.400 --> 00:01:33.119
of json can be non-trivial however
00:01:33.119 --> 00:01:36.479
while just reading and understanding it
00:01:36.479 --> 00:01:39.119
will be essential to getting your job
00:01:39.119 --> 00:01:40.320
done
00:01:40.320 --> 00:01:43.680
so let's quickly check out an example
00:01:43.680 --> 00:01:47.200
json file this is from the github api
00:01:47.200 --> 00:01:50.560
where which is a request sorry the
00:01:50.560 --> 00:01:53.119
response to a request for a specific
00:01:53.119 --> 00:01:55.280
issue on the github api so let's
00:01:55.280 --> 00:01:58.799
quickly check that one out
00:01:58.799 --> 00:02:01.280
okay so here it is open and we can
00:02:01.280 --> 00:02:03.280
already see that there is lots of stuff
00:02:03.280 --> 00:02:05.439
going on here
00:02:05.439 --> 00:02:08.319
it's uh 200 lines it's not going to be
00:02:08.319 --> 00:02:10.319
very easy just just to find out what are
00:02:10.319 --> 00:02:12.160
the top level things in here what are
00:02:12.160 --> 00:02:13.920
the top level attributes of course I can
00:02:13.920 --> 00:02:14.560
do this
00:02:14.560 --> 00:02:16.480
and maybe it would by hand but that
00:02:16.480 --> 00:02:17.840
doesn't scale
00:02:17.840 --> 00:02:20.560
I can use cool Emacs facilities like the
00:02:20.560 --> 00:02:22.560
height show mode and try to
00:02:22.560 --> 00:02:24.720
fold all the things that are top level
00:02:24.720 --> 00:02:27.200
but that also doesn't really scale
00:02:27.200 --> 00:02:29.760
there must be a better way and of course
00:02:29.760 --> 00:02:32.000
there is there is prior art
00:02:32.000 --> 00:02:34.959
there is a tool called jq I'm going to
00:02:34.959 --> 00:02:36.080
quote the usp
00:02:36.080 --> 00:02:39.120
from their website jq is like
00:02:39.120 --> 00:02:42.959
sed said for json data you can use it to
00:02:42.959 --> 00:02:44.720
slice and filter and map
00:02:44.720 --> 00:02:46.720
and transform structured data with the
00:02:46.720 --> 00:02:47.840
same ease that
00:02:47.840 --> 00:02:51.519
z awk grep and friends let you play with
00:02:51.519 --> 00:02:54.000
text
00:02:54.000 --> 00:02:56.160
let me give you a quick demonstration of
00:02:56.160 --> 00:02:57.519
it by the way
00:02:57.519 --> 00:02:59.680
it's written in portable c it has zero
00:02:59.680 --> 00:03:01.920
runtime dependency so it's very easy
00:03:01.920 --> 00:03:04.959
to get started with it and use it on
00:03:04.959 --> 00:03:09.040
pretty much any unix-based
00:03:09.040 --> 00:03:12.800
computer sorry no linux based computer
00:03:12.800 --> 00:03:16.159
apologies okay so let's explore a
00:03:16.159 --> 00:03:19.599
json file with it it's a command line
00:03:19.599 --> 00:03:21.120
tool and it has a very
00:03:21.120 --> 00:03:24.640
simple command line syntax so you
00:03:24.640 --> 00:03:26.799
call the binary and then you give it a
00:03:26.799 --> 00:03:27.840
query
00:03:27.840 --> 00:03:31.680
and a file and then we'll return
00:03:31.680 --> 00:03:33.840
its answer so for example if I want the
00:03:33.840 --> 00:03:35.440
top level keys
00:03:35.440 --> 00:03:38.319
I will just say jq keys the file and it
00:03:38.319 --> 00:03:39.840
will return the keys
00:03:39.840 --> 00:03:42.319
simple as that so let's check this out
00:03:42.319 --> 00:03:43.519
in a real
00:03:43.519 --> 00:03:46.879
shell here I am in eshel
00:03:46.879 --> 00:03:50.080
let's run jq keys on the github
00:03:50.080 --> 00:03:53.200
issue comment and we can see
00:03:53.200 --> 00:03:56.959
that we have actually received a list
00:03:56.959 --> 00:04:00.000
back here with the top level
00:04:00.000 --> 00:04:02.000
things okay so this issue it looks very
00:04:02.000 --> 00:04:04.319
very interesting so let's uh ask it to
00:04:04.319 --> 00:04:06.239
give me more information on this
00:04:06.239 --> 00:04:10.080
issue then it's hairy again that's a lot
00:04:10.080 --> 00:04:11.360
of stuff
00:04:11.360 --> 00:04:14.319
I mean lucky for for us we are in Emacs
00:04:14.319 --> 00:04:17.759
here so we can use nice shortcuts we can
00:04:17.759 --> 00:04:21.040
copy this we go can go in here just
00:04:21.040 --> 00:04:22.000
select that
00:04:22.000 --> 00:04:24.400
get that out or something like this but
00:04:24.400 --> 00:04:25.600
still
00:04:25.600 --> 00:04:28.320
this is not really it's not really the
00:04:28.320 --> 00:04:29.600
best way
00:04:29.600 --> 00:04:34.080
to do that right it gets kind of tedious
00:04:34.080 --> 00:04:36.639
at this point the output can be
00:04:36.639 --> 00:04:37.680
humongous
00:04:37.680 --> 00:04:39.360
the shell is not really the best place
00:04:39.360 --> 00:04:42.479
to read through such big output I mean e
00:04:42.479 --> 00:04:43.600
shell is
00:04:43.600 --> 00:04:45.440
probably one of the better shells for
00:04:45.440 --> 00:04:47.440
this because it's just a regular Emacs
00:04:47.440 --> 00:04:48.560
buffer but still
00:04:48.560 --> 00:04:51.199
it's not really the best tool and I need
00:04:51.199 --> 00:04:52.720
to repeat the command
00:04:52.720 --> 00:04:55.280
all the time until I finally build the
00:04:55.280 --> 00:04:56.000
right query
00:04:56.000 --> 00:04:59.120
and all the time I use I lose my
00:04:59.120 --> 00:05:02.080
focus I lose what I'm currently looking
00:05:02.080 --> 00:05:02.800
at
00:05:02.800 --> 00:05:06.080
I'm seeing the new result it would be so
00:05:06.080 --> 00:05:08.160
much nicer to have live feedback
00:05:08.160 --> 00:05:10.080
and when working with Emacs we're quite
00:05:10.080 --> 00:05:11.600
used to that so there should be an
00:05:11.600 --> 00:05:12.320
option
00:05:12.320 --> 00:05:15.120
and of course there is it's Emacs right
00:05:15.120 --> 00:05:17.759
so you can do anything
00:05:17.759 --> 00:05:20.880
there is various good tools for
00:05:20.880 --> 00:05:22.960
completion in Emacs
00:05:22.960 --> 00:05:26.000
I used ivy for this
00:05:26.000 --> 00:05:29.039
I'm going to code the usp for ivy
00:05:29.039 --> 00:05:31.840
iv is a generic completion mechanism for
00:05:31.840 --> 00:05:32.639
Emacs
00:05:32.639 --> 00:05:34.639
while it operates similarly to other
00:05:34.639 --> 00:05:35.919
completion schemes
00:05:35.919 --> 00:05:38.960
such as icomplete mode iv aims to be
00:05:38.960 --> 00:05:40.400
more efficient smaller
00:05:40.400 --> 00:05:43.120
simpler and smoother to use yet highly
00:05:43.120 --> 00:05:45.199
customizable
00:05:45.199 --> 00:05:47.840
and that's true one of the cool things
00:05:47.840 --> 00:05:49.440
of iv
00:05:49.440 --> 00:05:52.479
compared to other completion mechanisms
00:05:52.479 --> 00:05:54.320
in Emacs
00:05:54.320 --> 00:05:58.160
is that it can be used on dynamic
00:05:58.160 --> 00:06:01.600
data so usually completion works on a
00:06:01.600 --> 00:06:03.520
static input for example you're in a
00:06:03.520 --> 00:06:05.360
buffer a text buffer
00:06:05.360 --> 00:06:08.800
and you use I search maybe with idle
00:06:08.800 --> 00:06:09.600
mode
00:06:09.600 --> 00:06:12.400
and you find your results that's all
00:06:12.400 --> 00:06:13.360
nice
00:06:13.360 --> 00:06:16.960
however if I
00:06:16.960 --> 00:06:19.840
want to search on dynamic data that
00:06:19.840 --> 00:06:20.720
doesn't work
00:06:20.720 --> 00:06:23.759
so whenever I type in my query
00:06:23.759 --> 00:06:27.039
for jq I actually need to call the jq
00:06:27.039 --> 00:06:28.000
binary
00:06:28.000 --> 00:06:30.160
and it will give a different result set
00:06:30.160 --> 00:06:32.840
back so it's a really
00:06:32.840 --> 00:06:36.319
dynamic mechanism that we need here it's
00:06:36.319 --> 00:06:38.240
much more like a search engine
00:06:38.240 --> 00:06:41.440
and ivy luckily has something built in
00:06:41.440 --> 00:06:42.560
and it's called
00:06:42.560 --> 00:06:46.000
console so I used council and jq
00:06:46.000 --> 00:06:48.160
and combined them and build a new
00:06:48.160 --> 00:06:49.199
package
00:06:49.199 --> 00:06:52.960
with which we can use Emacs and jq
00:06:52.960 --> 00:06:56.000
to have live feedback
00:06:56.000 --> 00:06:58.800
it's very easy to use so you just call
00:06:58.800 --> 00:06:59.840
console.jq
00:06:59.840 --> 00:07:02.800
on a buffer containing json for example
00:07:02.800 --> 00:07:04.319
the one we have here
00:07:04.319 --> 00:07:07.280
let's call console.jq on it and we
00:07:07.280 --> 00:07:08.319
already
00:07:08.319 --> 00:07:11.280
get a default query the dot query which
00:07:11.280 --> 00:07:13.039
just gives us
00:07:13.039 --> 00:07:16.080
the same file but now we can change it
00:07:16.080 --> 00:07:17.280
and for example
00:07:17.280 --> 00:07:19.039
find all the keys in here and then we
00:07:19.039 --> 00:07:21.039
see I had this issue this was the one
00:07:21.039 --> 00:07:22.800
that we were interested in
00:07:22.800 --> 00:07:24.639
so let's find more information on the
00:07:24.639 --> 00:07:26.479
issue what
00:07:26.479 --> 00:07:28.800
keys does it have actually have uh it
00:07:28.800 --> 00:07:31.680
has assignees that that interests me
00:07:31.680 --> 00:07:34.800
so let's check out the assignees in here
00:07:34.800 --> 00:07:37.039
there's two of them but I'm only
00:07:37.039 --> 00:07:39.759
interested in the first one
00:07:39.759 --> 00:07:42.000
I'm making stuff up as I go here of
00:07:42.000 --> 00:07:43.599
course
00:07:43.599 --> 00:07:46.000
and whenever I hit enter I get a new
00:07:46.000 --> 00:07:47.039
buffer
00:07:47.039 --> 00:07:50.160
which just shows me this
00:07:50.160 --> 00:07:53.520
particular result for the particular
00:07:53.520 --> 00:07:55.599
query that I entered
00:07:55.599 --> 00:07:59.199
so let me do that again we are in here
00:07:59.199 --> 00:08:03.199
we are looking at a
00:08:03.199 --> 00:08:05.840
json file this can be very very big
00:08:05.840 --> 00:08:07.520
doesn't also need to be a file just
00:08:07.520 --> 00:08:09.520
needs to be a buffer
00:08:09.520 --> 00:08:12.160
you call console.jq on it and you can do
00:08:12.160 --> 00:08:13.599
any kind of
00:08:13.599 --> 00:08:16.479
query on it for example let's see if
00:08:16.479 --> 00:08:18.080
there is a url here
00:08:18.080 --> 00:08:20.319
yes there's a url let's see if there's a
00:08:20.319 --> 00:08:23.759
repository here repository
00:08:23.759 --> 00:08:26.879
no there isn't what was it called issue
00:08:26.879 --> 00:08:33.440
keys repository url it was called okay
00:08:33.440 --> 00:08:36.640
so let's see issue pause
00:08:36.640 --> 00:08:40.240
url and then we see so
00:08:40.240 --> 00:08:42.959
apparently this issue command is for a
00:08:42.959 --> 00:08:44.159
repository called
00:08:44.159 --> 00:08:47.839
organize I wonder what that might be
00:08:47.839 --> 00:08:50.320
okay so that was a very short
00:08:50.320 --> 00:08:52.640
introduction to console jq
00:08:52.640 --> 00:08:54.800
you can see the timer here I only have
00:08:54.800 --> 00:08:56.800
one minute left to go so I'm going to
00:08:56.800 --> 00:08:57.440
leave
00:08:57.440 --> 00:08:59.760
with a very very short introduction to
00:08:59.760 --> 00:09:01.519
the console gq
00:09:01.519 --> 00:09:05.040
code it's not even 60 lines
00:09:05.040 --> 00:09:07.519
of e-lisp so building something like
00:09:07.519 --> 00:09:09.600
this is very very easy
00:09:09.600 --> 00:09:12.800
I would encourage you to go and read
00:09:12.800 --> 00:09:14.560
through the code in your own time
00:09:14.560 --> 00:09:16.160
if you're interested in building
00:09:16.160 --> 00:09:18.320
something like this if you're interested
00:09:18.320 --> 00:09:19.600
in just using
00:09:19.600 --> 00:09:22.720
jq or you're done
00:09:22.720 --> 00:09:24.320
these are the links to all the tools
00:09:24.320 --> 00:09:25.839
console.jq of course
00:09:25.839 --> 00:09:28.800
is readily available on melpah also
00:09:28.800 --> 00:09:29.519
developed
00:09:29.519 --> 00:09:32.959
under the agpl license on github
00:09:32.959 --> 00:09:36.080
and disorganized thing by the way it's
00:09:36.080 --> 00:09:37.839
orig mode for mobile and desktop
00:09:37.839 --> 00:09:39.839
browsers also a great
00:09:39.839 --> 00:09:42.399
free software tool maybe that interests
00:09:42.399 --> 00:09:43.120
you
00:09:43.120 --> 00:09:46.240
thank you for listening have great time
00:09:46.240 --> 00:09:48.800
10 seconds left I am going to stop this
00:09:48.800 --> 00:09:49.360
now
00:09:49.360 --> 00:09:53.920
enjoy EmacsConf have a great day
|