A Nice Emacs Dired Command

As I’ve mentioned many times, I write my blog posts in Emacs and publish them with org2blog. After I push the post to WordPress, I have a buffer and file with the HTML that I no longer need. I used to clean that up by opening a Dired buffer and using the 【% m】 command to ask that files be marked by a regular expression. When prompted for the regexp, I would specify \.html$. Then a 【D】 command would delete any html files and ask if I wanted the buffers deleted too. That’s a quick and easy way to get rid of leftover files and buffers.

Somewhere along the line, I discovered an easier way to mark those files in Dired. Instead of 【% m】 use the command 【* .】 to ask that buffers be marked by their extension and then just specify html when prompted.

Today I read that this command is not well known so I thought I’d share. If you think about it, we often want to delete files this way. Think of how many times you’ve typed something like

rm *.o

Here are some other useful commands in the marking family:

Key Sequence Command
* / Mark Directories
* @ Mark Symlinks
* * Mark Executables
* t Invert Marking
* s Mark Files in Current Subdir
* % Mark Files Matching Regexp
* ( Mark Files For Which an Elisp Expression Returns t (Dired+)

Update: Several commenters have reported that the 【* .】 command is available only when dired+.el is loaded. I’ve been using Dired+ for a long time and can recommend it whether or not you need this particular command.

Posted in General | Tagged , | 8 Comments

Using Reeder

It’s been almost two months since I started using Reeder and I was thinking that I should write a review. Fortunately, Angel over at Apple Casts has already taken care of that for me. He does a very nice job so I encourage you to head on over there and take a look if you’re in the market for an (OS X/iOS) RSS reader.

As I wrote when I first adopted Reeder, I like it because it works across the entire Apple platform and keeps my reading in sync no matter which device I’m using at the moment. That last point deserves some emphasis: iMac, MacBook Pro, iPad, or iPhone1 it makes no difference. The “same” application runs on them all and because Reeder is a Google Reader client what I’ve read on one device is reflected on the others.

I put same in quotes in the last paragraph because, of course, it’s not literally the same application—it’s a family of ports of a single application. Each of these ports offers the same functionality and behave in essentially the same way but there are some UI differences due to different hardware. On the Macs, for example, you can control Reeder entirely through the keyboard if you like; with the iPad, the keyboard is never used except for entering subscriptions, emailing articles, and things like that. The hardware differences that matter go beyond the type of computer. For example, my MacBook has an “old” trackpad that recognizes only the two-finger scrolling gesture whereas my iMac has a Magic Trackpad that recognizes the full set of Apple gestures. The same full set of gestures are available on the trackpads of the newer MacBooks, of course. These differences influence how you use Reeder.

Here’s how I invoke the common Reeder functions on the various devices:

Function iMac (Magic Trackpad) MacBook (old trackpad) iPad
Next/Previous Feed click on feed n/p touch feed
Next/Prev Article 4-finger swipe down/up j/k touch down/up arrow
View Article 4-finger swipe right v touch article
View Article in Readability pinch open g pinch open
View Article in Browser Menu b Menu

As you can see, I’m inclined to control Reeder on the iMac entirely with the Magic Trackpad although I could use the same keyboard shortcuts that I use on the MacBook.

There are other Reeder function that I don’t use very often so I haven’t listed them. You may find you do want to use them or you may find that you want to invoke the functions in a different way from me. The nice thing about Reeder is that you can pretty much use whatever method you like except on the iPad where everything is touch based.

Update: touch up/down arrow → touch down/up arrow for iPad

Footnotes:

1 There is an iPhone version of Reeder but I don’t use it because I don’t like reading articles on the small screen.

Posted in General | Tagged | 1 Comment

Solarized On Emacs

Unlike many hackers, I don’t care for a dark-themed Emacs so I use the basic black on white screen. Lately this scheme has begun to feel overly bright and I thought I would try some lower contrast colors. I’ve browsed the Solarized color scheme several times and thought it looked great on the Web site. So I downloaded Solarized and color-theme, made the necessary changes to my init.el, and bounced Emacs. The next thing I did was to comment out the enabling Emacs Lisp in my init.el and bounce Emacs again. I absolutely hated using the color scheme. At first I couldn’t figure out why I didn’t like it; as I said, it looked great on the Web site. I finally realized that I didn’t like working with the low contrast colors. The syntax highlighting didn’t stand out as well and I had a hard time reading some of the shades.

As a compromise, I set the background color of my frame to “oldlace” (#fdf5e6) and left the other colors alone. That definitely helped with the brightness and I will keep my Emacs this way for a few days before I decide whether to make the change permanent or go back to a white background.

Apparently I’m not alone in my aversion to low contrast colors but others aren’t so sure. We’re talking about my Emacs screen so I don’t have to please anyone but myself. All the design decisions for the blog use the default values of the Twenty Ten theme. Those turn out to be #666 on white so while there’s a little less contrast than the stark black on white it’s hard to tell unless you look carefully. I think it looks nice and is easy to read.

Here’s a shot of my Emacs screen with the oldlace background. It looks pretty good, I think, if you like a light themed Emacs.

http://irreal.org/blog/wp-content/uploads/2011/08/wpid-oldlace.jpg

Posted in General | Tagged | 2 Comments

Let Emacs Make Your Scripts Executable

Because I like to automate things, I write a lot of shell scripts. Sometimes it’s just some simple shell code, other times the script loads and executes a Scheme program. Almost every time I do this, I forget to set the execute bits on the script so, of course, it fails the first time I try to run it. Here, via Hacker News, is a simple trick to automate making your scripts executable. Add the following to your .emacs or init.el file.

(add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p)

This will check when you save a file to see if it looks like a script and if it does, make it executable. The executable-make-buffer-file-executable-if-script-p function does the intelligent thing when the file is already executable so it won’t mess up any file mode bits that you’ve already set.

Posted in Programming | Tagged | Leave a comment

SICP Under Attack?

Vedant Kumar has a provocative post entitled SICP is Under Attack in which he laments the abandonment of SICP by several universities and especially by Berkeley, where he is a EE/CS student. Berkeley, it turns out, is replacing SICP with Dive Into Python. I’m having a hard time getting my mind around this.

I’ve read Dive Into Python and it’s a very nice book—excellent for learning Python—but it’s not really a book about Computer Science or learning to think like a computer scientist. If you’ve watched the famous SICP lectures given by Abelson and Sussman at HP you may recall that in the first lecture Abelson specifically says that Computer Science is no more about computers than geometry is about surveying. That little nugget is from 1986 and has aged well, I think.

How then, does it make sense to replace a book about Computer Science—arguably the best book about Computer Science—with a book that teaches a particular language? Yes, SICP uses Scheme but the point was that Scheme was so easy to pick up that they spent virtually no time on the language; they concentrated on Computer Science concepts such as recursion, complexity theory, and fixed points.

To be fair, Kumar has an update in which he says that Berkeley has assured him that all that’s really happening is that they’re moving from Scheme to Python and that the content from SICP will be preserved. Even if that’s possible, it makes the decision worse in my opinion. SICP is the exemplar of its approach. Why would you replace it with something else? Again, Dive Into Python is a fine book for learning python but in no way does it cover the same material or serve the same ends as SICP.

MIT, of course, famously abandoned SICP too but they, at least, had a reasonable, if not ultimately convincing, rationale for doing so. Sussman explained that software engineering today is all about gluing together huge libraries that hardly anyone understands and that the SICP approach of understanding everything “all the way down” isn’t used anymore or at least is less relevant. That may be true but it’s no reason that students should not learn the material that forms the foundation of their craft.

In the last couple of days. I’ve seen several posts lamenting the fact that younger engineers don’t really understand the fundamentals or what’s going on “under the covers.” Of course some of this could be the normal “kids today!” that fogies have been muttering since Plato but if our very best engineering schools, like Berkeley and MIT, are teaching their students to glue libraries together at the expense of learning and understanding the foundations of CS these observations should come as no surprise.

Posted in General | Tagged | Leave a comment

Desktop Gmail Gets A Preview Pane

Back in July I wrote that I preferred reading Gmail on my iPad even when I was home and had my iMac available. That’s because the iPad Gmail has a preview pane. If you haven’t used it, it doesn’t sound like much but it really improves the Gmail work flow. On the desktop I scan the list of emails and delete any that I know I’m not interested in. Then I go to the first unread email, read it, and click on the next button to get the next message. That’s OK but if I want to delete a message or mark it as spam I get taken back to the list of emails and have to click on the next email to read. If I want to keep a message in my inbox, I mark it with a star. When I’ve read all the messages, I tell Gmail to check all the unstarred messages and then click on the archive button to save them.

With the iPad, there are three panes: the menu pain listing mailboxes, the message pane listing the messages, and the preview pane that has the selected message displayed (on the iPad, the menu pane is usually hidden but it can be swapped with the message pane). With this setup, I can just choose archive, delete, or mark as spam and the next message displays. It’s a much easier and more natural flow and when I’m done, I’m done—I don’t have to mark messages for archiving and all that.

Now, at last, desktop Gmail has a preview pane. It’s still a “Gmail Labs” project so you have to enable it—see the linked article for directions—but once you do that it works fine. Jason Kincaid, who wrote the TechCrunch article above, has a few problems with it but I’m happy. Very happy. The first time I used it I expanded my browser to full screen, which on my 27-inch iMac gives everything plenty of room, but I’m not sure I really need to do that; After all, it works fine on the iPad’s 9.7 inch screen. I’ll experiment with it a bit more before I settle on a definite routine. For now, I’m just happy to have this functionality on my desktop as well as my iPad.

Posted in General | Leave a comment

The Emacs Info Apropos Command

I’m a longtime Unix programmer. I started before Linux or FreeBSD and if you count Xenix, I programmed on versions as early as System III. As a result, I came to view the man page as the sine qua non of Unix documentation. Later, the GNU project introduced the texinfo format but by then I was well into curmudgeonhood and I never did warm up to info. Part of the problem was info itself. As far as I’m concerned, it’s unusable. I know, I know, lots of people love info. I’m not one of those people. When I absolutely had to read an info page I used a little Tcl/Tk utility called tkinfo. I still used it grudgingly but at least it was usable.

Back in those days, I was a vi user, so info or tkinfo were pretty much the only choices. When I moved to Emacs, I was delighted to discover that its info interface was much better so, while I still preferred man pages, I got much more comfortable with info documentation. One problem I still had even with the Emacs info reader was that it’s hard to search for specific text if you’re not already on the proper node. Now Mickey over at Mastering Emacs has written an excellent post on Full Text Searching In Info Mode With Apropos that showed me how to solve that problem.

The info-apropos command (【Meta+ xinfo-apropos) will do a text search of all the info documentation (not just Emacs documentation) on your system. It produces an apropos-like buffer containing each match and an indication of what node it’s in. You can select one of the matches in the usual info mode way and go directly to the corresponding info node.

Mickey’s post covers other apropos-type commands so you should definitely head over there and absorb some of his wisdom.

Posted in General | Tagged | Leave a comment

Sum Of Two Integers

A couple of days ago, I wrote about upgrading to Clozure Lisp 1.7 and remarked that I should try it out with a miniproject, perhaps from Programming Praxis. I went over there and found the Sum of Two Integers problem, which looked interesting. The problem is given a list of integers and a target integer determine if there are two integers in the list that sum to the target.

I chose to interpret the rules strictly:

  • You can make no assumptions about the list of integers. They could be positive, negative, or zero. Numbers might be repeated multiple times. They are not sorted and you do not know the maximum or minimum number without checking the list.
  • Similarly, you can make no assumptions about the target number other than that it’s an integer
  • You must find exactly two integers that sum to the target number—you can’t reuse a number or just find the target in the list. Thus, if the target is 10 and 5 is in the list, there must be another 5 in the list for (5, 5) to be a solution. Similarly, if 10 is in the list, that’s not a solution unless 0 is also in the list.

Truth to tell, if this were a one-off most of us would just hack up the obvious n2 solution with two nested loops checking each pair of numbers in the list. Of course, none of us would admit to doing such a thing so the question is: can we find a better solution? My first thought was to use a bit array where the nth bit is set if n is in the list. That leads to a O(n) solution but there are some problems:

  • You need a second array to indicate whether a given number is repeated at least once in the list.
  • You really need to know the maximum number in the list to size the bit array properly.
  • It doesn’t handle negative numbers gracefully.

I did code up a solution like this under the assumption that there were no negative numbers but that doesn’t solve the problem so we need another solution.

We can use almost the same solution by substituting a hash table for the bit array. With this solution, each integer in the list is a key for the hash table and the value corresponding to the key is the count of the occurrences of the key in the list of integers. We need to go through the list twice1: once to build the hash table and once to check to see if a number in the list has the required number that sums to the target.

The code below implements this solution. The check routine on lines 9–19 does all the real work. For each number in the list (have) we calculate the number we need to sum to the target (need) and then check to see if need is in the hash table. If it is, we’ve found a solution (line 18), if it’s not we recursively call check with the cdr of the list (line 19). Lines 15–17 check for the special case of a number being exactly half of the target. In that case we’ve found the solution if the number is in the list at least twice.

 1:  (defun hash-numbers (numbers)
 2:    (let ((ht (make-hash-table :size (length numbers))))
 3:      (dolist (n numbers)
 4:        (setf (gethash n ht) (1+ (gethash n ht 0))))
 5:      ht))
 6:  
 7:  (defun check-sums (goal numbers)
 8:    (let ((ht (hash-numbers numbers)))
 9:      (labels ((check (numbers)
10:                 (if (null numbers)
11:                     nil
12:                     (let* ((have (car numbers))
13:                            (need (- goal have)))
14:                       (cond
15:                         ((= need have) (if (> (gethash need ht) 1)
16:                                            (list have have)
17:                                            (check (cdr numbers))))
18:                         ((gethash need ht) (list have need))
19:                         (t (check (cdr numbers))))))))
20:        (check numbers))))
21:  

This solution won’t be as fast as the bit array solution (given a decent implementation of bit arrays) but it’s still pretty efficient and it avoids all the problems with the bit array solution.

Can we do better than O(n)? What if we know the list is sorted?

Update: 2011-08-05 Fri
I looked through the solutions that other Programming Praxis readers submitted looking for something better than O(n). I didn’t find anything but Graham and some others noticed that you could combine the testing with the building of the hash table. Here’s my translation of Graham’s Python solution

(defun check-sums-2 (goal numbers)
  (let ((ht (make-hash-table :size (length numbers))))
    (dolist (n numbers)
      (if (gethash (- goal n) ht)
          (return (list n (- goal n)))
          (setf (gethash n ht) t)))))

It still O(n) but faster because it only goes through the list once. It’s also simpler.

Footnotes:

1 Actually, the solution goes through the list 3 times; calculating the size of the list also requires reading through the list.

Posted in Programming | Tagged | Leave a comment

Some More Emacs Tips

Gurmeet Manku shares some Emacs Tips n Tricks for Everybody on his homepage. A lot of these will be familiar to most Emacs users and some are things I wouldn’t want to do but it’s a nice list of things you can add to your .emacs file to make your development work easier and more enjoyable.

One interesting example is a pair of functions that swap the numeric keys with the shifted numeric keys (1 ↔ !, 2 ↔ @, 3 ↔ #, etc.). The idea is that this makes typing faster when editing C/C++ code. A companion function maps __ into -> and .. into [] for pointer notation and array indexing. I’m not sure I’d like this but if you do a lot of C/C++ and can deal with the schizophrenia it could be a time saver.

Another useful trick is to add

(modify-syntax-entry ?- "w")

to your emacs-lisp-mode-hook so that - is not considered a word delimiter. Similarly,

(modify-syntax-entry ?_ "w")

when added to c-mode-common-hook will prevent _ from being a word delimiter. I don’t know why this isn’t built into Emacs.

There are a lot of other ideas in the article and it’s well worth a look if you’re interested in ways of streamlining your Emacs work flow.

Posted in General | Tagged | Leave a comment

Clozure Lisp 1.7 Is Out

I haven’t been doing very much Common Lisp programming lately but I noticed that Clozure Common Lisp 1.7 has just been released so I upgraded. I always like to do a (rebuild-ccl :full t) when I install a new version but my recent upgrade to Lion meant that I didn’t have up-to-date build tools so I also downloaded the new Xcode.

I have one of the free developer accounts but this time I just used the App store. The download took forever, of course, and then it just left the installer in Launchpad so I didn’t realize it had finished. Once I got the new Xcode installed the rebuild-ccl completed normally.

Now I should try it out with some miniproject. Programming Praxis is always a good source of that type of thing so perhaps I’ll head over there and try one of their recent exercises out.

Posted in Programming | Tagged , | Leave a comment