Recovering Subversion passwords

Tags:

Subversion caches the passwords you give it, in plain-text files with hex-code-hash-value names, in a hidden directory under your home. You can see them all with:

$ <strong>cat ~/.subversion/auth/*</strong>

Naturally, this only works if you store your passwords without encryption... the file will contain at least this, in Key / Value pairs:

K 8
passtype
V 6
simple
V 30
<http://example.com:80> example.com
K 8
username
V 13
<em>your-username</em>
K 8
password
V 13
<em>your-password</em>

SVN tricks

Tags:

To compare the current working copy with other versions, or just to see what other tagged versions are available, it is handy to know the revision number, which is what svn bases all its operations on. The best way to do this is with the long (verbose) form of svn ls as shown below. Note, I am in the 'trunk' directory of my AutoNav project.

bill@charcoal:trunk$ <strong>svn ls -v ../tags</strong>
 327606 wlindley              Dec 31 11:41 ./
 175035 wlindley              Nov 18  2009 1.1.8/
 175037 wlindley              Nov 18  2009 1.1.9/
 187455 wlindley              Dec 27  2009 1.2.2/
 192298 wlindley              Jan 10  2010 1.2.3/
 193267 wlindley              Jan 12  2010 1.2.4/
 195857 wlindley              Jan 20  2010 1.2.5/
 283374 wlindley              Aug 31 14:03 1.2.7/
 287447 wlindley              Sep 09 13:31 1.2.8/
 307532 wlindley              Nov 03 14:52 1.2.9/
 308944 wlindley              Nov 07 12:57 1.3.0/
 311196 wlindley              Nov 13 16:28 1.3.1/
 312023 wlindley              Nov 15 22:33 1.3.2/
 320048 wlindley              Dec 07 06:34 1.3.3/
 320583 wlindley              Dec 08 11:05 1.3.4/
 327606 wlindley              Dec 31 11:41 1.3.5/
bill@charcoal:trunk$

The revision numbers are at left. Now I can do:

bill@charcoal:trunk$ svn diff -r 320583
Index: autonav-wl.php
===================================================================
--- autonav-wl.php      (revision 320583)
+++ autonav-wl.php      (working copy)
@@ -4,7 +4,7 @@
 Plugin URI: http://www.wlindley.com/webpage/autonav
 Description: Displays child pages in a table of images or a simple list; also displays
attached images, or images from a subdirectory under wp-uploads, in a table, with
automatic resizing of thumbnails and full-size images.
 Author: William Lindley
-Version: 1.3.3
+Version: 1.3.6
 Author URI: http://www.wlindley.com/
 */
            <em>and so on</em>

It sure would be nice if there were a way to combine both local working copy and a remote tag in an svn diff command, but that does not seem to be suppported yet (as of svn 1.6).

see also Other svn tricks here [gnu.org]

WordCamp Phoenix 2011

Tags:

This was one of the most fun, useful, conventions ever. About 700 folks from all over attended the main sessions on Saturday.

Some highlights and my random notes follow.

[caption id="" align="alignright" width="171" caption="Had a blast!"]It looks an awful lot like me.[/caption]

Friday: Child Themes and Frameworks

Austin Passy led several dozen of us through the use and creation of child themes, parent themes, and frameworks. Here is his presentation (you might have to wait awhile for all the bits to load, before you can advance through it).

First off, the Hybrid theme shows quite a few configurable items as it uses Hooks almost exclusively. By applying different classes to elements based on page content, whether sidebars are active or inactive, and so on, you can write conditional CSS without any code. We explored how actions and filters let you customize a site, doing all kinds of magic with just a tiny bit of PHP. Hybrid Core is a library for building parent themes (like Hybrid itself is).

http://wordpress.org/extend/plugins/elastic-theme-editor/ --- This is a promising plugin, with a rather fancy ajax/javascript front end that lets you move theme elements around on a set of vertical columns. SaltRiver developers have been working on a similar idea but this looks exceedingly promising.

Saturday: Main Sessions

In Wordpress 3.1, custom post types (CPT, took me awhile to decipher the acronym on the program) can have Archive pages, and can participate in The Loop and RSS feeds with a snippet.

In "A/B testing the WordPress Way" by “Mitcho” Erlewine we heard about ShrimpTest and discovered that simple text changes, like "See Plans and Pricing" over "Free Trial" can result in triple the response. His cocktail-sauce-ready plugin automates the process of trying different bits of text (or code!) which visitors will see randomly, while experiencing the same view within a session.

Mark Jaquith spoke on "Theme & Plugin Security," revealing common pitfalls and relatively simple cures for most of them. SQL Injection and many other "hacks" can be overcome by judicious use of $wpdb->update(), esc_attr(), and related functions. Authorization levels should be regarded with current_user_can() and the nonce system -- even if you have Javascript in the user's browser, that is no substitute for checking back at the server. For Javascript, be sure to use wp_enqueue_script() to reduce load and duplication errors.

Corey Eulas's "SEO Master Class" -- Reinforced my view that SEO is 85% snake oil and 15% pure gold. Highlighting "Competitive Analysis" -- it's less a question of what "tricks" you are using, than how well you are doing versus your competitors. Finding that, however, can be a bit of a challenge. There are several services, the one that caught my eye was "SEOmoz" even though it's a pay site. Google Analytics never really seemed to work the way I wanted.

"WP for Non Profits" by Amanda Blum raised a few interesting points. No matter whether you're non-profit or for-profit, a website has to answer your audience's questions:

  1. Why do I need X in general?

  2. Why do I need your X ?

  3. What do I do after I get X ?

  4. OK, I'm ready, what do I do now?

Plugin suggestions: Gravity Forms; Donation Bucket; and WP-Quotations.

Eyebrow-raising was her suggestion: no advertising! I interpret this to mean, confine your list of sponsors and donors exclusively to a "Sponsors and Donors" page, and eliminate

Sunday: Barbecue and Committing to Core

This was our chance to get down and dirty with Core Developers, finding and closing tickets in Trac, adding plugins and themes to the repository. Hamburgers, sodas, and Four Peaks on tap!

Bottom Line

Blew the socks off 2009's Word Camp. Let's do it again next year!

Although: To the few folks, please, drop the profanity from your presentations, they are neither professional nor polite. Unless you are describing a vacuum cleaner large enough to swallow a donkey, please do not use those kinds of words.

Quack

Tags:

I have always loved a mallard's iridescent green.

Resurrecting ancient CP/M programs

Tags:

In the process of researching some accounting programs I found it useful to restore the LS Software product DIAMOND Accounting, last updated 1984. This program originally ran on HDOS (Heath/Zenith), CP/M, and the original Zenith Z-100 series.

I do have the MSBASIC source code. Note that on those systems, MSBASIC -- before there was a "gee whiz" GWBASIC -- stored your code in compressed format. GWBASIC can read compressed files from MS-DOS MSBASIC / BASICA, but the HDOS, CP/M, and Z-100 versions of MSBASIC all used slightly different code bytes.

Other minor differences

On HDOS you could use terminate a line with the @ character for line continuation; that was not true on MSBASIC or GWBASIC. HDOS and CP/M also required the WIDTH 255 command to ensure a CR/LF was not output in the middle of an escape sequence. That's right, you had to control the terminal by printing escape codes (VT-52 style for the Heath/Zenith series)... and accept escape codes as input. On the IBM PC variants, you have to translate all that to LOCATE commands and PC keystroke codes... quite a tall order for 25-year old code.

DOSEMU to the rescue

Even without translating the escape codes and keystrokes, you can at least get much of the code from HDOS or CP/M BASIC to run with the Linux dosemu package. If you have a copy of GWBASIC.EXE or possibly QuickBasic QB.EXE lying about, you are golden. If not you might be able to Google one.

Note that on Debian, after apt-get install dosemu you will get an error which is easily resolved. Typed commands are underlined.

$ <span style="text-decoration: underline;">sudo apt-get install dosemu</span>
[sudo] password for youtheuser: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
 libsndfile1
The following NEW packages will be installed:
 dosemu libsndfile1
0 upgraded, 2 newly installed, 0 to remove and 65 not upgraded.
1 not fully installed or removed.
Need to get 2605kB of archives.
After this operation, 6103kB of additional disk space will be used.
Do you want to continue [Y/n]? 

$ <span style="text-decoration: underline;">dosemu</span>
<strong>LOWRAM mmap: Invalid argument</strong>
<strong>Segmentation fault</strong>
$ <span style="text-decoration: underline;">sudo sysctl -w vm.mmap_min_addr=0</span>
vm.mmap_min_addr = 0
$ <span style="text-decoration: underline;">dosemu</span>

Success!

Now I can run:

C:> basgwbasic start.bas

and it spits out a bunch of VT-52 / H-19 escape codes and asks me whether I want SY1: or DK0: to be my data diskette. Hmm, this is gonna take some work. Nevertheless, here is code that has sat idle since 1984, on a 2 MHz Z-80 with 48K RAM, working on a 2 GHz CPU with 4 GB RAM!