summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--2020/info/25.md181
-rw-r--r--2020/organizers-notebook.org6
-rw-r--r--2020/subtitles/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon-autogen.vtt757
-rw-r--r--2020/subtitles/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon.vtt553
4 files changed, 735 insertions, 762 deletions
diff --git a/2020/info/25.md b/2020/info/25.md
index 090cb22e..4e49cdc6 100644
--- a/2020/info/25.md
+++ b/2020/info/25.md
@@ -1,8 +1,9 @@
# Traverse complex JSON structures with live feedback
Zen Monk Alain M. Lafon
-[[!template id=vid src="https://mirror.csclub.uwaterloo.ca/emacsconf/2020/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon.webm"]]
-[Download compressed .webm video (15.8M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon--vp9-q56-video-original-audio.webm)
+[[!template vidid="mainVideo" id=vid src="https://mirror.csclub.uwaterloo.ca/emacsconf/2020/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon.webm" subtitles="/2020/subtitles/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon.vtt"]]
+[Download compressed .webm video (15.8M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon--vp9-q56-video-original-audio.webm)
+[View transcript](#transcript)
If you are working with complex nested JSON structures, you are
probably familiar with jq which is like sed for JSON data and great at
@@ -69,3 +70,179 @@ queries in jq should be valid in jq. Hence, I'm inclined to say
- counsel-jq: <https://github.com/200ok-ch/counsel-jq>.
- organice: <https://github.com/200ok-ch/organice>.
- Entire presentation inside Emacs, with a count down reminder.
+
+<a name="transcript"></a>
+# Transcript
+
+[[!template new="1" text="Hello, everyone, and welcome to this short lightning talk:" start="00:00:00.799" video="mainVideo" id=subtitle]]
+[[!template text="&quot;Traverse Complex JSON Structures with Live Feedback.&quot;" start="00:00:05.520" video="mainVideo" id=subtitle]]
+[[!template text="This is a pre-recorded talk and part of the EmacsConf 2020 schedule." start="00:00:09.519" video="mainVideo" id=subtitle]]
+[[!template text="This is what we're going to do." start="00:00:18.000" video="mainVideo" id=subtitle]]
+[[!template text="I'll make a quick introduction to the topic at hand." start="00:00:19.439" video="mainVideo" id=subtitle]]
+[[!template text="I'll give you a demonstration of some tools," start="00:00:22.320" video="mainVideo" id=subtitle]]
+[[!template text="and then we'll leave you with the links to said tools." start="00:00:24.400" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Before that, just a little bit about me." start="00:00:29.199" video="mainVideo" id=subtitle]]
+[[!template text="I am the CEO and co-founder of a company based in the Swiss mountains called 200ok.ch." start="00:00:31.679" video="mainVideo" id=subtitle]]
+[[!template text="We are a product incubator and service consultancy," start="00:00:40.399" video="mainVideo" id=subtitle]]
+[[!template text="but we like to spend most or at least as much time as we can" start="00:00:44.879" video="mainVideo" id=subtitle]]
+[[!template text="building free software." start="00:00:50.000" video="mainVideo" id=subtitle]]
+[[!template text="I'm also an ordained Zen monk and abbot of the Lambda Zen temple." start="00:00:52.719" video="mainVideo" id=subtitle]]
+[[!template text="You can reach me anytime on questions regarding Emacs, for example," start="00:00:56.879" video="mainVideo" id=subtitle]]
+[[!template text="at alain@200ok.ch." start="00:01:04.159" video="mainVideo" id=subtitle]]
+[[!template new="1" text="But back to the topic at hand." start="00:01:07.200" video="mainVideo" id=subtitle]]
+[[!template text="The proposition is as following:" start="00:01:09.439" video="mainVideo" id=subtitle]]
+[[!template text="most work on the computer is based on either" start="00:01:11.760" video="mainVideo" id=subtitle]]
+[[!template text="text processing or text consumption." start="00:01:14.000" video="mainVideo" id=subtitle]]
+[[!template text="And very often, the text which you need to process is in a structured format," start="00:01:16.479" video="mainVideo" id=subtitle]]
+[[!template text="for example, in JSON." start="00:01:22.799" video="mainVideo" id=subtitle]]
+[[!template text="That might even be if your job is not programming per se." start="00:01:24.560" video="mainVideo" id=subtitle]]
+[[!template text="Reading through such a bigger chunk of JSON can be non-trivial, however," start="00:01:28.560" video="mainVideo" id=subtitle]]
+[[!template text="while just reading and understanding it" start="00:01:33.119" video="mainVideo" id=subtitle]]
+[[!template text="will be essential to getting your job done." start="00:01:36.479" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So let's quickly check out an example JSON file." start="00:01:40.320" video="mainVideo" id=subtitle]]
+[[!template text="This is from the Github API," start="00:01:44.479" video="mainVideo" id=subtitle]]
+[[!template text="which is a request--sorry, the response to a request" start="00:01:47.200" video="mainVideo" id=subtitle]]
+[[!template text="for a specific issue on the github API." start="00:01:52.079" video="mainVideo" id=subtitle]]
+[[!template text="So let's quickly check that one out." start="00:01:54.640" video="mainVideo" id=subtitle]]
+[[!template text="Okay. So here it is open, and we can already see" start="00:01:58.799" video="mainVideo" id=subtitle]]
+[[!template text="that there is lots of stuff going on here." start="00:02:01.920" video="mainVideo" id=subtitle]]
+[[!template text="It's 200 lines." start="00:02:05.439" video="mainVideo" id=subtitle]]
+[[!template text="It's not going to be very easy" start="00:02:07.360" video="mainVideo" id=subtitle]]
+[[!template text="just to find out what are the top level things in here," start="00:02:09.200" video="mainVideo" id=subtitle]]
+[[!template text="what are the top level attributes." start="00:02:11.840" video="mainVideo" id=subtitle]]
+[[!template text="Of course I can do this, and maybe do it by hand, but that doesn't scale." start="00:02:13.360" video="mainVideo" id=subtitle]]
+[[!template text="I can use cool Emacs facilities like the hideshow-mode" start="00:02:17.840" video="mainVideo" id=subtitle]]
+[[!template text="and try to fold all the things that are top level," start="00:02:21.599" video="mainVideo" id=subtitle]]
+[[!template text="but that also doesn't really scale." start="00:02:24.720" video="mainVideo" id=subtitle]]
+[[!template text="There must be a better way." start="00:02:27.200" video="mainVideo" id=subtitle]]
+[[!template text="Of course there is. There is prior art." start="00:02:29.360" video="mainVideo" id=subtitle]]
+[[!template new="1" text="There is a tool called jq." start="00:02:32.000" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to quote the USP (unique selling proposition) from their website:" start="00:02:34.080" video="mainVideo" id=subtitle]]
+[[!template text="jq is like sed for JSON data." start="00:02:37.760" video="mainVideo" id=subtitle]]
+[[!template text="you can use it to slice and filter and map and transform structured data" start="00:02:42.000" video="mainVideo" id=subtitle]]
+[[!template text="with the same ease that" start="00:02:46.319" video="mainVideo" id=subtitle]]
+[[!template text="sed, awk, grep, and friends let you play with text." start="00:02:47.840" video="mainVideo" id=subtitle]]
+[[!template text="Let me give you a quick demonstration of it." start="00:02:54.000" video="mainVideo" id=subtitle]]
+[[!template text="By the way, it's written in portable C." start="00:02:56.879" video="mainVideo" id=subtitle]]
+[[!template text="It has zero runtime dependency, so it's very easy to get started with it" start="00:02:59.040" video="mainVideo" id=subtitle]]
+[[!template text="and use it on pretty much any UNIX-based computer." start="00:03:03.519" video="mainVideo" id=subtitle]]
+[[!template text="Sorry, no, Linux-based computer, apologies." start="00:03:09.840" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Okay, so let's explore a JSON file with it." start="00:03:14.000" video="mainVideo" id=subtitle]]
+[[!template text="It's a command line tool," start="00:03:18.720" video="mainVideo" id=subtitle]]
+[[!template text="and it has a very simple command line syntax." start="00:03:20.000" video="mainVideo" id=subtitle]]
+[[!template text="So you call the binary and then you give it a query and a file," start="00:03:24.000" video="mainVideo" id=subtitle]]
+[[!template text="and then it will return its answer." start="00:03:29.840" video="mainVideo" id=subtitle]]
+[[!template text="So, for example, if I want the top level keys," start="00:03:32.560" video="mainVideo" id=subtitle]]
+[[!template text="I will just say jq keys the file" start="00:03:35.440" video="mainVideo" id=subtitle]]
+[[!template text="and it will return the keys." start="00:03:38.000" video="mainVideo" id=subtitle]]
+[[!template text="Simple as that. So let's check this out in a real shell." start="00:03:39.840" video="mainVideo" id=subtitle]]
+[[!template text="Here I am in eshell." start="00:03:44.400" video="mainVideo" id=subtitle]]
+[[!template text="Let's run jq keys on the Github issue comment." start="00:03:46.879" video="mainVideo" id=subtitle]]
+[[!template text="We can see that we have actually received a list back here" start="00:03:51.440" video="mainVideo" id=subtitle]]
+[[!template text="with the top-level things." start="00:03:58.799" video="mainVideo" id=subtitle]]
+[[!template text="So this issue... It looks very interesting." start="00:04:00.319" video="mainVideo" id=subtitle]]
+[[!template text="Let's ask it to give me more information on this issue." start="00:04:02.879" video="mainVideo" id=subtitle]]
+[[!template text="Then it's hairy again. That's a lot of stuff." start="00:04:07.360" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I mean, lucky for us, we are in Emacs here," start="00:04:11.360" video="mainVideo" id=subtitle]]
+[[!template text="so we can use nice shortcuts." start="00:04:14.560" video="mainVideo" id=subtitle]]
+[[!template text="We can copy this. We can go in here, just select that," start="00:04:16.720" video="mainVideo" id=subtitle]]
+[[!template text="get that out or something like this." start="00:04:22.000" video="mainVideo" id=subtitle]]
+[[!template text="But still, this is not really the best way to do that, right?" start="00:04:24.160" video="mainVideo" id=subtitle]]
+[[!template text="it gets kind of tedious." start="00:04:32.320" video="mainVideo" id=subtitle]]
+[[!template text="At this point the output can be humongous." start="00:04:34.080" video="mainVideo" id=subtitle]]
+[[!template text="The shell is not really the best place to read through such big output." start="00:04:37.680" video="mainVideo" id=subtitle]]
+[[!template text="I mean, eshell is probably one of the better shells for this," start="00:04:41.919" video="mainVideo" id=subtitle]]
+[[!template text="because it's just a regular Emacs buffer," start="00:04:45.759" video="mainVideo" id=subtitle]]
+[[!template text="but still, it's not really the best tool." start="00:04:47.919" video="mainVideo" id=subtitle]]
+[[!template text="I need to repeat the command all the time" start="00:04:50.720" video="mainVideo" id=subtitle]]
+[[!template text="until I finally build the right query." start="00:04:53.680" video="mainVideo" id=subtitle]]
+[[!template text="And all the time, I lose my focus," start="00:04:56.000" video="mainVideo" id=subtitle]]
+[[!template text="I lose what I'm currently looking at." start="00:04:59.840" video="mainVideo" id=subtitle]]
+[[!template text="I'm seeing the new result." start="00:05:02.800" video="mainVideo" id=subtitle]]
+[[!template new="1" text="It would be so much nicer to have live feedback." start="00:05:05.520" video="mainVideo" id=subtitle]]
+[[!template text="When working with Emacs, we're quite used to that." start="00:05:08.160" video="mainVideo" id=subtitle]]
+[[!template text="So there should be an option." start="00:05:10.720" video="mainVideo" id=subtitle]]
+[[!template text="And of course there is. It's Emacs, right," start="00:05:12.320" video="mainVideo" id=subtitle]]
+[[!template text="so you can do anything." start="00:05:15.120" video="mainVideo" id=subtitle]]
+[[!template new="1" text="There is various good tools for completion in Emacs." start="00:05:17.759" video="mainVideo" id=subtitle]]
+[[!template text="I used ivy for this." start="00:05:22.960" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to quote the USP for ivy." start="00:05:26.000" video="mainVideo" id=subtitle]]
+[[!template text="ivy is a generic completion mechanism for Emacs." start="00:05:29.039" video="mainVideo" id=subtitle]]
+[[!template text="While it operates similarly to other completion schemes such as icomplete mode," start="00:05:32.639" video="mainVideo" id=subtitle]]
+[[!template text="ivy aims to be more efficient, smaller, simpler, and smoother to use," start="00:05:37.919" video="mainVideo" id=subtitle]]
+[[!template text="yet highly customizable." start="00:05:42.160" video="mainVideo" id=subtitle]]
+[[!template text="And that's true." start="00:05:45.199" video="mainVideo" id=subtitle]]
+[[!template new="1" text="One of the cool things of ivy" start="00:05:46.479" video="mainVideo" id=subtitle]]
+[[!template text="compared to other completion mechanisms in Emacs" start="00:05:49.440" video="mainVideo" id=subtitle]]
+[[!template text="is that it can be used on dynamic data." start="00:05:54.320" video="mainVideo" id=subtitle]]
+[[!template text="So usually completion works on a static input." start="00:05:59.120" video="mainVideo" id=subtitle]]
+[[!template text="For example, you're in a buffer, a text buffer," start="00:06:02.400" video="mainVideo" id=subtitle]]
+[[!template text="and you use isearch maybe with ido-mode," start="00:06:05.360" video="mainVideo" id=subtitle]]
+[[!template text="and you find your results. That's all nice." start="00:06:09.600" video="mainVideo" id=subtitle]]
+[[!template text="However, if I want to search on dynamic data," start="00:06:13.360" video="mainVideo" id=subtitle]]
+[[!template text="that doesn't work." start="00:06:19.600" video="mainVideo" id=subtitle]]
+[[!template text="So whenever I type in my query for jq," start="00:06:20.720" video="mainVideo" id=subtitle]]
+[[!template text="I actually need to call the jq binary," start="00:06:24.880" video="mainVideo" id=subtitle]]
+[[!template text="and it will give a different result set back." start="00:06:28.000" video="mainVideo" id=subtitle]]
+[[!template text="So it's a really dynamic mechanism that we need here." start="00:06:30.720" video="mainVideo" id=subtitle]]
+[[!template text="It's much more like a search engine." start="00:06:36.160" video="mainVideo" id=subtitle]]
+[[!template new="1" text="ivy luckily has something built in," start="00:06:38.240" video="mainVideo" id=subtitle]]
+[[!template text="and it's called counsel." start="00:06:41.440" video="mainVideo" id=subtitle]]
+[[!template text="So I used counsel and jq and combined them," start="00:06:43.520" video="mainVideo" id=subtitle]]
+[[!template text="and built a new package" start="00:06:47.360" video="mainVideo" id=subtitle]]
+[[!template text="with which we can use Emacs and jq" start="00:06:49.199" video="mainVideo" id=subtitle]]
+[[!template text="to have live feedback." start="00:06:52.960" video="mainVideo" id=subtitle]]
+[[!template text="It's very easy to use." start="00:06:56.000" video="mainVideo" id=subtitle]]
+[[!template text="So you just call counsel-jq" start="00:06:57.759" video="mainVideo" id=subtitle]]
+[[!template text="on a buffer containing JSON." start="00:06:59.840" video="mainVideo" id=subtitle]]
+[[!template text="For example, the one we have here." start="00:07:02.160" video="mainVideo" id=subtitle]]
+[[!template text="Let's call counsel-jq on it," start="00:07:04.319" video="mainVideo" id=subtitle]]
+[[!template text="and we already get a default query," start="00:07:06.800" video="mainVideo" id=subtitle]]
+[[!template text="the dot query, which just gives us the same file." start="00:07:10.080" video="mainVideo" id=subtitle]]
+[[!template text="But now we can change it." start="00:07:14.639" video="mainVideo" id=subtitle]]
+[[!template text="For example, find all the keys in here." start="00:07:16.240" video="mainVideo" id=subtitle]]
+[[!template text="And then we see I had this issue." start="00:07:18.639" video="mainVideo" id=subtitle]]
+[[!template text="This was the one that we were interested in." start="00:07:20.319" video="mainVideo" id=subtitle]]
+[[!template text="So let's find more information on the issue." start="00:07:22.800" video="mainVideo" id=subtitle]]
+[[!template text="What keys does it have actually have?" start="00:07:25.599" video="mainVideo" id=subtitle]]
+[[!template text="It has assignees. That interests me." start="00:07:28.720" video="mainVideo" id=subtitle]]
+[[!template text="So let's check out the assignees in here." start="00:07:31.680" video="mainVideo" id=subtitle]]
+[[!template text="There's two of them, but I'm only interested in the first one." start="00:07:34.800" video="mainVideo" id=subtitle]]
+[[!template text="I'm making stuff up as I go here, of course." start="00:07:39.759" video="mainVideo" id=subtitle]]
+[[!template text="Whenever I hit enter, I get a new buffer" start="00:07:43.599" video="mainVideo" id=subtitle]]
+[[!template text="which just shows me this particular result" start="00:07:47.039" video="mainVideo" id=subtitle]]
+[[!template text="for the particular query that I entered." start="00:07:52.639" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So let me do that again." start="00:07:55.599" video="mainVideo" id=subtitle]]
+[[!template text="We are in here. We are looking at a JSON file." start="00:07:57.680" video="mainVideo" id=subtitle]]
+[[!template text="This can be very, very big." start="00:08:04.000" video="mainVideo" id=subtitle]]
+[[!template text="Doesn't also need to be a file." start="00:08:05.840" video="mainVideo" id=subtitle]]
+[[!template text="Just needs to be a buffer." start="00:08:07.280" video="mainVideo" id=subtitle]]
+[[!template text="You call counsel-jq on it," start="00:08:09.520" video="mainVideo" id=subtitle]]
+[[!template text="and you can do any kind of query on it." start="00:08:11.360" video="mainVideo" id=subtitle]]
+[[!template text="For example, let's see if there is a URL here." start="00:08:14.319" video="mainVideo" id=subtitle]]
+[[!template text="Yes, there's a URL." start="00:08:18.080" video="mainVideo" id=subtitle]]
+[[!template text="Let's see if there's a repository here." start="00:08:19.440" video="mainVideo" id=subtitle]]
+[[!template text="Repository. No, there isn't." start="00:08:22.827" video="mainVideo" id=subtitle]]
+[[!template text="What was it called? Issue. Keys. Repository URL, it was called." start="00:08:24.639" video="mainVideo" id=subtitle]]
+[[!template text="So let's see issue repository URL," start="00:08:33.440" video="mainVideo" id=subtitle]]
+[[!template text="and then we see." start="00:08:38.240" video="mainVideo" id=subtitle]]
+[[!template text="So apparently this issue comment is for a repository called organice." start="00:08:39.519" video="mainVideo" id=subtitle]]
+[[!template text="I wonder what that might be." start="00:08:44.800" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Okay. So that was a very short introduction to counsel-jq." start="00:08:47.839" video="mainVideo" id=subtitle]]
+[[!template text="You can see the timer here." start="00:08:52.640" video="mainVideo" id=subtitle]]
+[[!template text="I only have one minute left to go, so I'm going to leave" start="00:08:54.240" video="mainVideo" id=subtitle]]
+[[!template text="with a very, very short introduction to the counsel-jq code." start="00:08:57.440" video="mainVideo" id=subtitle]]
+[[!template text="It's not even 60 lines of elisp," start="00:09:02.880" video="mainVideo" id=subtitle]]
+[[!template text="so building something like this is very, very easy." start="00:09:06.000" video="mainVideo" id=subtitle]]
+[[!template text="I would encourage you to go and read through the code in your own time," start="00:09:09.600" video="mainVideo" id=subtitle]]
+[[!template text="if you're interested in building something like this." start="00:09:14.560" video="mainVideo" id=subtitle]]
+[[!template text="If you're interested in just using jq or you're done," start="00:09:17.519" video="mainVideo" id=subtitle]]
+[[!template text="these are the links to all the tools." start="00:09:22.720" video="mainVideo" id=subtitle]]
+[[!template text="counsel-jq, of course, is readily available on MELPA." start="00:09:24.320" video="mainVideo" id=subtitle]]
+[[!template text="Also developed under the AGPL license on Github." start="00:09:28.240" video="mainVideo" id=subtitle]]
+[[!template text="And this organice thing, by the way, it's" start="00:09:32.959" video="mainVideo" id=subtitle]]
+[[!template text="Org Mode for mobile and desktop browsers." start="00:09:36.080" video="mainVideo" id=subtitle]]
+[[!template text="Also a great free software tool maybe that interests you." start="00:09:38.560" video="mainVideo" id=subtitle]]
+[[!template text="Thank you for listening. Have a great time." start="00:09:43.120" video="mainVideo" id=subtitle]]
+[[!template text="10 seconds left. I am going to stop this now." start="00:09:46.240" video="mainVideo" id=subtitle]]
+[[!template text="Enjoy EmacsConf. Have a great day." start="00:09:49.360" video="mainVideo" id=subtitle]]
diff --git a/2020/organizers-notebook.org b/2020/organizers-notebook.org
index 1c54e0de..924dd736 100644
--- a/2020/organizers-notebook.org
+++ b/2020/organizers-notebook.org
@@ -52,10 +52,10 @@ I modified the =subed= package to work with VTT files. The modified version is a
- [X] sachac [[./subtitles/emacsconf-2020--22-powering-up-special-blocks--musa-al-hassy-autogen.vtt]]
- [ ] [[./subtitles/emacsconf-2020--23-incremental-parsing-with-emacs-tree-sitter--questions--tuan-anh-nguyen-autogen.vtt]]
- [X] sachac [[./subtitles/emacsconf-2020--23-incremental-parsing-with-emacs-tree-sitter--tuan-anh-nguyen-autogen.vtt]]
-- [ ] sachac [[./subtitles/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon-autogen.vtt]]
-- [ ] [[./subtitles/emacsconf-2020--26-emacs-as-a-highschooler-how-it-changed-my-life--pierce-wang-autogen.vtt]]
+- [X] sachac [[./subtitles/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon-autogen.vtt]]
+- [ ] sachac [[./subtitles/emacsconf-2020--26-emacs-as-a-highschooler-how-it-changed-my-life--pierce-wang-autogen.vtt]]
- [ ] [[./subtitles/emacsconf-2020--26-emacs-as-a-highschooler-how-it-changed-my-life--questions--pierce-wang-autogen.vtt]]
-- [ ] [[./subtitles/emacsconf-2020--27-state-of-retro-gaming-in-emacs-chip8--vasilij-wasamasa-schneidermann-autogen.vtt]]
+- [ ] sachac [[./subtitles/emacsconf-2020--27-state-of-retro-gaming-in-emacs-chip8--vasilij-wasamasa-schneidermann-autogen.vtt]]
- [ ] [[./subtitles/emacsconf-2020--28-welcome-to-the-dungeon--erik-elmshauser-corwin-brust-autogen.vtt]]
- [ ] [[./subtitles/emacsconf-2020--30-a-tour-of-vterm--gabriele-bozzola-sbozzolo-autogen.vtt]]
- [ ] [[./subtitles/emacsconf-2020--30-a-tour-of-vterm--questions--gabriele-bozzola-sbozzolo-autogen.vtt]]
diff --git a/2020/subtitles/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon-autogen.vtt b/2020/subtitles/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon-autogen.vtt
deleted file mode 100644
index e7eada5b..00000000
--- a/2020/subtitles/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon-autogen.vtt
+++ /dev/null
@@ -1,757 +0,0 @@
-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
diff --git a/2020/subtitles/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon.vtt b/2020/subtitles/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon.vtt
new file mode 100644
index 00000000..c453575d
--- /dev/null
+++ b/2020/subtitles/emacsconf-2020--25-traverse-complex-json-structures-with-live-feedback-counsel-jq--zen-monk-alain-m-lafon.vtt
@@ -0,0 +1,553 @@
+WEBVTT
+
+00:00:00.799 --> 00:00:05.520
+Hello, everyone, and welcome to this
+short lightning talk:
+
+00:00:05.520 --> 00:00:09.519
+"Traverse Complex JSON Structures with
+Live Feedback."
+
+00:00:09.519 --> 00:00:18.000
+This is a pre-recorded talk and part of
+the EmacsConf 2020 schedule.
+
+00:00:18.000 --> 00:00:19.439
+This is what we're going to do.
+
+00:00:19.439 --> 00:00:22.320
+I'll make a quick introduction to the
+topic at hand.
+
+00:00:22.320 --> 00:00:24.400
+I'll give you a demonstration of some
+tools,
+
+00:00:24.400 --> 00:00:29.199
+and then we'll leave you
+with the links to said tools.
+
+00:00:29.199 --> 00:00:31.679
+Before that, just a little bit about me.
+
+00:00:31.679 --> 00:00:40.399
+I am the CEO and co-founder of a company
+based in the Swiss mountains called 200ok.ch.
+
+00:00:40.399 --> 00:00:44.879
+We are a product incubator and
+service consultancy,
+
+00:00:44.879 --> 00:00:50.000
+but we like to spend most or at least as
+much time as we can
+
+00:00:50.000 --> 00:00:52.719
+building free software.
+
+00:00:52.719 --> 00:00:56.879
+I'm also an ordained Zen monk and abbot
+of the Lambda Zen temple.
+
+00:00:56.879 --> 00:01:04.159
+You can reach me anytime on questions
+regarding Emacs, for example,
+
+00:01:04.159 --> 00:01:07.200
+at alain@200ok.ch.
+
+00:01:07.200 --> 00:01:09.439
+But back to the topic at hand.
+
+00:01:09.439 --> 00:01:11.760
+The proposition is as following:
+
+00:01:11.760 --> 00:01:14.000
+most work on the computer is based on
+either
+
+00:01:14.000 --> 00:01:16.479
+text processing or text consumption.
+
+00:01:16.479 --> 00:01:22.799
+And very often, the text which you need
+to process is in a structured format,
+
+00:01:22.799 --> 00:01:24.560
+for example, in JSON.
+
+00:01:24.560 --> 00:01:28.560
+That might even be if your job is not
+programming per se.
+
+00:01:28.560 --> 00:01:33.119
+Reading through such a bigger chunk 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:40.320
+will be essential to getting your job
+done.
+
+00:01:40.320 --> 00:01:44.479
+So let's quickly check out an example
+JSON file.
+
+00:01:44.479 --> 00:01:47.200
+This is from the Github API,
+
+00:01:47.200 --> 00:01:52.079
+which is a request--sorry, the
+response to a request
+
+00:01:52.079 --> 00:01:54.640
+for a specific issue on the github API.
+
+00:01:54.640 --> 00:01:58.799
+So let's quickly check that one out.
+
+00:01:58.799 --> 00:02:01.920
+Okay. So here it is open, and we can
+already see
+
+00:02:01.920 --> 00:02:05.439
+that there is lots of stuff
+going on here.
+
+00:02:05.439 --> 00:02:07.360
+It's 200 lines.
+
+00:02:07.360 --> 00:02:09.200
+It's not going to be very easy
+
+00:02:09.200 --> 00:02:11.840
+just to find out what are the top level
+things in here,
+
+00:02:11.840 --> 00:02:13.360
+what are the top level attributes.
+
+00:02:13.360 --> 00:02:17.840
+Of course I can do this, and maybe do it
+by hand, but that doesn't scale.
+
+00:02:17.840 --> 00:02:21.599
+I can use cool Emacs facilities like the
+hideshow-mode
+
+00:02:21.599 --> 00:02:24.720
+and try to 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.360
+There must be a better way.
+
+00:02:29.360 --> 00:02:32.000
+Of course there is. There is prior art.
+
+00:02:32.000 --> 00:02:34.080
+There is a tool called jq.
+
+00:02:34.080 --> 00:02:37.760
+I'm going to quote the USP (unique selling proposition) from their website:
+
+00:02:37.760 --> 00:02:42.000
+jq is like sed for JSON data.
+
+00:02:42.000 --> 00:02:46.319
+you can use it to slice and filter and
+map and transform structured data
+
+00:02:46.319 --> 00:02:47.840
+with the same ease that
+
+00:02:47.840 --> 00:02:54.000
+sed, awk, grep, and friends let you
+play with text.
+
+00:02:54.000 --> 00:02:56.879
+Let me give you a quick demonstration of
+it.
+
+00:02:56.879 --> 00:02:59.040
+By the way, it's written in portable C.
+
+00:02:59.040 --> 00:03:03.519
+It has zero runtime dependency, so it's
+very easy to get started with it
+
+00:03:03.519 --> 00:03:09.840
+and use it on pretty much any UNIX-based
+computer.
+
+00:03:09.840 --> 00:03:14.000
+Sorry, no, Linux-based computer,
+apologies.
+
+00:03:14.000 --> 00:03:18.720
+Okay, so let's explore a
+JSON file with it.
+
+00:03:18.720 --> 00:03:20.000
+It's a command line tool,
+
+00:03:20.000 --> 00:03:24.000
+and it has a very simple command
+line syntax.
+
+00:03:24.000 --> 00:03:29.840
+So you call the binary and then you give
+it a query and a file,
+
+00:03:29.840 --> 00:03:32.560
+and then it will return its answer.
+
+00:03:32.560 --> 00:03:35.440
+So, for example, if I want the top
+level keys,
+
+00:03:35.440 --> 00:03:38.000
+I will just say jq keys the file
+
+00:03:38.000 --> 00:03:39.840
+and it will return the keys.
+
+00:03:39.840 --> 00:03:44.400
+Simple as that. So let's check this out
+in a real shell.
+
+00:03:44.400 --> 00:03:46.879
+Here I am in eshell.
+
+00:03:46.879 --> 00:03:51.440
+Let's run jq keys on the Github issue comment.
+
+00:03:51.440 --> 00:03:58.799
+We can see that we have actually
+received a list back here
+
+00:03:58.799 --> 00:04:00.319
+with the top-level things.
+
+00:04:00.319 --> 00:04:02.879
+So this issue... It looks very interesting.
+
+00:04:02.879 --> 00:04:07.360
+Let's ask it to give me more information on this issue.
+
+00:04:07.360 --> 00:04:11.360
+Then it's hairy again. That's a lot of stuff.
+
+00:04:11.360 --> 00:04:14.560
+I mean, lucky for us, we are in Emacs here,
+
+00:04:14.560 --> 00:04:16.720
+so we can use nice shortcuts.
+
+00:04:16.720 --> 00:04:22.000
+We can copy this. We can go in here, just select that,
+
+00:04:22.000 --> 00:04:24.160
+get that out or something like this.
+
+00:04:24.160 --> 00:04:32.320
+But still, this is not really the best way to do that, right?
+
+00:04:32.320 --> 00:04:34.080
+it gets kind of tedious.
+
+00:04:34.080 --> 00:04:37.680
+At this point the output can be humongous.
+
+00:04:37.680 --> 00:04:41.919
+The shell is not really the best place to read through such big output.
+
+00:04:41.919 --> 00:04:45.759
+I mean, eshell is probably one of the better shells for this,
+
+00:04:45.759 --> 00:04:47.919
+because it's just a regular Emacs buffer,
+
+00:04:47.919 --> 00:04:50.720
+but still, it's not really the best tool.
+
+00:04:50.720 --> 00:04:53.680
+I need to repeat the command all the time
+
+00:04:53.680 --> 00:04:56.000
+until I finally build the right query.
+
+00:04:56.000 --> 00:04:59.840
+And all the time, I lose my focus,
+
+00:04:59.840 --> 00:05:02.800
+I lose what I'm currently looking at.
+
+00:05:02.800 --> 00:05:05.520
+I'm seeing the new result.
+
+00:05:05.520 --> 00:05:08.160
+It would be so much nicer to have live feedback.
+
+00:05:08.160 --> 00:05:10.720
+When working with Emacs, we're quite used to that.
+
+00:05:10.720 --> 00:05:12.320
+So there should be an 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:22.960
+There is various good tools for 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 quote the USP for ivy.
+
+00:05:29.039 --> 00:05:32.639
+ivy is a generic completion mechanism for Emacs.
+
+00:05:32.639 --> 00:05:37.919
+While it operates similarly to other completion schemes such as icomplete mode,
+
+00:05:37.919 --> 00:05:42.160
+ivy aims to be more efficient, smaller, simpler, and smoother to use,
+
+00:05:42.160 --> 00:05:45.199
+yet highly customizable.
+
+00:05:45.199 --> 00:05:46.479
+And that's true.
+
+00:05:46.479 --> 00:05:49.440
+One of the cool things of ivy
+
+00:05:49.440 --> 00:05:54.320
+compared to other completion mechanisms in Emacs
+
+00:05:54.320 --> 00:05:59.120
+is that it can be used on dynamic data.
+
+00:05:59.120 --> 00:06:02.400
+So usually completion works on a static input.
+
+00:06:02.400 --> 00:06:05.360
+For example, you're in a buffer, a text buffer,
+
+00:06:05.360 --> 00:06:09.600
+and you use isearch maybe with ido-mode,
+
+00:06:09.600 --> 00:06:13.360
+and you find your results. That's all nice.
+
+00:06:13.360 --> 00:06:19.600
+However, if I want to search on dynamic data,
+
+00:06:19.600 --> 00:06:20.720
+that doesn't work.
+
+00:06:20.720 --> 00:06:24.880
+So whenever I type in my query for jq,
+
+00:06:24.880 --> 00:06:28.000
+I actually need to call the jq binary,
+
+00:06:28.000 --> 00:06:30.720
+and it will give a different result set back.
+
+00:06:30.720 --> 00:06:36.160
+So it's a really dynamic mechanism that we need here.
+
+00:06:36.160 --> 00:06:38.240
+It's much more like a search engine.
+
+00:06:38.240 --> 00:06:41.440
+ivy luckily has something built in,
+
+00:06:41.440 --> 00:06:43.520
+and it's called counsel.
+
+00:06:43.520 --> 00:06:47.360
+So I used counsel and jq and combined them,
+
+00:06:47.360 --> 00:06:49.199
+and built a new 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:57.759
+It's very easy to use.
+
+00:06:57.759 --> 00:06:59.840
+So you just call counsel-jq
+
+00:06:59.840 --> 00:07:02.160
+on a buffer containing JSON.
+
+00:07:02.160 --> 00:07:04.319
+For example, the one we have here.
+
+00:07:04.319 --> 00:07:06.800
+Let's call counsel-jq on it,
+
+00:07:06.800 --> 00:07:10.080
+and we already get a default query,
+
+00:07:10.080 --> 00:07:14.639
+the dot query, which just gives us the same file.
+
+00:07:14.639 --> 00:07:16.240
+But now we can change it.
+
+00:07:16.240 --> 00:07:18.639
+For example, find all the keys in here.
+
+00:07:18.639 --> 00:07:20.319
+And then we see I had this issue.
+
+00:07:20.319 --> 00:07:22.800
+This was the one that we were interested in.
+
+00:07:22.800 --> 00:07:25.599
+So let's find more information on the issue.
+
+00:07:25.599 --> 00:07:28.720
+What keys does it have actually have?
+
+00:07:28.720 --> 00:07:31.680
+It has assignees. 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:39.759
+There's two of them, but I'm only interested in the first one.
+
+00:07:39.759 --> 00:07:43.599
+I'm making stuff up as I go here, of course.
+
+00:07:43.599 --> 00:07:47.039
+Whenever I hit enter, I get a new buffer
+
+00:07:47.039 --> 00:07:52.639
+which just shows me this particular result
+
+00:07:52.639 --> 00:07:55.599
+for the particular query that I entered.
+
+00:07:55.599 --> 00:07:57.680
+So let me do that again.
+
+00:07:57.680 --> 00:08:04.000
+We are in here. We are looking at a JSON file.
+
+00:08:04.000 --> 00:08:05.840
+This can be very, very big.
+
+00:08:05.840 --> 00:08:07.280
+Doesn't also need to be a file.
+
+00:08:07.280 --> 00:08:09.520
+Just needs to be a buffer.
+
+00:08:09.520 --> 00:08:11.360
+You call counsel-jq on it,
+
+00:08:11.360 --> 00:08:14.319
+and you can do any kind of query on it.
+
+00:08:14.319 --> 00:08:18.080
+For example, let's see if there is a URL here.
+
+00:08:18.080 --> 00:08:19.440
+Yes, there's a URL.
+
+00:08:19.440 --> 00:08:22.827
+Let's see if there's a repository here.
+
+00:08:22.827 --> 00:08:24.639
+Repository. No, there isn't.
+
+00:08:24.639 --> 00:08:33.440
+What was it called? Issue. Keys. Repository URL, it was called.
+
+00:08:33.440 --> 00:08:38.240
+So let's see issue repository URL,
+
+00:08:38.240 --> 00:08:39.519
+and then we see.
+
+00:08:39.519 --> 00:08:44.800
+So apparently this issue comment is for a repository called organice.
+
+00:08:44.800 --> 00:08:47.839
+I wonder what that might be.
+
+00:08:47.839 --> 00:08:52.640
+Okay. So that was a very short introduction to counsel-jq.
+
+00:08:52.640 --> 00:08:54.240
+You can see the timer here.
+
+00:08:54.240 --> 00:08:57.440
+I only have one minute left to go, so I'm going to leave
+
+00:08:57.440 --> 00:09:02.880
+with a very, very short introduction to the counsel-jq code.
+
+00:09:02.880 --> 00:09:06.000
+It's not even 60 lines of elisp,
+
+00:09:06.000 --> 00:09:09.600
+so building something like this is very, very easy.
+
+00:09:09.600 --> 00:09:14.560
+I would encourage you to go and read through the code in your own time,
+
+00:09:14.560 --> 00:09:17.519
+if you're interested in building something like this.
+
+00:09:17.519 --> 00:09:22.720
+If you're interested in just using 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:28.240
+counsel-jq, of course, is readily available on MELPA.
+
+00:09:28.240 --> 00:09:32.959
+Also developed under the AGPL license on Github.
+
+00:09:32.959 --> 00:09:36.080
+And this organice thing, by the way, it's
+
+00:09:36.080 --> 00:09:38.560
+Org Mode for mobile and desktop browsers.
+
+00:09:38.560 --> 00:09:43.120
+Also a great free software tool maybe that interests you.
+
+00:09:43.120 --> 00:09:46.240
+Thank you for listening. Have a great time.
+
+00:09:46.240 --> 00:09:49.360
+10 seconds left. I am going to stop this now.
+
+00:09:49.360 --> 00:09:53.920
+Enjoy EmacsConf. Have a great day.