<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shreyas Ragavan</title>
    <description>The latest articles on DEV Community by Shreyas Ragavan (@shrysr).</description>
    <link>https://dev.to/shrysr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F113722%2Faf065ed0-8699-4450-89ba-a5071d5a576d.jpeg</url>
      <title>DEV Community: Shreyas Ragavan</title>
      <link>https://dev.to/shrysr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shrysr"/>
    <language>en</language>
    <item>
      <title>Setting up Continuous Integration (CI) for docker containers</title>
      <dc:creator>Shreyas Ragavan</dc:creator>
      <pubDate>Wed, 22 Jan 2020 06:30:00 +0000</pubDate>
      <link>https://dev.to/shrysr/setting-up-continuous-integration-ci-for-docker-containers-4ohl</link>
      <guid>https://dev.to/shrysr/setting-up-continuous-integration-ci-for-docker-containers-4ohl</guid>
      <description>&lt;p&gt;This blog post takes you through the process of setting up Continuous Integration for building docker images via Dockerhub and Github, and via Github Actions. It also contains a condensed summary of important notes from the documentation.&lt;/p&gt;

&lt;p&gt;Goal: Gain an overview of CI and actually use it to get automated builds of the docker images that built for my datascience toolbox.&lt;/p&gt;

&lt;p&gt;Essentially I want to be able to a status check the docker containers that I am maintaining. Eventually I want to setup a series of checks that the libraries and software tools that I use are working as expected. Though dockerhub enables containers to be built on a commit, I would also like a CI/CD pipeline to be setup in order to understand how it actually works.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pre-requisites : a dockerhub account and some dockerhub image to work off with. The dockerfile and related source code should be available in a github repository.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The github repository I will use is &lt;a href="https://github.com/shrysr/sr-ds-docker"&gt;shrysr/sr-ds-docker&lt;/a&gt; and the dockerhub image &lt;a href="https://hub.docker.com/r/shrysr/shiny"&gt;shrysr/shiny&lt;/a&gt;. Within the github repository, the shiny folder contains all the files needed to build the shiny image. Note here that the rbase image is required for the shiny image to build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plan &lt;code&gt;[3⁄3]&lt;/code&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; Complete reading the &lt;a href="https://help.github.com/en/actions"&gt;Github documentation on github actions&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;ol&gt;

&lt;li&gt; setup a github hosted runner&lt;/li&gt;

&lt;li&gt;[-] Setup a self-hosted runner : &lt;del&gt;Lower priority&lt;/del&gt; Postponed because it is better to understand how a runner works with github code before allowing any github code to run on my VPS.&lt;/li&gt;

&lt;/ol&gt;

&lt;ol&gt;
&lt;li&gt; Create a CI integration between Dockerhub and Github&lt;/li&gt;
&lt;li&gt; Expand the CI setup to the datascience docker containers.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Setting up a Github Runner &lt;code&gt;[0/1]&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;A github runner is essentially creatd by using the Actions tab. There is a marketplace of Actions that can be used for free. Actions already exist for many popular workflows like building a docker image and pushing it to some registry.&lt;/p&gt;

&lt;p&gt;Apparently the first action has to be a checkout of the repository. Without this step, the process will not work. I spent a long time in&lt;/p&gt;

&lt;p&gt;Specify build context to a specific folder. i.e do not use &lt;code&gt;build .&lt;/code&gt; because then the context and paths will not work, thus the &lt;code&gt;COPY&lt;/code&gt; type functions won’t work.&lt;/p&gt;

&lt;p&gt;Apparently Github will reocognise yaml files only within the &lt;code&gt;.github/workflows&lt;/code&gt; location, though I may be wrong. If their autosuggestion for the action setup is used, the folder is created automatically. However, thankfully,any YAML file created in this folder will be run by Github actions. Refer to the notes below regarding the API limitations. Since it appears that this YAML file cannot be used for say Travis or CircleCI, it may be good to have these within the github folder anyhow.&lt;/p&gt;

&lt;p&gt;Getting started was as simple as using the actions tab when the repository is opened. A basic YAML template is offered and was actually sufficient for me to quickly get started.&lt;/p&gt;

&lt;p&gt;The build context is specified by the location of the file in this case, and the tag can be specified. Currently, I’m using an ephemeral container.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; An idea for a test would be like : run an ubuntu docker container, and then call the shiny container within it. Get the container running, and then also devise some output via R scripts. One way could be load a bunch of packages. Another way could be to get a shiny app to run and provide some kind of temporary output. This has to be refined further.
&amp;lt;!--listend--&amp;gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Docker Image CI

on: [push]

jobs:

  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: shiny
      run: docker build . --file /shiny/Dockerfile --tag my-image-name:$(date +%s)q
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The build details can be found by clicking on the individual jobs. The raw log can be downloaded for verbose logs to enable a good text search. During a live build process, there is some lag between the log update and the webpage refresh, however it seems within tolerable limits as of now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shreyas.ragavan.co/img/github-actions-list-of-builds.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MvQR_VVr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shreyas.ragavan.co/img/github-actions-list-of-builds.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shreyas.ragavan.co/img/detailed-build-info-github-actions.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FM1b1XXI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shreyas.ragavan.co/img/detailed-build-info-github-actions.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Notes about build and queue
&lt;/h3&gt;

&lt;p&gt;The free build time is rather long and the configuration of the servers is unknown. It is probably a lot faster to build the images locally and push them to dockerhub. However, minor image updates and small image builds are quite quick to take place. The key is getting a single successful build off a github commit after which the context is established and new layers need not take the same amount of time.&lt;/p&gt;

&lt;p&gt;All this being said, the queue time in dockerhub is very long compared to the queue time of builds via actions on Github. The free tier is actually quite generous for a lot of room to play and experiment. It would also appear that the github computer servers are faster than Dockerhub.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up CI via Dockerhub and Github
&lt;/h2&gt;

&lt;p&gt;The pre-requisite is of course that you have a docker image in your repository.&lt;/p&gt;

&lt;p&gt;This process is relatively simple. Login to your Dockerhub account and click on the fingerprint like icon to reach the account settings. Use the linked accounts tab and setup github with your login credentials.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shreyas.ragavan.co/img/account-settings-dockerhub.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GiCJHS4U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shreyas.ragavan.co/img/account-settings-dockerhub.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, select your docker image repository and click on the Builds tab and click on setup automated builds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shreyas.ragavan.co/img/configure-automated-build-dockerhub.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RQ1URHYR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shreyas.ragavan.co/img/configure-automated-build-dockerhub.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you have the option to select a github repository and settings are available to point to a particular branch or a particular Dockerfile as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shreyas.ragavan.co/img/autobuild-configuration-github.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l4kXbBe9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shreyas.ragavan.co/img/autobuild-configuration-github.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note the option Enable for Base Image for the Repository Links. This can be set enabled if your image depends on another image. Suppose that base image is updated, then a build will be triggered for your image.&lt;/p&gt;

&lt;p&gt;The source option can be set to a named branch or a tag and the docker tag must also be specified. The build context helps if you have &lt;a href="https://github.com/shrysr/sr-ds-docker"&gt;multiple docker configurations stored together&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Note also below that Environment variables can be specified thus enabled a more customised deployment of the image. The variable can be used to specify things like the username and password, Rstudio version or r-base version, etc. Docker image tags are typically used to demarcate these more easily.&lt;/p&gt;

&lt;p&gt;Here’s how the build activity looks like on Dockerhub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shreyas.ragavan.co/img/build-activity-dockerhub.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RVFVIxxo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shreyas.ragavan.co/img/build-activity-dockerhub.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shreyas.ragavan.co/img/dockerhub-build-time.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--flzd8CpT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shreyas.ragavan.co/img/dockerhub-build-time.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  General notes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Overview of components
&lt;/h3&gt;

&lt;p&gt;For any code to run, there has to be a server or a computer to run it. This is called a runner and one can be created on a self-hosted platform or there are services with different tiers on which the runners can be placed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Reference: &lt;a href="https://help.github.com/en/actions/automating-your-workflow-with-github-actions/about-github-actions"&gt;Github docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub Actions enables you to create custom software development life cycle (SDLC) workflows directly in your GitHub repository. GitHub Actions is available with GitHub Free, GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub One&lt;/p&gt;

&lt;p&gt;Workflows run in Linux, macOS, Windows, and containers on GitHub-hosted machines, called ‘runners’. Alternatively, you can also host your own runners to run workflows on machines you own or manage. For more information see, “About self-hosted runners.”&lt;/p&gt;

&lt;p&gt;You can create workflows using actions defined in your repository, open source actions in a public repository on GitHub, or a published Docker container image. Workflows in forked repositories don’t run by default.&lt;/p&gt;

&lt;p&gt;You can create a workflow file configured to run on specific events. For more information, see “Configuring a workflow” and “Workflow syntax for GitHub Actions”.&lt;/p&gt;

&lt;p&gt;GitHub Marketplace is a central location for you to find, share, and use actions built by the GitHub community.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  On API limits
&lt;/h3&gt;

&lt;p&gt;Most of these limits are &lt;strong&gt;not applicable&lt;/strong&gt; to self-hosted runners. Exception to the above : “You can execute up to 1000 API requests in an hour across all actions within a repository.”&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There are some limits on GitHub Actions usage. Unless specified, the following limits apply only to GitHub-hosted runners, and not self-hosted runners. These limits are subject to change.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You can execute up to 20 workflows concurrently per repository. If exceeded, any additional workflows are queued.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Each job in a workflow can run for up to 6 hours of execution time. If a job reaches this limit, the job is terminated and fails to complete.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The number of concurrent jobs you can run across all repositories in your account depends on your GitHub plan. If exceeded, any additional jobs are queued.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can execute up to 1000 API requests in an hour across all actions within a repository. This limit also applies to self-hosted runners. If exceeded, additional API calls will fail, which might cause jobs to fail.&lt;/p&gt;

&lt;p&gt;In addition to these limits, GitHub Actions should not be used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Content or activity that is illegal or otherwise prohibited by our Terms of Service or Community Guidelines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cryptomining&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Serverless computing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Activity that compromises GitHub users or GitHub services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Any other activity unrelated to the production, testing, deployment, or publication of the software project associated with the repository where GitHub Actions are used. In other words, be cool, don’t use GitHub Actions in ways you know you shouldn’t.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can execute up to 1000 API requests in an hour across all actions within a repository. This limit also applies to self-hosted runners. If exceeded, additional API calls will fail, which might cause jobs to fail.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;GitHub plan&lt;/th&gt;
&lt;th&gt;Total concurrent jobs&lt;/th&gt;
&lt;th&gt;Maximum concurrent macOS jobs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;180&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Self-hosted runners versus github hosted runners
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Self-hosted runners can be physical, virtual, container, on-premises, or in a cloud. You can use any machine as a self-hosted runner as long at it meets these requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can install and run the GitHub Actions runner application on the machine. For more information, see “Supported operating systems for self-hosted runners.”&lt;/li&gt;
&lt;li&gt;The machine can communicate with GitHub Actions. For more information, see “Communication between self-hosted runners and GitHub.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub-hosted runners offer a quicker, simpler way to run your workflows, while self-hosted runners are a highly configurable way to run workflows in your own custom environment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub-hosted runners:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are automatically updated.&lt;/li&gt;
&lt;li&gt;Are managed and maintained by GitHub.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  - Provide a clean instance for every job execution.
&lt;/h2&gt;

&lt;p&gt;Self-hosted runners:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can use cloud services or local machines that you already pay for.&lt;/li&gt;
&lt;li&gt;Are customizable to your hardware, operating system, software, and security requirements.&lt;/li&gt;
&lt;li&gt;Don’t need to have a clean instance for every job execution.&lt;/li&gt;
&lt;li&gt;Depending on your usage, can be more cost-effective than GitHub-hosted runners.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notes on setting up :Using an .env file&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If setting environment variables is not practical, you can set the proxy configuration variables in a file named .env in the self-hosted runner application directory. For example, this might be necessary if you want to configure the runner application as a service under a system account. When the runner application starts, it reads the variables set in .env for the proxy configuration.&lt;/p&gt;

&lt;p&gt;An example .env proxy configuration is shown below:&lt;/p&gt;

&lt;p&gt;https_proxy=&lt;a href="http://proxy.local:8080"&gt;http://proxy.local:8080&lt;/a&gt;no_proxy=example.com,myserver.local:443&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Self-hosted runner security&lt;/strong&gt; : With respect to public repos - essentially, this means that some repo of code on github is able to run on your computer. Therefore unless the code is trusted and vetted, it is dangerous to allow this. Forks can cause malicious workflows to run by opening a pull request.&lt;/p&gt;

&lt;p&gt;It is safer to use public repositories with a github hosted runner.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We recommend that you do not use self-hosted runners with public repositories.&lt;/p&gt;

&lt;p&gt;Forks of your public repository can potentially run dangerous code on your self-hosted runner machine by creating a pull request that executes the code in a workflow.&lt;/p&gt;

&lt;p&gt;This is not an issue with GitHub-hosted runners because each GitHub-hosted runner is always a clean isolated virtual machine, and it is destroyed at the end of the job execution.&lt;/p&gt;

&lt;p&gt;Untrusted workflows running on your self-hosted runner poses significant security risks for your machine and network environment, especially if your machine persists its environment between jobs. Some of the risks include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Malicious programs running on the machine.&lt;/li&gt;
&lt;li&gt;Escaping the machine’s runner sandbox.&lt;/li&gt;
&lt;li&gt;Exposing access to the machine’s network environment.&lt;/li&gt;
&lt;li&gt;Persisting unwanted or dangerous data on the machine.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  CI
&lt;/h3&gt;

&lt;p&gt;Continuous Integration: enables commits to trigger builds and thereby enhances error discovery and rectification process.&lt;/p&gt;

&lt;p&gt;The CI server can run on the same server as the runner. Therefore it can be github hosted or a self-hosted CI server.&lt;/p&gt;

&lt;p&gt;Github analyses a repository when CI is setup and recommends basic templates depending on the language used.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When you commit code to your repository, you can continuously build and test the code to make sure that the commit doesn’t introduce errors. Your tests can include code linters (which check style formatting), security checks, code coverage, functional tests, and other custom checks.&lt;/p&gt;

&lt;p&gt;Building and testing your code requires a server. You can build and test updates locally before pushing code to a repository, or you can use a CI server that checks for new code commits in a repository.&lt;/p&gt;

&lt;p&gt;You can configure your CI workflow to run when a GitHub event occurs (for example, when new code is pushed to your repository), on a set schedule, or when an external event occurs using the repository dispatch webhook.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>docker</category>
      <category>datascience</category>
      <category>ci</category>
    </item>
    <item>
      <title>Oddmuse-curl exploration</title>
      <dc:creator>Shreyas Ragavan</dc:creator>
      <pubDate>Mon, 20 Jan 2020 17:11:00 +0000</pubDate>
      <link>https://dev.to/shrysr/oddmuse-curl-exploration-2ana</link>
      <guid>https://dev.to/shrysr/oddmuse-curl-exploration-2ana</guid>
      <description>&lt;p&gt;&lt;a href="https://www.google.com/url?q=https://github.com/kensanata/oddmuse-curl/"&gt;oddmuse-curl&lt;/a&gt; is kensanata’s tool to use Emacs to edit oddmuse wikis. I think it works rather well for my needs. Alternatively, I can also use the org exporter to export org mode content and manually copy this into a wiki page via the web browser. CLI options also exist to update the wiki, but I don’t think I need that functionality.&lt;/p&gt;

&lt;p&gt;Borrowing off the documentation of oddmuse-curl, I was able to set this up, with some additional settings. It always helps to read the source code, and I’m finding of late that elisp code often seem to have a detailed explanation, comments and etc that make the code a pleasure to read.&lt;/p&gt;

&lt;p&gt;One always hears - keep the code well commented, and to use caution in describing the idea rather than the syntax. However, it is not often to find such examples. It is probably also worth noting that most of them also seem to prefer to not have their readme’s tangling the source code. The .el files are probably edited directly in Emacs. This is not surprising because the lispy mode (and etc) provide very good support for writing lisp in Emacs.&lt;/p&gt;

&lt;p&gt;So to begin with : Clone kensanata’s package from github to the desired location:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/kensanata/oddmuse-curl.git ~/scimax/user/external_packages/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Next here is my config. There are some additional options that kensanata’s readme does not mention, however all these options can be found by reading the source code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(use-package oddmuse-curl
:load-path "~/scimax-personal/external_packages/oddmuse-curl/"
:defer nil
:ensure t
:config
;; user name
(setq oddmuse-username "shrysr")

;; Wiki names
(setq oddmuse-wikis
      '(("EmacsWiki" "https://www.emacswiki.org/emacs" utf-8 "abcd" nil)
    ("sr" "https://shrysr.ragavan.co" utf-8 nil nil)))

;; Directory where files will be downloaded from the wiki for editing.
(setq oddmuse-directory "~/my_org/01_wiki/oddmuse/")

;; adding an oddmuse-odd for files in the fiki directory
(add-to-list 'auto-mode-alist '("~/my_org/01_wiki/oddmuse" . oddmuse-mode))

;; autoload modes
(autoload 'oddmuse-edit "oddmuse-curl"
  "Edit a page on an Oddmuse wiki." t)

;; Not yet sure what this does and how it related to version control.
(add-to-list 'vc-handled-backends 'oddmuse)
(defun vc-oddmuse-registered (file)
  "Handle files in `oddmuse-directory'."
  (string-match (concat "^" (expand-file-name oddmuse-directory))
                (file-name-directory file)))

;; Since I work primarily with org before the wiki - I would rather note have the mode initialised.
;; (oddmuse-mode-initialize)

;; I would like to be able to call the wiki when desired and so the curl package is initialised.
(require 'oddmuse-curl)
)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;All I have to do is use &lt;code&gt;M-x&lt;/code&gt; &lt;code&gt;oddmuse-go&lt;/code&gt; to select the wiki I want and then start editing the page required. In the beginning it is a little intimidating to consider that a page has to be selected. However the search option can be easily used for anything relevant. It might also make sense to place useful links within a single page like the page which can be visited as a bookmark.&lt;/p&gt;

</description>
      <category>emacs</category>
      <category>wiki</category>
      <category>oddmuse</category>
      <category>elisp</category>
    </item>
    <item>
      <title>A graphic overview of the 'binary' with respect to R packages</title>
      <dc:creator>Shreyas Ragavan</dc:creator>
      <pubDate>Sun, 19 Jan 2020 04:28:00 +0000</pubDate>
      <link>https://dev.to/shrysr/a-graphic-overview-of-the-binary-with-respect-to-r-packages-5gne</link>
      <guid>https://dev.to/shrysr/a-graphic-overview-of-the-binary-with-respect-to-r-packages-5gne</guid>
      <description>&lt;p&gt;Recently there was a question as to what a Binary is, building off a question &lt;a href="https://community.rstudio.com/t/meaning-of-common-message-when-install-a-package-there-are-binary-versions-available-but-the-source-versions-are-later/2431"&gt;posted on the Rstudio community forum&lt;/a&gt;. I’ve always found these aspects interesting, and a little hard to keep track of the connections and flow - So I’ve made a flowchart that will help me remember and hopefully explain what is happening to a noob.&lt;/p&gt;

&lt;p&gt;In this process, I was able to remember &lt;a href="http://www.tldp.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/"&gt;One of the first&lt;/a&gt; documents I really enjoyed reading when I started learning how to use Linux. I would recommend that article for anybody starting out. The document is meant for people with a non-technical background, but I think it is technical enough.&lt;/p&gt;

&lt;p&gt;So: Lets pretend the binary is a capsule to be swallowed by the computer to gain superpowers :D : The capsule is in a sense off-the-shelf and made for your System. When the capsule is not available, it has to be manufactured (compiled) by your machine locally for which it needs certain tools and dependencies, etc and this varies from package to package, and possibly between hardware architectures as well and more. Please feel free to let me know if there are any discrepancies in the flowchart !&lt;/p&gt;

&lt;p&gt;Binaries can be built and maintained if you desire. There should be people maintaining their own binaries or frozen versions as well. The question is - who is going to maintain them and how many binaries can you build.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shreyas.ragavan.co/img/binaries-source-code-11.jpg"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P662_7u4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shreyas.ragavan.co/img/binaries-source-code-11.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>r</category>
      <category>datascience</category>
      <category>programming</category>
    </item>
    <item>
      <title>Implementing HTTPS : Let's Encrypt</title>
      <dc:creator>Shreyas Ragavan</dc:creator>
      <pubDate>Sat, 09 Nov 2019 14:41:00 +0000</pubDate>
      <link>https://dev.to/shrysr/implementing-https-let-s-encrypt-26o6</link>
      <guid>https://dev.to/shrysr/implementing-https-let-s-encrypt-26o6</guid>
      <description>&lt;h2&gt;
  
  
  What is Let’s Encrypt?
&lt;/h2&gt;

&lt;p&gt;Let’s Encrypt is a Certificate Authority (CA). A certificate from a CA is required to enable HTTPS.&lt;/p&gt;

&lt;p&gt;Certbot’s documentation summarises it well:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Certbot is part of EFF’s effort to encrypt the entire Internet. Secure communication over the Web relies on HTTPS, which requires the use of a digital certificate that lets browsers verify the identity of web servers (e.g., is that really google.com?). Web servers obtain their certificates from trusted third parties called certificate authorities (CAs).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How Let’s Encrypt works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;To certify my domain, I need to demonstrate control over my domain. i.e one has to run a software tool to generate this certificate (periodically) on the server. being able to do this demonstratesa control over the domain.

&lt;ul&gt;
&lt;li&gt;Similar to domain control, there are other certificates for different purposes as well. See the excerpt from the ACME protocol below:&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Different types of certificates reflect different kinds of CA verification of information about the certificate subject. “Domain Validation” (DV) certificates are by far the most common type. For DV validation, the CA merely verifies that the requester has effective control of the web server and/or DNS server for the domain, but does not explicitly attempt to verify their real-world identity. (This is as opposed to “Organization Validation” (OV) and “Extended Validation” (EV) certificates, where the process is intended to also verify the real-world identity of the requester.)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Let’s Encrypt’s &lt;a href="https://letsencrypt.org/getting-started/"&gt;documentation&lt;/a&gt; mentions that the software above will use the &lt;a href="https://ietf-wg-acme.github.io/acme/draft-ietf-acme-acme.txt"&gt;ACME&lt;/a&gt; protocols to generate the cert, and there are different approaches to do so, depending on the availability of shell access (or not) to the server.&lt;/li&gt;
&lt;li&gt;ACME stands for Automatic Certificate Management Environment : The &lt;a href="https://tools.ietf.org/html/draft-ietf-acme-acme-03#section-1"&gt;introduction&lt;/a&gt; in the RFC demonstrates how ACME automates a significantly manual procedure combining ad-hoc protocols.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;…protocol that a certificate authority (CA) and an applicant can use to automate the process of verification and certificate issuance. The protocol also provides facilities for other certificate management functions, such as certificate revocation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Since I have shell access to my VPS, I will focus on this approach.&lt;/li&gt;
&lt;li&gt;There are &lt;a href="https://letsencrypt.org/docs/client-options/"&gt;multiple ACME clients&lt;/a&gt; to choose from, and &lt;a href="https://certbot.eff.org/"&gt;Certbot&lt;/a&gt; is ‘recommended’ (by the EFF). On a superficial glance, &lt;a href="https://github.com/srvrco/getssl/tree/APIv2"&gt;GetSSL&lt;/a&gt; looks interesting as an alternative.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;At this point, I will proceed with Certbot, because I’ve not yet found any particular reason not to.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  On Certbot &lt;code&gt;[0/1]&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://certbot.eff.org/all-instructions"&gt;Certbot website&lt;/a&gt; provides customized instructions for the OS and server. The main requirement(s) is having an online HTTP website with an open port 80, hosted on a server. I can go ahead since I’ve got these.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Certbot will run on the web server (not locally) periodically and will help in automating the process of certificate management.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Setting up Certbot (on debian)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wget https://dl.eff.org/certbot-auto
sudo mv certbot-auto /usr/local/bin/certbot-auto
sudo chown root /usr/local/bin/certbot-auto
sudo chmod 0755 /usr/local/bin/certbot-auto
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Checking that the above was actually done with a simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ls -al /usr/local/bin/cert*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Next, a one-command certificate setup is possible (with nginx)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note that this command may require additional dependencies to be installed, and will need a bunch of user input as well, and so should not be run in a dumb terminal.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo /usr/local/bin/certbot-auto --nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install necessary dependencies and the certbot plugins (authenticator, installer) for nginx.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Noted the option of &lt;code&gt;--no-boostrap&lt;/code&gt; for debian. I’m not sure, but this probably has to do with addressing the dependencies for different debian versions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For reference, the following packages were checked/installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ca-certificates is already the newest version (20190110).
ca-certificates set to manually installed.
gcc is already the newest version (4:8.3.0-1).
libffi-dev is already the newest version (3.2.1-9).
libffi-dev set to manually installed.
libssl-dev is already the newest version (1.1.1c-1).
openssl is already the newest version (1.1.1c-1).
openssl set to manually installed.
python is already the newest version (2.7.16-1).
python-dev is already the newest version (2.7.16-1).
python-virtualenv is already the newest version (15.1.0+ds-2).
virtualenv is already the newest version (15.1.0+ds-2).
virtualenv set to manually installed.

Suggested packages:

augeas-doc augeas-tools
The following NEW packages will be installed:
  augeas-lenses libaugeas0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;An email address has to be entered for ‘urgent’ communication regarding the certificate, and optionally can be shared with the EFF (which was a trifle annoying (as a part of an installation process), though I said yes).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I had to enable https with UFW to complete the test successfully. &lt;code&gt;sudo ufw allow https&lt;/code&gt;. Earlier, only HTTP had been enabled.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Automatic certificate renewal by setting up a cron job.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' &amp;amp;&amp;amp; /usr/local/bin/certbot-auto renew" | sudo tee -a /etc/crontab &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt; deciphering the cron job, and verifying it is as expected. For now, I’ve not run this command because I want to know what it is doing first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As an alternative to a ‘one-step’ installation, getting just the certificate will mean nginx’s configuration will have to done manually. This is probably a good choice to ‘learn more’.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo /usr/local/bin/certbot-auto certonly --nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;I need to verify this, but it appears nginx’s main configuration is at &lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt; , and a quick peek showed me that the user was still set as ‘www-data’, which was used as the initial setup of the nginx test website. This was changed subsequently. Perhaps this is why I am unable to get Wordpress plugins write access.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At the end of it all, I received a &lt;a href="https://www.ssllabs.com/ssltest/analyze.html?d=s.ragavan.co"&gt;link&lt;/a&gt;, through which it appears I can get a detailed ‘SSL Report’.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Congratulations! You have successfully enabled https://s.ragavan.co

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=s.ragavan.co
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;This report appears to be quite important, but I could not make much sense of it, and it needs to be re-visited. As such, I see that the &lt;a href="https://tools.ietf.org/html/draft-ietf-acme-acme-03#section-7"&gt;ACME&lt;/a&gt; challenges need to be understood to comprehend these results.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Short Peek under the hood.
&lt;/h2&gt;

&lt;p&gt;A skim of the extensive &lt;a href="https://certbot.eff.org/docs/"&gt;documentation of Certbot&lt;/a&gt; shows that certbot relies on &lt;a href="https://certbot.eff.org/docs/using.html#plugins"&gt;2 types of plugins&lt;/a&gt; to function.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;authenticators: plugins to obtain a certificate, but not install (i.e edit the server configuration). Used with the &lt;code&gt;certonly&lt;/code&gt; command.&lt;/li&gt;
&lt;li&gt;Installers: used to modify the server’s configuration. Used with the &lt;code&gt;install&lt;/code&gt; command.&lt;/li&gt;
&lt;li&gt;Authenticators + installers : can be used with the &lt;code&gt;certbot run&lt;/code&gt; command.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These plugins use ‘&lt;a href="https://tools.ietf.org/html/draft-ietf-acme-acme-03#section-7"&gt;ACME Protocol challenges&lt;/a&gt;’ to prove domain ownership. Section 7 (as of today) of the internet draft of the standard provides an overview, and the challenges are described in detail in the draft.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There are few types of identifiers in the world for which there is a standardized mechanism to prove possession of a given identifier. In all practical cases, CAs rely on a variety of means to test whether an entity applying for a certificate with a given identifier actually controls that identifier.&lt;/p&gt;

&lt;p&gt;Challenges provide the server with assurance that an account key holder is also the entity that controls an identifier. For each type of challenge, it must be the case that in order for an entity to successfully complete the challenge the entity must both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Hold the private key of the account key pair used to respond to the challenge&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Control the identifier in question&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;HTTPS via Let’s Encrypt is setup for my website.&lt;/li&gt;
&lt;li&gt;Had a brief introduction into the methodology/philosophy behind Let’s Encrypt.&lt;/li&gt;
&lt;li&gt;Brief exploration of ACME and it was quite interesting to go through the draft standard, though it will take a lot more effort to fully comprehend all the tests. I think it is likely that I have visit this in more detail as I make progress in learning about encryption.&lt;/li&gt;
&lt;li&gt;Learned about the existence of ‘&lt;a href="https://en.wikipedia.org/wiki/Internet%5FStandard"&gt;Internet Standards&lt;/a&gt;’. These are documented by one or more documents called RFC’s (Request for Comments) and revised until deemed satisfactory to become a standard.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>vps</category>
      <category>linux</category>
      <category>https</category>
    </item>
    <item>
      <title>Federal R&amp;D Spending on climate change</title>
      <dc:creator>Shreyas Ragavan</dc:creator>
      <pubDate>Fri, 01 Nov 2019 20:27:00 +0000</pubDate>
      <link>https://dev.to/shrysr/federal-r-d-spending-on-climate-change-3b9j</link>
      <guid>https://dev.to/shrysr/federal-r-d-spending-on-climate-change-3b9j</guid>
      <description>&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This is a short exploration into the tidy tuesday dataset focused on the Federal R&amp;amp;D budget towards global climate change. The data has been extracted from a TidyTuesday dataset, which in return is moderately cleaned dataset from publicly available data. The analysis will show that NASA’s budget dwarfs the money going into other departments, and that the median spend towards climate change has been increasing since the year 2000.&lt;/p&gt;

&lt;p&gt;Useful links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/shrysr/sr-tidytuesday"&gt;Github Repo&lt;/a&gt; of Tidy Tuesday explorations&lt;/li&gt;
&lt;li&gt;Tidy tuesday dataset: &lt;a href="https://github.com/rfordatascience/tidytuesday/tree/master/data/2019/2019-02-12"&gt;link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Data Dictionary &lt;a href="https://github.com/rfordatascience/tidytuesday/tree/master/data/2019/2019-02-12#data-dictionary"&gt;link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Viz &lt;a href="https://twitter.com/ShreyasRagavan/status/1100765886892265472"&gt;posted on Twitter&lt;/a&gt; to participate in TidyTuesday.&lt;/li&gt;
&lt;li&gt;Tools used: ESS, Org mode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://shreyas.ragavan.co/scripts/tt1-fed-rnd.R"&gt;Download R script&lt;/a&gt; : this is the entire script below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Loading libraries
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;easypackages&lt;/code&gt; library allows quickly installing and loading multiple packages. &lt;em&gt;Note: Uncomment the appropriate line if this library needs to be installed.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Loading libraries
                                        # install.packages("easypackages")
library("easypackages")
libraries("tidyverse", "tidyquant", "DataExplorer")

All packages loaded successfully
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Reading in the data
&lt;/h2&gt;

&lt;p&gt;Since this is a small dataset, the data can be read in directly from Github into memory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Reading in data directly from github
climate_spend_raw &amp;lt;- readr::read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-02-12/climate_spending.csv", col_types = "cin")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Exploring the data
&lt;/h2&gt;

&lt;p&gt;We have 6 departments, and the remaining departments are lumped together as ‘All Other’.&lt;/p&gt;

&lt;p&gt;The data is available for the years 2000 to 2017.&lt;/p&gt;

&lt;p&gt;The above can be found using the &lt;code&gt;unique&lt;/code&gt; function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;climate_spend_raw$department %&amp;gt;% unique()
climate_spend_raw$year %&amp;gt;% unique()

[1] "NASA" "NSF" "Commerce (NOAA)" "Energy"
[5] "Agriculture" "Interior" "All Other"

 [1] 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014
[16] 2015 2016 2017
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some Notes on the data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We have the following columns:

&lt;ul&gt;
&lt;li&gt;name of the department. (chr)&lt;/li&gt;
&lt;li&gt;year (int)&lt;/li&gt;
&lt;li&gt;spending (double)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;The data is relatively clean. However some manipulation is required to summarise the department wise spending.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An overview of missing data can be easily scrutinised using the &lt;code&gt;plot_intro&lt;/code&gt; command, and actual numbers can be extracted using &lt;code&gt;introduce&lt;/code&gt;. These functions are from the &lt;code&gt;DataExplorer&lt;/code&gt; package.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;##plot_str(climate_spend_raw, type = 'r')
plot_intro(climate_spend_raw)
##introduce(climate_spend_raw)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://shreyas.ragavan.co/img/plot-intro.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vVCIycex--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shreyas.ragavan.co/img/plot-intro.png" alt="" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are no missing values or NA’s.&lt;/p&gt;

&lt;p&gt;For a quick look at the outliers, we can use a boxplot, using DataExplorer’s functions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;variance_climate_spend &amp;lt;- plot_boxplot(climate_spend_raw, by = "year")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://shreyas.ragavan.co/img/variance-spend.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eEoKjHbT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shreyas.ragavan.co/img/variance-spend.png" alt="" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
    Figure 1: It can be seen above that there are not many outliers. Subsequent visualisations will show that NASA is the most significant outlier. The median spending has been increasing over the years.&lt;br&gt;
  &lt;/p&gt;
&lt;h2&gt;
  
  
  Data Conditioning
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Note: this initial conditioning need not have involved the date manipulation, as the year extracted from a date object is still a double.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;climate_spend_conditioned &amp;lt;- climate_spend_raw %&amp;gt;%
  mutate(year_dt = str_glue("{year}-01-01")) %&amp;gt;%
  mutate(year_dt = as.Date(year_dt)) %&amp;gt;%
  mutate(test_median = median(gcc_spending)) %&amp;gt;%
  mutate(gcc_spending_txt = scales::dollar(gcc_spending,
                                           scale = 1e-09,
                                           suffix = "B"
                                           )
         )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Applying some summary statistics to calculate the total spend per department, per year.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Total spend per department per year
climate_spend_dept_y &amp;lt;- climate_spend_conditioned %&amp;gt;%
  group_by(department, year_dt = year(year_dt)) %&amp;gt;%
  summarise(
    tot_spend_dept_y = sum(gcc_spending)) %&amp;gt;%
  mutate(tot_spend_dept_y_txt = tot_spend_dept_y %&amp;gt;%
           scales::dollar(scale = 1e-09,
                          suffix = "B")
         ) %&amp;gt;%
  ungroup()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lets see how much money has been budgeted in each department towards R&amp;amp;D in climate change from 2000 to 2017.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;climate_spend_conditioned %&amp;gt;%
  select(-c(gcc_spending_txt, year_dt)) %&amp;gt;%
  group_by(department) %&amp;gt;%
  summarise(total_spend_y = sum(gcc_spending)) %&amp;gt;%
  arrange(desc(total_spend_y)) %&amp;gt;%
  mutate(total_spend_y = total_spend_y %&amp;gt;% scales::dollar(scale = 1e-09,
                                                        suffix = "B",
                                                        prefix = "$")
       )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Department&lt;/th&gt;
&lt;th&gt;Total Spend from 2000-2017&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NASA&lt;/td&gt;
&lt;td&gt;$25.77B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commerce (NOAA)&lt;/td&gt;
&lt;td&gt;$5.28B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NSF&lt;/td&gt;
&lt;td&gt;$5.26B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Energy&lt;/td&gt;
&lt;td&gt;$3.32B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agriculture&lt;/td&gt;
&lt;td&gt;$1.63B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All Other&lt;/td&gt;
&lt;td&gt;$1.54B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interior&lt;/td&gt;
&lt;td&gt;$0.86B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It is clear from here that the outlier department is NASA. Further exploration would be needed to understand the function of each department and the justification of this expenditure and the skew. &lt;em&gt;For example, one might think the Interior department would not be able to produce R&amp;amp;D superior to NASA/NSF.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Function to plot a facet grid of the department spending
&lt;/h2&gt;

&lt;p&gt;By using a function to complete the plot, the plot can be easily repeated for any range of years. It can also work for a single year.&lt;/p&gt;

&lt;p&gt;The function below takes the following arguments:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The range of the years we want to look into , example 2005-2010&lt;/li&gt;
&lt;li&gt;The number of columns in the facet wrap plot.&lt;/li&gt;
&lt;li&gt;The caption that consititues the observation from the plots and anything else.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The title of the plot includes the year range that is input above.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;climate_spend_plt_fn &amp;lt;- function(
                                 data,
                                 y_range_low = 2000,
                                 y_range_hi = 2010,
                                 ncol = 3,
                                 caption = ""
                                 )
{

  plot_title &amp;lt;- str_glue("Federal R&amp;amp;D budget towards Climate Change: {y_range_low}-{y_range_hi}")

  data %&amp;gt;%
  filter(year_dt &amp;gt;= y_range_low &amp;amp; year_dt &amp;lt;= y_range_hi) %&amp;gt;%
  ggplot(aes(y = tot_spend_dept_y_txt, x = department, fill = department ))+
  geom_col() +
  facet_wrap(~ year_dt,
             ncol = 3,
             scales = "free_y"
             ) +
  #scale_y_continuous(breaks = scales::pretty_breaks(10)) +
  theme_tq() +
  scale_fill_tq(theme = "dark") +
  theme(
    axis.text.x = element_text(angle = 45,
                               hjust = 1.2),
    legend.position = "none",
    plot.background=element_rect(fill="#f7f7f7"),
    ) +
  labs(
    title = plot_title,
    x = "Department",
    y = "Total Budget $ Billion",
    subtitle = "NASA literally dwarfs all the other departments, getting to spend upwards of 1.1 Billion dollars every year since 2000.",
    caption = caption
  )

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Visualizing department-wise spending over the years
&lt;/h2&gt;

&lt;p&gt;Calling the function and passing in the entire date (year) range of 2000-2010. Note that for a single year, have both the arguments &lt;code&gt;y_range_low&lt;/code&gt; and &lt;code&gt;y_range_high&lt;/code&gt; equal to the same year.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;climate_spend_plt_fn(climate_spend_dept_y,
                     y_range_low = 2000,
                     y_range_hi = 2010,
                     caption = "#TidyTuesday:\nDataset 2019-02-12\nShreyas Ragavan"
                       )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://shreyas.ragavan.co/img/fed-rnd-spending-1.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wz7xPb9O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shreyas.ragavan.co/img/fed-rnd-spending-1.png" alt="" width="800" height="900"&gt;&lt;/a&gt;&lt;br&gt;
    Figure 2: R&amp;amp;D Budget towards Climate Change from year 2000-2010 across departments.&lt;br&gt;
  &lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;climate_spend_plt_fn(climate_spend_dept_y,
                     y_range_low = 2011,
                     y_range_hi = 2017,
                     caption = "#TidyTuesday:\nDataset 2019-02-12\nShreyas Ragavan"
                       )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://shreyas.ragavan.co/img/fed-rnd-spending-2.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fbbzZ1Uj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shreyas.ragavan.co/img/fed-rnd-spending-2.png" alt="" width="800" height="900"&gt;&lt;/a&gt;&lt;br&gt;
    Figure 3: R&amp;amp;D Budget towards Climate Change from year 2011-2017 across departments.&lt;br&gt;
  &lt;/p&gt;

&lt;h2&gt;
  
  
  Some Concluding statements
&lt;/h2&gt;

&lt;p&gt;NASA has the highest R&amp;amp;D budget allocation towards climate change, and one that is significantly higher than all the other departments put together. The median spending on R&amp;amp;D towards climate change has been increasing over the years, which is a good sign considering the importance of the problem. Some further explorations could be along the lines of the percentage change in spending per department every year, and the proportion of each department in terms of percentage for each year.&lt;/p&gt;

</description>
      <category>r</category>
      <category>datascience</category>
      <category>eventdriven</category>
    </item>
    <item>
      <title>mosh - for better access to my VPS</title>
      <dc:creator>Shreyas Ragavan</dc:creator>
      <pubDate>Thu, 01 Aug 2019 15:42:00 +0000</pubDate>
      <link>https://dev.to/shrysr/mosh-for-better-access-to-my-vps-242j</link>
      <guid>https://dev.to/shrysr/mosh-for-better-access-to-my-vps-242j</guid>
      <description>&lt;p&gt;&lt;a href="https://mosh.org/"&gt;Mosh&lt;/a&gt; is short for mobile shell, and is useful as an alternative to SSH, especially for poor network conditions, and where one has to frequently switch networks. It works via the UDP port, which has to be specifically enabled. I learnt of mosh through the guys in the #emacs.&lt;/p&gt;

&lt;p&gt;I’ve faced frequent trouble due to network issues over SSH connections, with the lag hampering my ability to type, in general, and it is particularly inconvenient to respond on IRC/Weechat. I’m hoping mosh will alleviate the issue.&lt;/p&gt;

&lt;p&gt;UDP needs to be enabled for mosh to work. I used UFW on the ports 60000:61000 for this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ufw allow 60000:61000/udp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Essentially, a mosh server runs on both the machines (VPS and local machine), and these perform the background job of syncing commands and output with each other. This reduces the lag in typing, among other advantages. The initial connection of Mosh, including authentication is via SSH, after which the UDP protocol is used.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Installing Mosh:&lt;/p&gt;

&lt;p&gt;On debian - mosh is directly available as a package. Run &lt;code&gt;apt-get update&lt;/code&gt; and then install mosh.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apt-get install "mosh"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;mosh-server&lt;/code&gt; has to be run on both the machines. It may be a good idea to include this in &lt;code&gt;.bashrc&lt;/code&gt;, or in the list of start-up programs. This command will start up the mosh-server and detach the process (into the background).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mosh-server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This is where I ran into trouble. A UTF-8 environment has to be specified for mosh to run, and it appears that the locales of the two connecting machines have to match (?). On Debian, this is relatively easy with &lt;code&gt;dpkg&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo dpkg-reconfigure locales
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I chose the &lt;code&gt;en_USA.UTF-8&lt;/code&gt; option. The existing locale configuration can be viewed with &lt;code&gt;locale&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;locale

LANG="en_CA.UTF-8"
LC_COLLATE="en_CA.UTF-8"
LC_CTYPE="en_CA.UTF-8"
LC_MESSAGES="en_CA.UTF-8"
LC_MONETARY="en_CA.UTF-8"
LC_NUMERIC="en_CA.UTF-8"
LC_TIME="en_CA.UTF-8"
LC_ALL=
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Sometimes, additional settings for the locale are defined in locations like &lt;code&gt;~/.bashrc&lt;/code&gt;. This should be something like :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
# export LC_ALL=en_US.UTF-8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The above can be used for explicitly setting the preference. The &lt;a href="https://wiki.debian.org/Locale"&gt;Debian wiki&lt;/a&gt; dissuades end-users from using &lt;code&gt;LC_ALL&lt;/code&gt;, but that is easiest way. My initial settings were with &lt;code&gt;en_CA.UTF-8&lt;/code&gt;. While this is also UTF-8, for some reason, mosh still threw out locale errors. In any case, I wanted all my computers to uniformly use the &lt;code&gt;en_US&lt;/code&gt; version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Did mosh make a difference?
&lt;/h2&gt;

&lt;p&gt;It’s only been a few hours, but the difference can already be felt. Mosh clearly indicates when the connection has been lost and there is no lag in typing. Further experimentation is necessary to understand its behavior, but atleast, I can type out a message in peace without lag.&lt;/p&gt;

&lt;p&gt;[2019-07-31 Wed] After 3+ days of using mosh, I am happy to note that the experience of engaging with my vps over a terminal has significantly improved. There were few instances of really poor network connection, and mosh would clearly indicate the disconnection, and also allow a safe exit if required. I can switch computers and jump right in, without bothering to restore the SSH connection.&lt;/p&gt;

</description>
      <category>mosh</category>
      <category>linux</category>
      <category>tools</category>
    </item>
    <item>
      <title>'Archaic', text based email clients rock</title>
      <dc:creator>Shreyas Ragavan</dc:creator>
      <pubDate>Sun, 14 Jul 2019 02:16:39 +0000</pubDate>
      <link>https://dev.to/shrysr/archaic-text-based-email-clients-rock-3flm</link>
      <guid>https://dev.to/shrysr/archaic-text-based-email-clients-rock-3flm</guid>
      <description>&lt;h1&gt;
  
  
  Contents
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt; TLDR - for the busy folks

&lt;ol&gt;
&lt;li&gt; Goals:
&lt;/li&gt;
&lt;li&gt; Summary:
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt; Multiple email accounts. Lack of a unified interface.
&lt;/li&gt;

&lt;li&gt; Creating sync channels via &lt;code&gt;mbsync&lt;/code&gt;
&lt;/li&gt;

&lt;li&gt; Text based email client! Speed + simplicity
&lt;/li&gt;

&lt;li&gt; Why mu4e rocks [for me] - the perks
&lt;/li&gt;

&lt;li&gt; Quirksx
&lt;/li&gt;

&lt;li&gt; Multiple levels of filters are still necessary.
&lt;/li&gt;

&lt;li&gt; Takeaways
&lt;/li&gt;

&lt;li&gt; Links and References
&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;The post below inspired me to complete this languishing draft of my current email setup, and the benefits I've gained from using a text based email client in Emacs.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/myterminal" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F36209%2Fa343f792-987a-423c-9b5b-4410adba37c2.jpg" alt="myterminal"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/myterminal/how-i-unified-my-email-accounts-in-2019-1pji" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How I unified my email accounts in 2019&lt;/h2&gt;
      &lt;h3&gt;Mohammed Ismail Ansari ・ Jul 12 '19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#watercooler&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
 

&lt;p&gt;Hope you find it entertaining. In any case, the links and reference section will certainly prove useful. This article is also posted on my personal website.&lt;/p&gt;

&lt;p&gt;&lt;a id="orgfeeaf85"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  TLDR - for the busy folks
&lt;/h1&gt;

&lt;p&gt;&lt;a id="orgd90dade"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Goals:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Unification of email accounts while preserving separate individual components.&lt;/li&gt;
&lt;li&gt;  Local backup of email.&lt;/li&gt;
&lt;li&gt;  Potential to extend system to a personal server&lt;/li&gt;
&lt;li&gt;  Email access from Emacs !&lt;/li&gt;
&lt;li&gt;  Hopefully improve overall productivity with reduced context switching.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a id="org66853f4"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Summary:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; Started with 2 Gmail accounts and 1 MSN account.&lt;/li&gt;
&lt;li&gt; Switched to a paid account with Fastmail.&lt;/li&gt;
&lt;li&gt; Used Fastmail's tools to transfer email from both Gmail and MSN accounts.&lt;/li&gt;
&lt;li&gt; Setup forwarding for all new emails to Fastmail.&lt;/li&gt;
&lt;li&gt; Decided between retaining copies of emails in Gmail/MSN or deleting them once forwarded.&lt;/li&gt;
&lt;li&gt; Used customised settings in mu4e to manage Email from within Emacs.&lt;/li&gt;
&lt;li&gt; Occasionally rely on web browser / iOS app. Fastmail's interface is clean and very fast.&lt;/li&gt;
&lt;li&gt; Goals Achieved !! Live with the quirks and enjoy the perks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Look at the Links and References section for almost all the resources I relied on.&lt;/p&gt;

&lt;p&gt;A portion of my mu4e configuration is available &lt;a href="https://shrysr.github.io/docs/sr-config/#mu4e" rel="noopener noreferrer"&gt;on my website&lt;/a&gt;. The personal filters and configuration are placed in an encrypted file.&lt;/p&gt;

&lt;p&gt;My mbsync configuration is also shared for reference.&lt;/p&gt;

&lt;p&gt;&lt;a id="org3138e2b"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Multiple email accounts. Lack of a unified interface.
&lt;/h1&gt;

&lt;p&gt;Some years back, I found that I had 2 Gmail accounts, and an MSN account. I discarded age old Yahoo and rediffmail accounts which were luckily not used much (and God knows how many more I made as a kid).&lt;/p&gt;

&lt;p&gt;Gmail's interface felt just about tolerable, but inconvenient. The idea of viewing ads tailored to the content of emails had become disconcerting. Their Inbox app was interesting, but did not work smooth enough. MSN's web interace and apps always felt cumbersome, though updates over the years, this has improved significantly.&lt;/p&gt;

&lt;p&gt;Useful emails could be email digests that contain a wealth of links, discussions, articles and information. Or perhaps email digests of product and technology news that are useful to retain as an archive of reference.&lt;/p&gt;

&lt;p&gt;It would be nice to be able to process these links in a systematic manner, and have them available with a fast search system that is also integrated with a task management system.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My solution was to switch to forwarding all my emails to a single Fastmail account. It's been an excellent experience over 2+ years.&lt;sup&gt;1&lt;/sup&gt;,&lt;sup&gt;2&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a id="org4deb006"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Creating sync channels via &lt;code&gt;mbsync&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;My mbsync configuration is posted as a &lt;a href="https://gist.github.com/shrysr/21676fc69d50337d94c5648b9d31f70a" rel="noopener noreferrer"&gt;public gist&lt;/a&gt;. It is reasonably self explanatory, and shows how separate channels were made grouping together folders, by specifying a pattern. This took some time, but was finally very satisfying to know as a fine grained control technique.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I started out using offlineimap. I found mbsync to be significantly faster.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;a id="org843e491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Text based email client! Speed + simplicity
&lt;/h1&gt;

&lt;p&gt;Imagine being engrossed with your code or engineering notebook and the need for shooting off an urgent brief email arises. What if this could be done with a few key-presses on an email client, right from the terminal or the code editor that you are already engrossed in?&lt;/p&gt;

&lt;p&gt;How about adding an email as a task in your organiser with a deadline / planned date?&lt;/p&gt;

&lt;p&gt;What if I had the option to setup separate channels of mail transfer, such that I can sync the inbox or a custom group of folders alone when I am pressed for bandwidth or space?&lt;/p&gt;

&lt;p&gt;Practical solutions will need to cater to a lot more situations.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The good news is: usually anything you need is possible (or already implemented) using Emacs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I use &lt;a href="https://www.djcbsoftware.nl/code/mu/mu4e.html" rel="noopener noreferrer"&gt;mu4e&lt;/a&gt;, which uses the indexer mu as it's back-end. There are other popular options like &lt;a href="https://notmuchmail.org/" rel="noopener noreferrer"&gt;notmuch&lt;/a&gt; and &lt;a href="http://www.mutt.org/" rel="noopener noreferrer"&gt;mutt&lt;/a&gt;. I have briefly experimented with mutt, which has a fast email search capability, but has to be coupled with another front-end to be used within Emacs or elsewhere. The philosophy and system behind notmuch (leveraging the Gmail tag based approach) differ from mu4e.&lt;/p&gt;

&lt;p&gt;Over a few years of using this system, I have found that text and terminal based email clients offer a speed and integrity that is extremely pleasing.&lt;/p&gt;

&lt;p&gt;&lt;a id="orgd281942"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Why mu4e rocks [for me] - the perks
&lt;/h1&gt;

&lt;p&gt;The ability to create custom search filters (called bookmarks) that can be accessed with easy shortcuts. This is an example of bookmark configuration:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(setq mu4e-bookmarks
      `( ,(make-mu4e-bookmark
       :name  "Unread messages"
       :query "flag:unread AND NOT flag:trashed"
       :key ?u)
     ,(make-mu4e-bookmark
       :name "Today's messages"
       :query "date:today..now"
       :key ?t)
     ,(make-mu4e-bookmark
       :name "Last 7 days"
       :query "date:7d..now"
       :key ?w)
     ,(make-mu4e-bookmark
       :name "Messages with images"
       :query "mime:image/*"
       :key ?p)
     ,(make-mu4e-bookmark
       :name "Finance News"
       :query (concat "from:etnotifications@indiatimes.com OR "
              "from:newsletters@valueresearchonline.net"
              "from:value research")
       :key ?f)
     ,(make-mu4e-bookmark
       :name "Science and Technology"
       :query (concat "from:googlealerts-noreply@google.com OR "
              "from:reply@email.engineering360.com OR "
              "from:memagazine@asme.org"
              "from:action@ifttt.com"
              "from:digitaleditions@techbriefs.info")
       :key ?S)
         ))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This is how it looks:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcfhpgz5an465s2bciqo6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcfhpgz5an465s2bciqo6.png" width="678" height="656"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Complete keyboard based control, and using it with Emacs means the ability to compose email from anywhere and build all kinds of workflows. Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Hit Control+x and m (&lt;code&gt;C-x m&lt;/code&gt;) in Emacs parlance, and I have a compose window open.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There are built-in workflows and functions in starter-kits like &lt;a href="https://github.com/jkitchin/scimax" rel="noopener noreferrer"&gt;Scimax&lt;/a&gt;, which enable you to email an org-heading or buffer directly into an email, with the formatting usually preserved, and as intended.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I often use yasnippet to insert links to standard attachments like my resume. This essentially means being able to attach files with a 1-2 key strokes.&lt;/p&gt;

&lt;p&gt;While Mu4e may be a programmatic solution with no pleasing GUI - it allows one to search a large number of emails with glorious ease. This is particularly more effective on a SSD drive, rather than the conventional Hard disk.&lt;/p&gt;

&lt;p&gt;One has to experience the above to &lt;em&gt;know&lt;/em&gt; the dramatic impact it makes in getting closer in speed to your thoughts, using a customisable system.  Emails can be easily captured or added as tasks into &lt;a href="https://orgmode.org/" rel="noopener noreferrer"&gt;Org mode&lt;/a&gt; documents as a part of task and project management.&lt;/p&gt;

&lt;p&gt;Using the mu4e and mbsync, I've devised a 'sane inbox' which is bereft of the noise, like annoying digests, social media updates and so on.  The idea was to dedicate focused blocks to rapidly process email, all within Emacs.&lt;/p&gt;

&lt;p&gt;I have tried using Todoist extensively in the past, along with their integration with Gmail. This approach is a reasonable solution, if one is open to using different applications.&lt;/p&gt;

&lt;p&gt;&lt;a id="orgd7f7513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Quirks
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;mu4e&lt;/code&gt; is a text based email interface. It can be set such that the rendered &lt;code&gt;HTML&lt;/code&gt; is displayed in the mu4e-view buffer for each email, which enables graphics and pictures (if any). However, the render is not perfect at all times.  The HTML parsing engine can be specified. Thus, heavy &lt;code&gt;HTML&lt;/code&gt; emails are unlikely to render correctly, to the extent of being a nuisance.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Such emails can be viewed in the browser of your choice with merely 2 key presses, 'a' and then 'v', with cursor in the body of the email. This could be Firefox, or &lt;a href="http://w3m.sourceforge.net/" rel="noopener noreferrer"&gt;w3m&lt;/a&gt; or any other browser of your choice.&lt;sup&gt;3&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Email syncing frequency is set in mu4e. This update process takes a few seconds, and it is not as seamless as a web app. Notifications for new email can be configured on the mode line or through pop-ups in Emacs. However, the experience with working synced emails is good.&lt;/p&gt;

&lt;p&gt;&lt;a id="org0f0f9f0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Multiple levels of filters are still necessary.
&lt;/h1&gt;

&lt;p&gt;Situations where I do not have access to Emacs will need me to use the iOS app or the web interface. Therefore the inbox in the web interface here cannot be 'insane', and a higher level of filters need to be implemented in Fastmail itself.&lt;/p&gt;

&lt;p&gt;For example all Linked in group and job updates have their own folders. These folders are all sub-folders of the Archive. They never reach the inbox at all. These emails often remain unread, or if necessary, I can focus on bunches of them at a time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;By grouping all such incoming mails into sub-folders within the Archive folder, I can use a single channel for all the  &lt;em&gt;relatively&lt;/em&gt; unimportant mail.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a id="orge43c2bc"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Takeaways
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Using an 'archaic' text based email client (mu4e) has significantly boosted the speed with which I can handle my emails and focus on tasks. The simple interface and speed enables better focus.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;While there are many articles and plenty of guidance on this topic, it takes time and patience to get this working the way you need it to. However, once it is setup, it does become rather comfortable to use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Context switching is expensive on the brain and dents productivity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrating email with time and project management is important. mu4e integrates well with Org mode. Beyond tasks, it is also a good reference, and I can easily attach notes, summaries etc to these emails.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a id="org43c6709"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Links and References
&lt;/h1&gt;

&lt;p&gt;These are the links and references I've used in setting up and troubleshooting my email setup.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These could be organized better, and some links may be repeated. All put together, these should give you all you need to get hooked up!&lt;/p&gt;

&lt;p&gt;Some of the links have additional comments, and many are tagged with dates, as a reference to when I collected the link. Sometimes, this is fun to reflect on!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="http://cachestocaches.com/2017/3/complete-guide-email-emacs-using-mu-and-/" rel="noopener noreferrer"&gt;A Complete Guide to Email in Emacs using Mu and Mu4e&lt;/a&gt;, &lt;span&gt;&lt;span&gt;&amp;lt;2017-03-08 Wed 10:04&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://www.ict4g.net/adolfo/notes/2014/12/27/EmacsIMAP.html" rel="noopener noreferrer"&gt;Reading IMAP Mail in Emacs on OSX | Adolfo Villafiorita&lt;/a&gt;, &lt;span&gt;&lt;span&gt;&amp;lt;2016-11-27 Sun 08:17&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;  [ ] Excellent link talking about mu4e and notifications &lt;a href="https://martinralbrecht.wordpress.com/2016/05/30/handling-email-with-emacs/" rel="noopener noreferrer"&gt;Handling Email with Emacs – malb::blog&lt;/a&gt;, &lt;span&gt;&lt;span&gt;&amp;lt;2016-08-01 Mon 18:37&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.reddit.com/r/emacs/comments/3s5fas/which_email_client_mu4e_mutt_notmuch_gnus_do_you/" rel="noopener noreferrer"&gt;Which email client (mu4e, Mutt, notmuch, Gnus) do you use inside Emacs, and why? : emacs&lt;/a&gt;  &lt;span&gt;&lt;span&gt;&amp;lt;2016-05-31 Tue 07:32&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://emacs-fu.blogspot.in/2012/08/introducing-mu4e-for-email.html" rel="noopener noreferrer"&gt;emacs-fu: introducing mu4e, an e-mail client for emacs&lt;/a&gt; - Emacs and mu4e stuff  &lt;span&gt;&lt;span&gt;&amp;lt;2016-04-20 Wed 13:02&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://www.kirang.in/2014/11/13/emacs-as-email-client-with-offlineimap-and-mu4e-on-osx/" rel="noopener noreferrer"&gt;Emacs as email client with offlineimap and mu4e on OS X &lt;em&gt;/ KG /&lt;/em&gt; Hacks. Thoughts. Writings.&lt;/a&gt; - nice blog related to Emacs and linux  &lt;span&gt;&lt;span&gt;&amp;lt;2016-04-21 Thu 22:44&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://writequit.org/eos/eos-mail.html" rel="noopener noreferrer"&gt;EOS: Mail (Email) Module&lt;/a&gt; - explaining multiple email setup in mu4e  &lt;span&gt;&lt;span&gt;&amp;lt;2016-04-27 Wed 07:56&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://tech.memoryimprintstudio.com/the-ultimate-emailing-agent-with-mu4e-and-emacs/" rel="noopener noreferrer"&gt;The Ultimate Emailing Agent with Mu4e and Emacs – Emacs, Arduino, Raspberry Pi, Linux and Programming etc&lt;/a&gt;, &lt;span&gt;&lt;span&gt;&amp;lt;2016-08-17 Wed 13:19&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://varunbpatil.github.io/2013/08/19/eom/#.VxXTtM7hXCs" rel="noopener noreferrer"&gt;Varun B Patil | EOM a.k.a End of Mail a.k.a Emacs + offlineimap + mu4e&lt;/a&gt; - multiple accounts  &lt;span&gt;&lt;span&gt;&amp;lt;2016-04-19 Tue 12:19&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://pragmaticemacs.com/emacs/master-your-inbox-with-mu4e-and-org-mode/" rel="noopener noreferrer"&gt;Master your inbox with mu4e and org-mode | Pragmatic Emacs&lt;/a&gt;  &lt;span&gt;&lt;span&gt;&amp;lt;2016-03-26 Sat 14:56&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;  notmuch - email setup  &lt;a href="https://wwwtech.de/articles/2016/jul/my-personal-mail-setup" rel="noopener noreferrer"&gt;My personal mail setup — Articles — WWWTech&lt;/a&gt; &lt;span&gt;&lt;span&gt;&amp;lt;2017-06-13 Tue 16:09&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://www.kmjn.org/notes/unix_style_mail_tools.html" rel="noopener noreferrer"&gt;Search-oriented tools for Unix-style mail | Mark J. Nelson&lt;/a&gt;, &lt;span&gt;&lt;span&gt;&amp;lt;2017-05-10 Wed 16:29&amp;gt;&lt;/span&gt;&lt;/span&gt;

&lt;ul&gt;
&lt;li&gt;  interesting comparison of mu and notmuch, going beyond superficial
differences, but not too much depth either.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;a href="https://lukespear.co.uk/mutt-multiple-accounts-mbsync-notmuch-gpg-and-sub-minute-updates" rel="noopener noreferrer"&gt;Mutt with multiple accounts, mbsync, notmuch, GPG and sub-minute updates | French to English translator&lt;/a&gt;, &lt;span&gt;&lt;span&gt;&amp;lt;2017-04-28 Fri 07:19&amp;gt;&lt;/span&gt;&lt;/span&gt;

&lt;ul&gt;
&lt;li&gt;  interesting link, author profile and content available on-line.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;a href="https://bostonenginerd.com/posts/notmuch-of-a-mail-setup-part-2-notmuch-and-emacs/" rel="noopener noreferrer"&gt;Assorted Nerdery - Notmuch of a mail setup Part 2 - notmuch and Emacs&lt;/a&gt;, &lt;span&gt;&lt;span&gt;&amp;lt;2017-04-27 Thu 18:41&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;

&lt;li&gt;  Mutt,  mu4e and notmuch links

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://stackoverflow.com/questions/6805783/send-html-page-as-email-using-mutt" rel="noopener noreferrer"&gt;bash - Send Html page As Email using "mutt" - Stack Overflow&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://fiasko-nw.net/~thomas/projects/htmail-view.html.en" rel="noopener noreferrer"&gt;Reading html email with mutt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://xaizek.github.io/2014-07-22/prefer-plain-text-format-over-html-in-mutt/" rel="noopener noreferrer"&gt;Prefer plain text format over HTML in mutt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://foivos.zakkak.net/tutorials/using_emacs_and_notmuch_mail_client.html" rel="noopener noreferrer"&gt;Using emacs and notmuch as a mail client - Foivos . Zakkak . net&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.reddit.com/r/emacs/comments/4jqyzu/help_with_mu4e_multiple_accounts/" rel="noopener noreferrer"&gt;Help with mu4e multiple accounts : emacs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.reddit.com/r/linux/comments/3kj6v4/using_mutt_offlineimap_and_notmuch_to_wrangle/" rel="noopener noreferrer"&gt;Using Mutt, OfflineIMAP and Notmuch to wrangle your inbox. : linux&lt;/a&gt;  &lt;span&gt;&lt;span&gt;&amp;lt;2016-06-16 Thu 15:23&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://lwn.net/Articles/705856/" rel="noopener noreferrer"&gt;A year with Notmuch mail {LWN.net}&lt;/a&gt; &lt;span&gt;&lt;span&gt;&amp;lt;2018-04-17 Tue 01:21&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  mu4e specific Links  &lt;span&gt;&lt;span&gt;&amp;lt;2016-04-19 Tue 21:48&amp;gt;&lt;/span&gt;&lt;/span&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="http://www.djcbsoftware.nl/code/mu/mu4e/Gmail-configuration.html#Gmail-configuration" rel="noopener noreferrer"&gt;Mu4e 0.9.16 user manual: Gmail configuration&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.google.co.in/search?q=mu4e+tutorials&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;gws_rd=cr&amp;amp;ei=4IwVV5jkC8fd0ATZ3q2gDA" rel="noopener noreferrer"&gt;mu4e tutorials - Google Search&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.reddit.com/r/emacs/comments/3junsg/tutorial_email_in_emacs_with_mu4e_and_imapssl/" rel="noopener noreferrer"&gt;Tutorial: email in Emacs with mu4e and IMAP+SSL : emacs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://pragmaticemacs.com/mu4e-tutorials/" rel="noopener noreferrer"&gt;mu4e tutorials | Pragmatic Emacs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://www.macs.hw.ac.uk/~rs46/posts/2014-01-13-mu4e-email-client.html" rel="noopener noreferrer"&gt;Drowning in Email; mu4e to the Rescue.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://standardsandfreedom.net/index.php/2014/08/28/mu4e/" rel="noopener noreferrer"&gt;Emacs &amp;amp; the obsessive email mongerer | Moved by Freedom – Powered by Standards&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://groups.google.com/forum/#!topic/mu-discuss/NzQmkK4qo7I" rel="noopener noreferrer"&gt;Mu4e + nullmailer - Google Groups&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://nullprogram.com/blog/2013/09/03/" rel="noopener noreferrer"&gt;Leaving Gmail Behind « null program&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.google.co.in/search?q=view+html+mails+in+mu4e&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;gws_rd=cr&amp;amp;ei=e74VV__iOMPM0ASlsq2ACg" rel="noopener noreferrer"&gt;view html mails in mu4e - Google Search&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://www.djcbsoftware.nl/code/mu/mu4e/Reading-messages.html" rel="noopener noreferrer"&gt;Mu4e 0.9.16 user manual: Reading messages&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.reddit.com/r/emacs/comments/1xad11/in_mu4e_is_this_how_your_htmlheavy_emails_render/" rel="noopener noreferrer"&gt;In mu4e, is this how your HTML-heavy emails render? : emacs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://varunbpatil.github.io/2013/08/19/eom/#.VxXTtM7hXCs" rel="noopener noreferrer"&gt;Varun B Patil | EOM a.k.a End of Mail a.k.a Emacs + offlineimap + mu4e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://www.djcbsoftware.nl/code/mu/mu4e/Marking-messages.html#Marking-messages" rel="noopener noreferrer"&gt;Mu4e 0.9.16 user manual: Marking messages&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.google.co.in/search?q=change+the+date+column+view+in+mu4e&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;gws_rd=cr&amp;amp;ei=TDgWV8zEBIOLuwTXk5uYAw#q=change+the+date+column+format+in+mu4e" rel="noopener noreferrer"&gt;change the date column format in mu4e - Google Search&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://www.djcbsoftware.nl/code/mu/mu4e/HV-Overview.html" rel="noopener noreferrer"&gt;Mu4e 0.9.16 user manual: HV Overview&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.google.co.in/search?q=increase+column+size+in+mu4e&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;gws_rd=cr&amp;amp;ei=ZjsWV7TDLJW3uQT6qZEY" rel="noopener noreferrer"&gt;increase column size in mu4e - Google Search&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://www.djcbsoftware.nl/code/mu/mu4e/HV-Custom-headers.html" rel="noopener noreferrer"&gt;Mu4e 0.9.16 user manual: HV Custom headers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://ftp.fau.de/gentoo/distfiles/mu4e-manual-0.9.9.pdf" rel="noopener noreferrer"&gt;mu4e-manual-0.9.9.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.google.co.in/search?q=do+mu4e+folders+sync+with+gmail+?&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;gws_rd=cr&amp;amp;ei=7DsWV7-NHIyXuASgtJ44#q=do+mu4e+folders+sync+with+gmail+folders" rel="noopener noreferrer"&gt;do mu4e folders sync with gmail folders - Google Search&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.reddit.com/r/emacs/comments/3r8dr3/mu4e_send_mail_with_custom_smtp_and_archive_in/" rel="noopener noreferrer"&gt;mu4e Send mail with custom SMTP and archive in Gmail "Sent" folder : emacs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://www.brool.com/post/using-mu4e/" rel="noopener noreferrer"&gt;Using mu4e · Brool &lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.google.co.in/search?q=are+maildir+folders+synced+back+to+gmail+?&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;gws_rd=cr&amp;amp;ei=RlwWV5TKKI62uASltLz4Ag" rel="noopener noreferrer"&gt;are maildir folders synced back to gmail ? - Google Search&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://www.offlineimap.org/doc/use_cases.html" rel="noopener noreferrer"&gt;Some real use cases&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://deferred.io/about/" rel="noopener noreferrer"&gt;About&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://bluishcoder.co.nz/2013/04/30/backing_up_gmail_messages_with_offlineimap.html" rel="noopener noreferrer"&gt;Backing up Gmail messages with offlineimap&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.google.co.in/search?q=notmuch+email+versus+mu4e&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;gws_rd=cr&amp;amp;ei=zmcWV8eVEIqdugTzkIpo" rel="noopener noreferrer"&gt;notmuch email versus mu4e - Google Search&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.reddit.com/r/emacs/comments/3s5fas/which_email_client_mu4e_mutt_notmuch_gnus_do_you/" rel="noopener noreferrer"&gt;Which email client (mu4e, Mutt, notmuch, Gnus) do you use inside Emacs, and why? : emacs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://irreal.org/blog/?p=2897" rel="noopener noreferrer"&gt;A Followup on Leaving Gmail | Irreal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://cscorley.github.io/2014/01/19/sup/" rel="noopener noreferrer"&gt;Sup?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://pbrisbin.com/posts/mutt_gmail_offlineimap/" rel="noopener noreferrer"&gt;Mutt + Gmail + Offlineimap&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://pragmaticemacs.com/emacs/migrating-from-offlineimap-to-mbsync-for-mu4e/" rel="noopener noreferrer"&gt;Migrating from offlineimap to mbsync for mu4e | Pragmatic Emacs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  Footnotes
&lt;/h1&gt;

&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; Fastmail allows for a variety of interesting features like aliases, easy email transfer (from a different email provider like Gmail or MSN), responsive technical support, and many more aspects, and much more. They have their own implementation of the IMAP protocol, &lt;a href="https://www.fastmail.com/help/guides/interfaceupdate-2018.html#what-is-jmap" rel="noopener noreferrer"&gt;called JMAP&lt;/a&gt;, which is significantly faster.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;2&lt;/sup&gt; While there are many advantages in Gmail and many swear by it's search capabilities - it is worth noting that Fastmail's ad-free interface and search just feels a lot quicker than Gmail, and I can find my way around the settings better than I used to with Gmail.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;3&lt;/sup&gt; You may be surprised to see the ease in browsing a good number of websites on a text based web browser. Besides the added advantage of being within Emacs - a surprising number of websites can be viewed functionally on w3m. It works fine for quick searches on Google (which like anything else, can be done within a few key strokes in Emacs).&lt;/p&gt;

</description>
      <category>emacs</category>
      <category>email</category>
      <category>productivity</category>
      <category>elisp</category>
    </item>
    <item>
      <title>Why bother with Emacs and Workflows?</title>
      <dc:creator>Shreyas Ragavan</dc:creator>
      <pubDate>Thu, 11 Jul 2019 15:43:28 +0000</pubDate>
      <link>https://dev.to/shrysr/why-bother-with-emacs-and-workflows-bk7</link>
      <guid>https://dev.to/shrysr/why-bother-with-emacs-and-workflows-bk7</guid>
      <description>&lt;p&gt;I've written &lt;a href="https://shrysr.github.io/tags/emacs/"&gt;several posts&lt;/a&gt; on different ways and tools available to aid productivity, and probably a lot about Emacs. My background is in computational physics, and not in programming, and yet Emacs has been an indispensable driver of my daily workflow for the past 3 years.&lt;/p&gt;

&lt;p&gt;The fact is that knowing Emacs (or Vim), or having a custom configuration is &lt;a href="https://www.reddit.com/r/emacs/comments/9ghpb4/was_anyone_ever_impressed_by_your_emacs_skills/"&gt;not a wildly marketable skill&lt;/a&gt;, nor is it mandatory to achieve spectacular results. An Emacs configuration suits personal workflows and style, which may be borderline peculiar to another person. Such a dependence on customised tools would also drastically reduce your speed while using a new IDE or text editor.&lt;/p&gt;

&lt;p&gt;So : why add Emacs to the ever-growing to-do list? The question is more pertinent considering that mastery of a 'text editor' is not something you can freely talk about and frequently expect empathetic responses or even a spark like connection. Emacs would be considered by many to be an esoteric and archaic software with a steep learning curve that is not beginner friendly.&lt;/p&gt;

&lt;p&gt;However …..&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.fugue.co/2015-11-11-guide-to-emacs.html"&gt;This article&lt;/a&gt; elucidates many points where Emacs can help PHB's (Pointy Haired Boss). The internet abounds with &lt;a href="https://news.ycombinator.com/item?id=11386590"&gt;several&lt;/a&gt; &lt;a href="https://news.ycombinator.com/item?id=6094610"&gt;examples&lt;/a&gt; on how org-mode and Emacs have changed lives for the better. Here is another &lt;a href="http://www.howardism.org/Technical/Emacs/new-window-manager.html"&gt;cool article by Howard Abrams&lt;/a&gt; on using Emacs as his (only) window manager, in place of a desktop environment.&lt;/p&gt;

&lt;p&gt;Watching an experienced person handle his tools emphasises the potential art form behind it, especially when compared to the bumbling of an amateur. Yes, the amateur may get the job done given enough time, and depending on his capabilities - even match the experienced professional's output (eventually).&lt;/p&gt;

&lt;p&gt;However, as experience is gained, the workflows and steps to achieve an optimal result become more lucid. I've experienced an exponentially increasing and compelling need to implement specific preferences to achieve the required optimized results faster and with fewer mistakes.&lt;/p&gt;

&lt;p&gt;It is therefore obvious that the workflow and tools used must allow the provision to evolve, customise and automate. This is particularly true with respect to the world of data science and programming. I don't think there is anything better than Emacs with respect to customisation.&lt;/p&gt;

&lt;p&gt;Imagine the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  having a combination of scripts or snippets in different languages to jumpstart a project, which is available with a few keypresses? (Yasnippet)&lt;sup&gt;1&lt;/sup&gt;
&lt;/li&gt;
&lt;li&gt;  Maintaining a blog with a single document, with articles updated automatically on a status change. (ox-hugo)&lt;/li&gt;
&lt;li&gt;  working with multiple R environments in a single document. (Org-babel, ESS)&lt;sup&gt;2&lt;/sup&gt;
&lt;/li&gt;
&lt;li&gt;  Different Window configurations and processes for different projects that can be called with a few keypresses (hint : keyboard macros)&lt;/li&gt;
&lt;li&gt;  An integrated git porcelain that can actually help you learn git so much faster (magit)&lt;/li&gt;
&lt;li&gt;  Intimately integrating email with tasks, projects, documentation and workflows (mu4e, Org-mode)&lt;/li&gt;
&lt;li&gt;  A customised text editor available right in your terminal (Use Emacsclient launched off a daemon within a terminal)&lt;/li&gt;
&lt;li&gt;  Not requiring to use the mouse for navigation!&lt;sup&gt;3&lt;/sup&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now : imagine the consolidated effect of having all the above at your disposal, in a reasonably streamlined state. Then, considering the cumulative effect over multiple projects! The above is just a shallow overview of the possibilities with Emacs.&lt;/p&gt;

&lt;p&gt;Investing in learning Emacs, has the serious potential to spawn exponential results in the long run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Footnotes
&lt;/h2&gt;

&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; Articles on using Yasnippet: — &lt;a href="http://blog.refu.co/?p=1355"&gt;Using Emacs Yasnippet against repetitive boileplate code&lt;/a&gt; || &lt;a href="https://jpace.wordpress.com/2012/10/20/tweaking-emacs-snippets/"&gt;Tweaking Emacs Yasnippet&lt;/a&gt; || &lt;a href="https://joaotavora.github.io/yasnippet/snippet-expansion.html"&gt;Expanding snippets&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;2&lt;/sup&gt; Links to using R with Emacs: &lt;a href="https://www.r-bloggers.com/using-r-with-emacs-and-ess/"&gt;Using R with Emacs and ESS&lt;/a&gt; || &lt;a href="https://lucidmanager.org/using-r-with-emacs/"&gt;Using R with Emacs&lt;/a&gt; || &lt;a href="https://www.reddit.com/r/emacs/comments/8gr6jt/looking_for_tips_from_r_coders_who_use_ess/"&gt;Tips from R Coders who use ESS&lt;/a&gt; || &lt;a href="https://thescientificshrimper.wordpress.com/2018/12/12/soapbox-rant-why-i-use-emacs-for-r-programming/"&gt;Why I use Emacs for R programming&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;3&lt;/sup&gt; See this &lt;a href="http://rss.slashdot.org/~r/Slashdot/slashdot/~3/7iykh9HdS5U/i-stopped-using-a-computer-mouse-for-a-week-and-it-was-amazing"&gt;article of a non-technical user's experiment&lt;/a&gt; with not using the mouse, reporting significant gains in speed and productivity. I've experienced this myself after gaining basic proficiency in moving around Emacs.&lt;/p&gt;

</description>
      <category>emacs</category>
      <category>productivity</category>
      <category>workflows</category>
    </item>
    <item>
      <title>Rapidly accessing cheatsheets to learn data science with Emacs</title>
      <dc:creator>Shreyas Ragavan</dc:creator>
      <pubDate>Sat, 02 Feb 2019 17:24:00 +0000</pubDate>
      <link>https://dev.to/shrysr/rapidly-accessing-cheatsheets-to-learn-data-science-with-emacs-ol7</link>
      <guid>https://dev.to/shrysr/rapidly-accessing-cheatsheets-to-learn-data-science-with-emacs-ol7</guid>
      <description>&lt;p&gt;&lt;a href="https://university.business-science.io/p/ds4b-101-r-business-analysis-r" rel="noopener noreferrer"&gt;Matt Dancho’s course DSB-101-R&lt;/a&gt; is an awesome course to step into ROI driven business analytics fueled by Data Science. In this course, among many other things - he teaches methods to understand and use cheatsheets to gain rapid &lt;em&gt;level-ups&lt;/em&gt;, especially to find information connecting various packages and functions and workflows. I have been hooked to this approach and needed a way to quickly refer to the different cheatsheets as needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/FavioVazquez/ds-cheatsheets" rel="noopener noreferrer"&gt;Favio Vazquez’s ds-cheatsheets repo&lt;/a&gt;, akin to the One Ring to Rule them All (with respect to Cheatsheets of course), combined with Emacs (&lt;a href="https://github.com/bbatsov/projectile" rel="noopener noreferrer"&gt;Projectile&lt;/a&gt; + &lt;a href="https://github.com/emacs-helm/helm" rel="noopener noreferrer"&gt;Helm&lt;/a&gt; packages) make it almost a breeze to find a specific cheatsheet quickly, by just typing in a few words. &lt;sup id="fnref:fn-1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;The built-in Hydras in &lt;a href="https://github.com/jkitchin/scimax" rel="noopener noreferrer"&gt;Scimax&lt;/a&gt; make it very easy to do the above with a few key presses. All I do is &lt;code&gt;F12&lt;/code&gt; &amp;gt;&amp;gt; p &amp;gt;&amp;gt; ww, start typing in “ds-” and choose the project and then start typing in the name of the PDF file I’m looking for. Check out the animation below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fshrysr.github.io%2Fimg%2FEmacs-projectile-cheatsheet.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fshrysr.github.io%2Fimg%2FEmacs-projectile-cheatsheet.gif"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;h4&gt;Rapidly switching to a cheatsheet PDF&lt;/h4&gt;&lt;/p&gt;



&lt;p&gt;The above concept applies to switching to any file in any git based project that is added to Projectile’s lists.&lt;/p&gt;

&lt;p&gt;The next aspect to consider was switching between maximized buffer of the opened cheatsheet PDF and the current code buffer. As it goes in Emacs, “there’s probably a package for that..” ! My solution was to use one of the various frame/window configuration packages in Emacs to save the position and orientation of the buffers and rapidly switch between the maximised PDF frame and the split code and interpreter frames.&lt;/p&gt;

&lt;p&gt;Facilitating the above was in fact already available in Scimax, where a frame or window configuration can be saved into a register that is valid for that session. Persistent saving of window configuration across sessions (i.e Emacs restarts) is a little more complex, but it is still possible with some tweaking. Winner-mode is also an interesting option to switch rapidly between window configurations.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;To some extent, it is also possible that launchers like the Alfred app could be set or programmed to search in particular locations. This is a less &lt;em&gt;hacky&lt;/em&gt; and still a functional option for Mac users. &lt;sup&gt;^&lt;/sup&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>emacs</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Literate Programming - Emacs, Howard Abrams and Library of Babel</title>
      <dc:creator>Shreyas Ragavan</dc:creator>
      <pubDate>Fri, 25 Jan 2019 21:44:00 +0000</pubDate>
      <link>https://dev.to/shrysr/literate-programming-emacs-howard-abrams-and-library-of-babel-54a5</link>
      <guid>https://dev.to/shrysr/literate-programming-emacs-howard-abrams-and-library-of-babel-54a5</guid>
      <description>&lt;p&gt;I’m an admirer of &lt;a href="https://www.linkedin.com/in/howardeabrams/"&gt;Howard Abrams&lt;/a&gt;, especially because his posts and videos show the awesome power of doing things in Emacs, and the importance of writing clean and logical code. Watching his videos and reading his posts make me feel like I was born yesterday and I am just getting started. But more importantly, they also fire up my imagination regarding the possibilities out there and the potential to create glorious workflows.&lt;/p&gt;

&lt;p&gt;Howard’s tutorial on &lt;a href="////www.howardism.org/Technical/Emacs/literate-programming-tutorial.html"&gt;Literate Programming&lt;/a&gt;, combined with his &lt;a href="https://www.youtube.com/watch?v=dljNabciEGg"&gt;Literate Devops with Emacs video&lt;/a&gt; are among the best ways to get started with understanding the power of using Org Mode and Org-Babel to create complex, inter-connected, multi-language programs / documents / research that are of course well documented (this being one basic tenet of literate programming). Essentially, Org Mode and Org-Babel enable a high quality programming environment in a single Org mode buffer or document. The said environment is significantly more feature rich compared to Jupyter notebooks, especially being supported by it’s foundation in Emacs.&lt;/p&gt;

&lt;p&gt;Though I’ve been using Org files for a while now for all my programming explorations, I’ve been bothered about my sub-par workflows. I could not easily reference other code blocks and snippets and recipes for a new document or project. It was inefficient and time consuming to locate the necessary snippet and re-write or re-paste the code in the new source blocks. I was not making much progress plodding through the vast documentation of org-babel.&lt;/p&gt;

&lt;p&gt;Therefore, I was thrilled to discover the &lt;a href="https://orgmode.org/worg/org-contrib/babel/library-of-babel.html"&gt;Library of Babel&lt;/a&gt; through Howard’s tutorial, which can be used to add files to a global library that is accessible from anywhere! Did I mention that it involves hitting barely 3 keys, and any number of arguments can be passed to these source blocks? I’m not sure such a feature is available with any other IDE.&lt;/p&gt;

&lt;p&gt;In addition, the above tutorial clearly elucidates how different languages can be combined together, and the video elucidates typical Devops procedures, which are easily taken care of with appropriate arguments and headers to the source code blocks. For example, all the source code blocks could be tangled into appropriately named and located script files using a single argument. These tutorials tied up bits and pieces of info in my head from various sources and was invaluable in enhancing my understanding of using Emacs and Org-Babel&lt;/p&gt;

&lt;p&gt;The Library of Babel can be made persistent across sessions by loading a specified org-file from which the named source code blocks are automatically read in. It is surprising that the internet does not seem to contain more references and examples using the Library of Babel. Perhaps there are some caveats that I am yet to encounter. One question that arises is whether the Library of Babel is automatically updated when the source code block is updated.&lt;/p&gt;

</description>
      <category>emacs</category>
      <category>programming</category>
      <category>literateprogramming</category>
      <category>orgmode</category>
    </item>
    <item>
      <title>Searching the awesome-lists on Github</title>
      <dc:creator>Shreyas Ragavan</dc:creator>
      <pubDate>Fri, 25 Jan 2019 21:38:00 +0000</pubDate>
      <link>https://dev.to/shrysr/searching-the-awesome-lists-on-github-4go2</link>
      <guid>https://dev.to/shrysr/searching-the-awesome-lists-on-github-4go2</guid>
      <description>&lt;p&gt;Discovered the glorious awesome lists today on Github. They are available through a &lt;a href="https://github.com/search?utf8=%E2%9C%93&amp;amp;q=awesome+list&amp;amp;type="&gt;simple search on github&lt;/a&gt;, and contain curated lists of resources of all kinds on a multitude of topics.&lt;/p&gt;

&lt;p&gt;As one might expect, there is a lot of common ground between these lists, including topics and links.&lt;/p&gt;

&lt;p&gt;How could one search for a keyword through all these repositories? I have always wanted search for particular keywords or code snippets in my Emacs configuration files, or in other files in a particular location. This is especially to verify if a bit of code or note is already available, in another location. Something that looks like this ;):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shreyas.ragavan.co/img/emacs-helm-ag-anim.gif"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oOxuAfRO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://shreyas.ragavan.co/img/emacs-helm-ag-anim.gif" alt=""&gt;&lt;/a&gt;&lt;br&gt;
    Searching for ‘datascience’ with emacs-helm-ag through a bunch of awesome-lists and other local repositories.&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;An answer had been available in &lt;a href="http://www.howardism.org/Technical/Emacs/why-emacs.html"&gt;Howard’s cool blog post&lt;/a&gt; on why one should learn Emacs - in a footnote (!), in which he’s mentioned &lt;code&gt;ack&lt;/code&gt;and &lt;code&gt;ag&lt;/code&gt; (&lt;a href="https://github.com/ggreer/the%5Fsilver%5Fsearcher"&gt;the silver searcher&lt;/a&gt;). &lt;sup id="fnref:fn-1"&gt;1&lt;/sup&gt;. It is even possible to edit in line with each search.&lt;/p&gt;

&lt;p&gt;The silver searcher github page provides clear examples of how it’s significantly faster than ack (and similar tools). Further exploration led me to the &lt;a href="https://github.com/syohex/emacs-helm-ag"&gt;emacs-helm-ag&lt;/a&gt; package, which is a helm interface to &lt;a href="https://github.com/ggreer/the%5Fsilver%5Fsearcher"&gt;the silver searcher&lt;/a&gt;. Implementing emacs-helm-ag was as simple as adding it to my list of packages, and adding a basic setup to my helm configuration.&lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;As of now, I add packages to &lt;a href="https://github.com/jkitchin/scimax"&gt;Scimax&lt;/a&gt; using this bit of code that I’ve obviously borrowed from the internet, and this case - I’m afraid I did not note the source.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;;; Setting up use packages
;; list the packages you want
(setq package-list '(diminish org-journal google-this ztree org-gcal w3m org-trello org-web-tools ox-hugo auto-indent-mode ob-sql-mode dash org-super-agenda ox-hugo workgroups2 switch-window ess ess-R-data-view interleave deft org-bookmark-heading writeroom-mode evil evil-leader polymode helm-ag))

;;fetch the list of packages available
(unless package-archive-contents
  (package-refresh-contents))

;; install the missing packages
(dolist (package package-list)
  (unless (package-installed-p package)
    (package-install package)))

;; Remember to start helm-ag. As per the Silver searcher github site, the helm-follow-mode-persistent has to be set before calling helm-ag.

(custom-set-variables
 '(helm-follow-mode-persistent t))

(require 'helm-ag)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This is how it looks in action &amp;gt;&amp;gt; Sweet !!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shreyas.ragavan.co/img/helm-ag-emacs.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VztjMgtl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shreyas.ragavan.co/img/helm-ag-emacs.png" alt=""&gt;&lt;/a&gt;&lt;br&gt;
    Notice the search across multiple files. So I’ve called &lt;code&gt;require org capture&lt;/code&gt; perhaps more times than necessary.&lt;br&gt;
  &lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;This is my first animated gif in a blog post! It was tricky! I used the free &lt;a href="https://itunes.apple.com/us/app/giphy-capture-the-gif-maker/id668208984?mt=12"&gt;GIPHY capture app&lt;/a&gt; on the Mac store. &lt;sup&gt;^&lt;/sup&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>emacs</category>
      <category>productivity</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Notes from the movie Whiplash</title>
      <dc:creator>Shreyas Ragavan</dc:creator>
      <pubDate>Sun, 20 Jan 2019 02:37:00 +0000</pubDate>
      <link>https://dev.to/shrysr/notes-from-the-movie-whiplash-466d</link>
      <guid>https://dev.to/shrysr/notes-from-the-movie-whiplash-466d</guid>
      <description>&lt;p&gt;&lt;a href="https://en.m.wikipedia.org/wiki/Whiplash%5F%25282014%5Ffilm%2529"&gt;Whiplash: Wikipedia&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whiplash is a fascinating movie on many levels regarding a topic that interests me deeply… How to progressively perform, and strive to become the very best in a chosen field. Personally, I found each step of the movie riveting and would recommend it to anybody who would find the above question even mildly interesting. The movie’s climax was immensely interesting, inspiring and supported by great acting. At any rate, the movie induced a blog post !&lt;/p&gt;

&lt;p&gt;The story revolves around the mind and life of a student who wants to be among the greats in his field, and the way he deals with an abrasive, abusive and unorthodox teacher whose intentions are to bring out the best in a student. No movie is perfect - while some points in Whiplash do appear extreme and therefore relatively unrealistic - the overriding message and theme conveyed certainly rings out clearly, in an engaging plot.&lt;/p&gt;

&lt;p&gt;I could relate to the following pointers from the movie:&lt;/p&gt;

&lt;h2&gt;
  
  
  Leverage stress to achieve new levels of insight and performance
&lt;/h2&gt;

&lt;p&gt;The belief of the teacher, that the best performance or attributes hidden inside a person can come out only via repeated, unexpected and stressful prodding. I’m not sure if this works as shown in the movie, but I have found unexpected insights at times of extreme stress, that have were taken forward to habits that changed my life.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weathering criticism
&lt;/h2&gt;

&lt;p&gt;The mental conditioning required to weather and beat intense, sharp, depressing criticism along with verbal and physical abuse from a mentor or teacher and use the same as a motive force for self-improvement and eventually superlative performance. Though there are examples of extreme abrasiveness in leaders like Steve Jobs - such an approach would not be tolerated by most people today.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I know other stories of people working under such mentors, striving to learn and gain their approval and eventually winning the same. These efforts paid off by resulting in skills, thinking patterns and a superior mental conditioning. Finding such a mentor at the formative stage is probably the best thing to happen to anybody.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An effective strategy to find mentors is to shadow people on Linked in and learn from their profiles and activity. Some of them may be willing to connect and invest time in mentoring.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Another possibility to find like minded people and mentors would be to join the communities of on-line courses, like Datacamp and Dataquest, who have lively channels in Slack for paid members.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting back up after a fall
&lt;/h2&gt;

&lt;p&gt;Everybody breaks. Just as the promising student in Whiplash breaks. But the champions among us rally, to stage a comeback and performance that make history.&lt;/p&gt;

&lt;p&gt;Regularly surpassing the level of deliberate knowledge of your own performance, and thus improvement by exactly being able to measure your performance and pinpoint mistakes. This point is portrayed in a very interesting manner in Whiplash, where the teacher expects the student to know exactly what mistake is being made.&lt;/p&gt;

&lt;h2&gt;
  
  
  Be Great, not Good
&lt;/h2&gt;

&lt;p&gt;Rejecting the ‘Good’ or ‘Good enough’ feedback from anybody. The goal is to be &lt;em&gt;Great&lt;/em&gt;, not good. The goal should be to strive to set the precedent and not just follow a beaten track. The pinpoint focus should be on progressive improvement to become the best, and that entails never being satisfied and to be ruthless in rooting out flaws.&lt;/p&gt;

&lt;h2&gt;
  
  
  Achieving Balance : mind + body + surroundings
&lt;/h2&gt;

&lt;p&gt;Great performance is about that perfect balance between the body, mind and environment to leverage the best result possible. I view the scene where the student survives a car crash, just to reach a performance and then not being able to perform, as a good example of overreaching, without strengthening the core, and thus inviting instability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Go off the beaten track and Lose yourself
&lt;/h2&gt;

&lt;p&gt;It was the ending of Whiplash that truly drove me to comprehend the points so far. It is twisted, unexpected and led me to truly enjoy the movie and appreciate that: despite the above points being reasonably discernible - the human mind and nature is exceedingly complex. Stability and reasoning are not the only keystones to the foundation of greatness. There has to be a &lt;em&gt;healthy&lt;/em&gt; mix of some form of abnormal obsession thrown in, to make a stellar performance what it is. However, can this be practically repeated on a regular basis?&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning velocity and Flow
&lt;/h2&gt;

&lt;p&gt;There are several bodies of research work available today that can be studied to get closer to consciously stimulating a great performance. One such example is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://unmistakablecreative.com/podcast/unlocking-the-talent-code-with-dan-coyle"&gt;Unlocking the Talent Code With Dan Coyle&lt;/a&gt; on the Unmistakable Creatives podcast provides an insight in line with the points seen above, into what constitute outliers and performers. The interesting concept of ‘Learning velocity’ is explained by Dan with a lucid example. It is surmised that progress and maximum learning to become better occurs &lt;em&gt;at&lt;/em&gt; the boundary line dividing what we know at the moment, and the unknown skills that beckon.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That point sems to be an amalgamation of several factors, that are typically present when someone is in ‘flow’. Perhaps this flow can be described as a heightened sense of what is, and what should be and the energy to strive and achieve what should be.. It certainly does feel logical to think that we become better by pushing that boundary.&lt;/p&gt;

</description>
      <category>motivation</category>
      <category>moviereview</category>
      <category>perfection</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
