Thursday, November 15, 2012

Oh wow, Functional Programming in Scala is over just like that!


On the last assignment of Progfun, I got sidetracked by some assertions in the discussion group about implementation details that weren't generally true, and hovered very close to the solution for far too long — long enough to start worrying about how I would finish by the deadline and make meaningful progress on some work for hire and catch up on another class that started last week when I was in Germany.

This a.m. after a slight change I decided to submit it to the grader (while at the time some testcases that only served to check someone else's implementation details were failing), and only a trivial style nit and handling of a simple edge case needed to be fixed. That was quick work to resolve, and now it is all over.

Overall I had one var (i.e., one bit of obviously imperative code) across six assignments for a demerit of 0.02 out of 60.00. If only...

Wednesday, November 7, 2012

Not a fanbois, but...


I bought an iPad mini on the first day. I like it. I don't care how bad everyone says it is.

I quickly discovered an app for the iPad called Textastic, which makes it easy to edit files accessible via Dropbox (or a couple of other mechanisms). I particularly like the cursor navigation wheel and the special symbol and number keys above the normal keyboard which give easy access to 45 or so more keys without cycling through keyboard layouts. It is a steal at $8.99. My Thinkpad has neither the battery life nor the size to allow for practical editing of files on the plane for more than a short time, so this app was a lifesaver on a recent trip.

My AC2012 EU slides


Monday, November 5, 2012

App App App App


<?php

function get_key($pi) {
    $terms = strlen($pi) != 0 ? $pi : 'Monday';
    $key = end(explode('/', $terms));
    return $key;
}

$key = get_key($_SERVER['PATH_INFO']);
$mckey = 'demowebapp.' . $key;

$mc = new Memcache;
$mc->connect('192.168.11.199', 11211);
$val = $mc->get($mckey);
if (!$val) {
    $pgconn = pg_connect("host=192.168.11.199 dbname=demowebapp");
    $res = pg_query($pgconn, "SELECT * from demowebapp_x WHERE id = '$key';");
    $row = pg_fetch_row($res);
    $val = $row[1];
    pg_free_result($res);
    pg_close($pgconn);
    $mc->set($mckey, $val, 0, 1);
}

print "$val\n";
?>


use strict;
use DBI;
use Cache::Memcached;

sub get_key {
    my $pi = shift;
    my @terms = split(/\//, $pi || "Monday");
    return $terms[-1];
}

my $app = sub {
    my $env = shift;

    my $key = get_key($env->{'PATH_INFO'});
    my $mckey = 'demowebapp.' . $key;

    my $mc = new Cache::Memcached({'servers' => ['192.168.11.199:11211']});
    my $val = $mc->get($mckey);
    if (!$val) {
        my $dbh = DBI->connect('DBI:Pg:dbname=demowebapp;host=192.168.11.199');
        my $sth = $dbh->prepare("SELECT * FROM demowebapp_x WHERE id = '$key';");
        $sth->execute();
        ($key, $val) = $sth->fetchrow_array();
        $sth->finish();
        $dbh->disconnect();
        $mc->set($mckey, $val, 1);
    }

    return ['200', ['Content-Type' => 'text/html'], [$val]];
};


import psycopg2
import memcache

def get_key(pi):
    terms = [token for token in pi.split('/') if token != '']
    if terms:
        return terms[-1]
    return 'Monday'

def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/html')])
    key = get_key(environ['PATH_INFO'])
    mckey = 'demowebapp.' + key
    mc = memcache.Client(['192.168.11.199:11211'])
    val = mc.get(mckey)
    if not val:
        pg = psycopg2.connect(database='demowebapp', host='192.168.11.199')
        csr = pg.cursor()
        csr.execute("SELECT * FROM demowebapp_x WHERE id = '%s';" % key)
        val = csr.fetchone()[1]
        csr.close()
        pg.close()
        mc.set(mckey, val, time=1)
    return [val]

class Lookup
    def get_key(pi)
        terms = pi != nil ? pi : 'Monday'
        terms.split('/')[-1]
    end

    def call env
        key = get_key(env['PATH_INFO'])
        mckey = 'demowebapp.' + key

        mc = Memcached.new('192.168.11.199:11211')
        begin
            val = mc.get mckey, false
        rescue
            val = nil
        end
        if not val
            pgconn = PGconn.open(:dbname => 'demowebapp', :host => '192.168.11.199')
            res = pgconn.exec("SELECT * from demowebapp_x WHERE id = '#{key}';")
            val = res[0]['content']
            res.clear
            pgconn.finish
            mc.set mckey, val, 1, false
        end

        [200, {'Content-Type' => 'text/html'}, [val]]
    end
end

Thursday, October 18, 2012

Chasing after fd 5


On FreeBSD 9, the mod_cgid daemon appears to have an odd file open, and in my current configuration that is file descriptor 5. procstat displays it as

26889 httpd               5 ? - ---------   2       0 -

The question mark is the result of translating unknown through multiple namespaces, and I stopped chasing it through the code backwards when I saw libprocstat copying foo_UNKNOWN to bar_UNKNOWN.

The file descriptor isn't really in use, since a CGI request will result in accept() returning 5 in that process.

Using DTrace to print the syscall name and pid for every syscall issued by httpd with either first arg 5 or return value 5 shows that it is a listening socket created in the initial httpd process and closed by the mod_cgid daemon, presumably via a call to ap_close_listeners().

There may be an interesting story/bug behind this, but I don't think it is in httpd-land, and time is flying.

#!/usr/sbin/dtrace -s

syscall:::entry
/execname == "httpd" && arg0 == 5/
{
  printf("%s %d %d\n", probefunc, arg0, pid);
}

syscall:::return
/execname == "httpd" && arg0 == 5/
{
  printf("%s %d %d\n", probefunc, arg0, pid);
}

(No, ustack() isn't working for me, but I didn't make world with the suggested flags.)

Saturday, October 13, 2012

lsof process group selection troubles on OS X too?


lsof exits with status 1 and no output on Snow Leopard when selecting either a Dropbox process group or an httpd process group. (I should get a download code for Lion in the next few days. I wonder if that works better.)

Anyway, the script mentioned previously which shows file descriptors by process group is available here as pgfiles.py.

Later

The problem symptom didn't change after installing Lion (lsof 4.84 built by Apple a couple of months ago), but the workaround of supplying lsof with a list of the pids in the group of interest appears to work fine.

The fix to lsof was trivial. I sent it to the author, so hopefully it will be in the next release.

FreeBSD lsof process group duplication????


A few days ago I was looking over some new code for an Apache httpd module and I was afraid that the design would lead to daemons like the mod_cgid daemon inheriting the module's pipe and inadvertently keeping the write end open and thereby break part of what the module used the pipe for. That lead to a desire to summarize Apache httpd file descriptors by which processes had them open. This morning I set out to write a script for that but with too little sleep+caffeine I stared at a mostly-empty Emacs buffer long enough that I decided to set a timer for one hour to force the issue.

The timer went off and I was still wading through far too much output; the same process id was listed multiple times for a given descriptor, and I couldn't find the reason in the code. I wasted a bit of time messing with the code but finally went back to a normal lsof display in the shell and discovered what was going on: When using -g NNN to select via process group id, lsof is displaying the same process multiple times, as in this snippet from the repeated displays of all the fds for one of the httpd processes:

$  lsof -P -g 38239 -a -d ^txt,^rtd,^cwd,^mem,^DEL | grep '38243.*4u'
lsof: WARNING: compiled for FreeBSD release 9.0-RC2; this is 9.0-RELEASE.
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)
httpd   38243 38239 trawick    4u    IPv4 0xfffffe00271a57a0      0t0    TCP *:* (CLOSED)

I don't see the same behavior on Linux. I ended up adding filtering to deal with the repetition. My script is now able to display a more manageable summary of files by process:

$ apfds.py 38239
fd 0 type VCHR name /dev/null
  38239 38240 38241 38242 38243
fd 1 type VCHR name /dev/null
  38239 38240 38241 38242 38243
fd 2 type VREG name /usr/home/trawick/inst/24-64/logs/error_log
  38239 38240 38241 38242 38243
fd 3 type IPv6 dev 0xfffffe002706c000 name *:8080
  38239 38241 38242 38243
fd 4 type IPv4 dev 0xfffffe00271a57a0 name *:*
  38239 38240 38241 38242 38243
fd 5 type IPv6 dev 0xfffffe0027099b70 name *:10080
  38239 38241 38242 38243
fd 6 type IPv4 dev 0xfffffe00271a73d0 name *:*
  38239 38240 38241 38242 38243
fd 7 type PIPE dev 0xfffffe0002729000 name ->0xfffffe0002729158
  38239 38240 38241 38242 38243
fd 8 type PIPE dev 0xfffffe0002729158 name ->0xfffffe0002729000
  38239 38240 38241 38242 38243
fd 9 type VREG name /usr/home/trawick/inst/24-64/logs/access_log
  38239 38240 38241 38242 38243
fd 10 type VREG name /usr/home/trawick/inst/24-64/logs/rewrite-map.38239
  38239 38241 38242 38243
fd 3 type unix dev 0xfffffe00273ad2a8 name /home/trawick/inst/24-64/logs/cgisock.38239
  38240
fd 5 name 0xfffffe0027171960 file struct, ty=0, op=0xffffffff81079180
  38240
fd 11 type VREG name /usr/home/trawick/inst/24-64/logs/rewrite-map.38239
  38241 38242 38243
fd 12 type KQUEUE dev 0xfffffe00131d4000 name count=0, state=0x2
  38241
fd 12 type KQUEUE dev 0xfffffe0018b9c600 name count=0, state=0x2
  38242
fd 12 type KQUEUE dev 0xfffffe002775e300 name count=0, state=0x2
  38243

(In some cases it may not be correct to require the fds to match in order for two files to be the same; OTOH, the heuristics might be unmanageable, and it may help to see the separate listings for distinct fds anyway.)

Later

More FreeBSD fun: Given the Mac OS X issue, I reimplemented the lsof group selection to use -p pid1,pid2,pid3, with the list built internally via ps. But that doesn't work at all on FreeBSD. Instead, it lists files for only the last pid in the list and exits with status 1. So the latest version of the script uses -g pgid (along with code to filter out the over-reporting) on FreeBSD and -p pid1,pid2,pid3 elsewhere. (I dare not try it on Solaris today.)

Later still...

I built lsof for Solaris 10 and didn't see any glitches with -pLIST or -gPGID. Also, I was able to create a fix for the FreeBSD glitches and send it to the lsof author.

Friday, October 12, 2012

Lion


As noted elsewhere, OS X Lion can still be purchased via a call to 1-800-MY-APPLE. $19.99 + tax.

As far as I know, this article is still correct on the likely but undocumented policy of security fixes. Another reason I want to upgrade is to be able to test software on a later OS X level.

Later

Throw in another $50.00 for the latest VMware Fusion (I had 2.0.6 previously, which doesn't support Lion) and a lot of wasted time fiddling with Xcode and Mac Ports to restore a working build environment (the upgrade wiped out symlinks which were part of the old Xcode (as well as the guts of Mercurial), new Xcode doesn't provide autoconf, ...). I guess everybody else went through this a year ago.

Monday, October 8, 2012

Recruiter spam


How can I get a phone call today about an Android development position as well as an e-mail about Hadoop work? I have no experience in either of these.

I can imagine some sort of procedure that takes a list of names and looks for interesting data for those search terms. I can sort of see a connection with Hadoop, as google("trawick hadoop") shows a few interesting hits:

  • From a conference schedule, where a Hadoop talk is listed after mine:
    Jeff Trawick. Big Data. Hadoop
    
  • From an apache.org server-status page:
    .. GET /dist/hadoop/common/hadoop-0.20.2/hadoop-0.20.2/src/docs/cn ..... 119.63.88.205, www.apache.org, GET /~trawick/apache-2-on-os390.html HTTP/1.0 ...
    
  • Does this make it appear that I'm a Hadoop developer?
    hive/trunk/common/src/java/org/apache/hadoop - SVNSearch
    svnsearch.org/svnsearch/repos/.../search?rev.../hadoop/...Share1370910 08.08.2012 21:37:27, by trawick. grab r1370907 from trunk: ... M /hadoop/common/branches/branch-2/hadoop-hdfs-project/had
    

and a bunch of less interesting pages totaling 19,500.

I didn't see anything interesting at the top of google("trawick android").

google("trawick resume keyword") and google("trawick experience keyword") yield only a few hits.

I guess the contacts were purely to rifle through *my* contacts. I know I shouldn't take it so seriously, but I respect the problem they're trying to solve. I have lost hope that this simple message would help avoid wasting the time of busy people, not just myself.

Friday, September 28, 2012

College dropout


Quite a while back I had signed up for some Coursera offerings which were off in the distant future. Around ten days ago I started getting boatloads of e-mails as several of the classes started. I've had plenty to keep me busy, including preparation for a couple of upcoming ApacheCon EU talks, so I dropped all but Functional Programming Principles in Scala. I've mostly caught up over the last several days.

After I left full-time employment earlier in the year, MOOCs were exactly what I needed for a change in perspective and a structured way to acquire useful knowledge, but there are a number of projects I want to develop, and eventually I need to create something that generates income, so I'll have to exercise a lot of restraint when I see interesting class offerings.

Monday, September 24, 2012

Practice vs. deliberate practice, re-spinned?


Errors vs. Bugs and the End of Stupidity

After playing for familiarity comes the real work: listening critically and fixing the bugs, one at a time. This is obvious, but too often it isn't the way we approach a mediocre level of performance. It takes time to resolve, but time shouldn't be the focus. Etc.

Thursday, September 6, 2012

New versions of mod_whatkilledus and mod_backtrace


A couple of weeks ago I started playing around on Windows to learn how to get backtraces programatically, as the first step to getting mod_whatkilledus and mod_backtrace working on that platform.

This afternoon I finished testing a rewrite of the two modules and hurriedly put together a distribution zip and documentation on the web. Yea!

Thursday, August 23, 2012

Gotta love SymInitialize()


Yesterday morning I started playing with a complete rewrite of mod_whatkilledus and mod_backtrace. I have a handful of goals for the rewrite, but the largest one is to have the functionality available on the Windows platform.

I started with trying to get a backtrace for a crashing module on Windows using the DbgHelp library. It didn't take long to get something minimal working with my MinGW/MSYS build of httpd trunk:

Wed Aug 22 09:17:07 2012
mod_wbt report:
Exception code:    EXCEPTION_ACCESS_VIOLATION
Exception address: 0043C47C
0043C47C
0040C6E8
0040CA5D
00442913
00442A27
0043F57C
00427A28
0046414C
76CC339A
779D9EF2
779D9EC5

Of course, not many people would find that helpful. An hour or so later I got another chance to play and with a few more changes I had this output:

Wed Aug 22 10:50:45 2012
mod_wbt report:
Exception code:    EXCEPTION_ACCESS_VIOLATION
Exception address: 0043C56C
  43C56C Return address
Symbol: apreq_parse_headers
  40C6E8 Return address
Symbol: ap_run_handler
  40CA5D Return address
Symbol: ap_invoke_handler
  442A03 Return address
Symbol: ap_process_async_request
  442B17 Return address
Symbol: ap_process_request
  43F66C Return address
Symbol: apreq_parse_headers
  427A28 Return address
Symbol: ap_run_process_connection
  46423C Return address
Symbol: mpm_signal_service
  76CC339A Return address
Symbol: BaseThreadInitThunk
  779D9EF2 Return address
Symbol: RtlInitializeExceptionChain
  779D9EC5 Return address
Symbol: RtlInitializeExceptionChain

Some of the symbols are hosed, but it was starting to look meaningful.

I got back to work on the Windows side this evening. The result of my first test of the same crash with a Visual Studio build of httpd was pretty disappointing:

Thu Aug 23 18:14:51 2012
Exception code:    EXCEPTION_ACCESS_VIOLATION
Exception address: 714B14E2
  no-symbol [0x714B14E2]
  ap_run_handler [0x6FF02115]
  ap_invoke_handler [0x6FF0257C]
  ap_die [0x6FF0F7FC]

Some of that is actually correct, but there's not much information available. This test was with an httpd 2.4.3 community build created with Visual Studio 10, and no .pdb files were present. I switched to an old build of 2.2.15-dev (What tools did I have back then???), which had .pdb files for everything, and got a longer but just as screwy backtrace:

Thu Aug 23 19:53:53 2012
Exception code:    EXCEPTION_ACCESS_VIOLATION
Exception address: 714B10AE
SymInitialize() failed with error 87
  no-symbol [0x714B10AE]
  no-symbol [0x714B106D]
  ap_run_handler [0x6FF02115]
  ap_invoke_handler [0x6FF0257C]
  ap_die [0x6FF0F7FC]

I had noticed by this point that SymInitialize() was failing. The only time I could get it to "succeed" was with FALSE for the fInvadeProcess parameter, and that yielded this lovely backtrace:

Thu Aug 23 19:57:00 2012
Exception code:    EXCEPTION_ACCESS_VIOLATION
Exception address: 714B10AE
  no-symbol [0x714B10AE]
  no-symbol [0x714B106D]
  no-symbol [0x6FF02115]
  no-symbol [0x29800F8]
  no-symbol [0x29800F8]
  no-symbol [0x29800F8]
  no-symbol [0x6EECCCC0]
  no-symbol [0x6FF0257C]
  no-symbol [0x29800F8]
  no-symbol [0x29800F8]
  no-symbol [0x29800F8]

(At least it didn't lie.)

The trick I finally found was to override the default search path, even though I understand from the documentation that it should find the symbol files anyway:

    if (SymInitialize(process, 
                      "C:\\Apache22\\bin;C:\\Apache22\\modules",
                      TRUE) != TRUE) {
        fprintf(log, "SymInitialize() failed with error %d\n",
                GetLastError());
    }

(And no, I don't intend to use stdio permanently in this context.)

That yields the following:

Thu Aug 23 19:59:46 2012
Exception code:    EXCEPTION_ACCESS_VIOLATION
Exception address: 714B10AE
SymInitialize() failed with error 87
  no-symbol [0x714B10AE]
  no-symbol [0x714B106D]
  ap_run_handler [0x6FF02115]
  ap_invoke_handler [0x6FF0257C]
  ap_process_request [0x6FF0F7FC]
  ap_process_http_connection [0x6FF0AA82]
  ap_run_process_connection [0x6FF04F25]
  ap_process_connection [0x6FF051B2]
  worker_main [0x6FF1E130]
  endthreadex [0x74F23433]
  endthreadex [0x74F234C7]
  BaseThreadInitThunk [0x76CC339A]
  RtlInitializeExceptionChain [0x779D9EF2]
  RtlInitializeExceptionChain [0x779D9EC5]

(And yes, SymInitialize() still returns an invalid parameter error.)

There's still some bogosity (libc symbols needed), and for some reason it doesn't grok the symbols in my DSO (which has a .pdb file), but this is pretty good.

Tuesday, August 7, 2012

Small houses, home built RVs, etc.

Read about it http://lloydkahn-ongoing.blogspot.com/.  I found a link to that a few days ago on http://freecabinporn.com/.  I have enjoyed many of the photos and ideas, and I feel a longing to hit the road.

Wednesday, July 25, 2012

We could not complete your purchase

I have a lightly used Core 2 Duo MacBook that I thought I'd upgrade to Mountain Lion, but I encountered an unexpected issue in the App Store: "We could not complete your purchase. OS X Mountain Lion is not compatible with this computer."

Requirements: "OS X 10.6.8 or later"

About This Mac says "Mac OS X Version 10.6.8"

How did Tim know that I didn't need this and should be doing something productive?

Friday, July 20, 2012

WSAEMFILE

The error code exists so it should be interesting, right?  I wanted to force this error for Apache httpd on Windows (7 in my case), so I thought I'd create sockets in the child until it failed, then free up the last n of those so that the server could basically work but occasionally encounter socket handle limits under controlled load.  I really didn't expect this:

[Fri Jul 20 10:28:09.269300 2012] [mpm_winnt:crit] [pid 4540:tid 444] (OS 10055)An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.  : error on last socket create request, after creating 1328724

I was able to successfully create 1.3 million AF_INET/SOCK_STREAM sockets before encountering WSAENOBUFS. So much for trivially forcing a real WSAEMFILE error... If I understand a few web resources correctly, there's no socket handle limit other than limitations on resources associated with the socket.

Thursday, July 5, 2012

Woo hoo! Compilers is done

Earlier this week, after a Friday-Monday a.m. heads down stint, I finished the last programming assignment — MIPS code generation for the Cool language — for Coursera's Compilers class.  Just now I finished taking the final, so I'm DONE.  What a relief!

The last programming assignment was great fun.  At the point that "Hello, world" actually ran on the MIPS emulator I started using the grading script and its testcases to identify the next bug or feature to implement.  The first run was 0 points out of 63 possible, and getting more than 1 or 2 points took quite a few hours :)   As I slowly filled in the implementation, each time I passed another testcase I ran around the house and high-fived anyone home. Finally, fixing a bug with calculating dispatch table offsets for overridden methods brought the score to 63/63 and I was done.  (No one will ever look at that blatantly unrefactored code I hope.)

Now, on to those things I'm behind on :)

Wednesday, May 9, 2012

Word of the day

Semiprime — a product of two prime numbers, which do not have to be distinct

Thursday, April 26, 2012

Coursera's Design and Analysis of Algorithms I — Finally finished!


I just finished the final exam for this class, taught by Tim Roughgarden of Stanford. At the moment I'm bummed out because after spending six or seven intense hours studying and arranging materials for and then taking the final I earned a 24.00 out of 30.00 on what was essentially an open-Internet test with two extra hours to research. (I had almost as many correct at the 0:58 mark as I did at the end, so I should have had better return from the two remaining hours.) Of the three questions I missed, I had no clue about one and misread or made an avoidable error on the other two. Still, I count myself somewhat lucky to get 80% on the final. I accrued technical debt throughout the course, at least until the point that &dayjob; ended and coincidentally the class moved on to graphs. I did not understand a handful of aspects of analysis or related mathematics on early topics (and that's just counting what showed up on the problem sets), but thanks to multiple choice answers and two chances to submit for the problem sets (along with programming assignments which were tedious but not tricky) I had 100% going into the final and ended the class with 94%.

Putting the same amount and kind of effort into the Stanford class, I would have been lucky to get 80% overall, though in effect it would be a different person taking that class at Stanford so all bets are off. The grading aspect isn't really so interesting anyway because there is little if any reputation at stake. (Will anyone try to find a piece of paper taped to my fridge for each MOOC whose forum I show up in?)

Some hundreds of people on the class forum supported the notion that Prof. Roughgarden is a teacher of some talent, and I concur. Thus, some useful artifacts were created -- namely, lecture videos, homework assignments of different types, etc. with matching idiosyncrasies. (For the moment let's ignore the current Stanford/Coursera agreement that puts in question these very artifacts.) What I'd love to see besides the obvious fixes (minus 2 for spelling, Tim!) are layers of crowd-contributed material à la MST, Pop-Up Videos, etc. to provide crowd-vetted context, pointers to remedial materials on the specific topic or terminology, etc. I should be able to pause the lecture and read or reference other materials directly.

Is a CS Education Movie Database with precomputed Norvig Number far behind?

Saturday, April 21, 2012

A clear run-through of Dijkstra's algorithm which requires much less caffeine than the one in my class (perhaps a lame consideration, but I studied this and Floyd's 23+ years ago and haven't used them since)

Thursday, April 19, 2012

Note to self: Where are my graduate school professors?

I've had computer science education on my brain lately (more thoughts on that later) and just spent a few minutes to track down a few professors I spent a lot of time with in graduate school at the University of Alabama in the late '80s... Two are still in academia, while one left for IBM @ RTP six months before I did...

  • Dr. Yeager, Programming Languages, master's project, probably more

  • Dr. Chung, Compiler Construction, special project to build a Prolog-subset interpreter

  • Dr. Swiniarski, System Programming, Computability

The main thing I remember from System Programming is that Dr. Swiniarski assigned a mammoth project to write a simple language interpreter with macro facility, to be implemented in C, x86 assembler, and S/370 assembler. It has always seemed funny-odd that we were forced to spend so much time on language interpreter issues for this class while Dr. Chung required a lot of attention to buffer management in Compiler Construction.

Back to Applied Cryptology videos...

Monday, April 16, 2012

550 5.1.1 jeff.trawick@oracle.com is not an active email address in the system

jeff.trawick@oracle.com, jeffrey.trawick@sun.com, trawick@us.ibm.com, JTRAWIC3 AT UA1VM — a line of personas which goes back to the late 1980's. One more was decommissioned Friday (yes, the 13th).

I'm taking a new direction, at the same time both more and less commercial than before. More commercial? I'll have to go out and find income; it won't appear in my bank account twice a month regardless of what transpired over the last couple of weeks. Less commercial? I'll sacrifice some amount of present enterprise in order to implement a better balance between life and present and future income.

http://emptyhammock.com/

Wednesday, February 15, 2012

Too lazy to translate



I hope I didn't mess this up!

November 5, 1975

Page two of that day's Gadsden Times had a picture of F. Lee Bailey and colleagues for an article on the upcoming ruling on Patty Hearst's mental competence. I was just over ten years old on this day and remember those tumultuous times, my primary concern being the frequent interruptions of Hawaii Five-O and other important cultural events for another CBS News Special Report.

Page one was dominated by state and local issues, and included an article on a local Spanish teacher, Dora Gene Hill, who was representing the state of Alabama in a national teacher of the year contest. The article went on to describe the many accomplishments of Mrs. Hill and her students from the time she became the first high school Russian teacher in Alabama back in 1960.

Mrs. Hill, always referred to as "Dora Gene" by a friend (as long as she was out of earshot), was my Latin I teacher in my senior year of high school some seven years after this article was published. That was a rather late point to start Latin, but I was assured that it would be a great experience. And it was! She was a ball of energy, moving around the room constantly, speaking very quickly, and magically imparting a great deal of knowledge. A number of us from that class have medals from the National Latin Exam to prove it.

A rather unfortunate memory of Mrs. Hill was the look she gave a friend and me as we returned to the Civic Center Sheraton in downtown Birmingham with ill-gotten pizza. We were with a school group at the state Latin convention, and against the rules laid down by Mrs. Hill we left the hotel to bring back food for our group. Aside from the stupidity of leaving the hotel, we did not understand the distinction between 11th Avenue North and 11th Avenue South and suffered more than sufficient trials and tribulations even before being caught red-handed back at the hotel.

I found out from my high school band Facebook group that Mrs. Hill died yesterday. The obituary I read had no mention of family or accomplishments, but I know she is survived by thousands of students over decades of devoted teaching, and among the most important lessons learned by those students was the meaning of excellence and devotion, seen all too rarely at the level practiced by Mrs. Hill.

Friday, February 3, 2012

Mandatory commentary for a makefile that simply includes another one?

# Qing zailai yibei hage kafei.

(At least that's what some developer thought n years ago when modifying the file I'm staring at now. And it is time for another cup of coffee.)

Tuesday, January 24, 2012

Saturday, January 14, 2012

JavaScript objects

good coverage

(and the need for more editing is no greater than with the average O'Reilly book)