Using Emacs to Run a Course

Via Sacha I found this really interesting post by John Kitchin, whose work Irreal has mentioned many times. In this post, Kitchin writes about how he used Emacs to run a graduate course in Chemical Engineering. Emacs was used to handle everything in the course.

When I say “everything,” I mean everything. As Kitchin says

Every lecture was given from Emacs, every assignment completed in Emacs, turned in from Emacs, graded in Emacs, returned in Emacs.

Kitchin provided each student with a custom Emacs environment that included all the tools he uses for interfacing with Python and for making engineering calculations. In addition, he included a package he calls techela that interfaces with git and handles student assignment submission, quiz and exam taking, retrieval of grades, and other similar chores.

Course administration generally takes a significant amount of a professor’s time. Kitchin’s set up eliminates much of the busy work. Read the post to get an idea of how pervasive Emacs was in the course. As usual, Kitchin exploits Emacs in novel ways that makes his work much easier.

Posted in General | Tagged | Leave a comment

Happy New Year

Have a Happy New Year and be careful out there.

Posted in General | Leave a comment

Safely Loading Your Emacs Configuration

Over at the Emacs Reddit, tending asks how to fall back to a known good Emacs configuration when initialization gets an error. His complaint is that if there’s an error early in his .emacs file, the initialization is aborted and he’s dumped into a default Emacs that doesn’t have his usual environment. We’ve all been there.

Last time I looked, no one had a solution for falling back to a known good configuration but Renan Ranelli pointed to his solution for the problem. Ranelli’s approach is to divide his configuration into several files—as many Emacs users do—and then have a small “bootloader” that loads each file but within a condition-case that captures any errors and records them. The rest of the files (assuming no further errors) are loaded normally. At the end of the loading, any errors are reported but most of his environment is available.

It’s a very nice solution and, if you already have your configuration divided into separate files, very easy to implement. Take a look at his init-bootstrap.el file. You may find you want to do something similar. You could even use the same idea to implement the solution tending was seeking.

Posted in General | Tagged | Leave a comment

Using AUCTeX

Piotr Kaźmierczak has a nice post on why Emacs is the ultimate LaTeX editor1. The idea is that adding AUCTeX to the greatest editor in the world gives you an incredibly powerful LaTeX environment.

Kaźmierczak is a Mathematician so his writings are of exactly the type that TeX/LaTeX were designed for. He gives some examples from one of his papers showing how it’s possible to preview the finished product within an Emacs buffer while still being able to see the markup. This is, as he says, very useful.

He also mentions using flymake with AUCTeX to have Emacs check your LaTeX syntax on the fly, and RefTex mode to manage your references and generate a table of contents to help you navigate through the document. He shows his configuration for using these utilities if you’re interested in setting up a similar environment.

These days, as I’ve said before, I use Org mode for almost all my writing. The nice thing is that Org is easier to use but you can embed LaTeX commands within your document so you still have almost all of the LaTeX functionality available. If I were to write a longer paper with a lot of mathematical content, I’d probably fire up AUCTeX. Kaźmierczak’s post makes me want to do that just for fun.

It’s a great post and if you have any interest in writing in LaTeX, you should give it a read.

Footnotes:

1

The post is from 2010, but Kaźmierczak has added updates occasionally so it’s pretty much up to date.

Posted in General | Tagged , | 2 Comments

LaTeX vs. Word

In an act that I’m sure was designed to throw me into a fit of rage, Markus Knauff and Jelica Nejasmic published An Efficiency Comparison of Document Preparation Systems Used in Academic Research and Development in PLOS ONE. The paper purports to compare the efficiency of Word versus LaTeX in academic document preparation.

Most everyone here knows my feelings about Word but that doesn’t mean I’m not open to a reasoned analysis of the relative merits of Word and LaTeX in producing technical documents. Sadly, this paper is not that analysis. Claus Wilke has an excellent post on the problems with the paper. You should definitely read it.

The thrust of Wilke’s post is that the design of the experiment discussed in the paper is very weak and does not support the rather strong conclusions that the authors reach. Most of the problems stem from the authors’ failure to distinguish between layout and content. For example, one of the tests involved reproducing exactly a page of continuous text (including title, author, and address lines). But, of course, LaTeX users don’t work that way. They download a style sheet from the journal they’re submitting the paper to and let the style sheet worry about the layout.

The most infuriating thing about the paper is their explanation for—what they consider—an anomaly: the fact that LaTeX users express less frustration and enjoy using their system more than Word users. They posit that the poor deluded fools who feel that way must be suffering from cognitive dissonance. Because, after all, it couldn’t be that LaTeX actually was better for it’s users.

Their other conclusion is that journals—at least non-mathematical journals—should stop accepting LaTeX and insist on Word or PDF. This even though they admit that LaTeX is easier for the journals to integrate into their work flow and produces a better product. I find their reason for this conclusion particularly offensive. Since their study concludes that it takes longer to prepare a document with LaTeX than it does with Word, researchers should be forced, forced, to use a document preparation system other than the one they’d like because then they’ll have more time to do research and improve the common weal. As if researchers were slaves. It’s a disgraceful argument.

UPDATE: There’s an interesting discussion of the paper on the Org-Emacs list. In particular, see the post by Christophe Pouzat. He obtained the original data and reanalyzed it. His findings are very revealing.

Posted in General | Tagged , | 2 Comments

A New Emacs Blog

Oleh Krehel (abo-abo) has a new blog, (or emacs. There’s only a few posts so far but they’re really excellent. For example, his initial post discusses his packaging of ace-window into a library so that other packages can use the ace-window technology to pick windows to operate on.

I really like ace-window and use it all the time. I didn’t know, though, that with 【Ctrl+u】 it will swap the current window with the selected one and with 【Ctrl+u Ctrl+u】 it will delete the selected window. So I learned something useful from his very first post.

Abo-abo has made many contributions to Emacs other than ace-window so he has interesting things to say. Welcome, abo-abo. We’ll be looking forward to many more posts.

Posted in General | Tagged | 5 Comments

Quicklisp Client Update

Xach has an updated quicklisp client available. Just call

(ql:update-client)

to get it.

Posted in Programming | Tagged , | Leave a comment

Going to the Top and Bottom of iBuffer

I use iBuffer a lot. That’s probably because I get a little OCD about stray buffers eating up memory for no reason. With my new 16 GB laptop, buffers eating up memory isn’t much of a problem but it’s too late for me to reform my ways.

I especially like to clean up after I upgrade my packages. That process always leaves a Compile-Log buffer at the top of the iBuffer list and a Packages buffer at the bottom. Of course, when I navigate to the head or tail of the buffer I end up in the wrong place—not at the head or tail of the list.

If that seems a little familiar it’s probably because Magnar Sveen had similar problem with dired and solved it with a bit of Elisp. So I shamelessly ripped off Sveen’s code and made a few trivial changes so it does the same thing for iBuffer that Sveen’s did for dired. If you’re having the same problem, the code is below. It’s almost embarrassing to post it because it’s such a rip off but Emacsers who don’t have the wherewithal to figure out which key map to use or who don’t know Elisp may find it useful.

;; Stolen from Magnar's code to do the same thing for dired
;; http://whattheemacsd.com/setup-dired.el-02.html
(defun ibuffer-back-to-top ()
  (interactive)
  (beginning-of-buffer)
  (next-line 3))

(defun ibuffer-jump-to-bottom ()
  (interactive)
  (end-of-buffer)
  (next-line -2))

(eval-after-load 'ibuffer
  '(progn
     (define-key ibuffer-mode-map
       (vector 'remap 'end-of-buffer) 'ibuffer-jump-to-bottom)
     (define-key ibuffer-mode-map
       (vector 'remap 'beginning-of-buffer) 'ibuffer-back-to-top)))
Posted in General | Tagged | 2 Comments

Sorting by IP Addresses 2

Yesterday, I told you about my difficulties in trying to sort an Org mode table. I came up with a solution that was, um, less than optimal but at least I got the table sorted. It bugged me that Org mode couldn’t sort by IP address so I wrote a patch to add a “sort by IP address” option to org-table-sort-lines and submitted it.

Nicolas Goaziou pushed me to make a more general patch that would allow a user to specify any sorting method. The idea was to duplicate the ?f ?F functionality of org-sort-list. After some back and forth, the patch was accepted and is now on the master branch. If you’re tracking the Org repository, it’s available now. If you’re getting Org from ELPA or just updating with major releases it should be along shortly.

Org mode still doesn’t have an IP sort option but now I can write my own. First, I need a comparison function:

(defun jcs-ip-lessp (ip1 ip2 &optional op)
  "Compare two IP addresses.
Unless the optional argument OP is provided, this function will return T
if IP1 is less than IP2 or NIL otherwise. The optional argument OP is
intended to be #'> to support reverse sorting."
  (setq cmp (or op #'<))
  (cl-labels ((compare (l1 l2)
                       (if (or (null l1) (null l2))
                           nil
                         (let ((n1 (string-to-number (car l1)))
                               (n2 (string-to-number (car l2))))
                           (cond
                            ((funcall cmp n1 n2) t)
                            ((= n1 n2) (compare (cdr l1) (cdr l2)))
                            (t nil))))))
    (compare (split-string ip1 "\\.") (split-string ip2 "\\."))))

The rest is easy. I just need to call org-table-sort-lines with jcs-ip-lessp and the appropriate key extraction function:

(defun jcs-ip-sort ()
  (interactive)
  (org-table-sort-lines nil ?f #'org-sort-remove-invisible #'jcs-ip-lessp))

(defun jcs-ip-sort-reverse ()
  (interactive)
  (org-table-sort-lines nil ?F #'org-sort-remove-invisible
                        (lambda (ip1 ip2) (jcs-ip-lessp ip1 ip2 #'>))))

I just add this to my init.el and then call jcs-ip-sort or jcs-ip-sort-reverse to sort a table by IP address.

You can also specify the key extraction function interactively and org-table-sort-lines will choose either a string or numeric sort depending on the type of the first extracted key.

Posted in General | Tagged , | 3 Comments

Maintenance

Irreal’s hosting provider is planning some server maintenace from [2014-12-26 Fri] to [2014-12-29 Mon]. Somewhere in that interval, the server that Irreal runs on will be upgraded.

The hosting provider does not expect any outages during this process but warns that if a reboot is necessary the site may be down for a few minutes. If you try to connect and nothing happens, just wait a few minutes.

Posted in Blogging | Tagged | Leave a comment