Too Many MacVims Installed

24 April 2017

I have MacVim installed by Homebrew, but MacVim still pops up sometimes to suggest an update, and brew updates it as well. After a year or 2 of this, my "Open with…​" menu was littered with about 7 different versions of MacVim dating back to version 7.4.

I figured I’d try to uninstall it, brew uninstall macvim, and see how many version I’m left. The simple uninstall confirmed that quite a few versions of MacVim were installed, and suggested the --force option to remove them all, so I did. That left mvim no longer working in the shell, and fortunately, all the MacVims had disappeared from the "Open with…​" menu as well.

Reinstalling it with brew install macvim leaves me nicely with only one MacVim now. I’ll have to see if they multiply again, but now I’ll have this note to myself on how to fix it.


Split the Blogs

06 April 2017

Since the beginning when I rebuilt my blog with JBake, I intended to split and restyle the photography work from the tech work.

The photo work just disappeared from here, so now it can be found at John Flinchbaugh Photography.

Both sites are rebuilt whenever new content is pushed to their respective git repositories.


Ultrawide Display on Debian Linux

27 November 2016

I picked up a very-slightly-used 34-inch LG 34UM67 display to use on my Debian Linux workstation that I use for processing photos. It’s an IPS display with 2560x1080 pixels, so that should fit nicely with photo work.

The built-in graphics on my Dell T20 only supports VGA, so I also needed to buy a new video card to support HDMI. My needs are modest, so I picked out an Asus ATI Radeon HD6450. I’ve always gone for ATI/AMD and Intel when I could, since their fully open-source versions of drivers have worked well in the past. I’m also not a gamer, so I can skip over Nvidia.

Upon plugging it all together, I needed to ensure I had all the "amdgpu" packages installed from Debian Unstable, so I could get higher resolutions beyond VGA.

It still didn’t recognize the crazy-wide 21:9 aspect ratio out of the box, so I still had some work to do. By default, the display awkwardly stretched the card’s 1920x1080 across the whole screen. That can be fixed in the display: Menu → Quick Settings → Ratio → 1:1, and then you’ll have letter boxes on the sides, but no stretching.

That left me still needing to convince my Xorg xserver to use the rest of the screen, all 2560x1080 pixels. I found a stackexchange article which provided me just about everything I needed.

  1. Generate a modeline for the new resolution: [1]

    cvt 2560 1080 30
  2. Create that new modeline dynamically. In my case mine, looked like this:

    xrandr --newmode "2560x1080_30.00"  106.75  2560 2640 2896 3232  1080 1083 1093 1102 -hsync +vsync
  3. Add the mode to the HDMI interface. In my case it was named HDMI-0:

    xrandr --addmode HDMI-0 2560x1080_30.00
  4. Then switch to it:

    xrandr --output HDMI-0 --mode 2560x1080_30.00

Once I had proven these settings to work nicely, I obviously wanted to keep them, so I persisted them by creating a file for them in the xorg config directory along-side the existing configs that Debian provides. I called my file /usr/share/X11/xorg.conf.d/40-monitor.conf:

Section "Monitor"
    Identifier "HDMI-0"
    Modeline "2560x1080_30.00"  106.75  2560 2640 2896 3232  1080 1083 1093 1102 -hsync +vsync
    Option "PreferredMode" "2560x1080_30.00"
EndSection

Upon reboot, everything was working, and I was happy for a week or 2, but I noticed performance wasn’t great during fast 2D updates. I was seeing some tearing when I’d play a video in full-screen or even a large window. I dug around a little in the amdgpu(4) man page and found a couple more options to add to my 40-monitor.conf file:

Section "Device"
    Identifier "AMDgpu"
    Option "TearFree" "on"
    Option "ShadowPrimary" "on"
EndSection

Those final adjustments solved the performance problem for me. I expect those adjustments may only be specific to the cheap card I bought, though.

Next I’ll need to figure out how to speed up my mouse, since it’s such a long way from one side of the screen to the other. I’ll also further rethink the windows I keep beside one another.

I bought the display figuring Linux can be made to do anything, and I was right. I just needed to figure out how.


1. 60Hz worked for all the lesser resolutions, but when I tried 60Hz at the highest resolution, the display blacked out, so I had to drop back to 30Hz. It looks fine.


JBake with MarkupTemplateEngine

03 November 2016

JBake 2.5.0 got support for the MarkupTemplateEngine, so I wanted to give it a try, since structured code will be nicer than extreme scriptlet stuff that was happening in the original Groovy template example. The stock MTE example shows off MTE templates, but it also switched to Foundation in place of Bootstrap.

I’ve been looking forward to really learning Bootstrap for work and my personal projects, so I’m not looking to switch frameworks right now, so I rebuilt my own example project with MTE and Bootstrap based on the original Groovy/Bootstrap sample I had previously used.

Hopefully, I’ll get a little feedback and the JBake people will incorporate my contribution.


First Transistor Radio

18 October 2016

The First Transistor Radio hit the market on this day (18 October) in 1954. (Read that in the voice of Garrison Keillor.)

Learning this today reminded me of one of my first pieces of electronics as a kid. It was a little blue, portable transistor AM radio that took 2 AA batteries. I got it as a prize from the school fundraiser, and I specifically remember it being listed as a transistor radio, like that was something special. I’m not sure how special that really was in around 1985, since we’d evidently had the technology readily available since 1954.

That radio was packed full of components on a board in its blue plastic shell. From the first time I had to open it to put batteries in it, I was intrigued by it — solder joints, variable capacitor, capacitors, resistors, transistors, antenna coil with ferrous core, bits of glue holding it together, etc. That thing came apart many times as I compared its contents to other devices and to those on my electronics kit later.


Google Apps on Kindle Fire Tablet

28 June 2016

Ben’s birthday is approaching, so I picked up the inexpensive Amazon Fire Tablet from 2015. It’s running FireOS 5.1.x.

He played with it running stock for a week or so, using it to mostly read library books, and of course, to play some games from the Amazon Appstore.

Reading was the main purpose to have the tablet, but I also wanted it for communication and organization. That means getting the Google Apps installed on it. The only things available in the Amazon Appstore were these shell apps that were nothing more than a wrapper aronud a web pane, so I needed to proceed to install the Google Play framework and app store.

Before even buying the tablet, I had found some links, so I was pretty sure it could be done. I started with a post on XDA which got me the link to an all-in-one ZIP of everything I’d need.

It came with the APK files and directions to run a Windows BAT file, which obviously isn’t going to happen on any machine I have, so I cracked open the BAT, and followed the script running the important bits by hand:

  • Login to the tablet as the original login — Ben’s secondary login didn’t work.

  • Enable Developer Options — Settings → Device Options → tap serial number serveral times, and the Developer Options will appear.

  • Enable USB Debugging — Settings → Device Options → Developer Options → Enable ADB to Enabled

  • Enable Side Loading — Settings → Device Options → Developer Options → Enable Untrusted Sources

  • I was on a Mac, so the USB drivers were already good, and I had Android Developer Tools already installed.

  • Unpack the all-in-one ZIP.

  • Run the commands at the shell:

    # see that tablet device is listed
    adb devices
    adb install com.google.android.gms-6.6.03_\(1681564-036\)-6603036-minAPI9.apk
    adb install GoogleLoginService.apk
    adb install GoogleServicesFramework.apk
    adb shell pm grant com.google.android.gms android.permission.INTERACT_ACROSS_USERS
    adb install com.android.vending-5.9.12-80391200-minAPI9.apk
    
    # disable ads on cheap tablet, though I already paid to have it disabled.
    adb shell pm hide com.amazon.kindle.kso

After those couple commands, I found I had the Play Store icon, and fired it up, did the Play Services upgrade, and started installing the Gmail, Calendar, Hangouts, and Keep. I did find Inbox would crash after setup, but Gmail was fine.


LIFO Life

24 February 2016

Information Overload

I’ve heard lots of talk recently about information overload. I even tried to do that whole Infomagical Challenge, and I couldn’t really convince myself it was necessary. I just don’t seem to have that addiction trait.

Social

Our social feeds are in reverse chronological order — dip in, see the latest, scroll a little to see something older, and then move on. Sure I’ll hit reload a couple times when I’m bored to see something new, (but I could totally stop whenever I want). I don’t feel like I need to necessarily click the bait or read everything.

News and Current Events

When I want to keep up with a little news outside of the social networks, Feedly is showing me headlines from newest to oldest. I’m sure I miss some news, since I only scroll through maybe 100 stories at a time, but anything worth knowing will be mentioned a couple times over the days and weeks. I just never see some blips in news, and that’s OK — it probably wasn’t worth the time anyway.

Podcasts

I have BeyondPod configured to do the same thing for my audio listening. Sometimes I have 50 podcasts queued up, and sometimes I run it down to 0. I have 3 priorities into which I categorize each feed, so I can always hear my favorites first, but within each of those priorities, the episodes are still presented in LIFO order, so I don’t fall behind. When I listen my way down to something that’s just out-of-date and low in priority, I can just delete it.

Photo Workflow

The reverse-chronological (or LIFO, last-in-first-out) order works great for my photo workflow too. When I was working chronologically, every photo ended up late — up to a month or 2 at times. Working from the newest stuff back fixed that. The latest party or event could often get posted, while some lower-priority sets of photos could wait a little. When I got super-busy, some photos could end up a month or 2 delayed, but not all of them.

Culling in Reverse

LIFO even saves me time when I’m culling photos, which is the first thing I do after importing photos. We often work a scene and shoot until we’re convinced that we have the shot we want, so I start looking for the keepers from the end of the set and browse my way back to the beginning of the set. When I know I have the keeper, I can more confidently skip all the previous images that led me to the keeper. There was no point in studying those earlier half-baked images when I’ll keep finding better versions as I work forward.

Delete Most the Photos

Once I’ve picked that 10% I’m keeping, I delete everything else, because I still have the end in mind — reasonably backing up all my images. Some probably find that idea backward too.


Adventures with the M3D Micro

12 February 2016

The kids got a little M3D Micro for Christmas, and so started our adventures into 3D printing.

I intended to let the kids learn the whole thing from scratch, but I knew I was throwing them a little bit of a curve ball by only having Linux netbooks to drive it, so I ended up getting a headstart setting up OctoPrint and the M3D-Fio driver.

At the end of December 2015 when I was starting, the M3D-Fio driver had some configurations in the repository that might not have been optimal, so I was fighting a bit with a few problems:

  • adhesion to the bed

  • gaps and lines in the bottom layers

  • stringing

  • speed

  • other quality issues

I thrashed around for quite some time changing settings I didn’t really understand, and Matthew spent a night helping me and showing me what his much larger printer could do — that helped immensely, since it gave me some hints as to what I should be expecting from my printer. I also learned what the different settings should be doing for me.

For an entire Sunday, about 18 hours, I printed 1cm test cubes and experimented with settings. I quickly decided I should have my settings and profiles tracked in my own local git repository, so I can always rollback to previous settings.

After a week or so, some updates from the M3D-Fio repository brought us more success with more default settings that matched the defaults found in the original software from Micro. The conservative settings also added rafts and slowed down the print a bit.

I was able to take those conservative settings and speed them up a bit and remove the rafts — the BuildTak holds a print pretty well even without the raft. I based my customizations on the stock profile that prints at 0.25mm layer thickness to get even more speed out of the printer.

I also found keeping a -0.4mm bed offset on my printer helped get just enough squish in the first layer to help get a more solid bottom layre and good adhesion to the bed.

Another notable configuration tip I had picked up was to set the wall thickness to a multiple of the nozzle size. In the case of the M3D, the nozzle thickness is 0.35mm, so I’m using a thickness of 0.70mm. Before I had learned that, a couple of my initial chachkies came out with thin gaps where the slicer should have decided to fill.

I’m at the point now that I have pretty reasonable expectations for what the printer can do, and I can start up the machine after a week or 2 of sitting, and run a print through reliably without needing to make adjustments. That’s great for letting the kids just make whatever they want. Both kids have been able to get into Tinkercad and produce some printable designs. Ben’s doing Nerf rail accessories, and Marie is designing a new cap for my growler.

Finally, I’ve pushed my configurations to a public git repository to serve as reference for anyone else who cares.

Update 2016-02-23

An update added a slicker settings dialog to allow more intuitive adjustments to a profile, so I’ve been testing relatively successfully with using the stock PLA profile and just flipping options. I did find that using a raft in "medium quality" mode fused my little 10mm test cube to the raft in a way that I can’t remove it. I usually avoid the raft anyway, though, since it sticks so well to the buildtak already.


JBake

05 January 2016

I’ve moved the blog to a static site generated by JBake. The source for the content lives in my techblog project in Github, so I have a full versioning of my content for the small price of a git workflow.

I installed JBake using the familiar SDKMan that I already use to manage my Grails and Groovy installations. I initialized it with the Groovy templating engine and have started customizing the templates.

To make sure this thing is easy to update, I keep a local clone of the repo, so I can update it any time and push whenever I’m ready. I have a shell script scheduled to run on the server which basically does:

cd techblog
git fetch
git merge | grep "Already" > /dev/null || jbake

That little bit of code only runs jbake if the git pull doesn’t say "Already up-to-date". That provided me a simple little "continuous integration" hook that polls git for changes to trigger the build. I’ll probably use this trick in other places.

I brought all my old content from my old database into the new platform using a quick little Groovy script to dump out an HTML file for each article including the header of metadata for JBake’s use. While most of these old articles will remain HTML, I intend to use AsciiDoctor format for all the new stuff.

I’ve been collecting a long list of (mostly technical) articles to write, but replacing the old platform kept trumping my attempts to write. Hopefully, this move can open the flood gates, and eventually, I’ll break out another instance of it for the photography blog. JBake should make it easy and interesting to continue the blogs.


XFCE Desktop

26 January 2015

I've written about trying new desktops previously, and how much trouble I've had. I did settle into Gnome 3 nicely for a while, but my computers continued to get older and slower.

Even when I upgraded my main desktop machine, I had initially only put 4G of RAM in it, and that was barely enough to be a full-time photo workstation, so I still needed to slim down my environment, so I installed XFCE on my netbooks, VMs, and desktop/server machine.

The XFCE environment is much more familiar with plain window decorations, panels and widgets I can add and remove as I care, and a fixed number of multiple desktops which I can create and just keep available. The ability to piece together the little components is what was really missing from Gnome 3. I also like to be able to customize where my panels and widgets live. I find it more efficient to use a little space on the left and right of a wide screen for my panels instead of having them stuck to the top or bottom of the screen.

A convenient searching menu and launcher bound to a key combination is the last component I've really come to need these days. I've had it on OS X, Gnome 3, Unity, and even in Windows 7. Whisker Menu is an alternate menu widget for the XFCE panel that fills that need. Add a key binding (Alt-Space for me) to fire the show-menu command, and I'm in business!

I added lots more RAM to my main desktop machine, but I'm still going to stick with XFCE, since it feels more native to the UNIX way — stringing together a couple small programs to get a bigger job done well.


Bachelor Week 2013

12 August 2013

Bachelor Week 2013 (where Claire and kids ran off to the beach and left me behind) started out with photographing at the Menges Mills Tractor Show for the third year, and the week ended with a quick road trip after work to join the family for a day on the beach.

In between, I got to a party with some photographer friends, sat in front of the computer for many, many hours catching up on photo processing for the Project 365 (whew!) and beyond. I also managed to have some friends over for an Xbox night to play a little good old Halo 2 and Sonic All-Stars Racing Transformed.

While continuing to go to work, I listened to podcasts like crazy (at 1.5x speed!) to get caught up on all the news in technology and photography.

It was a much-needed reset, and I was glad to rejoin the family at the end of the week (and start adding to my photo backlog again)!


Replacing a Drive in the Software RAID

13 December 2012

I realized upon trying to replace a drive in my Linux software RAID, that I had never previously documented this process.

The power failed a couple days ago, and sitting around for 10 hours not spinning was bad for my one Western Digital 500GB drive, so it never came back online, but the computer booted up just fine with 2 of the 3 drives. I ordered a new 1GB drive to replace it within 2 hours of the problem.

When the new drive arrived, I shutdown the computer, unplugged the failing SATA drive, and replaced it with the new one. Linux again booted up with only 2 drives active.

To ensure that the partitions matched, I did an sfdisk -d /dev/sda | sfdisk /dev/sdb. cfdisk was unhappy with the drive initially, but fdisk was happy to read the table and write it back cleanly. Then I could open it again in cfdisk and add one more primary partition to use the extra non-redundant 500G on the new drive.

With the partitions in place, it was time to insert the new partitions back into the RAID devices: mdadm /dev/md0 --add /dev/sdb1, mdadm /dev/md2 --add /dev/sdb5, etc, until all the drives were re-established. Watching /proc/mdstat, I could see that the RAID started recovering the devices, and I could go to bed.

I did manage to do something wrong at one point, so a quick mdadm /dev/md0 --fail /dev/sdb1 and mdadm /dev/md0 --remove /dev/sdb1 allowed me to fail and remove a partition, fix it up, then add it back when I was done. All this could be done with the system up and running—that's pretty convenient.


Impressions of SlimBean ROM for Nexus S

16 November 2012

I've had my Nexus S for about a year and a half now, and I was stuck on an old stock Android for a long time—the AT&T version of this phone just never got the updates, so Matt helped me out and got me started with CM9 on the device back in the Spring.

Since getting some experience rooting and romming, I've tracked CM9, tried CM10, loaded stock Android 4.0 and 4.1. I found my device with stock 4.1 with my usual loaded apps (like BeyondPod, Tasker, etc) to be a little light on RAM. BeyondPod kept getting pushed out of memory when, really, it's my #1 app for daily use.

I needed to free up some memory, so I figured SlimBean would be worth a look. It seems to be based on AOSP with some of the most useful features of other ROMs merged, like notification toggles, etc. It's also relatively easy to install, though the upgrades keep recommending a full wipe and reinstall, which can be inconvenient, even with a ROM Toolbox doing my backup and restore of applications.

One of the most notable features is that the default DPI is set low (182ppi), so everything ends up tiny. Couple that with a tighter grid-size in Hololauncher and you can cram lots of app icons and widgets on the screen. I at one point bumped it back up to 200 to get it just a little more readable, but in the latest install, I've just been leaving it set to the default.

Amazon Appstore offered me my first problem. ROM Toolbox half restored it, but not the whole way, so it had some data files laying around but not the rest of the app. When I went to install it again from APK, it kept telling me "App is not installed". I finally figured out in this last time I wiped and installed, that I needed to delete the Appstore's data directory in Root Browser, and then it happily installed.

In the end, I'm not sure I gained much free memory—it still seems tight, and applications are still quick to get pushed out. I think what's slim about the ROM, is that it merged in some select features from CM and others without taking up as much space for everything those other ROMs offer. I like this ROM, and I hope to see it make Android 4.2.x and later available on my little Nexus S.


Desktop Luddite

27 October 2011

get off my lawn!

I've been happily kicking along in Gnome 2.x-whatever on my Debian and Ubuntu machines for quite sometime. When Ubuntu tried to push me over into Unity back in April, I gave it half a day, then reverted back to Gnome 2 for familiarity and more workspaces.

Well, it's October now, and Ubuntu made the push again, but this time, it also pushed Gnome up to 3.2, which is drastically different as well. With no solace in Gnome, I've had to just sort of try to figure out the Unity-way with no controls and their "it's for your own good" mentality. (It feels a lot like that other OS that I wiped off a Mac Book Pro.)

A couple more days passed, and my Debian unstable machine upgraded to Gnome 3.0, and my good ol' Gnome 2.x was gone. So I'm trying Unity on my Ubuntu netbook, and I'm trying Gnome 3.0 on my photo workstation/server. They're similar enough, but it's still disorienting bouncing between the 2 environments -- while Unity hasn't offered any absolute show-stoppers, I may land on Gnome for consistency. It might also be time to look into KDE or XFCE -- somehow, I think they probably still offer me all the knobs and buttons I've used previously to customize my desktop.

If I wanted to give up my choices, I could just run a Mac -- they have nice hardware and a Unixy OS.


Quick and Easy Groovy for the Web

22 June 2011

Groovy can be used pretty easily to spin up some simple web pages in almost the same way one would hack out some PHP or JSP without going to the trouble to do an all-out Grails project.

The Groovy Servlet allows you to pack up the groovy-all-*.jar, a simple web.xml, and whatever *.groovy scripts you want and deploy it right into Tomcat as a plain WAR file. The Groovy Servlet page

Here's a bit of a script I put together to jump start a simple Groovlet project by packaging a WAR file from a directory of scripts. This isn't Groovy Servlet code itself, but just a command-line tool. (The Groovy Servlet page linked previously has examples for writing your own servlets.) This script will copy in the Groovy JAR and generate the basic web.xml to wire up the GroovyServlet to dynamically execute your scripts. I also have a downloadable copy of package_groovlet.groovy.

#!/usr/bin/env groovy

if (args.size() < 1) {
    print """\
        |Usage: package_groovlet.groovy <war-name>
        |Package the current directory into a Groovy Servlet war.
        |""".stripMargin()
    return
}

def war = args[0]
def embed = "${System.getenv()['GROOVY_HOME']}/embeddable"

def ant = new AntBuilder()

ant.sequential {
    delete(dir: 'build')
    mkdir(dir: 'build/WEB-INF/lib')
    copy(toDir: 'build/WEB-INF/lib') {
        fileset(dir: embed) {
            include(name: 'groovy-all-*.jar')
        }
    }
    copy(toDir: 'build') {
        fileset(dir: '.') {
            exclude(name: 'build/**')
        }
    }
}

new FileOutputStream('build/WEB-INF/web.xml').withWriter { webxml ->
    webxml.print """\
        <!DOCTYPE web-app PUBLIC
          "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
          "http://java.sun.com/dtd/web-app_2_3.dtd" >
        <web-app>
            <servlet>
                <servlet-name>Groovy</servlet-name>
                <servlet-class>groovy.servlet.GroovyServlet</servlet-class>
            </servlet>
            <servlet-mapping>
                <servlet-name>Groovy</servlet-name>
                <url-pattern>*.groovy</url-pattern>
            </servlet-mapping>
         </web-app>
     """.stripIndent()
}

ant.jar(destfile: "build/${war}", basedir: 'build')
println "Created build/${war}"


Tiniest USB Stick

13 December 2010

I made the tiniest USB drive for my car using the elago microSD card reader and a 16G microSD card—it's more of USB nub than a stick, but it's big enough to hold my entire music collection I've collected over the years. The USB port on the new Fiesta is in the middle console out in the open, so I wanted the smallest device for it, so it wouldn't be damaged.


Ubuntu on EeePC 1201N

07 December 2010

New Machine

Back in the summer after being laid off at MapQuest, I needed a new primary notebook computer, so I bought a 12-inch netbook—the Asus EeePC 1201N. I chose this machine, because I wanted something light, portable, inexpensive, and the higher resolution of the 12-inch display was more practical that the 1024x600 displays of the 10-inch netbooks. The machine also has a dual-core hyperthreaded Atom processor, so it shows up as 4 CPUs on this little machine.

Ubuntu 10.04

As soon as I got it, I booted an SD card with Ubuntu 10.04 desktop installation image, and I was off. The install ran smoothly as expected, and I rebooted to the new OS. I went about installing all my normal user, photography, and developer tools. I also included the wireless backport modules based on my previous experience with Claire's EeePC. I'm not sure the backports were necessary on this machine, though—I don't think it made much of a difference.

I was sort of annoyed to have to load the NVidia drivers and config panels, but it seems to be nearly unavoidable these days. At least it seems to just work. The HDMI output even works with my TV, so I guess I can't complain.

Performance

I can run Eclipse and Sun Wireless Toolkit fine on the machine, as does the Android SDK, though I try to not keep too many projects open at once. Grails development at the command-line (in vim) goes quickly enough, though I can tell this machine's a little slower than my bigger desktop machines. My normal build, test, report cycle completes in under 2 minutes.

I've used the machine as my primary photo processing machine (digikam, Gimp, Rawstudio) when I was on vacation for a week or when I'm in my photography class. It does fine, but working with lots of images can be slow compared to the Athlon X2 server where I usually do that work.

For browsing, music, and podcatching the machine has plenty of power.

Problems

From the beginning, suspend (memory) and hibernate (disk) worked, but sometimes a memory issue (maybe loose) would cause it to shutdown while suspended and boot up with half the memory working. This problem seems to have gone away on its own. After the Ubuntu 10.10 upgrade, I'm still working to get hibernate working again, but I still have suspend.

I fought for a couple weeks trying to get good old CPU frequency scaling to work. I could manage to force the module to load, but it would cause all sorts of latency and pauses, and it didn't save any power. It turns out that this processor is already optimised enough for power saving, so I gave up in the end and just let it run full speed all the time. Currently, I can count on about 3 hours of battery.

The wireless network was fine until I took the machine to my new job. On the work wireless network, the connection becomes flaky when it tries to hop channels and access points. I haven't figured out how to fix this yet, but I worked around it by just using the wired connection while I'm there.

Small and Generic Wins

Despite some problems, I'm still impressed enough with it that I've ordered a third netbook for the house. I really wanted to buy another 1201N, but they're not available, so I bought an AMD-based EeePC 1215T. (The 1215T is even easier to setup.) I really love the 12-inch netbook form-factor, and it's worth the performance trade offs in the type of computing I do, and the relatively generic hardware makes it easy to run Linux.


A Groovy First Monday

22 September 2010

The new K-Prep website is implemented in Grails now, so I was looking for a Groovy way to let the computer do the heavy lifting of figuring out dates for each week (starting with the first Monday) of the school year and matching them to a list of themes.

I got the algorithm working in about 8 lines of Groovy code, and then generalized it a bit more for you here to allow you to ask for any day of any week of any month. e.g. 3rd Wednesday in December.

To get the date for the 3rd Wednesday in December, my call looks like this:

dayByWeek(2010, DECEMBER, 2, WEDNESDAY, 0)

And the implementation looks like this:

import static java.util.Calendar.*

def dayByWeek = { year, month, week, day, shift ->
    def c = Calendar.instance
    c.minimalDaysInFirstWeek = c.firstDayOfWeek + 7 - day
    c[YEAR] = year
    c[MONTH] = month
    c[WEEK_OF_MONTH] = week + 1 + (shift?:0)
    c[DAY_OF_WEEK] = day
    c.time
}

The shift parameter allows me to optionally start a theme on the previous week in cases where that day is the end of the previous month. The static import allows me to conveniently refer to the Calendar constants without qualifying them, and finally, setting the minimalDaysInFirstWeek allows days early or late in the week to still be found when the Calendar would have otherwise preferred a longer week to start searching.


Catching Your Twitter Replies in FriendFeed

22 June 2010

I use FriendFeed to aggregate all my content, and that echoes it out to Twitter for people who prefer to use that service to follow me.

I'm following many of my friends in FriendFeed, but I still need to see every Twitter reply without having to go check Twitter, so I:

Now I can just watch that group as part of my normal feed, and it shows me any replies within a couple hours of them being posted, and I often end up finding or creating a FriendFeed user for contacts I didn't know lived on Twitter.

Note: While playing with my twitter search feed, I noticed that my FriendFeed comments on those entries weren't echoed out to Twitter, so I just switched it to a Standard group, and that allows for the comments to be posted to Twitter.


Top Posting in Mutt

27 May 2010

Outlook, Entourage, and Evolution have trained me in work environments to top-post my email replies against my curmudgeonly better judgment.

Now that I'm mostly job searching and sending lots of email from my home account, I've finally buckled to the peer pressure, and configured mutt to top-post my signature in the .muttrc:

set sig_on_top = yes

I don't even frequent those old mailing lists where someone would yell at me for top-posting, anyway. Next I'll likely just dump Mutt and go to a desktop mail client, like Thunderbird.


Older posts are available in the archive.