How will this software get my users laid?
Middle of the night surfing, I came across the site of one of the original XEmacs and Netscape (and later, Mozilla) developers, where is the small article, Groupware Bad. It makes a lot of good points that I think a lot of people miss, especially on why Netscape 4.0 was trash (heh, I remember when everyone called it ‘Nutscrape’) and making software that people actually want to use (and contribute to).
Of course, the titular quote:
“How will this software get my users laid” should be on the minds of anyone writing social software (and these days, almost all software is social software).
The Art of War… ish.
Chapter One
Making Of Plans
Master Sun said:
War,
War never changes
It is a place
Of life and death,
A road
To survival and extinction,
A matter
To be pondered carefully.
When deciding whether to go to war
Or remain in peace
Flip a coin
If one flip decides upon peace
Try for the best three out of five
Chapter Two
Waging War
Master Sun said:
When your weapons are dulled,
Your ardor damped,
Your strength exhausted and your treasure spent,
Other chieftains will spring up
To take advantage of your extremity
At this time you should
Ask the enemy for a time out
So that your men can rest
And their weapons can be sharpened
Chapter Three
Attack By Strategem
Master Sun said:
Ultimate excellence lies
Not in winning
Every battle,
But in defeating the enemy
Without even fighting.
So try to concentrate hard enough
To make the enemy’s heads explode;
Perhaps by training on watermelon first
And working your way up to humans
Chapter Four
Tactical Dispositions
Master Sun said:
Position is key
To success in battle.
When planning your angle of attack,
Make sure you are directly facing the harsh rays of the sun;
This will make it easier for your men
To tell what time it is,
Giving you a distinct advantage
Chapter Five
Weak Points And Strong
Master Sun said:
You can be sure of succeeding
In your attacks if you only attack
Places which are undefended;
Therefore you must not attack
Until the enemy is at their most vulnerable;
Like when their entire army
Removes their armor
Wanders from the safety of their camps
To drop deuces in a ditch
Then they all fall asleep in that ditch
At exactly the same time
Attack at this moment
And only this moment
And you will be victorious
Chapter Six
Maneuvering
Master Sun said:
If your men hear a strange sound
In the middle of the night
The best tactical maneuver available
Is to have everyone split up
And wander aimlessly in the woods
By themselves
While yelling “Hello?”
Chapter Seven
The Use Of Spies
Master Sun said:
All warfare is based
On deception;
Have your army dress themselves
In the enemy’s clothing
And sneak into their camp before dawn;
Then, when they least expect it,
Have your men disembowel themselves
Your enemy will think a large number
Of their own men have died
Score one for
Team awesome
Chapter Eight
Terrain
Master Sun said:
An army with higher ground
Is at a distinct advantage;
If you find yourself on a level battlefield
Have your men drop their weapons
And stand on one another’s backs
Forming a giant pyramid
With the man at the very top wielding a sword
This height advantage should make him
More powerful than an entire army
Chapter Nine
The Attack By Fire
Master Sun said:
There are six ways of attacking with fire
The first is to burn soldiers in their camp;
The second is to burn stores;
The third is to burn baggage trains;
The fourth is to burn arsenals and magazines;
The fifth is to hurl dropping fire amongst the enemy;
The sixth is to set all of your provisions on fire
And hope your enemy steps on them by mistake
Epilogue
Master Sun said:
Take these tactics which have proven
Disastrous on the battlefield
And bind them into a volume;
Then make sure it falls
Into the hands of my enemies
Who will be eager to use
My strategies against me
But don’t write this part
You’re not writing this
Are you
Okay good
.stumpwmrc 0.7
; -*-lisp-*-
;;; 0.7
;; 2008/02/13
;; Replaced my MusicPD code with Patzy's as it's far more complete.
;; Using external 'unclutter' again.
;; (run-with-timer 5 5 'banish-pointer) became too annoying.
;; A few cleanups, mostly involving variable names.
(in-package :stumpwm)
;; Include Patzy's MPD code.
(load "~/.stumpwm/contrib/mpd.lisp")
;;; Internal variable definitions.
(defparameter *foreground-color* "darkcyan")
(defparameter *background-color* "black")
(defparameter *border-color* *foreground-color*)
(setf *format-time-string-default* "%a %b %e %k:%M")
(setf *mpd-port* 2100)
(setf *mpd-volume-step* 10)
;;; Internal function definitions.
;; Found at:
;; http://en.wikipedia.org/wiki/User:Gwern/.stumpwmrc
(defun cat (&rest strings) "A shortcut for (concatenate 'string foo bar)."
(apply 'concatenate 'string strings))
;;; Theme.
;; Window border colors.
(set-focus-color *foreground-color*)
(set-unfocus-color *background-color*)
;; Input box colors.
(set-fg-color *foreground-color*)
(set-bg-color *background-color*)
(set-border-color *border-color*)
;; Modeline colors.
(setf *mode-line-foreground-color* *foreground-color*)
(setf *mode-line-background-color* *background-color*)
(setf *mode-line-border-color* *border-color*)
;; Background.
(run-shell-command (cat "xsetroot -solid " *background-color*))
;;; Init stuff.
;; Make frames and windows 1-indexed.
;; See: http://lists.gnu.org/archive/html/stumpwm-devel/2006-08/msg00002.html
;; Found at: http://en.wikipedia.org/wiki/User:Gwern/.stumpwmrc
(setf *frame-number-map* "1234567890")
(setf *window-number-map* "1234567890") ; This doesn't actually do anything.
;; Rename the first group to Browse and create the other groups.
;; Found at: http://en.wikipedia.org/wiki/User:Gwern/.stumpwmrc
(setf (group-name (first (screen-groups (current-screen)))) "Browse")
(run-commands "gnewbg Edit" "gnewbg Term" "gnewbg Comms" "gnewbg Misc")
;; Change the prefix key
;; keycode 115 = F20 in ~/.xmodmaprc, 115 being the left "windows" key.
(set-prefix-key (kbd "F20"))
;; Set up X cursor and colors.
(run-shell-command (cat "xsetroot -cursor_name left_ptr -fg " *background-color* ; Cursor body
" -bg " *border-color*)) ; Cursor outline
;; Keep the X cursor out of the way.
(run-shell-command "unclutter -idle 5 -jitter 5 -root")
;; Configure and start the modeline. Colors are handled above.
(setf *mode-line-border-width* 1)
(setf *mode-line-pad-x* 1)
(setf *mode-line-pad-y* 1)
(setf *mode-line-position* :bottom)
(setf *mode-line-timeout* 10) ; Update every 10 seconds if nothing else has triggered it already.
(setf *screen-mode-line-format* (list "((%n %w) (" ; Current group and frames
`(:eval (format-time-string))
") (%m))")) ; Patzy's MPD code.
;; Switch mode-line on only if needed. Found at:
;; http://hcl-club.lu/svn/development/lisp/.stumpwmrc
(if (not (head-mode-line (current-head)))
(toggle-mode-line (current-screen) (current-head)))
;; Found this tidbit browsing the source. Defaults to :ignore
(setf *mouse-focus-policy* :click) ; I'm fucking lame.
;;; Keyboard shortcuts.
;; Fluxbox-style Alt-F# virtual desktop (group in StumpWM-speak) switching. Modified from:
;; http://hcl-club.lu/svn/development/lisp/.stumpwmrc
(dotimes (i 13)
(unless (eq i 0) ; F0 is non-existant and will error.
(define-key *top-map* (kbd (format nil "M-F~a" i)) (format nil "gselect ~a" i))))
;; Applications.
(define-key *root-map* (kbd "b") "exec firefox ")
(define-key *root-map* (kbd "e") "exec xemacs ")
(define-key *root-map* (kbd "c") (cat "exec urxvt -fg " *foreground-color*
" -bg " *background-color*
" -pr " *foreground-color*
" +sb "))
;; Audio controls, uses un-numlocked keypad.
;; Some keys duplicated, not sure which I prefer yet.
(define-key *top-map* (kbd "KP_Up") "mpd-volume-up")
(define-key *top-map* (kbd "KP_Add") "mpd-volume-up") ; Redundant
(define-key *top-map* (kbd "KP_Down") "mpd-volume-down")
(define-key *top-map* (kbd "KP_Subtract") "mpd-volume-down") ; Redundant
(define-key *top-map* (kbd "KP_Left") "mpd-prev")
(define-key *top-map* (kbd "KP_Right") "mpd-next")
(define-key *top-map* (kbd "Num_Lock") "mpd-toggle-pause") ; The light indicates play/pause
This space reserved for jelly stains.
Finished reading those books. Actually, I read the first two within half a day of getting them, the 3rd took a while. They include footnotes as to the differences between Scheme and Common Lisp where relevant, many of which are simply to deal with CL being a Lisp-2. And they were all worth every fucking penny.
The Little Schemer was far more basic than I had expected but it did get around to covering the Y combinator, in quite an interesting way. Probably not so basic if you havn’t worked through SICP, HTDP, TSPL, and such. Heavy on recursion, only actually uses a very small subset of Scheme. It goes on to, much like SICP, write a small Scheme interpreter inside Scheme itself.
The Seasoned Schemer is pretty much what you would expect: more Scheme. Gets into let, set!, call/cc, etc…, including Y! which I don’t recall seeing before. Interesting to note, there’s a footnote for Common Lisp in chapter 19 that simply says: “This is impossible in Lisp, but Scheme can do it.”. It was referring to a particular use of letcc (aka call/cc), but it gave me a chuckle.
The Reasoned Schemer… wow. Despite being the shortest, I really had to take my time with that one. It’s pretty much entirely on using and writing a Prolog implementation in Scheme.
And if you havn’t guessed from the title of this post, they all use foods as example data, in an oft humorous way.
-
Recent
-
Links
-
Archives
- October 2009 (1)
- August 2009 (1)
- July 2009 (3)
- April 2009 (2)
- March 2009 (1)
- December 2008 (1)
- November 2008 (1)
- September 2008 (1)
- July 2008 (5)
- June 2008 (8)
- April 2008 (3)
- March 2008 (5)
-
Categories
-
RSS
Entries RSS
Comments RSS