scratchpad
Limbic~Region
<p>
<b>Would prefer to make this a single regular expression but avoid (?{ code }) if possible but have no issue with /e</b>
<c>
sub format_string {
my ($str) = @_;
return $str if ! $str;
my $new_str = '';
for my $chr (split '', $str) {
my $ord = ord($chr);
if ($ord < 255) {
$new_str .= $chr;
next;
}
$new_str .= '&#x' . sprintf("%x", $ord) . ';';
}
return $new_str;
}
</c>
</p>
<p>
<b>For [BrowserUk]:</b>
<br />
When I do alt+space and hit any arrow key, I can then use my mouse alone to re-position the window. I think the following might work for moving a window to a desired X,Y.
<c>
my $wid = WaitWindow('Notepad', 5);
# Paranoia - make sure we are affecting the desired window
SetActiveWindow($wid);
SetFocus($wid);
SetForegroundWindow($wid);
# Used to determine where to move the mouse later
my ($left, $top, $right, $bottom) = GetWindowRect($wid);
# Enable moving the mouse to move the window
# I *THINK* this will work
SendKeys("%{SPACE}M{DOWN}");
my ($x, $y) = calculate_position_from($left, $top, $right, $bottom);
MouseMoveAbsPix($x,$y);
SendKeys("{ENTER}");
</c>
</p>
<p>
<b>From [BrowserUk]:</b>
<br />
<c>
## Shared the array of select ids
my @id :shared;
## Select them
while (my $rec = $sth->fetchrow_hashref) {
push @id, $rec->{unique_id} if desired_rec($rec);
}
## Set the number of threads--start with 1 per core
our $T //= 4;
## break up the array into non-overlapping ranges
my( $step, $s, @ranges ) = ( int @id / $T, 0 );
push( @ranges, [ $s, $s + $step -1 ] ), $s += $step for 1 ..$T;
$ranges[ -1][1] = scalar @id;
my @threads;
## Loop over those ranges
for my $range ( @ranges ) {
##starting a new thread for each
push @threads, async {
## Create a new handle in each thread
my $dbh = DBI->connect( ... ) or die ..;
my $del_sth = $dbh->prepare("DELETE FROM TBL WHERE unique_id = ?");
## process the subrange one at a time
for( @id[ @$range ] ) {
eval {
$del_sth->execute($_);
};
$logger->write("Failed to remove '$_'") if $@;
}
## till done
$dbh->disconnect;
};
}
## Wait for them
$_->join for @threads;
</c>
</p>
<p>
<b>For [moritz]/[BrowserUk]/[ambrus]/[bart]/[blokhead]</b>
<br />
Here is the abstracted code I was trying to convert from recursion to iteration through a @stack. While iterative versions of the red/black tree are fairly straight forward, they require an additional slot for the parent. I want both fast and compact. Function calls in perl are slow and I am hoping to get a speedup by converting the call stack into a user stack. I finally figured it out - see below:
<c>
sub _insert {
my ($node, $cmp, $key, $val) = @_;
return [RED, $key, $val, undef, undef] if ! $node;
# Do foo with $node
my $result = $key cmp $node->[KEY];
if ($result == EQUAL) {
$node->[VALUE] = $val;
}
elsif ($result == MORE) {
$node->[RIGHT] = _insert($node->[RIGHT], $cmp, $key, $val);
}
else {
$node->[LEFT] = _insert($node->[LEFT], $cmp, $key, $val);
}
# Do bar with $node
# Do blah with $node
return $node;
}
</c>
Not thoroughly tested for dup inserts, but appears to be working
<c>
sub _insert {
my ($node, $cmp, $key, $val) = @_;
my ($found, @stack);
while ($node) {
_colorFlip($node) if _isRed($node->[RIGHT]) && _isRed($node->[LEFT]);
push @stack, [$node, undef];
my $result = $cmp->($key, $node->[KEY]);
# Dup key, replace value
if ($result == EQUAL) {
($found, $node->[VALUE]) = (1, $val);
$node = undef;
}
# Descend right
elsif ($result == MORE) {
$stack[LAST][DIR] = RIGHT;
$node = $node->[RIGHT];
}
# Descend right
else {
$stack[LAST][DIR] = LEFT;
$node = $node->[LEFT];
}
}
push @stack, [[RED, $key, $val, undef, undef], undef] if ! $found;
my $assign;
while (@stack) {
my $unwind = pop @stack;
my ($item, $dir) = @{$unwind}[NODE, DIR];
if ($assign || $found) {
$item->[$dir] = $assign->[NODE] if $assign;
$item = _rotateLeft($item) if _isRed($item->[RIGHT]) && ! _isRed($item->[LEFT]);
$item = _rotateRight($item) if _isRed($item->[LEFT]) && _isRed($item->[LEFT][LEFT]);
}
$assign = [$item, undef];
}
return $assign->[NODE];
}
</c>
And below, is the current work in progress.
<c>
package Tree::Binary::RedBlack;
require Exporter;
@ISA = 'Exporter';
@EXPORT = qw/
deleteKey
deleteMax
deleteMin
insert
key_exists
lookup
max
min
new_rb
node_count
/;
our $VERSION = '0.01';
# Tree definition
use constant ROOT => 0;
use constant COUNT => 1;
use constant COMPARE => 2;
# Node definition
use constant COLOR => 0;
use constant KEY => 1;
use constant VALUE => 2;
use constant RIGHT => 3;
use constant LEFT => 4;
# Color definition
use constant BLACK => 0;
use constant RED => 1;
# Comparison definition
use constant LESS => -1;
use constant EQUAL => 0;
use constant MORE => 1;
# Truth definition
use constant TRUE => 1;
use constant FALSE => undef;
# Stack definition
use constant LAST => -1;
use constant NODE => 0;
use constant DIR => 1;
use strict;
use warnings;
use Carp;
use UNIVERSAL 'isa';
# Public
sub new_rb {
croak "Incorrect number of parameters" if @_ % 2;
my %opt = @_;
my $cmp = delete $opt{compare} || 'cmp';
if (isa($cmp, 'CODE')) {
*_insert = *_insert_custom;
}
elsif($cmp eq 'cmp') {
#*_insert = *_insert_ascii;
*_insert = *_insert_cmp;
}
else {
croak "The '$cmp' comparison is not supported";
}
carp "The '$_' parameter is not supported\n" for keys %opt;
return [undef, 0, $cmp];
}
# Public
sub insert {
my ($tree, $key, $val) = @_;
$tree->[ROOT] = _insert($tree->[ROOT], $tree->[COMPARE], $key, $val);
$tree->[COUNT]++;
$tree->[ROOT][COLOR] = BLACK;
}
# Private
sub _insert_custom {
my ($node, $cmp, $key, $val) = @_;
return [RED, $key, $val, undef, undef] if ! $node;
if ($node->[RIGHT] && $node->[RIGHT][COLOR] && $node->[LEFT] && $node->[LEFT][COLOR]) {
$node->[COLOR] = ! $node->[COLOR] || BLACK;
$node->[LEFT][COLOR] = ! $node->[LEFT][COLOR] || BLACK;
$node->[RIGHT][COLOR] = ! $node->[RIGHT][COLOR] || BLACK;
}
my $result = $cmp->($key, $node->[KEY]);
if ($result == EQUAL) {
$node->[VALUE] = $val;
}
elsif ($result == MORE) {
$node->[RIGHT] = _insert($node->[RIGHT], $cmp, $key, $val);
}
else {
$node->[LEFT] = _insert($node->[LEFT], $cmp, $key, $val);
}
if ($node->[RIGHT] && $node->[RIGHT][COLOR] && ! ($node->[LEFT] && $node->[LEFT][COLOR])) {
my $temp = $node->[RIGHT];
$node->[RIGHT] = $temp->[LEFT];
$temp->[LEFT] = $node;
$temp->[COLOR] = $node->[COLOR];
$node->[COLOR] = RED;
$node = $temp;
}
if ($node->[LEFT] && $node->[LEFT][COLOR] && $node->[LEFT][LEFT] && $node->[LEFT][LEFT][COLOR]) {
my $temp = $node->[LEFT];
$node->[LEFT] = $temp->[RIGHT];
$temp->[RIGHT] = $node;
$temp->[COLOR] = $node->[COLOR];
$node->[COLOR] = RED;
$node = $temp;
}
return $node;
}
sub _insert_cmp {
my ($node, $cmp, $key, $val) = @_;
return [RED, $key, $val, undef, undef] if ! $node;
if ($node->[RIGHT] && $node->[RIGHT][COLOR] && $node->[LEFT] && $node->[LEFT][COLOR]) {
$node->[COLOR] = ! $node->[COLOR] || BLACK;
$node->[LEFT][COLOR] = ! $node->[LEFT][COLOR] || BLACK;
$node->[RIGHT][COLOR] = ! $node->[RIGHT][COLOR] || BLACK;
}
my $result = $key cmp $node->[KEY];
if ($result == EQUAL) {
$node->[VALUE] = $val;
}
elsif ($result == MORE) {
$node->[RIGHT] = _insert($node->[RIGHT], $cmp, $key, $val);
}
else {
$node->[LEFT] = _insert($node->[LEFT], $cmp, $key, $val);
}
if ($node->[RIGHT] && $node->[RIGHT][COLOR] && ! ($node->[LEFT] && $node->[LEFT][COLOR])) {
my $temp = $node->[RIGHT];
$node->[RIGHT] = $temp->[LEFT];
$temp->[LEFT] = $node;
$temp->[COLOR] = $node->[COLOR];
$node->[COLOR] = RED;
$node = $temp;
}
if ($node->[LEFT] && $node->[LEFT][COLOR] && $node->[LEFT][LEFT] && $node->[LEFT][LEFT][COLOR]) {
my $temp = $node->[LEFT];
$node->[LEFT] = $temp->[RIGHT];
$temp->[RIGHT] = $node;
$temp->[COLOR] = $node->[COLOR];
$node->[COLOR] = RED;
$node = $temp;
}
return $node;
}
sub _insert_ascii {
my ($node, $cmp, $key, $val) = @_;
my ($found, @stack);
while ($node) {
if ($node->[RIGHT] && $node->[RIGHT][COLOR] && $node->[LEFT] && $node->[LEFT][COLOR]) {
$node->[COLOR] = ! $node->[COLOR] || BLACK;
$node->[LEFT][COLOR] = ! $node->[LEFT][COLOR] || BLACK;
$node->[RIGHT][COLOR] = ! $node->[RIGHT][COLOR] || BLACK;
}
my $result = $key cmp $node->[KEY];
# Descend right
if ($result == LESS) {
push @stack, [$node, LEFT];
$node = $node->[LEFT];
}
# Descend right
elsif ($result == MORE) {
push @stack, [$node, RIGHT];
$node = $node->[RIGHT];
}
# Dup key, replace value
else {
push @stack, [$node];
($found, $node->[VALUE]) = (1, $val);
$node = undef;
}
}
push @stack, [[RED, $key, $val, undef, undef]] if ! $found;
my $idx = @stack;
my $assign;
while ($idx--) {
my ($item, $dir) = @{$stack[$idx]}[NODE, DIR];
if ($assign || $found) {
$item->[$dir] = $assign->[NODE] if $assign;
if ($item->[RIGHT] && $item->[RIGHT][COLOR] && ! ($item->[LEFT] && $item->[LEFT][COLOR])) {
my $temp = $item->[RIGHT];
$item->[RIGHT] = $temp->[LEFT];
$temp->[LEFT] = $item;
$temp->[COLOR] = $item->[COLOR];
$item->[COLOR] = RED;
$item = $temp;
}
if ($node->[LEFT] && $node->[LEFT][COLOR] && $node->[LEFT][LEFT] && $node->[LEFT][LEFT][COLOR]) {
my $temp = $node->[LEFT];
$node->[LEFT] = $temp->[RIGHT];
$temp->[RIGHT] = $node;
$temp->[COLOR] = $node->[COLOR];
$node->[COLOR] = RED;
$node = $temp;
}
}
$assign = [$item];
}
return $assign->[NODE];
}
sub lookup {
my ($tree, $key) = @_;
return FALSE if ! defined $key;
my ($root, $cmp) = ($tree->[ROOT], $tree->[COMPARE]);
while ($root) {
my $result = $cmp->($key, $root->[KEY]);
return $root->[VALUE] if $result == EQUAL;
$root = $result == LESS ? $root->[LEFT] : $root->[RIGHT];
}
return FALSE;
}
sub key_exists {
my ($tree, $key) = @_;
return FALSE if ! defined $key;
my ($root, $cmp) = ($tree->[ROOT], $tree->[COMPARE]);
while ($root) {
my $result = $cmp->($key, $root->[KEY]);
return TRUE if $result == EQUAL;
$root = $result == LESS ? $root->[LEFT] : $root->[RIGHT];
}
return FALSE;
}
sub node_count {
my ($tree) = @_;
return $tree->[COUNT];
}
sub deleteMin {
my ($tree) = @_;
$tree->[ROOT] = _deleteMin($tree->[ROOT]);
$tree->[COUNT]-- if $tree->[COUNT];
$tree->[ROOT][COLOR] = BLACK;
}
sub deleteKey {
my ($tree, $key) = @_;
$tree->[ROOT] = _deleteKey($tree->[ROOT], $tree->[COMPARE], $key);
$tree->[COUNT]-- if $tree->[COUNT];
$tree->[ROOT][COLOR] = BLACK;
}
sub max {
my ($tree, $key) = @_;
return FALSE if ! $tree->[ROOT];
return _max($tree->[ROOT]);
}
sub min {
my ($tree, $key) = @_;
return FALSE if ! $tree->[ROOT];
return _min($tree->[ROOT]);
}
sub deleteMax {
my ($tree) = @_;
$tree->[ROOT] = _deleteMax($tree->[ROOT]);
$tree->[COUNT]-- if $tree->[COUNT];
$tree->[ROOT][COLOR] = BLACK;
}
# Private
sub _deleteMax {
my ($node) = @_;
$node = _rotateRight($node) if _isRed($node->[LEFT]);
return FALSE if ! $node->[RIGHT];
$node = _moveRedRight($node) if ! _isRed($node->[RIGHT]) && ! _isRed($node->[RIGHT][LEFT]);
$node->[RIGHT] = _deleteMax($node->[RIGHT]);
return _fixUp($node);
}
sub _deleteKey {
my ($node, $cmp, $key) = @_;
if ($cmp->($key, $node->[KEY]) == LESS) {
$node = _moveRedLeft($node) if ! _isRed($node->[LEFT]) && ! _isRed($node->[LEFT][LEFT]);
$node->[LEFT] = _deleteKey($node->[LEFT], $cmp, $key);
}
else {
$node = _rotateRight($node) if _isRed($node->[LEFT]);
return FALSE if $cmp->($key, $node->[KEY]) == EQUAL && ! $node->[RIGHT];
$node = _moveRedRight($node) if ! _isRed($node->[RIGHT]) && ! _isRed($node->[RIGHT][LEFT]);
if ($cmp->($key, $node->[KEY]) == EQUAL) {
# Opportunity to return key/val together
$node->[VALUE] = _get($node->[RIGHT], $cmp, _min($node->[RIGHT]));
$node->[KEY] = _min($node->[RIGHT]);
$node->[RIGHT] = _deleteMin($node->[RIGHT]);
}
else {
$node->[RIGHT] = _deleteKey($node->[RIGHT], $key);
}
}
return _fixUp($node);
}
sub _get {
my ($node, $cmp, $key) = @_;
return FALSE if ! $node;
my $result = $cmp->($key, $node->[KEY]);
return $node->[VALUE] if $result == EQUAL;
return _get($node->[LEFT], $cmp, $key) if $result == LESS;
return _get($node->[RIGHT], $cmp, $key);
}
sub _min {
my ($node) = @_;
return $node->[KEY] if ! $node->[LEFT];
return _min($node->[LEFT]);
}
sub _max {
my ($node) = @_;
return $node->[KEY] if ! $node->[RIGHT];
return _max($node->[RIGHT]);
}
sub _deleteMin {
my ($node) = @_;
return FALSE if ! $node->[LEFT];
$node = _moveRedLeft($node) if ! _isRed($node->[LEFT]) && ! _isRed($node->[LEFT][LEFT]);
$node->[LEFT] = _deleteMin($node->[LEFT]);
return _fixUp($node);
}
sub _moveRedLeft {
my ($node) = @_;
_colorFlip($node);
if (_isRed($node->[RIGHT][LEFT])) {
$node->[RIGHT] = _rotateRight($node->[RIGHT]);
$node = _rotateLeft($node);
_colorFlip($node);
}
return $node;
}
sub _moveRedRight {
my ($node) = @_;
_colorFlip($node);
if (_isRed($node->[LEFT][LEFT])) {
$node = _rotateRight($node);
_colorFlip($node);
}
return $node;
}
sub _rotateLeft {
my ($node) = @_;
my $temp = $node->[RIGHT];
$node->[RIGHT] = $temp->[LEFT];
$temp->[LEFT] = $node;
$temp->[COLOR] = $node->[COLOR];
$node->[COLOR] = RED;
return $temp;
}
sub _rotateRight {
my ($node) = @_;
my $temp = $node->[LEFT];
$node->[LEFT] = $temp->[RIGHT];
$temp->[RIGHT] = $node;
$temp->[COLOR] = $node->[COLOR];
$node->[COLOR] = RED;
return $temp;
}
sub _isRed {
my ($node) = @_;
return FALSE if ! $node;
return $node->[COLOR] == RED;
}
sub _colorFlip {
my ($node) = @_;
$node->[COLOR] = ! $node->[COLOR] || BLACK;
$node->[LEFT][COLOR] = ! $node->[LEFT][COLOR] || BLACK;
$node->[RIGHT][COLOR] = ! $node->[RIGHT][COLOR] || BLACK;
}
sub _fixUp {
my ($node) = @_;
$node = _rotateLeft($node) if _isRed($node->[RIGHT]);
$node = _rotateRight($node) if _isRed($node->[LEFT]) && _isRed($node->[LEFT][LEFT]);
_colorFlip($node) if _isRed($node->[LEFT]) && _isRed($node->[RIGHT]);
return $node;
}
'This statement is false.';
__END__
OPTIMIZATIONS
1. Inline some subs
2. Turn recursion into a stack
3. Allow predefined comparison subs and then *foo = in order to not pay penalty
- ascii, numerical, coderef sub {$_[0] cmp $_[1]}
4. Add get_min_kv and get_max_kv (see _deleteKey)
5. Turn the things that make sense from recursion to iteration (but frustratingly, not insert)
6. Consider XS
7. As a configurable option, allow not storing values to reduce memory
FEATURES
1. Add val_defined
2. Iterator for going over the tree
GENERAL
1. Consistency in sub names
REFERENCE
1. http://www.cs.princeton.edu/~rs/talks/LLRB/08Dagstuhl/RedBlack.pdf
2. http://www.cs.princeton.edu/~rs/talks/LLRB/RedBlack.pdf
3. http://www.cs.princeton.edu/~rs/talks/LLRB/08Penn.pdf
</c>
</p>
<p>
<b>How to fix tables pointing to race</b>
<c>
UPDATE
table t
SET
race_id = (
SELECT
pkey_id
FROM
race r,
(SELECT * from race where pkey_id = t.race_id) x
WHERE
r.track_id = 41 AND
r.raceday = x.race_day AND
r.race = x.race
)
WHERE
race_id in (select pkey_id from race where track_id = 37)
</c>
This seems logically sound to me (which is freaking scare) - but will it work.
</p>
<p>
<b>How to fix race table</b>
<br />
<c>
table event
pkey_id = serial
event_id = integer
event_date = date(YYYY-MM-DD)
event_num = integer
UPDATE
event e
SET
event_id = 41
WHERE
event_id = 37 AND
NOT EXISTS (
SELECT
1
FROM
event
WHERE
event_id = 41 AND
event_date = e.event_date AND
event_num = e.event_num
)
</c>
</p>
<p>
<b>For [biohisham]</b>
<br />
I don't have a computer science degree (actually, I almost flunked out of high school and never went to college). While I like to think of myself as having above average intelligence, I am not one of those scary smart types that doesn't need to go to college because they already read all those books in high school. I say this to put things in perspective - I think most folks that regularly frequent this site have the quality necessary to expand their own abilities on their own. I have an incredibly inquisitive nature and am willing to spend lots of my own time learning about things that don't have an immediate practical value. It comes in handy in the long run. If you are interested in a reading list, might I recommend [Recommended Reading] and some of the links from [href://?node_id=3989;a=Limbic%7ERegion;nf=0;yr=2006;mo=11;dy=17;re=N|here].
<br />
<br />
One approach to learning to think about a problem from different angles is to follow the advice I gave at [id://438034]. It probably sounds like a load of bull, but the easiest way to solve a really tough problem in a new way is to break it down into smaller pieces stating your assumptions along the way and then challenging those assumptions. For instance, if you have ever read [id://580093] - I took an NP Complete problem and turned it into O(1). Now, that was only possible because I didn't work under the same constraints (assumptions) as the original problem. In the original problem you have an arbitrarily large alphabet and dictionary but I chose English (26 letters) and a specific dictionary (around 61K words). I then started challenging my own assumptions (that every word need be considered for instance).
<br />
<br />
I guess what I am saying is knowing lots of algorithms and data structures and being able to determine the order of complexity of your own algorithm by itself is not enough. I don't know nearly what I should if I had a CS degree. All of those things are a great help but if you don't even attempt to solve a problem because you already know it will be hard - how would anything get done? Sometimes the key to the toppling over the entire impossible tower is by changing or challenging 1 key assumption.
<br />
<br />
I hope this helps.
</p>
<p>
<b>For [bart]</b>
<br />
Step 1 is to enable whatever secure session capability the database supports (SSL) so your credentials are not going over the wire in the clear.
<br />
Step 2 is to use a symetric encryption routine that is compiled into native bytecode (a la C or whatnot). The routine can be used to generate the encrypted password when you want to change the password (stored in a file) but its primary role is to decrypt the password in memory when appropriate
<br />
Step 3 is to modify DBI such that instead of passing in a user/pass for authentication, you tell it to use the routine above with the encrypted password. It is designed such that it writes directly to the SSL socket. Getting it to give back the password to the user would require modifying and recompiling DBI and potentially the compiled routine as well.
<br />
It is still sketchy in a few areas. For instance, it is in the clear in memory so you need to come up with a good routine for scrubbing that. A user who has permission to execute the compiled routine, can read the file with the stored encrypted passwords, and can execute perl can get access to the DB (even though they don't know what the password is), etc. I think it may be worth it in some cases though.
</p>
<p>
<b>For [blokhead] and [tye]</b>
<CODE>
print solve(
holes => 33,
empty => 17,
towin => 17,
valid => [
[1, 2, 3], [1, 4, 9], [2, 5, 10], [3, 6, 11],
[4, 5, 6], [4, 9, 16], [5, 10, 17], [6, 11, 18],
[7, 8, 9], [7, 14, 21], [8, 9, 10], [8, 15, 22],
[9, 10, 11], [9, 16, 23], [10, 11, 12], [10, 17, 24],
[11, 12, 13], [11, 18, 25], [12, 19, 26], [13, 20, 27],
[14, 15, 16], [15, 16, 17], [16, 17, 18], [16, 23, 28],
[17, 18, 19], [17, 24, 29], [18, 19, 20], [18, 25, 30],
[21, 22, 23], [22, 23, 24], [23, 24, 25], [23, 28, 21],
[24, 25, 26], [24, 29, 32], [25, 26, 27], [25, 30, 33],
[28, 29, 30], [31, 32, 33],
],
);
</CODE>
</p>
<b>For [blokhead]</b>
<br />
I have been doing some analysis of base-n counting as it relates to identifying combinations. Specifically, I am counting in base-n up to 0..base - 1 which is the largest combination set for size of base-n. Next, I mark all the values that meet the combination criteria (all positions must increase from left to right) and measure the distance in between.
<p>
Believe it or not, predictable patterns do emerge but they are quite interesting - at least initially. See for yourself:
</p>
<CODE>
#!/usr/bin/perl
use strict;
use warnings;
for my $base (3 .. 9) {
print "\tBASE $base\n";
my $next = count_base($base);
my $n = 0;
while (my @dig = $next->()) {
my $num = join '', @dig;
if (restricted(@dig)) {
print "$n\n" if $n;
$n = 0;
#print "\t$num\n";
}
else {
++$n;
#print "$num\n";
}
}
print "\n\n";
}
sub restricted {
my @dig = @_;
my $i = 0;
while (! $dig[$i]) {
shift @dig;
}
for (1 .. $#dig) {
return 0 if $dig[$_] <= $dig[$_ - 1];
}
return 1;
}
sub count_base {
my $base = shift @_;
my @dig = (0) x $base;
my @end = 0 .. $base - 1;
return sub {
return () if "@dig" eq "@end";
my $pos = @dig;
while ($pos--) {
if (++$dig[$pos] < $base) {
@dig[$pos + 1 .. $#dig] = (0) x ($#dig - $pos);
return @dig;
}
}
};
}
</CODE>
Basically, the sequences come in a handful of forms:
<ul>
<li>X .. N - 1 (where X = some number less than N)</li>
<li>XN + X (where X = some number less than N)</li>
<li>N^P - 1 for P = 1 .. X (where X = some number less than N)</li>
<li>N^P - 1 * X / N (where P & X = some number less than N)</li>
</ul>
X and P are also predictable but vary.
</p>
<p>
<b>WTF Over?</b>
<br />
I got a new machine at work and have been cleaning up 2 1/2 years of stuff to keep it shiny. In a directory called "Chomp" I found a file called "blah.pl", the contents of which are:
<CODE>
#! /usr/bin/perl
use strict;
use warnings;
use Quantum::Superpositions;
my @array_1 = (1 .. 4);
my @array_2 = qw{1 2 2 3 3 3 4 4 4 4 7 6 5};
my @array_3 = eigenstates( any(@array_2) != all(@array_1) );
my @array_4 = Quantum::Superpositions::eigenstates( any(@array_2) != all(@array_1) );
print "Ordered:\n";
print "$_\n" for @array_3;
print "Hash:\n";
print "$_\n" for @array_4;
{
no warnings 'redefine';
*eigenstates = *main::eigenstates;
sub eigenstates ($) {
my @uniq;
my %seen;
for ( Quantum::Superpositions::collapse( $_[0] ) ) {
push @uniq , $_ if ! $seen{$_};
$seen{$_}++;
}
return @uniq;
}
}
</CODE>
It took me a second to realize that I had overridden eigenstates to guarantee ordering. WTF was I thinking when I picked the dir/file name?
</p>
<p>
<b>For [injunjoel]</b>
<br />
If I were going to do it without the use of modules, this is how I would have done it.
<CODE>
package Some::Object;
use strict;
use warnings;
use Carp;
our $VERSION = '0.01';
sub new {
my $class = shift;
my $self = bless {}, $class;
croak "Incorrect number of parameters" if @_ % 2;
$self->_init(@_);
return $self;
}
sub _init {
my $self = shift;
my %default = (
foo => 'bar',
blah => 'asdf',
);
my %user = @_;
for ( keys %user ) {
delete $user{$_} if ! exists $default{$_};
}
for ( keys %default ) {
$user{$_} = $default{$_} if ! exists $user{$_};
}
$self->{OPT} = \%user;
}
</CODE>
</p>
<p>
<b>For [spartan]</b>
<br />
The thing that took me so long was remembering to add the signal handlers so that when you hit ctrl-c or what not, the children died too
<CODE>
#!/usr/bin/perl
use strict;
use warnings;
use Parallel::ForkManager;
use constant MAX_PROCS => 1;
use constant MAX_TIME => 10;
my ($pid, $ident, $start);
my $pm = new Parallel::ForkManager( MAX_PROCS );
@SIG{ qw(ABRT STOP TERM INT) } = (sub { kill 9, $pid; exit }) x 4;
$pm->run_on_start (
sub {
($pid, $ident)= @_;
$start = time;
print "$ident started at ", scalar localtime($start), " with pid: $pid\n";
}
);
$pm->run_on_wait (
sub {
if ( time - $start > MAX_TIME ) {
print "Killing $pid - taking too long to run\n";
kill 9, $pid;
}
},
1
);
$pm->run_on_finish (
sub {
($pid, my $exit_code, $ident) = @_;
print "$ident ($pid) just completed with : $exit_code\n";
}
);
while ( 1 ) {
$pid = $pm->start( 'health check' ) and next;
# We are in child process
for ( 1 .. rand 15 ) {
print "I am the child doing work\n";
sleep 1;
}
$pm->finish;
# We are in parent process
}
</CODE>
</p>
<p>
Users, as of 2004-10-15, that have a homenode length of 500 and either have greater than 200 XP or have been a member for more than a year and logged in within 45 days.
<br />
<ul>
<li>[id://188181]</li>
<li>[id://6041]</li>
<li>[id://14909]</li>
<li>[id://178658]</li>
<li>[id://10277]</li>
<li>[id://87699]</li>
<li>[id://26179]</li>
<li>[id://72304]</li>
<li>[id://29008]</li>
<li>[id://31579]</li>
<li>[id://149104]</li>
<li>[id://83485]</li>
<li>[id://107642]</li>
<li>[id://19724]</li>
<li>[id://197927]</li>
<li>[id://43868]</li>
<li>[id://26274]</li>
<li>[id://9135]</li>
<li>[id://154438]</li>
<li>[id://63535]</li>
<li>[id://16309]</li>
<li>[id://3607]</li>
<li>[id://2329]</li>
<li>[id://70929]</li>
<li>[id://334469]</li>
<li>[id://25235]</li>
<li>[id://114691]</li>
<li>[id://23324]</li>
<li>[id://108447]</li>
<li>[id://142755]</li>
<li>[id://16834]</li>
<li>[id://133383]</li>
<li>[id://31503]</li>
<li>[id://36507]</li>
<li>[id://127116]</li>
<li>[id://190985]</li>
<li>[id://76853]</li>
<li>[id://137386]</li>
<li>[id://154199]</li>
<li>[id://21732]</li>
<li>[id://5993]</li>
<li>[id://69487]</li>
<li>[id://142528]</li>
<li>[id://33117]</li>
<li>[id://63250]</li>
<li>[id://9346]</li>
<li>[id://247784]</li>
<li>[id://197321]</li>
<li>[id://18800]</li>
<li>[id://217641]</li>
<li>[id://64771]</li>
<li>[id://111056]</li>
<li>[id://53423]</li>
<li>[id://23317]</li>
<li>[id://3537]</li>
<li>[id://33122]</li>
<li>[id://33341]</li>
<li>[id://68137]</li>
<li>[id://18131]</li>
<li>[id://23075]</li>
<li>[id://70219]</li>
<li>[id://21156]</li>
<li>[id://37626]</li>
<li>[id://86555]</li>
<li>[id://258928]</li>
<li>[id://132645]</li>
<li>[id://58288]</li>
<li>[id://324092]</li>
<li>[id://37070]</li>
<li>[id://5565]</li>
<li>[id://47827]</li>
<li>[id://76537]</li>
<li>[id://127547]</li>
<li>[id://95704]</li>
<li>[id://1382]</li>
<li>[id://176753]</li>
<li>[id://221767]</li>
<li>[id://7374]</li>
<li>[id://168975]</li>
<li>[id://89614]</li>
<li>[id://20087]</li>
<li>[id://4677]</li>
<li>[id://34584]</li>
<li>[id://123953]</li>
<li>[id://7056]</li>
<li>[id://9270]</li>
<li>[id://146055]</li>
<li>[id://89780]</li>
<li>[id://95145]</li>
<li>[id://194489]</li>
<li>[id://203787]</li>
<li>[id://120013]</li>
<li>[id://130164]</li>
<li>[id://111406]</li>
<li>[id://117316]</li>
<li>[id://77269]</li>
<li>[id://121131]</li>
<li>[id://69394]</li>
<li>[id://87725]</li>
<li>[id://11500]</li>
<li>[id://47597]</li>
<li>[id://132182]</li>
<li>[id://141348]</li>
<li>[id://225743]</li>
<li>[id://155876]</li>
<li>[id://49126]</li>
<li>[id://184322]</li>
<li>[id://81899]</li>
<li>[id://15528]</li>
<li>[id://7824]</li>
<li>[id://260843]</li>
<li>[id://23091]</li>
<li>[id://221638]</li>
<li>[id://50802]</li>
<li>[id://299049]</li>
<li>[id://80322]</li>
<li>[id://22609]</li>
<li>[id://87452]</li>
<li>[id://37222]</li>
<li>[id://243505]</li>
<li>[id://49433]</li>
<li>[id://1553]</li>
<li>[id://102902]</li>
<li>[id://78015]</li>
<li>[id://79095]</li>
<li>[id://110814]</li>
<li>[id://61798]</li>
<li>[id://70453]</li>
<li>[id://12207]</li>
<li>[id://33796]</li>
<li>[id://17361]</li>
<li>[id://27919]</li>
<li>[id://120056]</li>
<li>[id://82957]</li>
<li>[id://176670]</li>
<li>[id://22308]</li>
<li>[id://113511]</li>
<li>[id://5348]</li>
<li>[id://56341]</li>
<li>[id://95717]</li>
<li>[id://102451]</li>
<li>[id://66950]</li>
<li>[id://79000]</li>
<li>[id://36133]</li>
<li>[id://166859]</li>
<li>[id://105362]</li>
<li>[id://53200]</li>
<li>[id://277846]</li>
<li>[id://236234]</li>
<li>[id://54102]</li>
<li>[id://132236]</li>
<li>[id://89331]</li>
<li>[id://283154]</li>
<li>[id://178898]</li>
<li>[id://117915]</li>
<li>[id://170442]</li>
<li>[id://20310]</li>
<li>[id://55564]</li>
<li>[id://22848]</li>
<li>[id://25047]</li>
<li>[id://10395]</li>
<li>[id://131381]</li>
<li>[id://78196]</li>
<li>[id://80749]</li>
<li>[id://56270]</li>
<li>[id://62703]</li>
<li>[id://44715]</li>
<li>[id://95917]</li>
<li>[id://15594]</li>
<li>[id://61201]</li>
<li>[id://58913]</li>
<li>[id://80839]</li>
<li>[id://69464]</li>
<li>[id://25727]</li>
<li>[id://280965]</li>
<li>[id://54250]</li>
<li>[id://3737]</li>
<li>[id://75719]</li>
<li>[id://61104]</li>
<li>[id://197973]</li>
<li>[id://6415]</li>
<li>[id://5999]</li>
<li>[id://15263]</li>
<li>[id://134162]</li>
<li>[id://99128]</li>
<li>[id://80482]</li>
<li>[id://281119]</li>
<li>[id://182681]</li>
<li>[id://68623]</li>
<li>[id://979]</li>
<li>[id://45366]</li>
<li>[id://40726]</li>
<li>[id://65072]</li>
<li>[id://57411]</li>
<li>[id://46008]</li>
<li>[id://5997]</li>
<li>[id://186362]</li>
<li>[id://186684]</li>
<li>[id://131579]</li>
<li>[id://17000]</li>
<li>[id://136291]</li>
<li>[id://13044]</li>
<li>[id://7102]</li>
<li>[id://16818]</li>
<li>[id://306473]</li>
<li>[id://326482]</li>
<li>[id://57126]</li>
<li>[id://290288]</li>
<li>[id://26790]</li>
<li>[id://18518]</li>
<li>[id://180961]</li>
<li>[id://85900]</li>
<li>[id://205152]</li>
<li>[id://73487]</li>
<li>[id://143328]</li>
<li>[id://109406]</li>
<li>[id://23227]</li>
<li>[id://9098]</li>
<li>[id://52296]</li>
<li>[id://258459]</li>
<li>[id://83601]</li>
<li>[id://21682]</li>
<li>[id://362844]</li>
<li>[id://68660]</li>
<li>[id://169603]</li>
<li>[id://9511]</li>
<li>[id://79656]</li>
<li>[id://196475]</li>
<li>[id://21786]</li>
<li>[id://295259]</li>
<li>[id://63769]</li>
<li>[id://166227]</li>
<li>[id://47599]</li>
<li>[id://113686]</li>
<li>[id://201687]</li>
<li>[id://184363]</li>
<li>[id://13114]</li>
<li>[id://119929]</li>
<li>[id://41288]</li>
<li>[id://160333]</li>
<li>[id://93970]</li>
<li>[id://58682]</li>
<li>[id://247082]</li>
<li>[id://13922]</li>
<li>[id://159356]</li>
<li>[id://257226]</li>
<li>[id://80935]</li>
<li>[id://77866]</li>
<li>[id://381608]</li>
<li>[id://190859]</li>
<li>[id://45414]</li>
<li>[id://111362]</li>
<li>[id://117983]</li>
<li>[id://115576]</li>
<li>[id://51672]</li>
<li>[id://146458]</li>
<li>[id://81921]</li>
<li>[id://210078]</li>
<li>[id://333489]</li>
<li>[id://11052]</li>
<li>[id://24744]</li>
<li>[id://211693]</li>
<li>[id://59079]</li>
<li>[id://67861]</li>
<li>[id://186548]</li>
<li>[id://103344]</li>
<li>[id://74757]</li>
<li>[id://272750]</li>
<li>[id://18366]</li>
<li>[id://256799]</li>
<li>[id://194378]</li>
<li>[id://17310]</li>
<li>[id://45873]</li>
<li>[id://20500]</li>
<li>[id://67169]</li>
<li>[id://126766]</li>
<li>[id://34613]</li>
<li>[id://279632]</li>
<li>[id://233329]</li>
<li>[id://31366]</li>
<li>[id://18419]</li>
<li>[id://49599]</li>
<li>[id://239281]</li>
<li>[id://17227]</li>
<li>[id://66801]</li>
<li>[id://31548]</li>
<li>[id://295419]</li>
<li>[id://108833]</li>
<li>[id://45391]</li>
<li>[id://59531]</li>
<li>[id://145724]</li>
<li>[id://1936]</li>
<li>[id://180035]</li>
<li>[id://75996]</li>
<li>[id://72267]</li>
<li>[id://170000]</li>
<li>[id://74129]</li>
<li>[id://70968]</li>
<li>[id://19340]</li>
<li>[id://173287]</li>
<li>[id://27209]</li>
<li>[id://261960]</li>
<li>[id://83614]</li>
<li>[id://177432]</li>
<li>[id://7756]</li>
<li>[id://95633]</li>
<li>[id://88743]</li>
<li>[id://113121]</li>
<li>[id://225811]</li>
<li>[id://118268]</li>
<li>[id://281137]</li>
<li>[id://196171]</li>
<li>[id://185222]</li>
<li>[id://341423]</li>
<li>[id://62377]</li>
<li>[id://206025]</li>
<li>[id://133339]</li>
<li>[id://131279]</li>
<li>[id://58706]</li>
<li>[id://8727]</li>
<li>[id://9073]</li>
<li>[id://31662]</li>
<li>[id://58877]</li>
<li>[id://9547]</li>
<li>[id://5087]</li>
<li>[id://6762]</li>
<li>[id://5094]</li>
<li>[id://27402]</li>
<li>[id://131055]</li>
<li>[id://149022]</li>
<li>[id://31148]</li>
<li>[id://24232]</li>
<li>[id://19840]</li>
<li>[id://109358]</li>
<li>[id://79379]</li>
<li>[id://46267]</li>
<li>[id://61193]</li>
<li>[id://141380]</li>
<li>[id://69062]</li>
<li>[id://8710]</li>
<li>[id://55239]</li>
<li>[id://143330]</li>
<li>[id://272239]</li>
<li>[id://73441]</li>
<li>[id://91007]</li>
<li>[id://107850]</li>
<li>[id://8948]</li>
<li>[id://44865]</li>
<li>[id://57316]</li>
<li>[id://121335]</li>
<li>[id://250204]</li>
<li>[id://14199]</li>
<li>[id://225273]</li>
<li>[id://127615]</li>
<li>[id://200170]</li>
<li>[id://27784]</li>
<li>[id://323003]</li>
<li>[id://5878]</li>
<li>[id://8157]</li>
<li>[id://289824]</li>
<li>[id://105312]</li>
<li>[id://40469]</li>
<li>[id://47040]</li>
<li>[id://154313]</li>
<li>[id://81749]</li>
<li>[id://334202]</li>
<li>[id://166641]</li>
<li>[id://163690]</li>
<li>[id://8749]</li>
<li>[id://58957]</li>
<li>[id://315586]</li>
<li>[id://56739]</li>
<li>[id://59896]</li>
<li>[id://104914]</li>
<li>[id://282117]</li>
<li>[id://175325]</li>
<li>[id://328673]</li>
<li>[id://8810]</li>
<li>[id://74541]</li>
<li>[id://8661]</li>
<li>[id://325477]</li>
<li>[id://119119]</li>
<li>[id://56346]</li>
<li>[id://183001]</li>
<li>[id://43894]</li>
<li>[id://85664]</li>
<li>[id://49266]</li>
<li>[id://134983]</li>
<li>[id://10620]</li>
<li>[id://33990]</li>
<li>[id://129189]</li>
<li>[id://6211]</li>
<li>[id://78461]</li>
<li>[id://150245]</li>
<li>[id://21592]</li>
<li>[id://117875]</li>
<li>[id://64922]</li>
<li>[id://113251]</li>
<li>[id://60869]</li>
<li>[id://162095]</li>
<li>[id://183547]</li>
<li>[id://1350]</li>
<li>[id://121999]</li>
<li>[id://278227]</li>
<li>[id://5549]</li>
<li>[id://69448]</li>
<li>[id://313292]</li>
<li>[id://287641]</li>
<li>[id://113861]</li>
<li>[id://45946]</li>
<li>[id://328228]</li>
<li>[id://79173]</li>
<li>[id://125487]</li>
<li>[id://2680]</li>
<li>[id://16523]</li>
<li>[id://55519]</li>
<li>[id://125246]</li>
<li>[id://127995]</li>
<li>[id://72233]</li>
<li>[id://210057]</li>
<li>[id://176608]</li>
<li>[id://47277]</li>
<li>[id://50425]</li>
<li>[id://73311]</li>
<li>[id://41832]</li>
<li>[id://175354]</li>
<li>[id://68278]</li>
<li>[id://71699]</li>
<li>[id://29772]</li>
<li>[id://62959]</li>
<li>[id://81222]</li>
<li>[id://59207]</li>
<li>[id://63135]</li>
<li>[id://67442]</li>
<li>[id://180139]</li>
<li>[id://11967]</li>
<li>[id://86813]</li>
<li>[id://89231]</li>
<li>[id://14635]</li>
<li>[id://188425]</li>
<li>[id://2675]</li>
<li>[id://31375]</li>
<li>[id://25626]</li>
<li>[id://375088]</li>
<li>[id://62512]</li>
<li>[id://9198]</li>
<li>[id://61919]</li>
<li>[id://240802]</li>
<li>[id://46752]</li>
<li>[id://153880]</li>
<li>[id://385891]</li>
<li>[id://103304]</li>
<li>[id://90598]</li>
<li>[id://17384]</li>
<li>[id://70091]</li>
<li>[id://18550]</li>
<li>[id://122003]</li>
<li>[id://48563]</li>
<li>[id://16052]</li>
<li>[id://156169]</li>
<li>[id://134631]</li>
<li>[id://59600]</li>
<li>[id://323803]</li>
<li>[id://56379]</li>
<li>[id://56742]</li>
<li>[id://45622]</li>
<li>[id://34691]</li>
<li>[id://133139]</li>
<li>[id://77754]</li>
<li>[id://57013]</li>
<li>[id://18720]</li>
<li>[id://363234]</li>
<li>[id://70099]</li>
<li>[id://35843]</li>
<li>[id://35391]</li>
<li>[id://181089]</li>
<li>[id://101553]</li>
<li>[id://62139]</li>
<li>[id://19952]</li>
<li>[id://150498]</li>
<li>[id://72812]</li>
<li>[id://253915]</li>
<li>[id://64906]</li>
<li>[id://181643]</li>
<li>[id://65388]</li>
<li>[id://85567]</li>
<li>[id://155973]</li>
<li>[id://38800]</li>
<li>[id://168204]</li>
<li>[id://92650]</li>
<li>[id://144696]</li>
<li>[id://195066]</li>
<li>[id://190918]</li>
<li>[id://272877]</li>
<li>[id://109080]</li>
<li>[id://7611]</li>
<li>[id://62458]</li>
<li>[id://304668]</li>
<li>[id://197712]</li>
<li>[id://113570]</li>
<li>[id://187037]</li>
<li>[id://244306]</li>
<li>[id://96618]</li>
<li>[id://70876]</li>
<li>[id://65703]</li>
<li>[id://104238]</li>
<li>[id://137449]</li>
<li>[id://68365]</li>
<li>[id://8656]</li>
<li>[id://194370]</li>
<li>[id://6393]</li>
<li>[id://71198]</li>
<li>[id://103111]</li>
<li>[id://96742]</li>
<li>[id://4945]</li>
<li>[id://269004]</li>
<li>[id://42645]</li>
<li>[id://1027]</li>
<li>[id://19314]</li>
<li>[id://156312]</li>
<li>[id://208473]</li>
<li>[id://92410]</li>
<li>[id://6608]</li>
<li>[id://66617]</li>
<li>[id://22335]</li>
<li>[id://32859]</li>
<li>[id://76565]</li>
<li>[id://52384]</li>
<li>[id://59514]</li>
<li>[id://177458]</li>
<li>[id://53288]</li>
<li>[id://117788]</li>
<li>[id://6808]</li>
<li>[id://368252]</li>
<li>[id://83012]</li>
<li>[id://213642]</li>
<li>[id://72670]</li>
<li>[id://8119]</li>
<li>[id://81246]</li>
<li>[id://83612]</li>
<li>[id://70819]</li>
<li>[id://30067]</li>
<li>[id://33790]</li>
<li>[id://105944]</li>
<li>[id://131262]</li>
<li>[id://195273]</li>
<li>[id://7461]</li>
<li>[id://223311]</li>
<li>[id://34288]</li>
<li>[id://119620]</li>
<li>[id://43471]</li>
<li>[id://72806]</li>
<li>[id://42951]</li>
<li>[id://16380]</li>
<li>[id://98461]</li>
<li>[id://200410]</li>
<li>[id://20624]</li>
<li>[id://186342]</li>
<li>[id://106013]</li>
<li>[id://133118]</li>
<li>[id://44862]</li>
<li>[id://326467]</li>
<li>[id://163683]</li>
<li>[id://67275]</li>
<li>[id://267934]</li>
<li>[id://210053]</li>
<li>[id://295576]</li>
<li>[id://114167]</li>
<li>[id://170642]</li>
<li>[id://39362]</li>
<li>[id://162528]</li>
<li>[id://22313]</li>
<li>[id://71923]</li>
<li>[id://345315]</li>
<li>[id://6727]</li>
<li>[id://68135]</li>
<li>[id://25825]</li>
<li>[id://116014]</li>
<li>[id://6537]</li>
<li>[id://178687]</li>
<li>[id://63082]</li>
<li>[id://43546]</li>
<li>[id://128665]</li>
<li>[id://160784]</li>
<li>[id://56812]</li>
<li>[id://194920]</li>
<li>[id://11400]</li>
<li>[id://49370]</li>
<li>[id://17251]</li>
<li>[id://18122]</li>
<li>[id://211540]</li>
<li>[id://40925]</li>
<li>[id://195718]</li>
<li>[id://326280]</li>
<li>[id://131763]</li>
<li>[id://82147]</li>
<li>[id://222702]</li>
<li>[id://8852]</li>
<li>[id://165120]</li>
<li>[id://52492]</li>
<li>[id://88170]</li>
<li>[id://230012]</li>
<li>[id://322786]</li>
<li>[id://43604]</li>
<li>[id://267993]</li>
<li>[id://110201]</li>
<li>[id://243154]</li>
<li>[id://263299]</li>
<li>[id://223894]</li>
<li>[id://118632]</li>
<li>[id://3568]</li>
<li>[id://249137]</li>
<li>[id://178253]</li>
<li>[id://59359]</li>
<li>[id://376331]</li>
<li>[id://228394]</li>
<li>[id://20567]</li>
<li>[id://266955]</li>
<li>[id://102701]</li>
<li>[id://323154]</li>
<li>[id://10973]</li>
<li>[id://300037]</li>
<li>[id://39811]</li>
<li>[id://10945]</li>
<li>[id://127307]</li>
<li>[id://127435]</li>
<li>[id://45395]</li>
<li>[id://16711]</li>
<li>[id://264355]</li>
<li>[id://38019]</li>
<li>[id://31011]</li>
<li>[id://159771]</li>
<li>[id://5459]</li>
<li>[id://96022]</li>
<li>[id://218135]</li>
<li>[id://115693]</li>
<li>[id://5304]</li>
<li>[id://36709]</li>
<li>[id://105646]</li>
<li>[id://66722]</li>
<li>[id://80543]</li>
<li>[id://91846]</li>
<li>[id://55829]</li>
<li>[id://176075]</li>
<li>[id://47295]</li>
<li>[id://124995]</li>
<li>[id://31280]</li>
<li>[id://144786]</li>
<li>[id://85412]</li>
<li>[id://368189]</li>
<li>[id://186172]</li>
<li>[id://64183]</li>
<li>[id://68266]</li>
<li>[id://171047]</li>
<li>[id://139399]</li>
<li>[id://126943]</li>
<li>[id://83100]</li>
<li>[id://2610]</li>
<li>[id://89606]</li>
<li>[id://20513]</li>
<li>[id://366581]</li>
<li>[id://114819]</li>
<li>[id://10195]</li>
<li>[id://42664]</li>
<li>[id://9307]</li>
<li>[id://117190]</li>
<li>[id://14989]</li>
<li>[id://146276]</li>
<li>[id://115954]</li>
<li>[id://19040]</li>
<li>[id://62118]</li>
<li>[id://2905]</li>
<li>[id://78001]</li>
<li>[id://349972]</li>
<li>[id://145768]</li>
<li>[id://332319]</li>
<li>[id://101964]</li>
<li>[id://113194]</li>
<li>[id://19317]</li>
<li>[id://128928]</li>
<li>[id://294789]</li>
<li>[id://38148]</li>
<li>[id://2942]</li>
<li>[id://6864]</li>
<li>[id://175275]</li>
<li>[id://59751]</li>
<li>[id://211039]</li>
<li>[id://5984]</li>
<li>[id://163438]</li>
<li>[id://266790]</li>
<li>[id://2577]</li>
<li>[id://107263]</li>
<li>[id://34794]</li>
<li>[id://105128]</li>
<li>[id://82627]</li>
<li>[id://106314]</li>
<li>[id://138881]</li>
<li>[id://99080]</li>
<li>[id://173932]</li>
<li>[id://328443]</li>
<li>[id://169829]</li>
<li>[id://126187]</li>
<li>[id://240387]</li>
<li>[id://59285]</li>
<li>[id://56747]</li>
<li>[id://62956]</li>
<li>[id://89299]</li>
<li>[id://121246]</li>
<li>[id://222307]</li>
<li>[id://230102]</li>
<li>[id://46495]</li>
<li>[id://57097]</li>
<li>[id://254820]</li>
<li>[id://20220]</li>
<li>[id://152953]</li>
<li>[id://17500]</li>
<li>[id://190134]</li>
<li>[id://248054]</li>
<li>[id://17706]</li>
<li>[id://29605]</li>
<li>[id://65742]</li>
<li>[id://85580]</li>
<li>[id://59581]</li>
<li>[id://8812]</li>
<li>[id://59463]</li>
<li>[id://97646]</li>
<li>[id://58729]</li>
<li>[id://5606]</li>
<li>[id://5272]</li>
<li>[id://126161]</li>
<li>[id://155644]</li>
<li>[id://150042]</li>
<li>[id://345630]</li>
<li>[id://213494]</li>
<li>[id://235663]</li>
<li>[id://215904]</li>
<li>[id://133637]</li>
<li>[id://87708]</li>
<li>[id://118958]</li>
<li>[id://20965]</li>
<li>[id://142606]</li>
<li>[id://43332]</li>
<li>[id://101472]</li>
<li>[id://9886]</li>
<li>[id://38708]</li>
<li>[id://96169]</li>
<li>[id://15837]</li>
<li>[id://52645]</li>
<li>[id://54777]</li>
<li>[id://115397]</li>
<li>[id://131165]</li>
<li>[id://274623]</li>
<li>[id://8911]</li>
<li>[id://249603]</li>
<li>[id://114324]</li>
<li>[id://58919]</li>
<li>[id://191183]</li>
<li>[id://88400]</li>
<li>[id://157432]</li>
<li>[id://127861]</li>
<li>[id://192090]</li>
<li>[id://98826]</li>
<li>[id://166702]</li>
<li>[id://33345]</li>
<li>[id://288770]</li>
<li>[id://39719]</li>
<li>[id://299295]</li>
<li>[id://327961]</li>
<li>[id://5421]</li>
<li>[id://6040]</li>
<li>[id://244776]</li>
<li>[id://84630]</li>
<li>[id://302301]</li>
<li>[id://6183]</li>
<li>[id://104292]</li>
<li>[id://277103]</li>
<li>[id://58953]</li>
<li>[id://109390]</li>
<li>[id://29600]</li>
<li>[id://202703]</li>
<li>[id://367547]</li>
<li>[id://69318]</li>
<li>[id://15684]</li>
<li>[id://1647]</li>
<li>[id://154224]</li>
<li>[id://52855]</li>
<li>[id://281871]</li>
<li>[id://8036]</li>
<li>[id://273734]</li>
<li>[id://284050]</li>
<li>[id://80237]</li>
<li>[id://233437]</li>
<li>[id://297379]</li>
<li>[id://174227]</li>
<li>[id://242652]</li>
<li>[id://125863]</li>
<li>[id://66954]</li>
<li>[id://252482]</li>
<li>[id://265946]</li>
<li>[id://42756]</li>
<li>[id://100472]</li>
<li>[id://227370]</li>
<li>[id://183551]</li>
<li>[id://96367]</li>
<li>[id://122663]</li>
<li>[id://45886]</li>
<li>[id://21569]</li>
<li>[id://13127]</li>
<li>[id://154315]</li>
<li>[id://126267]</li>
<li>[id://198160]</li>
<li>[id://58458]</li>
<li>[id://19739]</li>
<li>[id://330779]</li>
<li>[id://48670]</li>
<li>[id://275605]</li>
<li>[id://8237]</li>
<li>[id://32111]</li>
<li>[id://110883]</li>
<li>[id://182524]</li>
<li>[id://21781]</li>
<li>[id://90940]</li>
<li>[id://162845]</li>
<li>[id://368438]</li>
<li>[id://336353]</li>
<li>[id://116292]</li>
<li>[id://143299]</li>
<li>[id://65431]</li>
<li>[id://174302]</li>
<li>[id://1568]</li>
<li>[id://203632]</li>
<li>[id://22280]</li>
<li>[id://11332]</li>
<li>[id://165850]</li>
<li>[id://23811]</li>
<li>[id://152787]</li>
<li>[id://256842]</li>
<li>[id://93314]</li>
<li>[id://13110]</li>
<li>[id://375665]</li>
<li>[id://34640]</li>
<li>[id://2104]</li>
<li>[id://52340]</li>
<li>[id://220509]</li>
<li>[id://22772]</li>
<li>[id://114926]</li>
<li>[id://329889]</li>
<li>[id://189756]</li>
<li>[id://134513]</li>
<li>[id://27571]</li>
<li>[id://108270]</li>
<li>[id://89172]</li>
<li>[id://201512]</li>
<li>[id://67489]</li>
<li>[id://32506]</li>
<li>[id://200274]</li>
<li>[id://268515]</li>
<li>[id://84357]</li>
<li>[id://7531]</li>
<li>[id://102748]</li>
<li>[id://8851]</li>
<li>[id://121457]</li>
<li>[id://75456]</li>
<li>[id://98668]</li>
<li>[id://21298]</li>
<li>[id://129714]</li>
<li>[id://212308]</li>
<li>[id://6595]</li>
<li>[id://284123]</li>
<li>[id://16098]</li>
<li>[id://123319]</li>
</ul>
</p>
<p>
 
</p>
<p>
 
</p>
Previously Recent:
<br />
2005-01-01 : My primary and official New Year's resolution is to try and be a better husband. My secondary and unofficial resolution is to try and find an acceptable weight and stop fluctuating.
<br />
2004-09-20 : Have decided to take a programming sabbatical. Still here, just not coding much. <small><i>As it turned out this didn't turn out to be much of a sabbatical. A few weeks off was all it took to get inspired again</i></small>
<br />
2004-06-12 : I got married to Jean in Maine.
<br />
2004-06-01 : Decided to start keeping track of my latest news
<br />
2003-10-06 : I am working for TSA, but don't hold the fact that I work for the Government against me!
<br />
2003-09-11 : Uploaded [cpan://Tie::Hash::Sorted] to [http://www.cpan.org|CPAN]
<br />
2003-05-30 : Became the 198th Saint
<p>
This is the end
</p>