Saturday, October 6, 2012

Gmail RTM Bookmarklet

I am evaluating the Remember The Milk task management system.  They have a bookmarklet that does not provide (as of 2012-10-06) a way to record the URL of the page the task was added from.  I played around with the mobile versions of the bookmarklet posted to Using the mobile Add as a generic Quick Add tool including all fields forum thread and could not get it to work. So I based my own on a modified copy of the original Gmail This! bookmarklet and edited it to create a message body with the fields I needed, including the URL off the current web page.

This bookmarklet opens up a new Gmail compose window and adds the required info to the body of the message. It appends a note for both the document title and the current selection. You can then manually add additional text into that note which is typically what I need to do to provide extra info about the task.

I left the Due field blank, as I know I will have to type that in anyhow. This is different from what the standard RTM bookmarklet as it expects you to highlight text of a date and/or time as the Due date.

This is just GMail compose window, so there is no auto-completion of existing Tags, which is something the original bookmarklet does that mine does not. I don't miss that much as I know what my tags are, which are kept to be short names.

Here is the bookmarklet text:

java_script:popw='';Q='';rtmMail='CHANGE_THIS';x=document;y=window;if(x.selection)%20{Q=x.selection.createRange().text;}else%20if%20(y.getSelection)%20{Q=y.getSelection();}else%20if%20(x.getSelection)%20{Q=x.getSelection();}''+encodeURIComponent(rtmMail)+'&su='+encodeURIComponent(document.title)+'&body='+encodeURIComponent('T: '+Q+'\n')+encodeURIComponent('D: \n')+encodeURIComponent('U: '+location.href)+encodeURIComponent("\n---\n"+document.title+"\n"+Q+"\n"),'gmailForm','scrollbars=yes,width=680,height=510,top=175,left=75,status=no,resizable=yes');if%20(!document.all)%20T%20=%20setTimeout('popw.focus()',50);void(0);

How to install:
  1. Select the text above and copy it to the clipboard (CTRL-C typically).
  2. Right mouse click on the Firefox toolbar, and select New Bookmark.
  3. Select the Link field, and paste the link text (CTRL-V typically).
  4. Remove the underscore character from "java_script".
  5. Change the "CHANGE_THIS" in the pasted text of the bookmarklet to be your Inbox Email Address (see How to). 
  6. Change the Name field to be GMail RTM.
  7. Click Save.
To use, highlight a part of a web page, and click the GMail RTM button on your toolbar.  Make any required changes and click Send.

(The platform and browser version I used: 32-bit Firefox 15.0.1 running on 64-bit Debian Linux (Testing).)

Sunday, May 27, 2012

Raspberry Transplanting Procedure


Below is the procedure I followed to transplant raspberries. This is a consolidation of various sources I found on the web (links are included). Primary sources were posts on

Equipment needed:

  • Garden gloves sturdy enough to deal with thorny raspberries.
  • Hand shovel or similar.
  • Garden shears for cutting the suckers roots.
  • Garden stakes for locating where the holes will go.
  • Tape measure to measure off the distances.


  • When to transplant: This should be done in the 2nd year after the plant has grown. Transplant raspberry volunteers in April and May (see volunteer plants). Dig them up and move them when they have just begun to leaf out, with a few small leaves emerging. If possible, transplant during overcast weather, at the beginning of an overcast period, so the transplant will get 2 or 3 days to develop roots before the sun comes out. If transplanting during the summer months, use a sun shade for several weeks to provide the plant with reduced sunlight.
  • Locate the destination holes for the transplants (Select a full-sun location) by marking them with some stakes. Make the line east to west to maximize sun exposure during the summer. Space holes 3 feet apart to prevent the spread of disease, and rows 8 to 12 feet apart (note that one web page said spread them 2 feet apart). Destroy any perennial weeds growing near the destination holes including any wild raspberry or blackberry plants, because they can spread disease to your plants.
  • After the first frost, in early spring, identify the healthiest red raspberry plant from which to draw suckers. Look around the base of the mother plant for suckers (choose strong suckers with healthy roots), which are also known as daughter plants: find the off shoots from your main plant or plants that are popping up from the soil around the main plant. Put garden gloves on, because you will be working around the red raspberry's thorny canes. Use garden shears to snip roots that connect the daughter plant to the mother plant (It may be necessary to scoop some of the dirt away to find the root of the plant). Be careful to preserve a soil ball around the daughter plant's root system. When you find the roots, dig the plant out from that point. As you will see, some of the roots are actually part of your main plant. Go ahead and dig or cut away from those roots, as it will not harm your plants.
  • Be sure to loosen the soil around and under the raspberry sucker to remove it from the ground with its roots attached. Raspberry roots are shallow, growing no deeper than 10 inches. If you drive your spade into the ground to a depth of 1 foot, you should be able to take the baby bush out completely with its roots.
  • Dig out transplant candidates after the last spring frost and submerge their roots immediately in a bucket of water to keep the roots from drying out (but only if you are not going to transplant them immediately).
  • Take care to remove all old canes from bushes to be transplanted.
  • Plant one raspberry seedling per hole.
  • In the destination holes, insure to dig holes as deep as the daughter roots, and twice as wide as they are deep. Insure that the holes are large enough so that roots will not be crowded and an inch or two deeper than roots were growing previously (see also Set plant in a hole).
  • Fill holes with water and let them drain halfway down.
  • Use a shovel to tamp down the soil over the top of the newly transplanted red raspberry plant, being sure to cover roots. This is so that any water remaining in the hole will not leave a dry air-space when it drains out.
  • Trim all canes to 6 to 8 inches long (new small plants created by tipping can remain untrimmed). The reason is because "trimming back transplants may result in decreased fruiting the first year but will pay dividends in healthy growth". Check again that plants are solidly tamped in (i.e., do not leave dry air-spaces). (An alternative is to snip off two-thirds of the cane with garden shears to help encourage root development. Provide one inch of water. Consider planting at night to help the plant adapt to its new location.)
  • Keep soil consistently moist for at least a week, to help roots establish in new soil. Continue keeping soil moist during any dry spells until plants show solid new growth.
  • Do not immediately stake new plants; they must be trimmed and allowed to grow new canes first. In fact, since they do best with a trellis system, do the instructions in installing a trellis during the summer, or after the plants grow a bit.

Tips & Warnings

  • Your transplant should begin producing berries the following summer.
  • To help maintain moisture, reduce weeds and protect against the harshness of winter, maintain six inches of mulch around your transplant year round.  I ended up using lawn grass cuttings piled up high enough so that the suckers and other weeds cannot grow (just let the yard trimmings decompose around the plant which I believe will act as fertilizer for the raspberry bush).
  • Trimming back transplants may result in decreased fruiting the first year but will pay dividends in healthy growth.
  • The University of Maine recommends installing a trellis to support raspberry canes (They do best with a trellis system). Providing a place for the canes to climb reduces disease, improves fruit quality, and makes it easier to harvest the berries.

Saturday, May 19, 2012

Batch Image Resizing from the GIMP command-line

The following TinyScheme (Script-Fu) script resizes one or more image files as specified with a file glob, and writes the resized image files into an output directory:

(define (scale-to-max-fileglob
  (let* ((filelist (cadr (file-glob file-pattern 1))))
    (while (not (null? filelist))
      (let* ((in-file (car filelist))
             (image (car (gimp-file-load RUN-NONINTERACTIVE in-file in-file)))
             (drawable (car (gimp-image-get-active-drawable image)))
             (old-width (car (gimp-image-width image)))
             (old-height (car (gimp-image-height image)))
             (old-max (max old-width old-height))
             (new-width (round (/ (* old-width newmax) old-max)))
             (new-height (round (/ (* old-height newmax) old-max))))
        ;; states "... because saving undo
        ;; steps can be time and memory intensive" and so we don't
        ;; care about undo operations for batch runs:
        (gimp-image-undo-disable image)
        (gimp-image-scale image new-width new-height)
        (let ((out-file
               (string-append out-dir
                              ;; Insert a slash character if
                              ;; not already at the tail-end
                              ;; of out-dir:
                              (if (char=? #\/ (car (last (string->list out-dir))))
                              ;; Take the basename of in-file which may be a fully-qualified path:
                              (car (last (strbreakup in-file "/"))))))
          ;; The print function does not show output on standard
          ;; output, so use gimp-message instead:
          (gimp-message (string-append "   scale-to-max-fileglob: scaling "
                                       in-file " into " out-file
                                       " with these dimensions: "
                                       (number->string new-width) "x" (number->string new-height)))
          (gimp-file-save RUN-NONINTERACTIVE image drawable out-file out-file))
        (gimp-image-delete image))
      (set! filelist (cdr filelist)))))

Store this into ~/.gimp-2.6/scripts/batch-resize.scm and the definition of scale-to-max-fileglob will load into all future gimp sessions.

Example run: This was executed using GIMP 2.6 on a 64-bit Debian Linux machine.  The "script-fu-Warning" is coming from the gimp-message function:

user@somehost:/tmp/images_dir$ time gimp -i -b '(begin (scale-to-max-fileglob "*.jpg" "outdir" 1000) (gimp-quit 0))'

script-fu-Warning:    scale-to-max-fileglob: scaling 2012-05-19_16-43-42_676.jpg into outdir/2012-05-19_16-43-42_676.jpg with these dimensions: 562x1000

script-fu-Warning:    scale-to-max-fileglob: scaling 2012-05-19_16-44-35_210.jpg into outdir/2012-05-19_16-44-35_210.jpg with these dimensions: 562x1000

script-fu-Warning:    scale-to-max-fileglob: scaling 2012-05-19_16-41-21_785.jpg into outdir/2012-05-19_16-41-21_785.jpg with these dimensions: 1000x562

script-fu-Warning:    scale-to-max-fileglob: scaling 2012-05-19_16-44-02_760.jpg into outdir/2012-05-19_16-44-02_760.jpg with these dimensions: 1000x562

script-fu-Warning:    scale-to-max-fileglob: scaling 2012-05-19_16-45-34_771.jpg into outdir/2012-05-19_16-45-34_771.jpg with these dimensions: 562x1000

script-fu-Warning:    scale-to-max-fileglob: scaling 2012-05-19_16-43-15_141.jpg into outdir/2012-05-19_16-43-15_141.jpg with these dimensions: 562x1000

script-fu-Warning:    scale-to-max-fileglob: scaling 2012-05-19_16-42-39_886.jpg into outdir/2012-05-19_16-42-39_886.jpg with these dimensions: 562x1000

script-fu-Warning:    scale-to-max-fileglob: scaling 2012-05-19_16-45-13_128.jpg into outdir/2012-05-19_16-45-13_128.jpg with these dimensions: 562x1000

script-fu-Warning:    scale-to-max-fileglob: scaling 2012-05-19_16-42-52_376.jpg into outdir/2012-05-19_16-42-52_376.jpg with these dimensions: 562x1000

script-fu-Warning:    scale-to-max-fileglob: scaling 2012-05-19_16-41-49_429.jpg into outdir/2012-05-19_16-41-49_429.jpg with these dimensions: 562x1000

script-fu-Warning:    scale-to-max-fileglob: scaling 2012-05-19_16-42-08_196.jpg into outdir/2012-05-19_16-42-08_196.jpg with these dimensions: 562x1000

script-fu-Warning:    scale-to-max-fileglob: scaling 2012-05-19_16-41-54_552.jpg into outdir/2012-05-19_16-41-54_552.jpg with these dimensions: 562x1000

script-fu-Warning:    scale-to-max-fileglob: scaling 2012-05-19_16-42-34_497.jpg into outdir/2012-05-19_16-42-34_497.jpg with these dimensions: 562x1000

real    0m16.179s
user    0m13.229s
sys    0m2.236s

The above code was cobbled together from these sources:
  1. Christopher Campbell's blog: Batch image scaling with Gimp
  2. TinySCHEME Version 1.40 Manual is rather skimpy so you may desire to refer to The Racket Reference instead.
  3. Gimp Batch Mode Introduction