<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>VisiData Blog Feed</title>
  <subtitle></subtitle>
  <link href="https://visidata.org/feed.xml" rel="self"/>
  <link href="https://visidata.org/"/>
  <updated>2021-10-29T00:00:00Z</updated>
  <id>https://visidata.org/</id>
  <author>
    <name>Saul Pwanson</name>
    <email>vd@saul.pw</email>
  </author>
  
  <entry>
    <title>Estimates of current and future usage</title>
    <link href="https://visidata.org/blog/2021/usage-graphs/"/>
    <updated>2021-10-29T00:00:00Z</updated>
    <id>https://visidata.org/blog/2021/usage-graphs/</id>
    <content type="html">&lt;h1 id=&quot;estimates-of-current-and-future-usage&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/usage-graphs/#estimates-of-current-and-future-usage&quot;&gt;&lt;/a&gt;Estimates of current and future usage&lt;/h1&gt;
&lt;p&gt;[Since v1.3, the motd feature has served as a usage counter.  This upsets some people even though it can be disabled.  &lt;a href=&quot;https://github.com/saulpw/visidata/discussions/940#discussioncomment-572821&quot;&gt;Here&#39;s an explanation of why this is on by default.&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;Our &lt;a href=&quot;https://visidata.org/usage.tsv&quot;&gt;usage data&lt;/a&gt; gives us some good information about the &lt;a href=&quot;https://mikemcquaid.com/2018/08/14/the-open-source-contributor-funnel-why-people-dont-contribute-to-your-open-source-project/&quot;&gt;open source contributor funnel&lt;/a&gt;.  As of October 2021, it seems to break down this way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;~3000 monthly users&lt;/li&gt;
&lt;li&gt;~300 daily users&lt;/li&gt;
&lt;li&gt;~30 community members&lt;/li&gt;
&lt;li&gt;~3 regular contributors&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;usage-growth&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/usage-graphs/#usage-growth&quot;&gt;&lt;/a&gt;Usage Growth&lt;/h2&gt;
&lt;p&gt;Here&#39;s what VisiData usage looked like for the first 2.5 years of its existence: from 40 daily M-F users in early 2018, to almost 100 in mid-2019.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/vd-usage-2.5y-125.png&quot; alt=&quot;graph of usage from 2016-10-29 2019-04-29, y=0-125&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Here&#39;s what the usage graph looks like now:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/vd-usage-5y.png&quot; alt=&quot;graph of usage from 2016-10-29 2021-10-29, y=0-500&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This graph above has 500 daily users on the Y axis.  Let&#39;s extrapolate another 4x to 2000 and another 5 years:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/vd-usage-10y-2000.png&quot; alt=&quot;graph of usage from 2016-10-29 2026-10-29, y=0-2000&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This graph makes even a &amp;quot;modest&amp;quot; 4x usage growth seem unlikely.  But consider this next graph, which is the view in 2019 (2.5 years old and 2.5 years ago), until today), with the axes expanded to what they are today:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/vd-usage-2.5y-500.png&quot; alt=&quot;graph of usage from 2016-10-29 2019-04-29, y=0-500&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Its growth to today would have seemed as unlikely then, and yet here we are.&lt;/p&gt;
&lt;p&gt;What will VisiData usage look like in 5 years?   If it continues to double every year, then in 5 years that would be 32x; possibly exceeding 10,000 daily users!  That seems a little excessive.  But with millions of terminal users and millions of Python users and millions of data professionals who could benefit from a quick dive into a new dataset and whip it into shape, it&#39;s not impossible.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>VisiData Turns 5</title>
    <link href="https://visidata.org/blog/2021/5-years-old/"/>
    <updated>2021-10-29T00:00:00Z</updated>
    <id>https://visidata.org/blog/2021/5-years-old/</id>
    <content type="html">&lt;p&gt;Today, we celebrate 5 years of VisiData.  In honor of the occasion, I thought I&#39;d put together a little retrospective, and some thoughts on what the future might hold.&lt;/p&gt;
&lt;h1 id=&quot;what-is-visidata&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/5-years-old/#what-is-visidata&quot;&gt;&lt;/a&gt;What is VisiData?&lt;/h1&gt;
&lt;p&gt;VisiData is an &lt;em&gt;interactive tabulator&lt;/em&gt;.  Like &lt;a href=&quot;https://en.wikipedia.org/wiki/VisiCalc&quot;&gt;VisiCalc&lt;/a&gt; is an interactive calculator, and &lt;a href=&quot;https://en.wikipedia.org/wiki/Vim_(text_editor)&quot;&gt;vim&lt;/a&gt; is an interactive text editor.
It&#39;s the ultimate tool for dealing with tabular data: exploring, cleaning, analyzing, and transmuting.
VisiData is not a spreadsheet, where cells are the first-class elements.  However, it &lt;em&gt;can&lt;/em&gt; load and interact with data in spreadsheet format, and many other formats too, even some things you might not think of at first: like filesystem metadata and API results and packet captures.
Because &lt;strong&gt;everything is data&lt;/strong&gt;.&lt;/p&gt;
&lt;h1 id=&quot;history&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/5-years-old/#history&quot;&gt;&lt;/a&gt;History&lt;/h1&gt;
&lt;p&gt;I&#39;ve been working on VisiData since October 2016, and in the beginning, there was only one user (me).&lt;/p&gt;
&lt;p&gt;The first &amp;quot;release&amp;quot; was &lt;a href=&quot;https://www.reddit.com/r/Python/comments/5ct5kd/visidata_a_curses_interface_for_exploration_of/&quot;&gt;v0.14 to r/Python&lt;/a&gt; in November 2016 but no one noticed.  Then in December I shared &lt;a href=&quot;https://www.reddit.com/r/pystats/comments/5hpph6/please_help_test_my_new_cursestextmode_data/&quot;&gt;v0.37 to r/pystats&lt;/a&gt;, which got a bit more attention, but was &lt;a href=&quot;https://www.reddit.com/r/pystats/comments/5hpph6/please_help_test_my_new_cursestextmode_data/db30878/&quot;&gt;scorned for not having any tests&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Back then it was a single &lt;a href=&quot;https://github.com/saulpw/visidata/blob/v0.31/bin/vd&quot;&gt;1000-line script&lt;/a&gt; that had loaders for csv, json, xlsx, hdf5, and could already create frequency tables and join sheets.  Many people would be quite happy with just this functionality.&lt;/p&gt;
&lt;p&gt;I kept going.&lt;/p&gt;
&lt;h2 id=&quot;2017-pre-v1&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/5-years-old/#2017-pre-v1&quot;&gt;&lt;/a&gt;2017: pre-v1&lt;/h2&gt;
&lt;p&gt;After only a few months, VisiData was already incredibly useful.  But I had a lot more ideas, so in 2017 I worked on VisiData extensively, always thinking a 1.0 was just around the corner.
The first major release prior to v1.0 was in June 2017, and made it to the top of Hacker News.&lt;/p&gt;
&lt;p&gt;I didn&#39;t have firm criteria for &amp;quot;version 1.0&amp;quot; was, I just knew I didn&#39;t want it to be a
&lt;a href=&quot;https://0ver.org/&quot;&gt;version 0&lt;/a&gt; project forever.  I mainly wanted 1.0 to be robust and useful without
major maintainance.&lt;/p&gt;
&lt;h2 id=&quot;2018-v1-era&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/5-years-old/#2018-v1-era&quot;&gt;&lt;/a&gt;2018: v1 era&lt;/h2&gt;
&lt;p&gt;In Jan 2018, I released version 1.0, and then took a step back.
Shortly after 1.0 I started getting some basic usage data.
I kept plugging away at it, and Anja (who I met at the &lt;a href=&quot;https://recurse.com/&quot;&gt;Recurse Center&lt;/a&gt; in 2017) became involved in the project.
Jeremy Singer-Vine, who had discovered VisiData the year before, wrote the excellent &lt;a href=&quot;https://jsvine.github.io/intro-to-visidata/&quot;&gt;Introduction to VisiData tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;2019-v152-era&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/5-years-old/#2019-v152-era&quot;&gt;&lt;/a&gt;2019: v1.5.2 era&lt;/h2&gt;
&lt;p&gt;At the end of 2018 I took a &lt;a href=&quot;https://cionic.com/&quot;&gt;full-time job&lt;/a&gt;, so in January of 2019 we &lt;a href=&quot;https://www.visidata.org/blog/2019/v1.5.2/&quot;&gt;released a &amp;quot;final&amp;quot; v1.5.2&lt;/a&gt; which was very reliable, and it was the last official release for almost 2 years.&lt;/p&gt;
&lt;p&gt;Here&#39;s what VisiData usage looked like for the first 2.5 years of its existence: from 40 daily M-F users in early 2018, to almost 100 in mid-2019.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/vd-usage-2.5y-125.png&quot; alt=&quot;graph of usage from 2016-10-29 2019-04-29, y=0-125&quot; /&gt;&lt;/p&gt;
&lt;p&gt;During 2019 I worked full-time, but still added functionality to VisiData on the side, or as I needed features for my paid work.  These stayed in the develop branch, and only used by a handful of dedicated users.&lt;/p&gt;
&lt;h2 id=&quot;2020-pre-v2-era&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/5-years-old/#2020-pre-v2-era&quot;&gt;&lt;/a&gt;2020: pre-v2 era&lt;/h2&gt;
&lt;p&gt;I wanted to clean up some elements of the API but I was aware of the responsibilities of maintaining a stable platform.
So I let the develop branch accumulate changes, and we only made some internal beta releases.&lt;/p&gt;
&lt;p&gt;Then 2020 happened, and I stopped working full-time to keep things together.
Anja and I put a bunch of effort into cleaning up the API, and we &lt;a href=&quot;https://www.visidata.org/blog/2020/v2.0/&quot;&gt;released v2.0&lt;/a&gt; in October 2020.&lt;/p&gt;
&lt;h2 id=&quot;2021-v2-era&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/5-years-old/#2021-v2-era&quot;&gt;&lt;/a&gt;2021: v2 era&lt;/h2&gt;
&lt;p&gt;In 2021, we&#39;ve continued to put out new releases every few months.
The &lt;a href=&quot;https://github.com/devottys/&quot;&gt;Devottys&lt;/a&gt; and I released the &lt;a href=&quot;https://github.com/devottys/xdplayer&quot;&gt;xdplayer&lt;/a&gt; terminal crossword player and &lt;a href=&quot;https://github.com/devottys/darkdraw&quot;&gt;DarkDraw&lt;/a&gt; (a Unicode drawing tool).
I reorganized most of my VisiData addons into &lt;a href=&quot;https://github.com/visidata/vdplus&quot;&gt;VisiData Plus&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&#39;s what the usage graph looks like now:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/vd-usage-5y.png&quot; alt=&quot;graph of usage from 2016-10-29 2021-10-29, y=0-500&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This &lt;a href=&quot;https://visidata.org/usage.tsv&quot;&gt;usage data&lt;/a&gt; gives us some good information about the &lt;a href=&quot;https://mikemcquaid.com/2018/08/14/the-open-source-contributor-funnel-why-people-dont-contribute-to-your-open-source-project/&quot;&gt;open source contributor funnel&lt;/a&gt;.  In VisiData&#39;s case, it breaks down this way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;~3000 monthly users&lt;/li&gt;
&lt;li&gt;~300 daily users&lt;/li&gt;
&lt;li&gt;~30 community members&lt;/li&gt;
&lt;li&gt;~3 regular contributors&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tl;dr-the-present&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/5-years-old/#tl;dr-the-present&quot;&gt;&lt;/a&gt;tl;dr: the present&lt;/h2&gt;
&lt;p&gt;In short, VisiData now has some ~15k lines of code, some thousands of regular users, and is frequently mentioned wherever people talk about tabular data tools and/or the terminal.
Its architecture for working with row/column data is powerful, and the interface is remarkably flexible and ergonomic for experienced users.
Users regularly call VisiData &amp;quot;delightful&amp;quot;, &lt;a href=&quot;https://www.reddit.com/r/vim/comments/kf4wgb/visidata_a_cool_vimlike_tool_for_examining_and/&quot;&gt;&amp;quot;amazing&amp;quot;&lt;/a&gt;, and say they &lt;a href=&quot;https://twitter.com/AlexNetoGeo/status/1451327794860941319&quot;&gt;&amp;quot;love&amp;quot;&lt;/a&gt; it.  My favorite response (as for most of my work) is &lt;a href=&quot;https://twitter.com/hillelogram/status/1252827658745860096&quot;&gt;&amp;quot;holy shit&amp;quot;&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&quot;the-future-of-visidata&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/5-years-old/#the-future-of-visidata&quot;&gt;&lt;/a&gt;The Future of VisiData&lt;/h1&gt;
&lt;p&gt;According to &lt;a href=&quot;https://en.wikipedia.org/wiki/Lindy_effect&quot;&gt;Lindy&#39;s Law&lt;/a&gt;, the life expectancy of software is proportional to its age.
So now that VisiData has been around for 5 years, we can look forward to and plan for another 5 years.&lt;/p&gt;
&lt;h2 id=&quot;usage-growth&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/5-years-old/#usage-growth&quot;&gt;&lt;/a&gt;Usage Growth&lt;/h2&gt;
&lt;p&gt;The second graph has 4x daily users on the Y axis.  Let&#39;s extrapolate this graph another 4x and another 5 years:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/vd-usage-10y-2000.png&quot; alt=&quot;graph of usage from 2016-10-29 2026-10-29, y=0-2000&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This graph makes even a &amp;quot;modest&amp;quot; 4x usage growth seem unlikely.  But consider this next graph, which is the view in 2019 (2.5 years old and 2.5 years ago), until today), with the axes expanded to what they are today:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/vd-usage-2.5y-500.png&quot; alt=&quot;graph of usage from 2016-10-29 2019-04-29, y=0-500&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Its growth to today would have seemed as unlikely then, and yet here we are.&lt;/p&gt;
&lt;p&gt;What will VisiData usage look like in 5 years?   If it continues to double every year, then in 5 years that would be 32x; possibly exceeding 10,000 daily users!  That seems a little excessive.  But with millions of terminal users and millions of Python users and millions of data professionals who could benefit from a quick dive into a new dataset and whip it into shape, it&#39;s not impossible.&lt;/p&gt;
&lt;h2 id=&quot;more-usability-and-teachability&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/5-years-old/#more-usability-and-teachability&quot;&gt;&lt;/a&gt;More Usability and Teachability&lt;/h2&gt;
&lt;p&gt;Like many powertools, VisiData has so much functionality that it can be offputting to new users.  Even though a handful of commands would already provide a large amount of power and flexibility, new users often bounce off of it because it just seems overwhelming.&lt;/p&gt;
&lt;p&gt;So a major and ongoing effort, is to make VisiData even easier to use, while not degrading the experience for power users, and in fact guiding new users into becoming power users without a lot of effort.  The new menu system in &lt;a href=&quot;https://www.visidata.org/blog/2021/v2.6/&quot;&gt;v2.6&lt;/a&gt; is a big step towards better discoverability.  Next on the list will be a sidebar for &amp;quot;wizard&amp;quot; commands like join, group, and plot; a more holistic and guided fancy chooser.&lt;/p&gt;
&lt;h2 id=&quot;bigger-data&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/5-years-old/#bigger-data&quot;&gt;&lt;/a&gt;Bigger Data&lt;/h2&gt;
&lt;p&gt;VisiData is great for dealing with a few million rows of data.  But more than that, and it starts to buckle.  Modern hardware and databases can readily work with 100 million rows on a single machine if they are stored and accessed correctly.  In the next few years, VisiData will be able to access these larger datasets without having to load everything into memory.  Imagine being able to browse a BigQuery table using &lt;code&gt;Shift+F&lt;/code&gt; for a Frequency Sheet and &lt;code&gt;Enter&lt;/code&gt; to dive into a subset, and then copying the resulting SQL into a notebook!&lt;/p&gt;
&lt;h2 id=&quot;bonkers-plugins&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/5-years-old/#bonkers-plugins&quot;&gt;&lt;/a&gt;Bonkers Plugins&lt;/h2&gt;
&lt;p&gt;Like Emacs is to text, VisiData is to tables.  If my wildest ambitions were fulfilled, VisiData would be the solution in the following analogy:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Emacs : text : Lisp :: VisiData : tables : Python
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and with that in mind, there&#39;s lots of room to grow!&lt;/p&gt;
&lt;h2 id=&quot;absurd-amounts-of-polish&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/5-years-old/#absurd-amounts-of-polish&quot;&gt;&lt;/a&gt;Absurd Amounts of Polish&lt;/h2&gt;
&lt;p&gt;As always, what makes VisiData so great to use, is the absurd amount of polish and attention to detail.  One by one, we find the frictions and try to remove them.  The minor inconsistencies.  The edge cases.  The little things that are deemed &amp;quot;not worth it&amp;quot; in most software.&lt;/p&gt;
&lt;h1 id=&quot;heres-to-another-5-years-of-visidata&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/5-years-old/#heres-to-another-5-years-of-visidata&quot;&gt;&lt;/a&gt;Here&#39;s to another 5 years of VisiData!&lt;/h1&gt;
&lt;p&gt;Thanks again to our current corporate sponsors &lt;a href=&quot;https://www.octoberswimmer.com/&quot;&gt;October Swimmer&lt;/a&gt; and &lt;a href=&quot;https://genui.com/&quot;&gt;General UI&lt;/a&gt;, and to all of the people who have contributed to make VisiData awesome!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>VisiData.org Redesign</title>
    <link href="https://visidata.org/blog/2021/redesign-2021/"/>
    <updated>2021-08-13T00:00:00Z</updated>
    <id>https://visidata.org/blog/2021/redesign-2021/</id>
    <content type="html">&lt;p&gt;Hello! My name is Luke Harris, and &lt;a href=&quot;https://luke.work/&quot;&gt;I&#39;m a web designer&lt;/a&gt;. I recently completed the new site design for VisiData.org, and wanted to outline the goals and challenges. Let&#39;s dive in.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/redesign/screenshot1.jpg&quot; alt=&quot;VisiData homepage&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;goals-for-the-design&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/redesign-2021/#goals-for-the-design&quot;&gt;&lt;/a&gt;Goals for the design&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Effectively communicate new releases and blog posts&lt;/li&gt;
&lt;li&gt;Better usability - consistent navigation and structure&lt;/li&gt;
&lt;li&gt;Easier discovery of documentation and features&lt;/li&gt;
&lt;li&gt;Searchable documentation with an easy-to-browse sidebar layout&lt;/li&gt;
&lt;li&gt;Statically generated from existing Markdown files, with templates as needed&lt;/li&gt;
&lt;li&gt;Easy to update and maintain by the VisiData creator and contributors&lt;/li&gt;
&lt;li&gt;RSS feeds for blog posts and releases&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;colophon&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/redesign-2021/#colophon&quot;&gt;&lt;/a&gt;Colophon&lt;/h2&gt;
&lt;p&gt;This website was originally built with a custom-made static site generator (SSG) and is a mix of regular Markdown files and reStructuredText parsed by &lt;a href=&quot;https://pandoc.org/&quot;&gt;pandoc&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This site is now statically generated with &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;11ty&lt;/a&gt;, and uses &lt;a href=&quot;https://tailwindcss.com/&quot;&gt;TailwindCSS&lt;/a&gt; for styling.&lt;/p&gt;
&lt;h2 id=&quot;challenges-overcome&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/redesign-2021/#challenges-overcome&quot;&gt;&lt;/a&gt;Challenges overcome&lt;/h2&gt;
&lt;h3&gt;reStructured Text&lt;/h3&gt;
&lt;p&gt;The docs were written in a mix of reStructuredText (RST) and Markdown, which proved a challenge as 11ty does not support RST. 11ty does support HTML files, so Saul wrote a script to run the docs through pandoc and output the resulting HTML files into a directory for 11ty.&lt;/p&gt;
&lt;h3&gt;Documentation search&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/redesign/screenshot2.jpg&quot; alt=&quot;VisiData documentation search&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We needed a quick self-hosted solution to search the documentation, and rely on as few external dependencies as possible. This ruled out popular search engine Algolia, and led me to &lt;a href=&quot;https://lunrjs.com/&quot;&gt;lunr.js&lt;/a&gt;, which can be fed a JSON file (generated by 11ty) of the index, and then run the search client-side in the browser. If JavaScript isn&#39;t supported in the browser, the search results page falls back to a DuckDuckGo site search link.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/redesign/screenshot3.jpg&quot; alt=&quot;DDG fallback&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Updatable components&lt;/h3&gt;
&lt;p&gt;The site features 3 JSON files for easy updating of sections of the site that see frequent updates, including the sponsors in the footer area, the header navigation, and the testimonials.&lt;/p&gt;
&lt;h2 id=&quot;design-highlights&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/redesign-2021/#design-highlights&quot;&gt;&lt;/a&gt;Design highlights&lt;/h2&gt;
&lt;h3&gt;Command demo&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/redesign/screenshot4.jpg&quot; alt=&quot;VisiData command demo&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This demo existed prior to the redesign on the old site. I gave it a facelift and designed the terminal output area to use a monospaced font. If you select the text, the &lt;code&gt;$&lt;/code&gt; is left out, allowing for easy copy-and-paste of commands.&lt;/p&gt;
&lt;h3&gt;Features and Getting started&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/redesign/screenshot5.jpg&quot; alt=&quot;features table&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Using CSS Grid, I designed a highlighted features area with one block spanning two columns, making for a neat effect.&lt;/p&gt;
&lt;h3&gt;Releases and Blog lists on homepage&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/redesign/screenshot6.jpg&quot; alt=&quot;blog and releases posts&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It&#39;s important to quickly be able to catch up on what&#39;s new with an open-source project. Adding the blog posts and releases list to the homepage was easily accomplished with 11ty&#39;s post collections.&lt;/p&gt;
&lt;h2 id=&quot;before-and-after&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/redesign-2021/#before-and-after&quot;&gt;&lt;/a&gt;Before and after&lt;/h2&gt;
&lt;h3&gt;Before:&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/redesign/screenshot7.jpg&quot; alt=&quot;old VisiData site&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;After:&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/redesign/screenshot1.jpg&quot; alt=&quot;new VisiData site&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;issues&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/redesign-2021/#issues&quot;&gt;&lt;/a&gt;Issues&lt;/h2&gt;
&lt;p&gt;If you come across any bugs or issues with the new design, let us know by &lt;a href=&quot;https://github.com/visidata/visidata.org/issues&quot;&gt;opening an issue on the repo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://luke.work/blog/2021/08/visidata-redesign/&quot;&gt;Originally posted on luke.work&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>10 Ways to Use VisiData</title>
    <link href="https://visidata.org/blog/2020/ten/"/>
    <updated>2021-07-24T00:00:00Z</updated>
    <id>https://visidata.org/blog/2020/ten/</id>
    <content type="html">&lt;h2 id=&quot;1-explore-datasets-effortlessly-no-matter-the-format&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/ten/#1-explore-datasets-effortlessly-no-matter-the-format&quot;&gt;&lt;/a&gt;1. Explore datasets effortlessly, no matter the format&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ vd albums.json dropbox/*.xls* agents.sqlite
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use the arrow keys to move around and &lt;code&gt;q&lt;/code&gt; to quit.&lt;/p&gt;
&lt;p&gt;VisiData loads data from &lt;a href=&quot;https://visidata.org/formats&quot;&gt;many different sources and formats&lt;/a&gt;, including &lt;a href=&quot;https://pandas.pydata.org/pandas-docs/stable/reference/io.html&quot;&gt;anything pandas can load&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;New loaders are included in every release, and &lt;a href=&quot;https://visidata.org/docs/loaders&quot;&gt;you can create one yourself easily&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 id=&quot;2-convert-from-any-input-format-into-any-output-format&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/ten/#2-convert-from-any-input-format-into-any-output-format&quot;&gt;&lt;/a&gt;2. Convert from any input format into any output format&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ vd -b input.csv -o output.json
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;3-interactively-select-replacement-for-cli-tools&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/ten/#3-interactively-select-replacement-for-cli-tools&quot;&gt;&lt;/a&gt;3. Interactively select replacement for cli tools&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ mv $(ls | vd) /trash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Select files using &lt;a href=&quot;https://visidata.org/docs/rows&quot;&gt;any of the selection commands&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Press &lt;code&gt;&amp;quot;&lt;/code&gt; to pull them into their own sheet.&lt;/p&gt;
&lt;p&gt;Press &lt;code&gt;Ctrl+Q&lt;/code&gt; to exit VisiData and write the current sheet to stdout.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 id=&quot;4-scrape-html-table-data-from-a-webpage&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/ten/#4-scrape-html-table-data-from-a-webpage&quot;&gt;&lt;/a&gt;4. Scrape HTML table data from a webpage&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ vd https://en.wikipedia.org/wiki/List_of_largest_cities
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;5-parse-and-explore-text-based-log-files&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/ten/#5-parse-and-explore-text-based-log-files&quot;&gt;&lt;/a&gt;5. Parse and explore text-based log files&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ vd output.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use &lt;code&gt;:&lt;/code&gt; to split each line by some string.&lt;/p&gt;
&lt;p&gt;Use &lt;code&gt;;&lt;/code&gt; with a regex with capture groups like &lt;code&gt;(\d+)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 id=&quot;6-explore-a-python-object-from-the-repl&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/ten/#6-explore-a-python-object-from-the-repl&quot;&gt;&lt;/a&gt;6. Explore a Python object from the REPL&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; visidata.pyobj.view(obj)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;7-explore-any-pandas-dataframe&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/ten/#7-explore-any-pandas-dataframe&quot;&gt;&lt;/a&gt;7. Explore any pandas DataFrame&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; visidata.vd.view_pandas(df)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;8-create-an-adhoc-data-pipeline&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/ten/#8-create-an-adhoc-data-pipeline&quot;&gt;&lt;/a&gt;8. Create an adhoc data pipeline&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ vd -b -p foo.vd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;VisiData can also be used in batch mode with &lt;a href=&quot;https://visidata.org/docs/save-restore/&quot;&gt;scripts&lt;/a&gt; without requiring any interaction.&lt;/p&gt;
&lt;p&gt;Save the cmdlog to a .vd file with &lt;code&gt;Ctrl+D foo.vd&lt;/code&gt;, then replay the saved .vd file:&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 id=&quot;9-rename-a-bunch-of-files&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/ten/#9-rename-a-bunch-of-files&quot;&gt;&lt;/a&gt;9. rename a bunch of files&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ vd &amp;lt;directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Edit the filenames &lt;a href=&quot;https://visidata.org/docs/edit&quot;&gt;(documentation on editing commands)&lt;/a&gt;.
Press &lt;code&gt;z Ctrl+S&lt;/code&gt; to commit the changes (before v2.0, use &lt;code&gt;Ctrl+S&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Watch &lt;a href=&quot;https://www.youtube.com/watch?v=l2Bpmm0yAGw&quot;&gt;this video showing how to use the directory browser&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 id=&quot;10-see-all-the-available-options-and-commands&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/ten/#10-see-all-the-available-options-and-commands&quot;&gt;&lt;/a&gt;10. see all the available options and commands&lt;/h2&gt;
&lt;p&gt;There are many other ways to use VisiData!  To learn more, press &lt;code&gt;Ctrl+H&lt;/code&gt; to see the &lt;a href=&quot;https://visidata.org/man&quot;&gt;manpage&lt;/a&gt;, or &lt;code&gt;z Ctrl+H&lt;/code&gt; to see the full list of commands available on the current sheet.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;[written by Saul Pwanson 2019-03-24]&lt;/li&gt;
&lt;li&gt;[updated on 2020-10-15]&lt;/li&gt;
&lt;li&gt;[updated on 2021-07-24]&lt;/li&gt;
&lt;li&gt;[updated on 2022-03-21]&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>New feature: Persistent input history</title>
    <link href="https://visidata.org/blog/2021/input-history/"/>
    <updated>2021-01-10T00:00:00Z</updated>
    <id>https://visidata.org/blog/2021/input-history/</id>
    <content type="html">&lt;p&gt;Like most tools, VisiData keeps a history of your responses to its prompts, so you can scroll through them in subsequent prompts using the Up and Down arrows.&lt;/p&gt;
&lt;p&gt;Up until now, these histories would only be available until the end of the VisiData session.
By default this is still the case, but if you set &lt;code&gt;options.input_history&lt;/code&gt; to any value, the history will persist between sessions.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;options.input_history = &#39;lastinputs&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will put the history in &lt;code&gt;.visidata/lastinputs.jsonl&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/2021-input-history.gif&quot; alt=&quot;input-history&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Input histories are separated based on the &lt;em&gt;type&lt;/em&gt; of the input (e.g., Python expressions, regex search, regex split, filenames),
The Last Inputs Sheet can be opened with the &lt;code&gt;open-inputs&lt;/code&gt; command, and edited/saved if desired.&lt;/p&gt;
&lt;p&gt;Many thanks to AJ Kerrigan who subbed to Saul at the &lt;a href=&quot;https://www.patreon.com/saulpw&quot;&gt;Workflow Optimist level on Patreon&lt;/a&gt;, and requested that &lt;a href=&quot;https://github.com/saulpw/visidata/issues/468&quot;&gt;this feature be kept open in our issues list&lt;/a&gt;.
This feature is currently in the &lt;code&gt;develop&lt;/code&gt; branch and slated for release in v2.2.&lt;/p&gt;
&lt;p&gt;[written by Anja Boskovic 2021-01-10]
[edited by Saul Pwanson 2021-01-10]&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Expansion of CLI Options</title>
    <link href="https://visidata.org/blog/2020/options/"/>
    <updated>2020-07-07T00:00:00Z</updated>
    <id>https://visidata.org/blog/2020/options/</id>
    <content type="html">&lt;p&gt;Hello VisiDaters!&lt;/p&gt;
&lt;p&gt;Recently, Saul has pushed a re-work of the CLI options to the &lt;code&gt;develop&lt;/code&gt; branch. I am particularly excited about this change, and so I wanted to cover it in detail.&lt;/p&gt;
&lt;p&gt;I am going to be referencing two options; &lt;code&gt;-f&lt;/code&gt;, alias for &lt;code&gt;--filetype&lt;/code&gt;, and &lt;code&gt;-d&lt;/code&gt;, alias for &lt;code&gt;--delimiter&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;By default, VisiData deduces the filetype of a source from its extension. &lt;code&gt;-f&lt;/code&gt; allows you to manually declare the filetype, overriding deduction by extension. &lt;code&gt;-d&lt;/code&gt; sets the delimiter for TSV files.&lt;/p&gt;
&lt;h2 id=&quot;the-additions&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/options/#the-additions&quot;&gt;&lt;/a&gt;The Additions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vd --help&lt;/code&gt; will now open the manpage&lt;/li&gt;
&lt;li&gt;VisiData now supports the setting of sheet-specific options, as well as global, through the CLI.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vd -f json foo.json.gz&lt;/code&gt; now applies to the inner filetype.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Historically, if you did,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vd -f csv foo.tsv bar.csv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;the option &lt;code&gt;-f&lt;/code&gt; would then get applied as a global option to every source.
There was no way to communicate to VisiData distinct filetypes for each source.&lt;/p&gt;
&lt;p&gt;With the new additions, you can do this,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vd -f tsv foo.tsv -f csv bar.csv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, &lt;code&gt;-f tsv&lt;/code&gt; would be applied to foo.tsv, and &lt;code&gt;-f csv&lt;/code&gt; would be applied to bar.csv.&lt;/p&gt;
&lt;h2 id=&quot;how-sheet-specific-cli-options-work&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/options/#how-sheet-specific-cli-options-work&quot;&gt;&lt;/a&gt;How Sheet-Specific CLI Options Work&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--option&lt;/code&gt;s will apply as sheet-specific options to the sources which follow them.&lt;/li&gt;
&lt;li&gt;The final setting for a given option will be considered the CLI-given override setting. It will be applied to all sources loaded by the CLI, if that source does not have its own sheet-specific setting. This means that if an option is only set once, it will be applied to all of the sources.&lt;/li&gt;
&lt;li&gt;If an option is preceded by &lt;code&gt;-g&lt;/code&gt; it will be set globally for all sheets in the session, just like in the previous versions of VisiData. Some special options, like &lt;code&gt;-p&lt;/code&gt; (replay), are always going to be global, and will not require the &lt;code&gt;-g&lt;/code&gt; prefix.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;p&gt;To specify a different delimiter for each file,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vd -d &#39;|&#39; pipes.tsv -d &#39;,&#39; commas.tsv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To set a global delimiter,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vd pipes.tsv commas.tsv -g -d &#39;|&#39;
vd -g -d &#39;|&#39; pipes.tsv commas.tsv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To specify a filetype for all of the files provided through the CLI,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vd foo bar -f tsv
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;limitations&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/options/#limitations&quot;&gt;&lt;/a&gt;Limitations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;there is no way to make an option apply only to the immediately following source&lt;/li&gt;
&lt;li&gt;nor a way to unset an option after setting it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As always, please let us know how you feel about it! &lt;a href=&quot;https://twitter.com/VisiData&quot;&gt;Share a tweet&lt;/a&gt;, or stop by for a &lt;a href=&quot;https://webchat.freenode.net/&quot;&gt;chat in freenode #visidata&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[written by Anja Boskovic 2020-07-07]
[updated by Anja Boskovic 2020-07-26]&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>VisiData&#39;s Limits on Growth</title>
    <link href="https://visidata.org/blog/2020/limits/"/>
    <updated>2020-07-01T00:00:00Z</updated>
    <id>https://visidata.org/blog/2020/limits/</id>
    <content type="html">&lt;p&gt;I added a page on the website, &lt;a href=&quot;https://visidata.org/limits&quot;&gt;/limits&lt;/a&gt;, summarising a list of things we wish were different, but would require unwanted adjustments to the architecture to change.&lt;/p&gt;
&lt;p&gt;Something I learned from spending time with Saul is that building software always requires making decisions around trade-offs. Sometimes, the decision about the trade-off really should lie with the user, which is part of the reason we added so many options.&lt;/p&gt;
&lt;p&gt;Sometimes, though, to fix it would require a large architectural overhaul, or would involve a trade-off that is just..,Worse in every way. Collecting these stories is what the &lt;a href=&quot;https://visidata.org/limits&quot;&gt;limits&lt;/a&gt; page is for.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>The implications of tabular data architecture</title>
    <link href="https://visidata.org/blog/2020/row-major/"/>
    <updated>2020-06-18T00:00:00Z</updated>
    <id>https://visidata.org/blog/2020/row-major/</id>
    <content type="html">&lt;p&gt;A known bug in VisiData (&lt;a href=&quot;https://github.com/saulpw/visidata/issues/413&quot;&gt;#413&lt;/a&gt;) is that the contents of &lt;code&gt;SettableColumn&lt;/code&gt;s created with &lt;code&gt;addcol-*&lt;/code&gt; are not able to be yanked (copied to VisiData&#39;s internal clipboard).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/2020-settable-screenshot.png&quot; alt=&quot;settable&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The reason behind why this happens illuminates something significant behind VisiData&#39;s architecture.&lt;/p&gt;
&lt;p&gt;There are two main ways table data can be organized: &lt;strong&gt;row-major&lt;/strong&gt; and &lt;strong&gt;column-major&lt;/strong&gt;.
Row-major keeps each row together, whereas column-major keeps each column together.
SQL databases are an example of a row-major data analysis tool (if they support row-level locking).
Python pandas is an example of a column-major library.&lt;/p&gt;
&lt;p&gt;Users might intuitively feel like VisiData is column-major, since it has so many &lt;a href=&quot;https://visidata.org/docs/columns&quot;&gt;column-centric commands&lt;/a&gt;, but architecturally it&#39;s actually row-major.
This is so we can use objects as rows, and also have heterogenous column values.
You can toss around bulk row references like they&#39;re nothing.
Operations like load and filter are really fast.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SettableColumn&lt;/code&gt; (and other columns which store data inside themselves &amp;quot;about&amp;quot; rows) is column-major, and so the distinctions are blurred.
It does happen to work pretty well for most things, but it&#39;s trepidacious and kind of off-label.&lt;/p&gt;
&lt;p&gt;This is the fundamental issue behind &lt;a href=&quot;https://github.com/saulpw/visidata/issues/413&quot;&gt;#413&lt;/a&gt; and why it can&#39;t be fixed.&lt;/p&gt;
&lt;p&gt;This is also why working with the pandas loader (or any columnar store like raw parquet files) can be tricky.
You have the hammering of row-oriented semantics around a lower level functionality or storage layer that is fundamentally column-oriented.
It&#39;s awkward and carries a stiff performance penalty.
VisiData is designed for loading and filtering over aggregating and saving.&lt;/p&gt;
&lt;p&gt;In the future, perhaps pandas should be a completely different kind of &lt;strong&gt;Sheet&lt;/strong&gt;.
A &lt;strong&gt;TableSheet&lt;/strong&gt; would actually be the row-oriented sheet, and there&#39;s another &lt;strong&gt;ColumnSheet&lt;/strong&gt; that&#39;s column-oriented.
Operations would be implemented differently, and maybe different ones would be available.&lt;/p&gt;
&lt;p&gt;However, in the meanwhile, with this awareness we can make cleaner choices within VisiData, and understand other implications this can have for different loaders and commands.&lt;/p&gt;
&lt;p&gt;[Written by Saul Pwanson 2020-06-17]
[Edited by Anja Boskovic 2020-06-17]&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>&#39;VisiData is like duct tape for your data&#39;, an interview with Saul</title>
    <link href="https://visidata.org/blog/2020/changelog/"/>
    <updated>2020-05-16T00:00:00Z</updated>
    <id>https://visidata.org/blog/2020/changelog/</id>
    <content type="html">&lt;p&gt;Saul was recently interviewed on &lt;a href=&quot;https://changelog.com/&quot;&gt;The Changelog&lt;/a&gt; podcast!&lt;/p&gt;
&lt;p&gt;&lt;audio data-theme=&quot;night&quot; data-src=&quot;https://changelog.com/podcast/394/embed&quot; src=&quot;https://cdn.changelog.com/uploads/podcast/394/the-changelog-394.mp3&quot; preload=&quot;none&quot; class=&quot;changelog-episode&quot; controls=&quot;&quot;&gt;&lt;/audio&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://changelog.com/podcast/394&quot;&gt;The Changelog 394: VisiData is like duct tape for your data&lt;/a&gt;&lt;/p&gt;&lt;script async=&quot;&quot; src=&quot;https://cdn.changelog.com/embed.js&quot;&gt;&lt;/script&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;It also has a &lt;a href=&quot;https://changelog.com/podcast/394#transcript&quot;&gt;written transcript&lt;/a&gt; available.&lt;/p&gt;
&lt;p&gt;This is a very wide-ranging interview. The first quarter covers his discovery of an egregious case of crossword plagiarism. If you want more, you can additionally check out &lt;a href=&quot;https://www.youtube.com/watch?v=9aHfK8EUIzg&quot;&gt;How A File Format Led To a Crossword Scandal&lt;/a&gt;, the talk he gave at &lt;a href=&quot;https://csvconf.com/2019/speakers/#saul-pwanson&quot;&gt;csv,conf&lt;/a&gt; in 2019.&lt;/p&gt;
&lt;p&gt;Next, he talked about our collaboration in creating the &lt;a href=&quot;http://github.com/devotees/biograph&quot;&gt;biograph framework&lt;/a&gt; for our own personal histomaps.&lt;/p&gt;
&lt;p&gt;In the second half, he talks about the side-effects of offering VisiData as a gift to the world. Open-sourcing software involves much more than just posting your code to a GitHub repository. There are insecurities, cultural practices, and responsibilities that come with it.&lt;/p&gt;
&lt;p&gt;I hope you enjoy the interview! I really did.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Unloaded Sheets</title>
    <link href="https://visidata.org/blog/2020/unloaded/"/>
    <updated>2020-02-11T00:00:00Z</updated>
    <id>https://visidata.org/blog/2020/unloaded/</id>
    <content type="html">&lt;p&gt;If after you pass multiple files to vd on the command-line, you go straight to the Sheets Sheet, you&#39;ll see that only the first one is loaded:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/2020-unloaded-screenshot-1.png&quot; alt=&quot;unloaded&quot; /&gt;&lt;/p&gt;
&lt;p&gt;When a sheet is first created, it is considered &amp;quot;unloaded&amp;quot; (literally &lt;code&gt;sheet.rows is UNLOADED&lt;/code&gt;).
It can stay in this dormant state indefinitely, and is quite lightweight.&lt;/p&gt;
&lt;p&gt;Then, as it&#39;s about to be drawn for the first time, the sheet starts its loading process (via &lt;code&gt;sheet.reload()&lt;/code&gt;), to read the data into memory.&lt;/p&gt;
&lt;p&gt;These reloads are spawned in a separate thread; this is what makes VisiData responsive as a sheet is loading.&lt;/p&gt;
&lt;p&gt;But there is a problem here.  If too many large sheets are loading at once, your laptop supercomputer would still slow to a crawl.&lt;/p&gt;
&lt;p&gt;So if you have 100GB of .csv files in a directory and you do &lt;code&gt;vd *.csv&lt;/code&gt; (which is a reasonable thing to want to do, especially if you have 100GB of .csv), VisiData only starts loading the top sheet (the first one given on the command-line) in order to draw it.  The other sheets remain unloaded, as you can see on the SheetsSheet.  When you jump to one of the unloaded sheets, it will start loading.&lt;/p&gt;
&lt;p&gt;Now, if you have a bunch of small sheets and go to the Sheets Sheet expecting to compare or join them straight away, you might be disappointed to find them unloaded and unusable.&lt;/p&gt;
&lt;p&gt;Fear not!  To load multiple sheets at the same time, go to the Sheets Sheet, select the sheets you want to load, and then &lt;code&gt;reload-selected&lt;/code&gt; with &lt;code&gt;g Ctrl+R&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/2020-unloaded-screenshot-2.gif&quot; alt=&quot;loaded&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Now you can go forth and jump around bundles of csvs to your heart&#39;s delight, secure in the knowledge that VisiData will only read into memory what you intentionally want to engage with.&lt;/p&gt;
&lt;p&gt;[written by Saul Pwanson 2020-02-10]&lt;/p&gt;
&lt;p&gt;[edited by Anja Kefala 2020-02-11]&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>New Features in 2.-3: repeat-last and repeat-input</title>
    <link href="https://visidata.org/blog/2020/repeat/"/>
    <updated>2020-02-09T00:00:00Z</updated>
    <id>https://visidata.org/blog/2020/repeat/</id>
    <content type="html">&lt;p&gt;Onto the &lt;code&gt;develop&lt;/code&gt; branch, we have pushed two new commands: &lt;code&gt;repeat-last&lt;/code&gt; and &lt;code&gt;repeat-input&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;These commands had been originally requested on the #visidata IRC channel. The design spec was then transcribed onto &lt;a href=&quot;https://github.com/saulpw/visidata/issues/441&quot;&gt;issue #441&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The aim was to have something spiritually similar vim&#39;s &lt;code&gt;.&lt;/code&gt; (dot) command.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;repeat-input&lt;/code&gt; runs the previous command, along with any previous input to that command. &lt;code&gt;repeat-last&lt;/code&gt; runs the most recent command with an empty, queried input.&lt;/p&gt;
&lt;p&gt;For the moment, they are unbound. To use any command with its longname, press &lt;code&gt;SPACE&lt;/code&gt; followed by the &lt;em&gt;longname&lt;/em&gt;. For example: &lt;code&gt;SPACE&lt;/code&gt; &lt;em&gt;repeat-last&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;To bind the commands to your preferential keystroke (the following example uses &lt;code&gt;.&lt;/code&gt;), add to your ~/.visidatarc`:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Sheet.bindkey(&#39;.&#39;, &#39;repeat-input&#39;)
Sheet.bindkey(&#39;z.&#39;, &#39;repeat-last&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or to take advantage of a currently unused keybinding:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Sheet.bindkey(ALT + &#39;r&#39;, &#39;repeat-input&#39;)
Sheet.bindkey(&#39;z&#39; + ALT + &#39;r&#39;, &#39;repeat-last&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As always, the features on &lt;code&gt;develop&lt;/code&gt; are experimental. If you do use them, please let us know how you feel about them! &lt;a href=&quot;https://github.com/saulpw/visidata/issues/new&quot;&gt;Post an issue on Github&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/VisiData&quot;&gt;share a tweet&lt;/a&gt;, or stop by for a &lt;a href=&quot;https://webchat.freenode.net/&quot;&gt;chat in freenode #visidata&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[written by Anja Boskovic 2020-02-09]&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>New feature in 2.-3: Split Window</title>
    <link href="https://visidata.org/blog/2020/splitwin/"/>
    <updated>2020-02-02T00:00:00Z</updated>
    <id>https://visidata.org/blog/2020/splitwin/</id>
    <content type="html">&lt;p&gt;Hey VisiDaters, check it out!&lt;/p&gt;
&lt;p&gt;In the bleeding-edge &lt;code&gt;develop&lt;/code&gt; branch, VisiData can now show TWO sheets at the same time:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/2020-splitwin-screenshot.gif&quot; alt=&quot;gif or screenshot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The ability to see two sheets on the screen at the same time has been on the v2.0 roadmap for a long time.
I&#39;ve even caught myself lamenting a few times that, if we had split-screen, the design for some feature would be straightforward.
Deep down I also think it might open up a whole new dimension of user interface, where movement on the active window instantly updates the inactive window.&lt;/p&gt;
&lt;p&gt;So I&#39;ve given it a few tries already; it&#39;s not that technically challenging to do, but the interface for it remained elusive
After talking with &lt;a href=&quot;https://github.com/tsibley&quot;&gt;@tsibley&lt;/a&gt; and &lt;a href=&quot;https://github.com/anjakefala&quot;&gt;@anjakefala&lt;/a&gt; and sitting with it for long enough, last week I finally put together a working prototype.
It&#39;s serviceable but not perfect, so hopefully it can serve as a launching pad for discussion about the finer points of split-screen workflow.&lt;/p&gt;
&lt;h2 id=&quot;optionsdisp_splitwin_pct&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/splitwin/#optionsdisp_splitwin_pct&quot;&gt;&lt;/a&gt;&lt;code&gt;options.disp_splitwin_pct&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The main option is &lt;code&gt;disp_splitwin_pct&lt;/code&gt;, which specifies the height of the top window as a percent of the full screen height.
Currently, a positive number puts the top sheet in the top window, whereas a negative number keeps the same layout, but puts the top sheet in the bottom window.&lt;/p&gt;
&lt;h2 id=&quot;commands&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/splitwin/#commands&quot;&gt;&lt;/a&gt;Commands&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Shift+Z&lt;/code&gt; splits the screen in half so that the second-most-recently accessed sheet is visible&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;g Shift+Z&lt;/code&gt; sets the active sheet to the whole screen (effectively disable splitwin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;z Shift+Z&lt;/code&gt; specifies &lt;code&gt;options.disp_splitwin_pct&lt;/code&gt; exactly&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Ctrl+^&lt;/code&gt; (which already jumps to the previous sheet) naturally swaps the layout without changing the active panel&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;TAB&lt;/code&gt; swaps the active panel, without changing the layout.  (note that this means the replay-advance command is currently disabled; I&#39;m still not sure how all this is going to work.)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Its full implementation could solve several issues (choosing jointype/aggregators, &lt;a href=&quot;https://github.com/saulpw/visidata/issues/293&quot;&gt;popup command help&lt;/a&gt;) and would make a two panel &lt;a href=&quot;https://github.com/saulpw/visidata/issues/309&quot;&gt;orthodox file manager&lt;/a&gt; all but inevitable.&lt;/p&gt;
&lt;h2 id=&quot;theme-options&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/splitwin/#theme-options&quot;&gt;&lt;/a&gt;Theme options&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;color_top_status&lt;/code&gt; is applied to the &amp;quot;top window status bar&amp;quot; -- which is in the middle of the screen.  Set by default to &lt;code&gt;underline&lt;/code&gt; to divide the screen visually.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;color_inactive_status&lt;/code&gt; is applied to the status bar of the inactive window.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;color_active_status&lt;/code&gt; is applied to the status bar of the active window.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;limitations&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/splitwin/#limitations&quot;&gt;&lt;/a&gt;Limitations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;only 2 sheets at the same time; from one to two sheets is a quantum leap by itself and a reasonable constraint (at least to start with).&lt;/li&gt;
&lt;li&gt;only top/bottom split is supported; this implementation could be extended to include &lt;code&gt;options.disp_splitwin&lt;/code&gt; which might specify e.g. &lt;code&gt;top&lt;/code&gt; or &lt;code&gt;left&lt;/code&gt; to indicate the panel of the top sheet.&lt;/li&gt;
&lt;li&gt;it can&#39;t be specified as a CLI option (no &lt;code&gt;disp_&lt;/code&gt; or &lt;code&gt;color_&lt;/code&gt; option can).&lt;/li&gt;
&lt;li&gt;canvas/graph sheets aren&#39;t reset and may have errors that require &lt;code&gt;Ctrl+L&lt;/code&gt; to resize properly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is still quite experimental so if you use this feature, let me know how you feel about it!  &lt;a href=&quot;https://github.com/saulpw/visidata/issues/new&quot;&gt;Post an issue on Github&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/VisiData&quot;&gt;share a tweet&lt;/a&gt; , or stop by for a &lt;a href=&quot;https://webchat.freenode.net/&quot;&gt;chat in freenode #visidata&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[written by Saul Pwanson 2020-02-02]&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Hello World!</title>
    <link href="https://visidata.org/blog/2020/hello-world/"/>
    <updated>2020-01-19T00:00:00Z</updated>
    <id>https://visidata.org/blog/2020/hello-world/</id>
    <content type="html">&lt;p&gt;I have always wanted a home for longform conversations on VisiData.&lt;/p&gt;
&lt;p&gt;For the past three years, we have experimented with &lt;a href=&quot;https://visidata.org/blog/2018/tinyletter-16&quot;&gt;tinyletters&lt;/a&gt;, &lt;a href=&quot;https://visidata.org/blog/2018/tinyletter-13&quot;&gt;videos&lt;/a&gt;, &lt;a href=&quot;https://visidata.org/blog/2019/v1.5.2&quot;&gt;release notes&lt;/a&gt;, &lt;a href=&quot;https://visidata.org/blog/2019/python-init&quot;&gt;podcast interviews&lt;/a&gt;, &lt;a href=&quot;https://www.patreon.com/saulpw&quot;&gt;patreon posts&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/VisiData/status/1112474267013120001&quot;&gt;twitter threads&lt;/a&gt;, and &lt;a href=&quot;https://github.com/saulpw/visidata/issues/275&quot;&gt;responses to github issues&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I now want to consolidate those conversations into a single place. The backfill of this blog hopes to accomplish this. Additionally, I wanted a space for writing that is more impulsive than a newsletter, and merits more room for thought than a tweet. I am hoping this blog will become that space.&lt;/p&gt;
&lt;p&gt;Thanks for sticking around for the past 3 years. =) Welcome to the next stage in this experiment.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>VisiData Case Study #1 Transcript: summing donation data from a webpage</title>
    <link href="https://visidata.org/blog/2020/case-study-1/"/>
    <updated>2020-01-15T00:00:00Z</updated>
    <id>https://visidata.org/blog/2020/case-study-1/</id>
    <content type="html">&lt;p&gt;This case study was originally a &lt;a href=&quot;https://www.youtube.com/watch?v=yhunJc8Nu4g&quot;&gt;video&lt;/a&gt;, that was published on 2018-04-01. The video was designed and recorded by &lt;a href=&quot;https://saul.pw/&quot;&gt;Saul Pwanson&lt;/a&gt; with help from &lt;a href=&quot;https://tarahoch.com/&quot;&gt;Tara Hoch&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It was transcribed by &lt;a href=&quot;https://twitter.com/cel10e&quot;&gt;E&lt;/a&gt; on 2019-12-11 and then updated and converted into a blog post by &lt;a href=&quot;https://anja.kefala.info/&quot;&gt;Anja Boskovic&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This walkthrough will use VisiData to take a paragraph of donation information from a website (&lt;a href=&quot;https://web.archive.org/web/20180307091111/https://beginners.re/&quot;&gt;beginners.re&lt;/a&gt;), and then get it into a form that can be easily summed.&lt;/p&gt;
&lt;p&gt;In the process, the following commands/features will be covered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;adding custom functions to &lt;code&gt;~/.visidatarc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;piping stdin into VisiData&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+O&lt;/code&gt; in any edit field to open it with a custom external editor (specified with &lt;strong&gt;$EDITOR&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:&lt;/code&gt; to split columns&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Shift+M&lt;/code&gt; to melt (un-pivot)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;;&lt;/code&gt; to match by regex capture group&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$&lt;/code&gt; to type columns as &amp;quot;currency&amp;quot; (a dirty float)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z+&lt;/code&gt; to apply an aggregator statistic to the current column and show the result&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~&lt;/code&gt; to type a column as a string&lt;/li&gt;
&lt;li&gt;&lt;code&gt;=&lt;/code&gt; to create a new column by Python expression&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since the donations are all in different currencies, Saul made a plugin called &lt;a href=&quot;https://raw.githubusercontent.com/saulpw/visidata/develop/plugins/usd.py&quot;&gt;USD&lt;/a&gt;. He uses the plugin&#39;s USD() function at the final step in the case study. USD() takes a number and a currency code or currency symbol, and converts it into US dollars based on the current day&#39;s currency rates. If you want to follow along with the final step of the tutorial, before you launch your VisiData session you will need to add the USD() code to your &lt;code&gt;~/.visidatarc&lt;/code&gt; or &lt;a href=&quot;https://github.com/saulpw/visidata/blob/develop/docs/plugins.md&quot;&gt;install it as a plugin&lt;/a&gt;. Then its functions will be added to your session&#39;s scope. This is &lt;em&gt;completely optional&lt;/em&gt;, and only comes to play at the end.&lt;/p&gt;
&lt;p&gt;Since the video&#39;s creation, &lt;a href=&quot;https://fixer.io/&quot;&gt;fixer.io&lt;/a&gt; has also added a user api key requirement. To take advantage of the usd plugin, you will also need to create an account, grab an api key, and then set  &lt;code&gt;options.fixer_key&lt;/code&gt; in your &lt;code&gt;.visidatarc&lt;/code&gt; in your $HOME directory.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;.visidatarc&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;options.fixer_key = &#39;insert_here&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;transcription-of-case-study-starts&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/case-study-1/#transcription-of-case-study-starts&quot;&gt;&lt;/a&gt;Transcription of case study starts&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Saul&lt;/strong&gt;: I came across a book called &amp;quot;Reverse Engineering for Beginners,&amp;quot; written by Dennis Yurichev. It seems like it&#39;s a pretty good book; he&#39;s got a bunch information about it, and he also lists the donors who have supported him. I actually really appreciate his transparency here, that he will share all this information on his website. It made me curious as to how much money had been donated to him overall.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/videos/assets/case-study-1-01.png&quot; alt=&quot;beginners.re&quot; /&gt;&lt;/p&gt;
&lt;p&gt;So you&#39;ll notice that this information here is in a single line. It&#39;s actually not that bad, but it&#39;s not in a form that we could easily do something with. So we&#39;re going to use VisiData to pick it apart, and try to do a sum of how much money was donated to him.&lt;/p&gt;
&lt;p&gt;First we are going to cut and paste this text into our terminal window, and pipe into VisiData directly.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &#39;2 * Oleg Vygovsky (50+100 UAH), Daniel Bilar ($50), James Truscott ($4.5), Luis Rocha ($63), Joris van de Vis ($127), Richard S Shultz ($20), Jang Minchang ($20), Shade Atlas (5 AUD), Yao Xiao ($10), Pawel Szczur (40 CHF), Justin Simms ($20), Shawn the R0ck ($27), Ki Chan Ahn ($50), Triop AB (100 SEK), Ange Albertini (€10+50), Sergey Lukianov (300 RUR), Ludvig Gislason (200 SEK), Gérard Labadie (€40), Sergey Volchkov (10 AUD), Vankayala Vigneswararao ($50), Philippe Teuwen ($4), Martin Haeberli ($10), Victor Cazacov (€5), Tobias Sturzenegger (10 CHF), Sonny Thai ($15), Bayna AlZaabi ($75), Redfive B.V. (€25), Joona Oskari Heikkilä (€5), Marshall Bishop ($50), Nicolas Werner (€12), Jeremy Brown ($100), Alexandre Borges ($25), Vladimir Dikovski (€50), Jiarui Hong (100.00 SEK), Jim Di (500 RUR), Tan Vincent ($30), Sri Harsha Kandrakota (10 AUD), Pillay Harish (10 SGD), Timur Valiev (230 RUR), Carlos Garcia Prado (€10), Salikov Alexander (500 RUR), Oliver Whitehouse (30 GBP), Katy Moe ($14), Maxim Dyakonov ($3), Sebastian Aguilera (€20), Hans-Martin Münch (€15), Jarle Thorsen (100 NOK), Vitaly Osipov ($100), Yuri Romanov (1000 RUR), Aliaksandr Autayeu (€10), Tudor Azoitei ($40), Z0vsky (€10), Yu Dai ($10), Anonymous ($15), Vladislav Chelnokov ($25), Nenad Noveljic ($50), Ryan Smith ($25), Andreas Schommer (€5). &#39; | vd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now VisiData has that as one of its rows.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/videos/assets/case-study-1-03.png&quot; alt=&quot;opening&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If we reduce this column to just a few characters here, you can see it&#39;s actually quite a long field. If you wanted to view the field and see all the contents of it, you can edit it (with &lt;code&gt;e&lt;/code&gt;), and you can scroll across the whole thing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/videos/assets/case-study-1-04.png&quot; alt=&quot;edit&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can also press &lt;code&gt;Ctrl+O&lt;/code&gt; to open any input line in your own editor: in this case it&#39;s vim, in the terminal. With this, you can see the entire contents. You can also make edits and save them off; they&#39;ll be reflected back in the cell. For now, we are just going to quit out of this and cancel the edit.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/videos/assets/case-study-1-05.png&quot; alt=&quot;editor&quot; /&gt;&lt;/p&gt;
&lt;p&gt;What we want to do, is split up that single line according to the individual donations. Each donation is separated by a comma, so we&#39;re going to use the split command (&lt;code&gt;:&lt;/code&gt;). The split command allows you to split the text in any column into two or more columns, based on a provided regex. In this case, the split regex is just a comma (&lt;code&gt;,&lt;/code&gt;). That will create columns for every individual donation.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/videos/assets/case-study-1-06.png&quot; alt=&quot;split-input&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/videos/assets/case-study-1-07.png&quot; alt=&quot;split-enter&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Now, we&#39;re going to hide this first column (&lt;code&gt;-&lt;/code&gt;), and now we&#39;ve got every donation in its own cell, which is a great start. This is a horizontal form of the data, but we want the data to be in a vertical form, because that&#39;s what VisiData expects. VisiData does statistical operations within columns.&lt;/p&gt;
&lt;p&gt;So we&#39;re going to use a command in VisiData called &#39;melt&#39;: it&#39;s like an un-pivot. It takes data from a horizontal form and swings it down into a vertical form. Now you can see the column names on the left, and the cell values on the right. Now we&#39;re ready to go.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/videos/assets/case-study-1-08.png&quot; alt=&quot;melt&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We can move our cursor to the &lt;strong&gt;Value&lt;/strong&gt; column, and we&#39;re going to use another command. The &lt;code&gt;;&lt;/code&gt; key extracts part of a column according to regex. We&#39;re going to pull out the donation amount from within the parentheses, by constructing a regex. This is the standard regex for extract everything from inside the parentheses: &lt;code&gt;\((.*)\)&lt;/code&gt;. The inner set of parentheses &lt;code&gt;(.*)&lt;/code&gt; is the capture group. Everything included in the capture group is going to be pulled into a new column.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/videos/assets/case-study-1-02.png&quot; alt=&quot;capture-input&quot; /&gt;
&lt;img src=&quot;https://visidata.org/videos/assets/case-study-1-09.png&quot; alt=&quot;capture-enter&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If we wanted to, we could just sum up this set of numbers. It wouldn&#39;t be very meaningful, because they&#39;re all in different currency units, but we could do it.&lt;/p&gt;
&lt;p&gt;There is a type, assigned to keystroke &lt;code&gt;$&lt;/code&gt;, which I call a currency type. It&#39;s really just a dirty float: it takes the initial non-numeric characters and converst them into a float. The trailing non-numeric characters are stripped off. The cells that have a symbol in the middle can&#39;t converted, so they will show up as errors. We will ignore those for now. And so now we can approach this as just a column of numbers.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/videos/assets/case-study-1-10.png&quot; alt=&quot;currency&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;+&lt;/code&gt; is used to put an aggregator on a column, which then shows up in future sheets.
Here, we&#39;re going to use the &lt;code&gt;z+&lt;/code&gt; command, which applies an aggregator to the current column and shows the result immediately. And so if we want to sum up the current column, we type &lt;code&gt;z+&lt;/code&gt; &lt;em&gt;sum&lt;/em&gt; and there we go.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/videos/assets/case-study-1-11.png&quot; alt=&quot;sum&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This is about 4,300 units of currency. Again, it&#39;s not very meaningful, because they&#39;re all in different currencies. Since they are in different currencies, here is where the &lt;a href=&quot;https://raw.githubusercontent.com/saulpw/visidata/develop/plugins/usd.py&quot;&gt;USD plugin&lt;/a&gt; comes into play. It takes a number and a currency code or currency symbol, and converts it into US dollars based on the current day&#39;s currency rates.&lt;/p&gt;
&lt;p&gt;To use it, let&#39;s convert our currencies back to strings. This will involve using the &lt;code&gt;~&lt;/code&gt; command. It was so-chosen because it looks like a string to me. Pressing it will type the current column back to a string, like it originally was.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/videos/assets/case-study-1-13.png&quot; alt=&quot;string&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Now, we are going to use &lt;code&gt;=&lt;/code&gt; to create a new column based on an input Python expression. With that, we are going to use the &lt;strong&gt;USD&lt;/strong&gt; function on this &lt;strong&gt;Value_re0&lt;/strong&gt; column.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/videos/assets/case-study-1-14.png&quot; alt=&quot;usd&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I&#39;m then going to convert this USD output into a float type. Now we can see that, for instance, this €50 is actually ~$55 in US money. Others that were already in US money just remain the same.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/videos/assets/case-study-1-15.png&quot; alt=&quot;float&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Now, we can do the same &lt;code&gt;z+&lt;/code&gt; &lt;em&gt;sum&lt;/em&gt; as we did before, and see the value in US dollars as of today&#39;s rates. That is about $1,431 worth of value: that&#39;s the total donations he got from people for his book. It&#39;s not quite the full total, because we&#39;re missing the ones with errors and such. We could do some more things to make that better, but this is a rough general calculation.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/videos/assets/case-study-1-16.png&quot; alt=&quot;final sum&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Thanks very much for using VisiData, and I will see you next time!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Exploratory Data Analysis Made Easy At The Command Line - Episode 230</title>
    <link href="https://visidata.org/blog/2019/python-init/"/>
    <updated>2019-10-30T00:00:00Z</updated>
    <id>https://visidata.org/blog/2019/python-init/</id>
    <content type="html">&lt;p&gt;This is an edited transcript of an interview about VisiData in this &lt;a href=&quot;https://www.pythonpodcast.com/visidata-exploratory-data-analysis-episode-230/&quot;&gt;episode of Python.__init__&lt;/a&gt;.
It was carefully transcribed and edited by E (&lt;a href=&quot;https://visidata.org/blog/2019/python-init/twitter.com/cel10e&quot;&gt;@cel10e&lt;/a&gt; on twitter) on 2019-10-30.&lt;/p&gt;
&lt;iframe title=&quot;Podlove Web Player: The Python Podcast.__init__ - Exploratory Data Analysis Made Easy At The Command Line&quot; width=&quot;768&quot; height=&quot;290&quot; align=&quot;centre&quot; src=&quot;https://cdn.podlove.org/web-player/share.html?episode=https%3A%2F%2Fwww.pythonpodcast.com%2F%3Fpodlove_player4%3D588&quot; frameboreder=&quot;0&quot; scrolling=&quot;no&quot; tabindex=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;h2 id=&quot;table-of-contents&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/python-init/#table-of-contents&quot;&gt;&lt;/a&gt;Table of Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://visidata.org/blog/2019/python-init/#tobias-intro&quot;&gt;Tobias&#39; intro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visidata.org/blog/2019/python-init/#saul-intro&quot;&gt;Saul intro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visidata.org/blog/2019/python-init/#what-are-the-main-use-cases-for-visidata&quot;&gt;What are the main uses cases for VisiData?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visidata.org/blog/2019/python-init/#the-command-log&quot;&gt;The command log&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visidata.org/blog/2019/python-init/#how-has-visidata-evolved-over-time&quot;&gt;How has VisiData evolved over time?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visidata.org/blog/2019/python-init/#why-the-terminal&quot;&gt;Why the terminal?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visidata.org/blog/2019/python-init/#the-design-of-keybindings&quot;&gt;The design of keybindings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visidata.org/blog/2019/python-init/#visidatas-capabilities&quot;&gt;VisiData&#39;s capabilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visidata.org/blog/2019/python-init/#the-visidata-community&quot;&gt;The community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visidata.org/blog/2019/python-init/#innovative-uses-of-visidata&quot;&gt;Innovative uses of VisiData&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visidata.org/blog/2019/python-init/#the-future&quot;&gt;The future&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visidata.org/blog/2019/python-init/#the-terminal-renaissance&quot;&gt;The terminal renaissance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visidata.org/blog/2019/python-init/#closing&quot;&gt;Closing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://visidata.org/blog/2019/python-init/#outro&quot;&gt;Outro&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tobias-intro-[0000]&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/python-init/#tobias-intro-[0000]&quot;&gt;&lt;/a&gt;Tobias&#39; intro [00:00]&lt;/h2&gt;
&lt;p&gt;[Intro music plays.]
&lt;strong&gt;Tobias Macey&lt;/strong&gt;: Hello, and welcome to Podcast.init, the podcast about Python and the people who make it great.&lt;/p&gt;
&lt;p&gt;When you&#39;re ready to launch your next app or want to try a project you hear about on the show, you&#39;ll need somewhere to deploy it. So take a look at our friends over at LINODE. With 200 gigabit private networking, scalable shared block storage, node balancers, and a 40 gigabit public network, all controlled by a brand new API, you get everything you need to scale up. And for your tasks that need fast computation, such as training machine learning models and running your continuous integration, they just launched dedicated CPU instances. Go to pythonpodcast.com/linode — that&#39;s L-I-N-O-D-E — today to get a $20 credit and launch a new server in under a minute. And don&#39;t forget to thank them for their continued support of this show.&lt;/p&gt;
&lt;p&gt;And you listen to this show to learn and stay up to date with the ways that Python is being used, including the latest in machine learning and data analysis. For even more opportunities to meet, listen, and learn from your peers, you don&#39;t want to miss out on this year&#39;s conference season. We have partnered with organizations such as O&#39;Reilly Media, Dataversity, Corinium Global Intelligence, and Data Council. Upcoming events include the O&#39;Reilly AI Conference, the Strata Data Conference, the combined events of the Data Architecture Summit and Graph Forum and Data Council in Barcelona. Go to pythonpodcast.com/conferences today to learn more about these and other events, and take advantage of our partner discounts when you register.&lt;/p&gt;
&lt;h2 id=&quot;saul-intro-[0137]&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/python-init/#saul-intro-[0137]&quot;&gt;&lt;/a&gt;Saul intro [01:37]&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: Your host as usual is Tobias Macey, and today I&#39;m interviewing Saul Pwanson about VisiData, a terminal-oriented interactive multi-tool for tabular data. So, Saul, can you start by introducing yourself?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Yeah, my name is &lt;a href=&quot;http://www.saul.pw/&quot;&gt;Saul&lt;/a&gt;, I&#39;ve been working in the software industry for a while, and I&#39;m in Seattle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: And do you remember how you first got introduced to Python?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Yeah, it was for work back in 2004. I was at a startup which was using it for their apps, and I picked it up there, because that&#39;s just what you do, right?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: And, so, at some point, you decided that you needed to start building your own multi-tool for working with data, particularly in tabular formats, and I&#39;m wondering if you could just start by describing a bit about the tool that you built in the form of VisiData, and some of the backstory of how it got started?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Yeah. I was working at a company called &lt;a href=&quot;https://www.f5.com/&quot;&gt;F5 Networks&lt;/a&gt; in 2011, I think, and I built up an early prototype of VisiData for them. I didn&#39;t know it would become VisiData at the time, it was just a configuration and exploration tool for their own networking hardware. But, as I got used to using it, it was fun, I found that the concept was very flexible, and I kept adding more and more stuff to it.&lt;/p&gt;
&lt;p&gt;And then after I left F5, I found myself missing it. I kept wanting to use it to look at HDF5 files or other tabular data that I had. And so, when I was at another company in 2016, and that company was winding down, I realized that I was turning 40, and looking back over my career of almost 20 years, I didn&#39;t have very much to show for it. And I was like, &amp;quot;well, I&#39;ve been wanting this tool, so let me just start that again.&amp;quot; I couldn&#39;t use the code that I had written at F5, obviously. So I was like, &amp;quot;if I&#39;m gonna rewrite it, let me do it again from scratch, and I&#39;ll make it right once and for all as the tool that I want to use.&amp;quot; And so that was the genesis of VisiData.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: There are a couple interesting things in there. One is the fact that you had to try and rewrite this tool from scratch, largely from memory, without copying the exact code that you had written. And then also, you mentioned HDF5 files, and I&#39;m curious: have you experimented with &lt;a href=&quot;https://www.pytables.org/&quot;&gt;PyTables&lt;/a&gt; at all, or any of the other libraries for that particular data format, and what was it that you found lacking that you wanted to have present in VisiData?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;:  So I hadn&#39;t used PyTables, but I&#39;ve used a lot of other Python tools for using HDF5 files. And just like with any complicated format, you can do anything you want to with Python, it&#39;s really great for that. But it&#39;s still kind of a hassle – you still have to write code to do it. And often, I wanted to just open up an HDF5 file and check it to see if that data reference isn&#39;t all zeros, or has tables that I want in there. And the tools that I had weren&#39;t good. There was one that was written in Java, and so of course you&#39;d start it up and it would take like three seconds to start. It actually had a bug in it so that it would modify the data to be kind of truncated, it was read-only. And so every kind of tool for quick exploration didn&#39;t really work for that purpose. I was really missing that really rapid flow — just show me the data, I want to see it with my own eyes and then pop back out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: And then for the sake of you rewriting this tool from scratch, I&#39;m curious if there was any functionality in the original tool that you either consciously left out because it didn&#39;t suit your particular needs of the time, or any functionality that you tried to replicate but weren&#39;t quite able to match, because you didn&#39;t have the necessary context that you had had at the time when you were working at F5?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Yeah, that&#39;s a really great question. I&#39;ve been working on VisiData now for a lot longer than I worked on the original prototype that I had made. But because it was a networking company, one of the things that was in the original version that I still haven&#39;t added but would like to add someday, was the ability to add a derivative column, because it was updating live from actual data on the device. For example, if you see the bytes transfer, then you could add another column that would be a derivative of bytes transfer: bytes transfer per second. And you could do that for any column you wanted to, which was a super handy feature.&lt;/p&gt;
&lt;p&gt;But I am finding that VisiData is used more for static data now than the original tool was at F5, and so that feature hasn&#39;t been added. I do remember that the prototype had pop-ups — for example, if you wanted to change a field between 10 values and enumeration, there was a little modal pop-up that would show up, where you could scroll down and pick the right option. That was always a neat little feature, it made things a little easier to use. Right now in VisiData, if you have to add an aggregator, you look on the bottom line for the list, which I still don&#39;t quite like. But, I decided to not add modal dialogues to VisiData. If you want to see something, you have to go to a fresh sheet. If you&#39;re going to go to a fresh thing, the modality is just in the bottom status line. That was a conscious design decision. It looks flashier to have the pop-ups, but as I&#39;m doing more design work, I see that modal dialogues kind of get in the way.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: You mentioned that the common use case for VisiData now is for static data. I&#39;m wondering if it does have any capacity for being able to process continuously updating information, such as the Top command in Linux, or the network streams that you had built the original tool for?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Yeah, absolutely. And in fact, I would love for VisiData to have more adapters or plugins or loaders for other things, like Top. Actually, Top&#39;s a great example. And I&#39;ve got some prototypes of &lt;a href=&quot;https://github.com/saulpw/visidata/tree/develop/vgit&quot;&gt;vgit&lt;/a&gt;, but vgit&#39;s still more static data. I do have a vping, which goes out as a combination trace route and ping, it updates live as it&#39;s finding the various hops and their latencies, and stuff like that. But then it turns out that every one of these applications is a pile of work. I&#39;ve been devoting so much to the core application of VisiData that I found myself not having a lot of time to polish the other ones to the degree that I want to. So I wish that I had that time, or that I could find somebody that wanted to work on it with me. But I&#39;ve been focusing on the main end of it.&lt;/p&gt;
&lt;h2 id=&quot;what-are-the-main-uses-cases-for-visidata-[0722]&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/python-init/#what-are-the-main-uses-cases-for-visidata-[0722]&quot;&gt;&lt;/a&gt;What are the main uses cases for VisiData? [07:22]&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: I&#39;m curious what the main use cases are for VisiData that you have found, both personally and within the community. In particular, which tools has replaced in your toolbox for things like systems administration or data analysis, that you might reach for otherwise, but that VisiData is just more convenient for?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Mm hmm. So it seems like one of the main use cases is to get a first look at downloaded data. I know that &lt;a href=&quot;https://www.jsvine.com/&quot;&gt;Jeremy Singer-Vine&lt;/a&gt;, who is the data editor at BuzzFeed, uses it all the time for exactly this purpose. Because you find data all the time online, and you don&#39;t know if it&#39;s useful, and you don&#39;t want to spend a lot of time investing in it — porting it into a database, for instance. We just want to see it right away, to see the first columns, the first rows, do a quick search or however else you want to view it. And to be able to get to that place instantly, as opposed to doing any amount of coding or work, is one of the huge benefits of VisiData. And so I would say that it&#39;s mainly super useful as an exploratory tool.&lt;/p&gt;
&lt;p&gt;The other thing that I find it super useful for is getting data from one format and structure, into another format and structure. So you know, if you just need this one-off thing — you&#39;ve got this pile of data here, whether it&#39;s an Excel spreadsheet, or even just piped in from another command, and you want to say, remove those four columns, add another computed column, and just save that off and pass it off, you can get all of that done in like 30 seconds. Whereas doing it in any other tool is going to take you at least several minutes to get those tools put together, then write the code, do whatever you&#39;re going to do, and it ends up taking more like a half an hour. And so it&#39;s a lot of those one-off scripts that I think VisiData has replaced for me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: Yeah, there are definitely utilities, both in the general user space libraries — particularly for Linux but also in Python — that can do direct conversion between formats. But the workflow you were describing, of being able to manipulate the information before you commit it to the other format, is definitely something that would typically require a lot more effort and exploration to make sure that you&#39;re getting things right. And then, once you do get it working, you&#39;re likely to use it repeatedly, but it&#39;s going to be much more static and brittle than if you were to use VisiData in a more exploratory fashion. And I know that VisiData also supports being able to build pipelines for that repeatable use case as well. So I&#39;m wondering if you can just talk through an overall typical workflow for data exploration and analysis, and also the sort of conversion workflow that you might use VisiData with?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Yeah, okay. So here&#39;s a typical workflow, for instance. I might download some data from the internet, for example from data.boston.gov — every city&#39;s got their own public datasets. And so you open it with vd to poke around and see what&#39;s there. I like to see the scope of the data and the precision: basically, how wide does it get and how much individual pieces do you get, as well as how clean it is and how useful it is for our purposes. And then, as I&#39;m browsing around, I start finding things — like, oh, this column seems interesting, I wonder what&#39;s in here. And because there might be a million rows in the data set, it&#39;s hard to see that, especially since it&#39;s often sorted in a certain way. And so I do a frequency analysis very often, using &lt;code&gt;Shift+F&lt;/code&gt;, which is one of my favorite things about VisiData. So you just use &lt;code&gt;Shift+F&lt;/code&gt; on any column, and within a couple of seconds if not instantly, you can see the top value in that column and the number of values in that column total. And I think it&#39;s really great for finding any anomalies or outliers in the data. So you can use VisiData as a quick sanity check: &amp;quot;oh, I see, there&#39;s really no data in that field, or seldom is there data in that field,&amp;quot; or &amp;quot;oh, that&#39;s interesting, why are there half the fields completely empty,&amp;quot; et cetera. So that&#39;s one workflow.&lt;/p&gt;
&lt;p&gt;What happens is, once I get the data into a state that I want, then it&#39;s pretty easy to revisit the command log in VisiData, cull it down to get only the stuff that I really want, and then save it off. And I can do that repeatedly, if that data might be updated, or I want to share it with somebody else. In fact, one of the things that&#39;s been interesting is how useful the command log has been for debugging. People can say, &amp;quot;this is what I&#39;ve been doing with this, and this is the input data that I have, and here&#39;s the command log that I&#39;ve been running over it.&amp;quot; And it&#39;s interesting how I can look at the command log, and see, &amp;quot;oh, I wouldn&#39;t have known that you did that exact command here, or on that row.&amp;quot; And that changes everything. That is the way that I can figure out what&#39;s going wrong. So the replay is a really useful debugging aid too.&lt;/p&gt;
&lt;h2 id=&quot;the-command-log-[1148]&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/python-init/#the-command-log-[1148]&quot;&gt;&lt;/a&gt;The command log [11:48]&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: I&#39;m wondering if you can talk a bit more about the command log. As you said, it&#39;s definitely frequent that you run through an exploratory cycle, and you finally get to a good state, but you don&#39;t necessarily remember all the steps that you&#39;ve run through. You may have deleted code or added new code, so you don&#39;t know exactly what the flow was. Whereas by using a more keyboard oriented tool, you can keep that history and see what the overall workflow was. So I&#39;m curious if you can just discuss the command log and how it manifests in VisiData, and some of the benefits and drawbacks that it might provide.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: So, as far as I&#39;m concerned, VisiData is a grand experiment. Originally I made it as just a browsing tool — a CSV browser, as I used to call it. And then it turns out that it&#39;s a lot more broadly useful; it turns out that spreadsheets and tables are a very universal construct. I was at the &lt;a href=&quot;https://www.recurse.com/&quot;&gt;Recurse Center&lt;/a&gt; in early 2017, just playing around, and I started to wonder if I can record all actions into a table itself. And I did that, and it didn&#39;t work at first, and I was recording all the motions and everything else, and it was a mess. But then once I took everything that didn&#39;t belong on the command log out, it worked remarkably well, and I think it&#39;s actually super handy. It&#39;s not as good, obviously, as a Python script. You can only have one input field, it&#39;s kind of a rigid structure. But given the limited amount of data that&#39;s on the command log, it&#39;s remarkably flexible and powerful. I&#39;m very surprised about that.&lt;/p&gt;
&lt;p&gt;There is one thing that I do wish that I could solve, and I&#39;m sure that it is solvable, but I haven&#39;t managed it yet. The command log reports every action that you take, including all the dead ends that you wind up finding yourself in. Those are sometimes handy to have on there, so you can see what you did and didn&#39;t want to keep around. But when you&#39;re getting to the end, and you want to do it again, you want to cull all those dead ends out, and just get to the place that you currently are. And so I want to have some kind of graph or tree that would get you from your current state and only show the commands that you took to get there. That&#39;s what I really want to add to VisiData, and I just haven&#39;t gotten to that point yet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: And another thing that you mentioned, which I also noted in the documentation, is the case where you have a file, which might have millions of lines, which would typically be either difficult or impossible to open in a more traditional terminal oriented editor, such as BM or Emacs or the less pager. And I&#39;m curious what types of performance strategies and techniques you&#39;ve used to be able to handle files like that, and particularly, being able to manipulate them without just exploding your memory usage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: So one thing is that VisiData actually does explode memory usage. It doesn&#39;t explode as much as some other things, but in my mind, it actually does take up a lot of memory. But beyond that, though, I think there&#39;s a couple things that matter here. One is that there&#39;s an &lt;a href=&quot;https://github.com/saulpw/visidata/blob/develop/visidata/vdobj.py#L16&quot;&gt;asyncthread&lt;/a&gt; decorator that you can add to any function in VisiData. And that means that when you call that function, it spawns a thread and goes off and does it asynchronously. And there&#39;s always one main interface thread that keeps active, that is constantly updating with its status. And then within that thread, you can add a little progress meter, and those are pretty easy to do. But the main thing is that because it is so easy to spawn additional threads, I do it all the time, whenever I&#39;m doing anything that might take a while. And I know that any kind of linear operation on data, because you might have millions of rows, might take a while, so I want to make each operation spin off its own thread. And that keeps me conscious of how much time things are taking, for one thing.&lt;/p&gt;
&lt;p&gt;But I want to say that I actually don&#39;t think VisiData is fast, in itself. It&#39;s just responsive, and it turns out responsiveness matters more than speed. I would rather spend 10 seconds seeing a progress meter update and make it to the end, than five minutes with no progress and no knowledge of how long it&#39;s going to take at all. The first one is kind of soothing — I can take a break for 10 seconds — and the second one is very frustrating and makes me almost on edge. Like, do I need to do something here in order to kill it before it takes over my entire computer.&lt;/p&gt;
&lt;p&gt;The other thing that&#39;s important is that tools like Excel or vim often want to own the data. They want to import it into their own structure and format, and that&#39;s what causes the thing to really blow up. Every cell has to be stored separately in its own custom thing. Whereas the key architecture thing that VisiData has that makes it so flexible is that it stores the rows natively. And so whatever I get from whatever Python library, that just becomes the row. Every item is just that object. And then columns are basically lenses into those rows. And so VisiData is computing the cells every time. It doesn&#39;t grab the cells and put them in, it just goes ahead and computes it whenever you want to see it. And it&#39;s adding a column, trivially – you can add a column in constant time. And that also means that saving, for instance, is comparatively slow in VisiData, because it means it has to do the evaluation of all those columns for every single cell when it&#39;s saving. But it turns out, you don&#39;t actually have to save everything, usually — you&#39;re not actually looking at everything, only looking at the first hundred rows, or a few columns, or whatever. So I feel like between the threading and the conception of rows as objects and columns as architecture, that&#39;s what really helps VisiData stay focused on the user experience like that.&lt;/p&gt;
&lt;h2 id=&quot;how-has-visidata-evolved-over-time-[1712]&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/python-init/#how-has-visidata-evolved-over-time-[1712]&quot;&gt;&lt;/a&gt;How has VisiData evolved over time? [17:12]&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: Can you dig a bit more into the architecture and implementation of VisiData itself and some of the ways that it has evolved since you first started working on it? And I know that you&#39;ve also got an upcoming 2.0 release, so maybe talk a bit about some of the evolution that&#39;s coming there, and then any libraries or language features that you have leaned particularly heavy on and found most useful in your work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Probably the biggest evolution is that, when I first was doing it, it actually started out in a single file script, I put everything into a single vdtui.py. And the idea was that it was a drop-in thing: you could copy it over to a server over SSH, and then you could start using it, and you wouldn&#39;t need anything but the base Python. And I licensed that as MIT. And then as I started adding more modules and internal plugins to it, I licensed those as GPL-3. I was trying to keep this very clean separation, because the idea was that you could use the vdtui, which was very similar to the thing I had at F5, for making all kinds of other apps. But then nobody really took me up on that, and it&#39;s kind of hard to use somebody&#39;s single file library like that unless it&#39;s a super tight little library. So I kind of gave up on that, and am now heading more towards a more plugin platform architecture, where VisiData the app is the thing that hosts the individual plugins that you can add. It may even wind up having a vgit application that you can use. But it&#39;s kind of turning on its head. As opposed to incorporating vdtui in some particular version of your thing, you&#39;re actually using the VisiData library.&lt;/p&gt;
&lt;p&gt;Beyond that, it&#39;s now just a bigger open source project. It&#39;s got a whole packaging release cycle. And I&#39;m working with &lt;a href=&quot;http://anja.kefala.info/&quot;&gt;Anja&lt;/a&gt;, who has been very instrumental in some of the packaging, testing, and documentation stuff that we&#39;ve been doing. And it&#39;s just taken off and gained more traction in that sense. You also asked about the libraries that I like. One of the things that I&#39;m doing to keep performance good is that I take very few dependencies. I feel like layers are how things get messy. So the fewer layers that you have, the better off it&#39;ll be, if you can wind up coding everything in between there. So as far as the libraries that I use, obviously curses is essential, but that&#39;s built into the Python standard library. The Python standard library is really fantastic, and everything&#39;s included, which is a super bonus. But then also, the PyPi ecosystem in general is so broad, that any format that I come across, HDF5 or Excel or whatever, they have a library already for it. And it&#39;s a library that you can use in Python, you write a page of code and you&#39;ve got the stuff in there. And then all the loaders are just importing those libraries, then calling them, and putting the rows and the return in there and having some columns around — it&#39;s a nice, pretty simple concept.&lt;/p&gt;
&lt;p&gt;One thing you mentioned was that you wanted to know other ways that I keep VisiData fast. I&#39;ve been very focused on making sure that it starts up very quickly. I feel like, if there&#39;s a half second of startup time, it just gets in the way and it feels like a certain kind of friction. And so one thing that I do a lot of is lazy importing. For all these libraries, I have no idea how long they&#39;re going to take to load or start up themselves. And I know that there are some pretty heavy ones that VisiData uses sometimes, but I don&#39;t use those unless I need to. When you open up an Excel file, for instance, that&#39;s the point where it imports the XLS library. And if you don&#39;t ever load an Excel file, then it doesn&#39;t have to spend the time doing that. So that&#39;s another one of those tricks.&lt;/p&gt;
&lt;p&gt;Before we move on, I wanted to mention the Python dateutil library. I don&#39;t take many dependencies, but that&#39;s one that I&#39;ve been very happy to take, because it parses any date format that you can throw at it. It&#39;s amazing. It&#39;s a best in class detection and parsing tool. Also, another feature that I have used a lot is Python decorators. I think that&#39;s a pretty standard thing, actually, but I use them a way of tagging functions. For instance, I mentioned the asyncthread decorator, which takes a pretty advanced concept and reduces it to just the essence, so that I don&#39;t have to think or work hard to have those concepts work for me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: Yeah, the decorator&#39;s capabilities and the syntax that allows for it definitely makes it a lot easier to organize code and concepts. You can just drop it on top of a function definition without having to try and incorporate it into the body of the function and remember, &amp;quot;what are the return types? What are the inputs?&amp;quot; You just say, &amp;quot;it wraps this function and then it handles it, I don&#39;t have to think about it anymore.&amp;quot; And you can just keep it all in a utility&#39;s library, for instance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Yeah, exactly. Totally. I will say that one of the things that I wish the decorators did support was to be able to put the def function, name and signature on the same line as the decorator. It&#39;s a minor point, but I use a lot of grep type tools, and I would like to be able to know that function that I&#39;m looking at is an asyncthread, or has a deprecated decorator now, and be able to see that when I&#39;m searching for functions, for instance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: Well, one tip there is that if you add the grep -b1 that it&#39;ll show you the line that you want, as well as the line just before it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: That&#39;s a great tip, thank you.&lt;/p&gt;
&lt;h2 id=&quot;why-the-terminal-[2236]&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/python-init/#why-the-terminal-[2236]&quot;&gt;&lt;/a&gt;Why the terminal? [22:36]&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: Another thing that stands out with VisiData, particularly, is the fact that it is entirely terminal-oriented, whereas a lot of data exploration tools will be more focused on a graphical interface, or trying to embed into a Jupyter notebook for providing some sort of visualization. And I&#39;m wondering, what was your motivation for focusing so closely on that terminal interface and making it a command line client?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: I feel like the terminal is my home. I&#39;ve been using terminal since the &#39;80s, and so I&#39;m very comfortable in that environment with those kinds of restrictions. I&#39;m also much more comfortable with the keyboard than a mouse, but as I am getting older, it&#39;s becoming harder to just type verbosely. So I wanted individual keystrokes to do things, and I couldn&#39;t figure out how to do that in, for instance, a Jupyter notebook. The other thing is that because the terminal is so old, and mature, let&#39;s say, it&#39;s a universal interface. Any platform has an SSH client and a terminal. The only other way that you can get that level of universality is with a web browser and, for instance, an electron client, and that&#39;s way too heavy. So I feel like the choice is between a terminal which is very light, and an electron client which is very heavy. That choice for me is obvious. I want it to be a very quick in and out thing. I don&#39;t know how I would do the same kinds of things as quickly in the web, or even in a native app, if you have to reach for the mouse. You can do it with a with a given native app for sure. But then you have to make a native app for Mac, for Windows, for Linux, et cetera, and I just didn&#39;t want to do that. And so really, VisiData is about only about 10,000 lines of code all told — which is actually quite a bit, but it&#39;s not that much when you compare it to comparable tools like Open Refine. And I think that&#39;s a testament to being on the command line. I can do the minimum necessary to get the job done, and don&#39;t have to worry about things like pixel width. It&#39;s like, &amp;quot;No, you choose your own font, you choose your own font size and ways to interact with the thing — I&#39;m just here to get out of the way.&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: It also has the benefit that, as you were describing originally, you can just copy it over via SSH, or now pip install it on a remote machine. You don&#39;t have to go through the hoops of trying to set up a way to have a graphical interface to that remote box, you can just copy it over. And it broadens the reach and capabilities and use cases for the tool, where the only access you have is via terminal, which as you said, despite its age is still a fairly common experience for people who are working in technology.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Yeah, absolutely. I work remotely now, and we do have screen-sharing apps, but they don&#39;t always work that great, and you have to sometimes install some other plugin. The app that I love most, is called tmate — it&#39;s a tmux wrapper, I guess. And you just install it, and you type tmate, and you get an instant shell into your own machine and you can give somebody an SSH link. And they can do that, and people are usually amazed. Between that and VisiData, now we have an instant data exploration platform we can share, alongside a chat client or whatever. That&#39;s it. And I find that to be so much more accessible than modern video chat platforms — even us, at the start of our session here, had technology difficulties. The shell is very reliable, by comparison.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: By the fact that you are targeting the terminal environment, what are some of the constraints that that brings with it, in terms of your capabilities that you can bring into VisiData? What are some of the most challenging aspects of trying to build a user interface for data exploration and analysis, within this environment that is so graphically constrained, particularly given the fact that you have incorporated some visualization capabilities, and just some of the ways that that manifests?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: I have to say that I&#39;ve been pleasantly surprised that I haven&#39;t felt as constrained as I thought I would. For example, once I discovered that I could use Braille characters to do the graphing, it kind of just worked. It&#39;s not perfect, but if you want more perfect things, you should be using other tools. And in fact, that&#39;s one of the things I think that is important with VisiData, is that it&#39;s not meant to be a be-all and end-all. It&#39;s kind of a glue technology, right? It&#39;s an adapter. And so, once you figure out what you want to do, then you should go to the fancier tool and do it right. But there&#39;s no reason to do everything super right from the get go. You just want a quick glance at it.&lt;/p&gt;
&lt;p&gt;You asked about the most challenging aspects of building a terminal UI. And I have to say, the thing that&#39;s been most challenging for me is knowing that if VisiData were on the web, it would probably be worth a lot of money, and doing it in the terminal means that I&#39;ve kind of eschewed that. No one really pays for terminal tools. I shouldn&#39;t say no one — I actually have several Patreon subscribers, and I&#39;m really appreciative of them.&lt;/p&gt;
&lt;p&gt;But you know, if you think about how VisiCalc back in the day was a fancy program that sold for hundreds of dollars, I can&#39;t imagine doing that with VisiData. That&#39;s just not how the world works. Although, if it was a native app, that might make it possible to sell VisiData, for instance. The other thing that is more challenging than you might think, is that you mentioned pip installing something. And that&#39;s really great for people who already have Python and already know how to use pip. But I actually think VisiData is a pretty reasonable tool to use for anybody — anybody who&#39;s willing to use the keyboard anyway. And yet, installation is one of the trickier parts, right? If I wanted my partner to go and install it on her computer, I have to tell her &amp;quot;install this, click here, download this.&amp;quot; People just want a single thing they can download, they can double click on, and then go. And that&#39;s just not how the terminal world generally works. So I feel like installation is one of those weird things, where there&#39;s a larger barrier to entry than there should be, and yet I can&#39;t find a super easy way around that. So that&#39;s just how it has to be.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: I&#39;m also wondering which terminal environments it supports. Because Windows is generally one that&#39;s left out of the support matrix for a command line tool, but because of the fact that Python does have the curses interface built in, or if you are relying on the prompt toolkit library, I know that there is the possibility of being able to support the Windows command lines, I&#39;m just curious what the overall support matrix is for VisiData.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: I started off doing it in Linux, because that&#39;s what I run, and then it turns out that it works on a Mac terminal just fine. And I didn&#39;t have access to a Windows machine, and so I was like, well, Windows isn&#39;t fully supported. It turned out that people were just running it under Windows subsystem — Windows Subsystem for Linux, &lt;a href=&quot;https://github.com/saulpw/visidata/issues/192&quot;&gt;WSL&lt;/a&gt;, I think is what it&#39;s called? And it basically just worked there. Then somebody submitted &lt;a href=&quot;https://github.com/saulpw/visidata/pull/288&quot;&gt;a small patch&lt;/a&gt;, and it works even without WSL now, I think, on a more recent version of Windows. So I actually have never used it on Windows, but I know we&#39;ve got quite a few people. Some Italian open beta users, like &lt;a href=&quot;https://github.com/saulpw/visidata/issues?q=is%3Aissue+author%3Aaborruso&quot;&gt;Andrea Borruso&lt;/a&gt;, love using it on Windows, and it works fine. So as far as I&#39;m concerned, it works on Mac, Windows, and Linux and seems to be fine on all of those. So I wouldn&#39;t say those platforms are what we support, necessarily. But if it works, I&#39;m not gonna say we don&#39;t support it either, right?&lt;/p&gt;
&lt;h2 id=&quot;the-design-of-keybindings-[2954]&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/python-init/#the-design-of-keybindings-[2954]&quot;&gt;&lt;/a&gt;The design of keybindings [29:54]&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: [chuckles] Another peculiarity of building a command line oriented client is that it is heavily keyboard-driven, as you mentioned, and that means that you need to create the set of key bindings that will do whatever it is that you wanted to do. So I&#39;m wondering how you&#39;ve approached the overall design and selection of those key bindings, to ensure that there is a set of internal consistencies, and that the key bindings make semantic sense, but also so that you don&#39;t run out of key bindings in the event that you have some new capability that you want to run into, because it is a limited space, even when you do incorporate modifier keys.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Yeah, totally. We&#39;re running up against that now. There are few keys left, in some sense — at least, few keys that people want to use. So the main thing is that I have to use mnemonics to make sure that key bindings stick in my own memory. I actually have a pretty bad memory myself, and so if they don&#39;t fit my mental model, I can&#39;t remember them from one month to the next. So I&#39;ve made sure that they at least make sense to me. And because I&#39;ve been using terminal stuff for so long, I&#39;m already tuned into the the existing text culture that is around. So a lot of the key bindings are borrowed from vim, like &lt;code&gt;d&lt;/code&gt; for delete, &lt;code&gt;a&lt;/code&gt; for add, and so on.&lt;/p&gt;
&lt;p&gt;Actually, when I showed it to a guy on &lt;a href=&quot;http://free.ingy.net/&quot;&gt;Ingy döt Net&lt;/a&gt;, he chastised me for the fact that &lt;code&gt;Ctrl+Z&lt;/code&gt; didn&#39;t suspend in VisiData, and I was like, &amp;quot;Oh, you are totally right, that needs to be fixed right away.&amp;quot; And I did fix it right away, because you want to make sure that the things that people are used to will still work. And so &lt;code&gt;Ctrl+C&lt;/code&gt; will just work. The other thing I think is really important is that there&#39;s layers of mnemonics. We have a couple of modifier keys, and I wanted to keep those very simple. Like, I think that vim is great, but it feels daunting when you see all the different possible combinations.&lt;/p&gt;
&lt;p&gt;And so I hope that when you see that VisiData has exactly two prefix keys, that it feels like &amp;quot;okay, maybe we can wrap our heads around this.&amp;quot; And those are just modifiers on other existing commands. And so there&#39;s layers. Another piece of this is that column transreferences, for instance, are all on the symbol keys. And in fact, all the types are all on a single row. And so you&#39;ve got date is on &lt;code&gt;@&lt;/code&gt;, and converting into an int is on the &lt;code&gt;#&lt;/code&gt; sign. Those are all just adjacent to each other on the top row of the keyboard, and then other column things are also symbols.&lt;/p&gt;
&lt;p&gt;And so you don&#39;t get confused thinking well, &amp;quot;Isn&#39;t an int &lt;code&gt;i&lt;/code&gt;?&amp;quot; &amp;quot;– No, it&#39;s one of those ones up there.&amp;quot; &amp;quot;Which one is it? Oh, I think it might be the one that looks like that.&amp;quot; That helps me, anyway. And then everything that&#39;s for going to a new sheet is all on the Shift key. For me, it&#39;s like shift and sheet almost rhyme. So &lt;code&gt;Shift+F&lt;/code&gt; goes to the frequency sheet, stuff like that.&lt;/p&gt;
&lt;p&gt;And then finally there&#39;s symmetry, I think that&#39;s really important. So I reserved all of the pairs. For instance, open paren &lt;code&gt;(&lt;/code&gt;, close paren &lt;code&gt;)&lt;/code&gt;, open brace &lt;code&gt;{&lt;/code&gt;, close brace &lt;code&gt;}&lt;/code&gt;, those were all reserved from the get go, for things that have both a front and a back. So sorting is on the square brackets, and one way goes ascending and the other way goes descending. Scrolling down to the next item is a greater-than sign, versus the previous item, less-than sign. And I feel like symmetry on those things is very useful, but then also, more largely, symmetry between commands. So the &lt;code&gt;g&lt;/code&gt; prefix goes bigger, and the &lt;code&gt;z&lt;/code&gt; prefix is smaller, more precise. And so when you say &amp;quot;I want to delete all the rows I&#39;ve got selected.&amp;quot; That&#39;s &lt;code&gt;gd&lt;/code&gt;. &amp;quot;I want to unselect all rows,&amp;quot; that&#39;s &lt;code&gt;gu&lt;/code&gt;. To me, in a way, it feels like what makes sense. You may not know it before you discover it, but once you discover it, then it&#39;s sticky. I feel like that&#39;s a super important thing. So, the VisiData interface isn&#39;t made for the first time user, it&#39;s made for, like, the third time user.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: Yeah, there are definitely a lot of peculiarities, and a sort of culture and history built up around different key bindings. And as you mentioned, vim has its own set, Emacs has a different set of key bindings that people will be familiar with, and then there are any number of command line tools, that have all created this sort of general pattern of how you would craft these key bindings. So it&#39;s definitely interesting to hear some of the history of how you have approached it, because of your particular toolset choices. And like you said, anybody who&#39;s been living on the terminal long enough will find it fairly natural. I appreciate the care that you&#39;ve put into considering how you add new key bindings so that it doesn&#39;t just end up cluttered and so that it – so that you can have some sort of mnemonic muscle memory of being able to recreate a certain workflow once you pick it up. Because with any tool, there will be periods where you put it down for a while and don&#39;t come back to it. And then when you do come back to it, you want to be able to just get right back to being productive without having to go back to try and remember what were all the key commands, and look at the reference manual.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Yeah, totally. The other thing that we did was that a year ago or so we instituted longnames. So originally the key bindings was all we had, for example, &lt;code&gt;Shift+F&lt;/code&gt; means the frequency table, and that was the only way you could access it. But now there&#39;s actually a longname for that, I think it&#39;s open-frequency-table. I&#39;m not sure that&#39;s exactly right, don&#39;t quote me on that. But then you bind &lt;code&gt;Shift+F&lt;/code&gt; to that, so people can rearrange their keyboard, if they really want to, but it also gives them the ability to add commands that aren&#39;t bound to any key. For instance, if you make your own command in your &lt;code&gt;~/.visidatarc&lt;/code&gt;, you can make that and bind it yourself. Or if we create a command that&#39;s very unused — for instance, random rows. That used to be on &lt;code&gt;Shift+R&lt;/code&gt;, but then we made &lt;code&gt;Shift+R&lt;/code&gt; be redo, in the undo-redo pair, because that&#39;s kind of a symmetry between &lt;code&gt;Shift+U&lt;/code&gt; and &lt;code&gt;Shift+R&lt;/code&gt;, as opposed to vim&#39;s lowercase u, Control+R, which doesn&#39;t make natural sense, to me anyway. Anyway, I moved random rows off of &lt;code&gt;Shift+R&lt;/code&gt;, but then there&#39;s no real good place for the random selection of rows to go. So since I feel like selecting random rows is an infrequent operation, I put it on a long name, so then you can just press the spacebar and enter in a long name, and it goes ahead and does it. So that&#39;s another tactic, is to start moving things off of the default key bindings, into a huge list of possible commands that you could use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: Yeah, that&#39;s another thing that&#39;s got a long tradition, both in vim and Emacs and other tools — being able to have a way of opening a prompt, so that you can then start typing, as you said, a long-named command, or being able to start typing it and then maybe tab through to cycle through what the commands are, so that you don&#39;t have to necessarily remember all those off the top of your head as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Mm-hmm, totally. We do have tab completion, and it works anywhere that we have open prompt, including the long name thing.&lt;/p&gt;
&lt;h2 id=&quot;visidatas-capabilities-[3637]&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/python-init/#visidatas-capabilities-[3637]&quot;&gt;&lt;/a&gt;VisiData&#39;s capabilities [36:37]&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: Then, in terms of the types of analysis that VisiData can do out of the box, I know that you mentioned frequency analysis or histograms. But I&#39;m curious, what are some of the other capabilities that come natively in VisiData, and any of the interesting plugins that you or others have contributed for being able to expand the capabilities and utility of VisiData?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: So, out of the box, it can do all kinds of interesting stuff: searching and filtering, bulk editing and cleaning, spot checking, finding outliers. I use it, actually more often than I would think, for file format conversion. The ability to load any format and then save it to JSON or character separated value or Markdown is super handy, and it gets me from here to there a lot faster than I could otherwise. Even scraping a web page for its tables is basically built-in. Jeremy Singer-Vine, for instance, has written several &lt;a href=&quot;https://github.com/jsvine/visidata-plugins&quot;&gt;plugins&lt;/a&gt; already for the current version. He wrote one that does row duplication, and a loader for the FEC, the Federal Election Commission dataset, and you just download those and import them in your VisiData RC, and they&#39;re ready for action right away.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: And when I was looking at the documentation, it seems that one of the libraries that you can load into it is pandas, and I&#39;m wondering if that means that you can expose all of the pandas capabilities as well, as you&#39;re exploring these data sets. Because I know that that&#39;s often the tool people will reach for, their first time digging into a data set just to see what&#39;s the shape of it. And so I&#39;m curious how that works into the overall sort of use case of VisiData as the exploratory tool, and then where the boundaries are, when you might want to jump to pandas, or if you could just incorporate that whole flow together.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Yeah, that&#39;s interesting. I made a very simple adapter for pandas, it literally was maybe 20 lines of code at first, just because pandas supports a lot of different loaders, too, and it&#39;s super handy to be able to use those and browse those. But what&#39;s interesting is that pandas and VisiData don&#39;t actually play that well together. In order to do things like sorting, for instance, VisiData grabs each value and sorts based on that, but pandas&#39; built-in sort function does it more efficiently. And there&#39;s just no good way to do that automatically. You have to write all the commands in a way that&#39;s compatible with pandas for pandas sheets. And that&#39;s totally doable, but it&#39;s a fair amount of work, and I haven&#39;t done it. Somebody &lt;a href=&quot;https://github.com/saulpw/visidata/pull/267&quot;&gt;did make some modifications to make pandas more responsive&lt;/a&gt; in certain cases, to make things work better. And that&#39;s totally doable. Like I said, it takes a fair amount of work, and it doesn&#39;t happen naturally. You can&#39;t just use pandas&#39; things like you&#39;d think. You can use some of the functions that pandas has, on pandas sheets, and even on non-pandas sheets if they&#39;re standalone functions, but to use a pandas dataframe just naturally like you would, you probably are better off using it in Jupyter by itself.&lt;/p&gt;
&lt;h2 id=&quot;the-community-[3940]&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/python-init/#the-community-[3940]&quot;&gt;&lt;/a&gt;The community [39:40]&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: In terms of the overall growth and adoption of VisiData, it seems that there&#39;s a decent community that&#39;s grown up around it. And I&#39;m wondering how you approach the project governance and sustainability as a solo developer, and how you are looking to grow the community and incorporate more people into the future of VisiData.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Yeah. Well, you&#39;re saying I&#39;m a solo developer, but I&#39;ve got a little bit of help now. Like I said, Anja has been instrumental in helping me with decisions and discussions, stuff like that. There&#39;s also a #visidata channel on &lt;a href=&quot;https://webchat.freenode.net/&quot;&gt;freenode&lt;/a&gt; that several of us are hanging out in, where people can talk about things and ask questions. I prefer personally a chat system like that, because I find myself doing a lot better with chat, which I&#39;ve been on chat platforms for over 20 years now, than I do with email. Email is a lot heavier, it requires more intention and attention, and with chat I can just toss up an answer and it&#39;s just done.&lt;/p&gt;
&lt;p&gt;So I&#39;m, of course, the decider on those things. But I have to be honest, it kind of feels like I&#39;m discovering VisiData more than creating it at this point. It&#39;s like a chunk of marble to a sculptor, it tells me what it wants to become. And there are some things that I didn&#39;t even consider, and then I look at it like, why didn&#39;t I think of that already? For example, the rowtype down in the lower left corner, where it shows you lines or columns or whatever the current data type is. For the longest time, almost to 1.0, that just said, &amp;quot;rows&amp;quot;. And I didn&#39;t know why I even put the text there, if all it was going to do is say the same thing every time. And yet I felt strongly that it should be there. And then once I realized that should just be the rowtype, I was like, oh! And I don&#39;t feel like that was my creation. That&#39;s just how it had to be, if that makes sense.&lt;/p&gt;
&lt;p&gt;So there&#39;s that, and then you mentioned about project sustainability. The thing is, my energy is my most precious resource — my energy and ability to code. I have a day job, and so I come home at night, and it&#39;s then that I want to screw around with VisiData. But it&#39;s really hard to summon the energy when I don&#39;t have a concrete use case, or someone that really cares about something. So I have the most energy when somebody is around and is enthusiastic, and they have a sample data set, and they&#39;re like, I just want to do this thing to it. It becomes kind of a little puzzle you can put together. Can I use this existing command to do this, or here&#39;s a one-liner to put in their &lt;code&gt;~/.visidatarc&lt;/code&gt;, or does this require a different core piece of functionality — so that now, not just that case, but ten other cases can be solved too. Those are the things I enjoy the most, I actually do really enjoy solving those puzzles. But then sometimes we&#39;ll have people who ask for a generic feature, and it doesn&#39;t feel like it&#39;s very immediate, it&#39;s more abstract. Or if I have a concept for something that I&#39;ve been wanting for a while, and because there&#39;s nobody who really, really wants it, I get less motivated, and I just kind of decide to do something else.&lt;/p&gt;
&lt;h2 id=&quot;innovative-uses-of-visidata-[4251]&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/python-init/#innovative-uses-of-visidata-[4251]&quot;&gt;&lt;/a&gt;Innovative uses of VisiData [42:51]&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: So what are some of the most interesting or unexpected or innovative ways that you&#39;ve seen VisiData used?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: I feel like we have a couple of superfans, people who will use it for well more than they really should. One of them is a guy named &lt;a href=&quot;https://www.octoberswimmer.com/salesforce-consulting/&quot;&gt;Christian Warden&lt;/a&gt;, and he does a lot of Salesforce consulting and stuff. So he&#39;s got buckets of data, and just wants to move through it quickly. He built a duplicate row finder for some dataset with Python expressions and a .vd script. VisiData is not made for internal computation; you can have elements that compute within a row, no problem, but if you want to look at the previous row, it&#39;s not really meant for that. I mean, I&#39;d like to add that at some point, but I haven&#39;t figured out a really great way to do it yet. But he figured out how to pull it off, and it was an amazing beast, and it worked. It actually exposed a bug with computation, so that it was taking forever to run. But once he fixed that, it actually was remarkable, like, wow, you really have turned this into yet another Turing-complete programming environment. [laughs] So that has been kinda weird.&lt;/p&gt;
&lt;p&gt;Also, I&#39;m not sure if you or your listeners have seen the &lt;a href=&quot;https://www.youtube.com/watch?v=N1CBDTgGtOU&quot;&gt;lightning talk&lt;/a&gt; that I gave a couple years ago, but I had some data that had lat-long coordinates, and I was just curious if I could plot those in my little canvas. And it turns out that plotting latitude-longitude as x,y coordinates, works really well for maps, even for like a million points, there you go, you can see the distribution of things. It was surprising to me that it worked as well as it did to be honest. Like, I don&#39;t think this is built for geographic information at all, and yet you can kind of pull it off. So that&#39;s been both surprising and unexpected and – yeah, kinda pleasing, too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: Yeah, I did see that lightning talk. And that was one of the things that I was kind of blown away by as far as the visualization aspect of VisiData, given that it&#39;s a terminal environment. And so it&#39;s interesting to hear how you just mapped the lat-long to x,y coordinates. And I&#39;m sure that you just figured out what were the maximum bounds of the coordinates that you had to figure out, what the overall plane coordinates needed to be in relation to each other, so, that&#39;s pretty funny.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Yeah, thank you. One more thing, if you don&#39;t mind, that has been kind of surprising to me is how meta the thing goes. So editing VisiData&#39;s internals, using VisiData&#39;s own commands, is something that&#39;s been kind of surprising for me. Just yesterday, a user asked &lt;a href=&quot;https://github.com/saulpw/visidata/issues/356&quot;&gt;how they could get a type column on the Describe Sheet&lt;/a&gt;. And I thought about it and I was like, you know what you can do, is: you can go to the Columns sheet, and you can copy it from there, and then you can paste it onto the Columns sheet of the Describe Sheet. And it&#39;ll just work. And it&#39;s like, you couldn&#39;t possibly do that with Excel. Similarly, if you&#39;ve got 1000 columns, and you want to search or select all the ones that begin with a certain thing, and remove all those from the set, you can do that in VisiData. And that&#39;s no problem, it just works just like anything else. I have no idea how you do that in almost any other tool. And so I feel like the metadata editing aspect of it has been surprising for me, even though I put it in there, but the fact that it works as well as it does has been really kind of interesting.&lt;/p&gt;
&lt;h2 id=&quot;the-future-[4608]&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/python-init/#the-future-[4608]&quot;&gt;&lt;/a&gt;The future [46:08]&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: And looking forward, what are some of the features or improvements that you have planned for the future of VisiData?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: So right now we&#39;re working on the 2.0 release, which will be still a couple months out, and the goal is to stabilize it. The current version, 1.5.2, is actually incredibly stable, and really tight — there&#39;s at least one bug I&#39;ve seen, but that&#39;s fine, it was an edge case. But the API is all over the place, it&#39;s not as coherent as the user interface. And so one of the things we will want to do is make the API stable, and produce some more coherent documentation about the internals, we&#39;re calling it the &amp;quot;Book of VisiData.&amp;quot; And the point of that is so that we can let it rest and work on some other things, but we can let other people go wild and share their own creations — plugins, commands, loaders, or whatever, without destabilizing the core goodness that is there. So I&#39;m sure there will be a 2.1 or whatever after that. But I&#39;m really hoping that after 2.0, development can slow down, and I can move on to some other projects that I have in the queue.&lt;/p&gt;
&lt;p&gt;So one of the things that we&#39;ve been talking about that&#39;s gotten a bit of traction is something I&#39;ve been calling &amp;quot;Where in the Data is Carmen San Mateo?&amp;quot;, which is a throwback to an old game from the 80s and 90s, which maybe you&#39;ve heard of, called &amp;quot;Where in the World is Carmen San Diego?&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: I used to play it, yep.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Okay, yeah, so you&#39;re familiar. So the idea is that I want that kind of game, but with data and data sets. So it&#39;ll be for hardcore data nerds, kind of an escape-the-room game, or a choose-your-own-adventure kind of game, where you&#39;re solving a crime, but you get data sets to look at, and that&#39;s how you get the actual clues and solve the puzzles. I&#39;d like to work on that, and so that&#39;s my next project, probably, in the queue. But I don&#39;t really want to do that until we&#39;ve got VisiData 2.0 locked down, and we feel like it&#39;s a stable place for everybody.&lt;/p&gt;
&lt;h2 id=&quot;the-terminal-renaissance-[4809]&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/python-init/#the-terminal-renaissance-[4809]&quot;&gt;&lt;/a&gt;The terminal renaissance [48:09]&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: Are there any other aspects of VisiData or data exploration or any of the other accompanying projects that we didn&#39;t discuss yet, that you&#39;d like to cover before we close out the show?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Not specifically, although I did want to say that I feel like we&#39;re in an age of kind of a terminal renaissance. We went through the period of the late &#39;90s and early 2000s, where it was more graphics, all the time. And that was the obvious way up and out. But the terminal has been with us throughout, and I definitely have never left it. I feel like within the past, maybe 10 years or so, with projects like ohmyzsh and tmux/tmate and many other ones, that the terminal has been kind of getting a resurgence. And even now, when people go to data science boot camps and stuff, they have to learn the terminal and get involved in there too, because you need to be able to do that in order to dive deeply into data stuff. And so I feel like this is part of that. VisiData is saying no, wait a second, you don&#39;t have to be in the web graphics world in order to be high perfection — in fact, not being in that world makes it a lot easier for you, if you can just embrace the fact that you&#39;re going to be at the terminal and using a keyboard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: Yeah, I definitely appreciate the fact that there is a lot more focus being paid to just making things that work in the command line and being able to stitch them together. Because, as you said, the graphical interfaces – well, they are appealing, and it&#39;s easier to sell something to somebody who isn&#39;t as technical, if you&#39;re in that environment – they do bring a lot of extra weight and requirement to the development and maintenance of them, as well as, in some cases, the use of them, because they are definitely much more mouse -riven. And it makes it harder to be able to have just a unified flow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Yeah. And you know, to be honest, the versions of iOS and Windows are going to keep marching forward. And I have no doubt that if I made an app for the current version of either of those things, that in the next three or four years, it wouldn&#39;t work with the next version. I am actually pretty confident that if I don&#39;t touch VisiData for the next four years, that you&#39;ll be able to use it in the next version of Python, on whatever platform, no problem at all. And I find that to be really motivating to do a good job now, because I don&#39;t have to keep writing it, I have to do it good once.&lt;/p&gt;
&lt;h2 id=&quot;closing-[5034]&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/python-init/#closing-[5034]&quot;&gt;&lt;/a&gt;Closing [50:34]&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: For anybody who wants to follow along with the work that you&#39;re doing or get in touch, I&#39;ll have you add your preferred contact information to the show notes. And with that, I&#39;m going to move us into the picks, and this week I&#39;m going to choose a newsletter that I actually found while I was doing some research for this conversation, called Data is Plural. It&#39;s maintained by Jeremy Singer-Vine, who you mentioned a few times. It&#39;s a weekly newsletter with different interesting data sets that looks to have some fairly curious discoveries. So if you&#39;re looking for something to experiment with VisiData, you might have some interesting finds in there. So with that, I&#39;ll pass it to you, Saul, do you have any picks this week?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: I wanted to promote tmate, which I think I have during this episode already. Definitely give tmate a look, if you&#39;re a terminal user and want to have a multi-user experience; there are a lot of other tools in that same vein like mosh, I want to give a shoutout to, the mobile shell for less than perfect network connections. And – yeah, there&#39;s all kinds of good tools out there, but I&#39;m not sure I can come up with any more off the top of my head.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tobias Macey&lt;/strong&gt;: All right, well, thank you very much for taking the time today to join me and share the work that you&#39;ve been doing with VisiData. It&#39;s definitely something that I&#39;m going to be experimenting with because I spend a fair amount of my time on the terminal, and have to do a lot of exploration of random data sets, whether it&#39;s just .csv&#39;s or piping things from different batch commands. So thank you for all of your work on that tool, and I hope you enjoy the rest of your day!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saul Pwanson&lt;/strong&gt;: Awesome, thank you very much! I hope you have a great day too.&lt;/p&gt;
&lt;h2 id=&quot;outro-[5206]&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/python-init/#outro-[5206]&quot;&gt;&lt;/a&gt;Outro [52:06]&lt;/h2&gt;
&lt;p&gt;[Outro music begins.]
&lt;strong&gt;Tobias Macey&lt;/strong&gt;: Thank you for listening. Don&#39;t forget to check out our other show, the Data Engineering Podcast, at dataengineeringpodcast.com, for the latest on modern data management. And visit the site at pythonpodcast.com to subscribe to the show, sign up for the mailing list, and read the show notes. And if you&#39;ve learned something, or tried out a project from the show, then tell us about it. Email host@podcastinit.com with your story. To help other people find the show, please leave a review on iTunes and tell your friends and coworkers.
[Outro music ends.]&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>The very last VisiData TinyLetter!</title>
    <link href="https://visidata.org/blog/2018/tinyletter-16/"/>
    <updated>2018-12-26T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/tinyletter-16/</id>
    <content type="html">&lt;p&gt;[originally published as TinyLetter #16]&lt;/p&gt;
&lt;p&gt;Hello VisiData enthusiast,&lt;/p&gt;
&lt;p&gt;Thanks for signing up for this TinyLetter and for your continued support.  After some reflection I&#39;ve decided to move these kinds of updates to my Patreon, and I would encourage you to check out the most recent one, which talks about v1.5.1, a forking undo experiment, and saving to sqlite:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.patreon.com/posts/v1-5-1-released-23468786&quot;&gt;https://www.patreon.com/posts/v1-5-1-released-23468786&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If VisiData is your jam then I would also encourage you to subscribe, because there will be some pretty interesting things coming in the next year.  But all posts will be made public, so you don&#39;t even have to subscribe in order to stay updated.&lt;/p&gt;
&lt;p&gt;Happy new year, and please come join me on Patreon!&lt;/p&gt;
&lt;p&gt;Saul&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Version 1.3.1 released; is this the last TinyLetter?</title>
    <link href="https://visidata.org/blog/2018/tinyletter-15/"/>
    <updated>2018-08-31T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/tinyletter-15/</id>
    <content type="html">&lt;p&gt;[originally published as TinyLetter #15]&lt;/p&gt;
&lt;p&gt;Hello VisiDaters!&lt;/p&gt;
&lt;p&gt;The past few months since v1.2 have been a whirlwind. We&#39;ve completely reworked the commands and options, created a new keyboard layouts page, and added some new power features. For full details, please see the release notes for v1.3.&lt;/p&gt;
&lt;p&gt;This was a particularly intense release because it involved substantial changes to the underlying architecture. We have already sent out a patch for the most pressing issues and are now heading towards a v1.3.2 release, since we&#39;ve found and fixed a couple more bugs since then.&lt;/p&gt;
&lt;p&gt;The plan is to release v1.3.2 in a couple weeks.  Due to the scope of the next batch of planned features, along with me transitioning to a new job starting next month, the next release may not be for quite awhile.  So please give v1.3.1 your diligent attention, and if you notice and bugs or nagging issues, let us know by filing an issue and we&#39;ll do our best to fix them for 1.3.2 so that our collective VisiData experience is maximally awesome.&lt;/p&gt;
&lt;p&gt;Finally, I&#39;m thinking of retiring this TinyLetter.  I&#39;ve been sending these letters for about a year now, and this kind of &#39;marketing&#39; output is draining for me and does not seem to provide any clear benefit.  (Does anyone get any value from these letters?  I don&#39;t get responses to my requests for feedback so I have no way of knowing.)  If anyone wants to help out with crafting these monthly updates (or posting tidbits to twitter, or reddit, or whatever), that would be very welcome!  Otherwise we&#39;ll just drop it and hopefully our other channels (github releases, website, maybe twitter) will be sufficient to notify people of the goings-on.&lt;/p&gt;
&lt;p&gt;VisiData your heart out!&lt;/p&gt;
&lt;p&gt;Saul&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>I&#39;ll show you my .visidatarc if you show me yours</title>
    <link href="https://visidata.org/blog/2018/tinyletter-14/"/>
    <updated>2018-07-24T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/tinyletter-14/</id>
    <content type="html">&lt;p&gt;[originally published as TinyLetter #14]&lt;/p&gt;
&lt;p&gt;Yo VisiDaters,&lt;/p&gt;
&lt;p&gt;Do you have a .visidatarc file? It&#39;s where you can set options and add your own commands, keybindings, and functions to use in expressions--super handy for fine-tuning your personal experience of VisiData. If you have one, I would love to see it. Please send it to me [vd@saul.pw] and if there&#39;s any common trends, it may even inspire changing the defaults.&lt;/p&gt;
&lt;p&gt;Additionally, I wanted to demonstrate the cmdlog history, which is toggled by an option. If you add this to your .visidatarc:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; options.cmdlog_histfile = &amp;quot;~/.visidata/history.vd&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;it will append each command to the cmdlog also to that file. Then you can press gD to go to the .visidata directory, and ENTER to visit the history. I&#39;ve used this with zY (syscopy-cell) to copy/paste a complicated regex I had used a session or two before.&lt;/p&gt;
&lt;p&gt;Finally, we are considering dropping the menu system. Does anyone use and/or like it? Anja opened up an issue on Github and we&#39;d love your comments: &lt;a href=&quot;https://github.com/saulpw/visidata/issues/174&quot;&gt;https://github.com/saulpw/visidata/issues/174&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Keep an eye out for v1.3 in August!&lt;/p&gt;
&lt;p&gt;Happy VisiDating,
Saul&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>VisiData: Video #6 (Big Melt); keyboard cheatsheet; the Great Renaming</title>
    <link href="https://visidata.org/blog/2018/tinyletter-13/"/>
    <updated>2018-06-21T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/tinyletter-13/</id>
    <content type="html">&lt;p&gt;[originally published as TinyLetter #13]&lt;/p&gt;
&lt;p&gt;Been awhile since I rapped at ya!  I started a job last week, so I&#39;m going to keep this short, but I wanted to let you know about a few things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Video #6 is out, and this time it&#39;s all about Big Melt (&#39;gM&#39;), a variant of Melt (&#39;M&#39;) that was added to 1.2:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/9RndW_yC45U&quot;&gt;https://youtu.be/9RndW_yC45U&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;As we&#39;re talking about adding an &#39;undo&#39; command and which key to put it on, Daniel E. (@deinspanjer) had the great idea to make a keyboard cheatsheet. If you&#39;re interested in following the discussion, here it is:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/issues/160&quot;&gt;https://github.com/saulpw/visidata/issues/160&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Finally, the longnames are going to be renamed in v1.3, probably to what will become their final home.  These are what will appear in the cmdlog (instead of keystrokes), and used for keybindings, macros, etc.  If anyone is interested in reviewing these names for intuitive conceptual integrity, please email me!  I&#39;d love to have some more eyes on this endeavor.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Happy Summer VisiDating,
Saul
vd@saul.pw&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>PyCon2018 and Video #5</title>
    <link href="https://visidata.org/blog/2018/tinyletter-12/"/>
    <updated>2018-05-19T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/tinyletter-12/</id>
    <content type="html">&lt;p&gt;[originally published as TinyLetter #12]&lt;/p&gt;
&lt;p&gt;Greetings VisiDaters!&lt;/p&gt;
&lt;p&gt;I&#39;m back from PyCon2018, but still recovering, so I&#39;ll keep this one short.&lt;/p&gt;
&lt;p&gt;First, PyCon happened!  There was no lightning talk this time, but we had both an &amp;quot;Open Space&amp;quot; and a sprint for VisiData, and it was great to engage directly with users.  Several fixes and documentation improvements are in the works because of suggestions we got during these sessions.  Thanks in particular to Rob, John, and Anja for sprinting on a yaml loader and the new rows-[un]select-expr commands, both of which will be available in v1.3.&lt;/p&gt;
&lt;p&gt;Second, there&#39;s a new Twitter handle in town!  &lt;a href=&quot;https://twitter.com/VisiData&quot;&gt;@VisiData&lt;/a&gt; &lt;s&gt;(note the underscore)&lt;/s&gt; is now the official VisiData account to follow.  I migrated my personal account (and recreated a new personal account), so you won&#39;t have to do anything if you&#39;re already following me.  But it&#39;s a lot clearer now which tweets should go where.&lt;/p&gt;
&lt;p&gt;And finally, here&#39;s video case study #5, in which I reshape an html table using a bunch of nifty commands, including fill (&#39;f&#39;), melt (&#39;M&#39;), and pivot (&#39;W&#39;): &lt;a href=&quot;https://www.youtube.com/watch?v=0iJ9F4uTkz8&quot;&gt;https://www.youtube.com/watch?v=0iJ9F4uTkz8&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Okay, I&#39;m off to sleep off some more jetlag.  Thanks for using VisiData, and as always, feel free to send me an email, I&#39;d love to hear how you&#39;re using it!&lt;/p&gt;
&lt;p&gt;Saul
vd@saul.pw&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Version 1.2 released; video #4 describes a major new feature</title>
    <link href="https://visidata.org/blog/2018/tinyletter-11/"/>
    <updated>2018-05-03T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/tinyletter-11/</id>
    <content type="html">&lt;p&gt;[originally published as TinyLetter #11]&lt;/p&gt;
&lt;p&gt;Hello VisiDaters!&lt;/p&gt;
&lt;p&gt;There are a couple of items this time.&lt;/p&gt;
&lt;p&gt;First, we have released v1.2!  It is currently up on pypi, and is making its way to all of our other distributions. Here are the highlights (the release notes for v1.2 can be found at https://github.com/saulpw/visidata/releases/tag/v1.2):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;an additional install method: conda, via the conda-forge channel (https://github.com/saulpw/visidata#install-via-conda)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;expanded commands such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;g^S&lt;/code&gt; (multisave all sheets),&lt;/li&gt;
&lt;li&gt;&lt;code&gt;g*&lt;/code&gt; (replace selected row cells with regex transform)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gM&lt;/code&gt; (melt using regex capture groups to transform columns into Variable-Value-Value... rows).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a prototype for a new macro system. On the CommandLog, z^S will allow you save selected rows to a macro for a given keystroke.  These macros will be saved to the .visidata folder and loaded automatically on startup.  Give it a try, and please let me know what does or does not work for you!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;new loaders for sas7bda, xpt, sav and dta (SAS, Stata, and SPSS formats)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;and last but certainly not least, an expansion of the directory browser.  Users can now modify file metadata, move files around, and delete files, all within the existing VisiData framework.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This last feature is so powerful that we made a video demonstrating it.  Video #4 (https://www.youtube.com/watch?v=l2Bpmm0yAGw) is up on Youtube.&lt;/p&gt;
&lt;p&gt;Secondly, I&#39;ve been so heartwarmed by those of you who have reached out recently to share what you love about VisiData.  It&#39;s really inspiring!&lt;/p&gt;
&lt;p&gt;In particular, a couple of you were so happy that VisiData does not save anything to disk or use any swap or tmp files, without explictly executing one of a very small set of commands--only ^S ^D ^O (save data, record cmdlog, open external).  This had not been an explicit design decision, but I can definitely see its value, so we will do our best to preserve it.&lt;/p&gt;
&lt;p&gt;This feedback was timely, however, as there is now &amp;quot;command history autosave&amp;quot; in v1.2.  One source of frustration I&#39;ve had with VisiData, is that I sometimes find a great workflow and then quit out entirely mere seconds before realizing I wanted to save the commandlog.  But taking the above design decision into account, it is disabled by default.  If you want to give it a try yourself, you can put this in your .visidatarc:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;options.cmdlog_histfile=&#39;~/.visidata/history.vd&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next week, we will be in Cleveland at PyCon.  If you will be there, send me an email and let me know!  I would love to say hi and chat for a bit.&lt;/p&gt;
&lt;p&gt;Au revoir (for at least a couple weeks),
Saul&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>VisiData Case Study #3: graphing calculator</title>
    <link href="https://visidata.org/blog/2018/tinyletter-10/"/>
    <updated>2018-04-16T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/tinyletter-10/</id>
    <content type="html">&lt;p&gt;[originally published as TinyLetter #10]&lt;/p&gt;
&lt;p&gt;Hello fellow VisiDaters!&lt;/p&gt;
&lt;p&gt;Video case study #3 is now available.  This newest installment focuses on creating your own datasets out of nothing: adding blank sheets/rows/columns, mass editing, setting a column to a Python range, and all under the guise of using VisiData as a graphing calculator.  Which it&#39;s not half-bad at!&lt;/p&gt;
&lt;p&gt;See the video here: &lt;a href=&quot;https://www.youtube.com/watch?v=yK3qgOIx4x0&quot;&gt;https://www.youtube.com/watch?v=yK3qgOIx4x0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also, I&#39;m going to be at the PyCon Python conference in a few weeks.  If you&#39;re going too, send me a note and let&#39;s meet up!  I&#39;d love to put together a VisiData side session if anyone&#39;s interested.&lt;/p&gt;
&lt;p&gt;That&#39;s all for now, but keep your eyes peeled for v1.2 , which will have (among many other improvements) a &#39;g+Ctrl-S&#39; command to save all sheets at once.&lt;/p&gt;
&lt;p&gt;Bonnes DonnéesVisi,
Saul&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>VisiData Case Study #2: save selected cities from a csv in json format</title>
    <link href="https://visidata.org/blog/2018/tinyletter-9/"/>
    <updated>2018-04-09T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/tinyletter-9/</id>
    <content type="html">&lt;p&gt;[originally published as TinyLetter #9]&lt;/p&gt;
&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;The next installment of the VisiData video series is here!  This time, a member of my co-working space had asked if I could create a bubble map of cities from a few particular counties.&lt;/p&gt;
&lt;p&gt;It was pretty straightforward to do this with Google Maps and a bit of Javascript, but then I had to get the location and population data for 50 cities into json format.  Normally this would require a small script and 20 minutes of trial and error, but fortunately, there is VisiData, and I was able to get this done in only a couple of minutes.  Besides being a lot faster, it&#39;s also a lot more fun to play with data this way!&lt;/p&gt;
&lt;p&gt;So here&#39;s the video that explains the process:  &lt;a href=&quot;https://www.youtube.com/watch?v=j0qn8OIiV-w&quot;&gt;https://www.youtube.com/watch?v=j0qn8OIiV-w&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This video shows how to group rows by multiple columns, and then select rows from particular groups, to be saved into a .json file.&lt;/p&gt;
&lt;p&gt;If you have a data task that you&#39;d like to do with VisiData, but aren&#39;t exactly sure of the best way to do it, send me an email!  There&#39;s probably a reasonably easy way to make it happen, and I&#39;d love to help make your data life easier.&lt;/p&gt;
&lt;p&gt;Cheers,
Saul
vd@saul.pw&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>VisiData Case Study #1 released on Youtube</title>
    <link href="https://visidata.org/blog/2018/tinyletter-8/"/>
    <updated>2018-04-02T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/tinyletter-8/</id>
    <content type="html">&lt;p&gt;[originally published as TinyLetter #8]&lt;/p&gt;
&lt;p&gt;Hello everyone,&lt;/p&gt;
&lt;p&gt;Welcome all you new subscribers!  Thank you for your emails, issue submissions, and for spreading the VisiData love around.  One of the more frequent comments I&#39;ve gotten, is that people really enjoy using VisiData, but feel like they&#39;re only taking advantage of a small fraction of what it has to offer.  So I&#39;m starting to create a new video series to help people get the most out of VisiData.&lt;/p&gt;
&lt;p&gt;The first video, released today (no joke!), is a 5 minute case study, which takes a list of donations from a webpage and transforms it into a columnar form that is convertible into USD and easily summed.  It was just a trivial curiosity I had a few weeks ago, which would not be worth investigating unless it were as easy as VisiData makes it.  But since it was so easy, I thought I would capture the steps and demonstrate how you can replicate the results for yourself.&lt;/p&gt;
&lt;p&gt;See the video here: https://youtu.be/yhunJc8Nu4g&lt;/p&gt;
&lt;p&gt;In the video, I mention a USD() function which converts arbitrary currency amounts into USD at today&#39;s rates.  It&#39;s not that much code, and I will probably include it in a snippets directory at some point, but if you&#39;d like a private preview, email me and I&#39;ll send it to you.&lt;/p&gt;
&lt;p&gt;I&#39;m planning to make more of these videos, so also let me know if you have a request for some feature or workflow that you&#39;d like covered!&lt;/p&gt;
&lt;p&gt;Happy VisiDating,
Saul&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>VisiData 1.1 released: menus and more</title>
    <link href="https://visidata.org/blog/2018/tinyletter-7/"/>
    <updated>2018-03-06T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/tinyletter-7/</id>
    <content type="html">&lt;p&gt;[originally written as TinyLetter #7]&lt;/p&gt;
&lt;p&gt;Hello fellow textpunks,&lt;/p&gt;
&lt;p&gt;We got a bunch of new subscribers over the weekend, as the lightning talk VisiData video was submitted to HackerNews, and it proceeded to climb onto the front page where it stayed the whole day.  This generated a bunch of traffic and a lot of positive response!  It seems like people are starting to understand VisiData as more than just a way to view csv files in the terminal.&lt;/p&gt;
&lt;p&gt;This was a bit of unfortunate timing, though, since the newcomers all saw v1.0, and we were just about to release v1.1, which has several new features and many improvements.  But that&#39;s how these things go, and we just kept on our path and released VisiData v1.1 last night as scheduled anyway.  The full release notes are on Github (and we&#39;ll update the website tonight or tomorrow), but here are the highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The Spacebar now invokes an experimental command menu system. Hopefully this can both let people know what functionality is available, and help them learn the command keys as they explore.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The new &lt;code&gt;(&lt;/code&gt; and &lt;code&gt;)&lt;/code&gt; commands expand and unexpand list/dict columns.  This should be very useful with e.g. nested json data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Data can now be copied directly to the system clipboard.  Jeremy Singer-Vine asked for this feature a few months ago, and I can see it being very handy for e.g. pasting a short summary into an email.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of, Jeremy has been putting together a tutorial for VisiData, which is looking really great!  Many people have asked for something like this, and he&#39;s done a much better job than I could ever hope to do.  Check it out and get some ideas of how to use VisiData to its fullest.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, VisiData has been accepted into Debian!  Currently in the unstable repository, it will move into stable for the next Debian release.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&#39;ve been thinking a lot lately about the community of terminal users.  There are a lot of great tools out there: the old standards like vim, the recent replacements like tmux, modern themes like ohmyzsh; and I hope that someday VisiData will be considered part of that pantheon.  Maybe I should convert textpunks.com (which has been sitting idle for a long time) into a lifestyle site for all of us terminal fanatics.  Would there be any interest in something like that?&lt;/p&gt;
&lt;p&gt;As usual, feedback and suggestions are very welcome; send me an email at vd@saul.pw and say hello!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>VisiData 1.0 official release!</title>
    <link href="https://visidata.org/blog/2018/tinyletter-6/"/>
    <updated>2018-01-26T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/tinyletter-6/</id>
    <content type="html">&lt;p&gt;[originally published as TinyLetter #6]&lt;/p&gt;
&lt;p&gt;Hello again VisiData enthusiasts,&lt;/p&gt;
&lt;p&gt;VisiData 1.0 has been officially released!  The full release notes (including changelog) can be found at &lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v1.0&quot;&gt;https://github.com/saulpw/visidata/releases/tag/v1.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The biggest part of this release is the redesigned and reorganized website, at http://visidata.org.  I would love it if you would take a few minutes to fill out a quick survey at https://www.surveymonkey.com/r/8JBN8BM and tell me how you use VisiData and what other features you might want to have.&lt;/p&gt;
&lt;p&gt;This is a huge milestone for VisiData.  I devoted my sabbatical (the entire year of 2017) to creating an open-source tool that would be useful for myself and other terminal users, and it was very important for me to release a stable and lasting 1.0 so that it could be set aside when I resumed working.&lt;/p&gt;
&lt;p&gt;We could have gotten away without certain features and with fewer supported formats, but there is such breadth and depth included in 1.0 (as shown by demos like this one at the PyCascades 2018 conference: https://www.youtube.com/watch?v=N1CBDTgGtOU), that I&#39;m hard-pressed to choose which features should have been omitted.&lt;/p&gt;
&lt;p&gt;Now that 1.0 has been released, I would especially love to hear from you.  If nothing else, send a quick email to vd@saul.pw and let me know that you&#39;re using it!&lt;/p&gt;
&lt;p&gt;Happy VisiDating,
Saul&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>VisiData v0.99 released; last stop before 1.0</title>
    <link href="https://visidata.org/blog/2017/tinyletter-5/"/>
    <updated>2017-12-26T00:00:00Z</updated>
    <id>https://visidata.org/blog/2017/tinyletter-5/</id>
    <content type="html">&lt;p&gt;[originally published as TinyLetter #5]&lt;/p&gt;
&lt;p&gt;Hello fellow VisiDataists,&lt;/p&gt;
&lt;p&gt;We pushed v0.99 to PyPi last week.  This release includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tab completion for filenames and expressions;&lt;/li&gt;
&lt;li&gt;an html loader;&lt;/li&gt;
&lt;li&gt;a json saver;&lt;/li&gt;
&lt;li&gt;and several tweaks; see the Changelog for the full list of changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The only remaining goal for 1.0 is to be installable via a single command on most systems, even if they don&#39;t have Python and pip3 already installed.&lt;/p&gt;
&lt;p&gt;So we are in the process of undergoing review for inclusion in the Debian package repository and homebrew-core, and hopefully getting close.  (The process is more elaborate than it might seem.) Anja has been doing a great job preparing the packages, perfecting the install process, and tying up the all the technical loose ends so that our pull requests won&#39;t be rejected.  But it is the holidays and these things just take time.&lt;/p&gt;
&lt;p&gt;Here&#39;s hoping they accept VisiData in the next week or two.  But even if they don&#39;t, we have our own brew/apt repositories set up, and even now, you should be able to install on MacOS with the single command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install saulpw/vd/visidata
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;which isn&#39;t too bad.  But I&#39;d still love to release the formal 1.0 in the official standard repositories.&lt;/p&gt;
&lt;p&gt;In the meantime, I would love it if you would test the bejeesus out of v0.99, and file any issues on github.  The goal is to have a stable 1.0 that is a reliable workhorse of a tool, that can be useful to myself and others for years to come without any need for major bugfixes or updates.&lt;/p&gt;
&lt;p&gt;That is not to say that I&#39;m done with VisiData; in fact, I can&#39;t wait to start working on the next version, which will include a more discoverable menu system and some major internal refactoring.  But I realize that I&#39;ve been putting off these refactors for months now because 1.0 seemed closer than it was.  So actually getting out a 1.0 stable release would go a long way to ease my mind, before everything gets shuffled around (which might take awhile to become seamless again).&lt;/p&gt;
&lt;p&gt;As usual, I would love to hear how you use VisiData.  Keep an eye out for the 1.0 release in early January!&lt;/p&gt;
&lt;p&gt;Happy holidays,
Saul&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>VisiData v0.98 has been released!</title>
    <link href="https://visidata.org/blog/2017/tinyletter-4/"/>
    <updated>2017-11-24T00:00:00Z</updated>
    <id>https://visidata.org/blog/2017/tinyletter-4/</id>
    <content type="html">&lt;p&gt;[originally published as TinyLetter #4]&lt;/p&gt;
&lt;p&gt;Hello all,&lt;/p&gt;
&lt;p&gt;Tonight Anja and I released VisiData v0.98, which can be installed as usual via pip3.  In addition to the graphs I demo&#39;ed a few weeks ago, VisiData now also displays maps, sourced from .shp or (vector) .mbtiles.  Both graphs and maps are available with the &#39;.&#39; (dot) command (instead of &#39;m&#39; as mentioned in the preview video).  dot == plot.&lt;/p&gt;
&lt;p&gt;It also finally has mouse support, which is useful on a canvas to select a cursor region with left click-drag, to scroll around with right click-drag, and to zoom in/out with the scrollwheel.  This has not been tested on MacOS, so maybe there is a better binding for e.g. scrolling.  If anyone has an opinion on this feel free to weigh in.  On a tabular sheet, mouse support is limited to setting the row cursor with left-click and scrolling rows with the scrollwheel.&lt;/p&gt;
&lt;p&gt;There are several command and option changes.   A few that might affect you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the &#39;headerlines&#39; and &#39;skiplines&#39; options are now called &#39;header&#39; and &#39;skip&#39;.&lt;/li&gt;
&lt;li&gt;&#39;P&#39; is now &amp;quot;paste before&amp;quot; (like vim).  &#39;R&#39; is now &amp;quot;get a random population sample&amp;quot;.&lt;/li&gt;
&lt;li&gt;&#39;^Z&#39; now suspends the program.  &#39;^O&#39; (&amp;quot;open&amp;quot;) launches the external $EDITOR (from the builtin editor).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can see a longer list of the additions and changes in the release notes (https://github.com/saulpw/visidata/releases/tag/v0.98).&lt;/p&gt;
&lt;p&gt;Happy Visidating,
Saul&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>VisiData v0.98 preview: Graphs</title>
    <link href="https://visidata.org/blog/2017/tinyletter-3/"/>
    <updated>2017-11-06T00:00:00Z</updated>
    <id>https://visidata.org/blog/2017/tinyletter-3/</id>
    <content type="html">&lt;p&gt;[originally published as TinyLetter #3]&lt;/p&gt;
&lt;p&gt;Hello VisiDaters,&lt;/p&gt;
&lt;p&gt;I recorded a 5 minute screencast to demo the new graphing functionality that will be out in v0.98 later this month.  Along the way, I show how to use &#39;A&#39; and &#39;ga&#39; to make a new sheet from nothing, and &#39;=&#39; to make computed columns.&lt;/p&gt;
&lt;p&gt;Here is the screencast on YouTube: &lt;a href=&quot;https://youtu.be/Ozap_numsjI&quot;&gt;https://youtu.be/Ozap_numsjI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let me know if you have any workflows or features you are interested in hearing more about!&lt;/p&gt;
&lt;p&gt;Saul&lt;/p&gt;
</content>
  </entry>
</feed>