Go: older entries

Thu, 2 Sep 2010

3:30 PM - Internet health

http://scoreboard.keynote.com/scoreboard/Main.aspx?Destination=NTT

The current latency for tier 1 providers on the Internet.

tags: internet health speed uptime

Thu, 12 Aug 2010

12:27 AM - Gaming thursday

Well i decided today was make-up day for losing a good part of my sunday to work.  I just bought the QuakeCon2010 pack on steam.  It includes fallout 3, quake *, Doom *, Hexen *,  RTCW, Spear of destiny, elder scrolls 3 & 4, heretic, commander keen and call of cthulhu: dark corners of the earth.  I figured that fallout 3 is close to the same price, and i got a lot of old games.  

I got a magus run started on ds9 and i'm answering questions via jabber, otherwise i'm just relaxing today. 

Wed, 4 Aug 2010

5:37 PM - More fun with LDAP

I haven't written about LDAP for a few years.  I've been asked to do a samba setup at work with LDAP.  I decided to document some of the steps required on FreeBSD.

Install samba port (i used 3.4.x)

install smbldap-tools (command line tools to help with user management)

install nss_ldap and pam_ldap ports.  Make sure you can resolve accounts from ldap using id and getent group or else samba will not authenticate.

Configure /usr/local/etc/ldap.conf (and make sure it's linked to nss_ldap.conf)

Modify /etc/nsswtich.conf ; on freebsd 8 remove the compat entries and switch it to files ldap for passwd, group and shadow.  When the compat keyword is used, nothing else works according to nsswitch.conf(5). 

Setup your LDAP directory.  If you configure the smbldap-tools properly, you can use the smbldap-populate command to create all the required parts of the ldap database.

Configure your shares and other settings in smb.conf (although part of this must be done before smbldap-tools works right)

optionally setup swat out of inetd via /etc/inetd.conf

This is by far not complete and should not be considered a "secure" setup but it does seem to work so far. 

In smb.conf you would have something like:

passdb backend = ldapsam:"ldap://ipaddresshere ldap://secondipaddress"
 

ldap user suffix = ou=people
ldap machine suffix = ou=Computers
ldap group suffix = ou=Groups
 

 

 

Mon, 19 Jul 2010

1:54 PM - LAMP = PIA

Yuck.. linux server ran out of disk space. installing new raid volumes now

status of raid 1:

mdadm --misc -D /dev/md3

installation howto from ubuntu:

https://help.ubuntu.com/community/Installation/RAID1%2BLVM

useful site on lvm:

http://www.linuxconfig.org/Linux_lvm_-_Logical_Volume_Manager

Thu, 1 Jul 2010

3:57 PM - Centos redhat fedora, sendmail and thunderbird

yum install cyrus-sasl-plain  is your friend.  THis fixes the mail vrfy blah blah error in the logs when you setup sendmail + saslauthd and you try to get thunderbird to auth properly. 

This bugged me for two days and there are hundreds of incorrect posts about using RELAY rules.  It's insane.

 did not issue MAIL/EXPN/VRFY/ETRN during connection to TLSMTA  fix is again to install the right cyrus sasl auth plugin from yum. 
 

Sun, 13 Jun 2010

7:01 PM - HL2 Episode 2

I finally got a chance to beat Half Life 2 Episode 2.  I've been half way through it since last year.  

Sat, 12 Jun 2010

1:16 PM - Wireless Security

One of my coworkers pointed out the inherit insecurity of WPA on Wifi devices the other day.  I knew that WEP was insecure, and I figured there were problems with WPA, but I didn't realize how easy it is to break it. 

WPA (and WPA2 -PSK / personal in apple lingo) use a secret key that can be up to 63 characters.  Many people don't use a full length key.  Others use a dictionary word or some other easy to deduce key.  

Apparently, in the protocol for WPA, the initial handshake (communication between your pc/mac and the wifi router) transmits something (well the hash of the key effectively) that can be grabbed in the air.  An attacker can grab this and then run a program offline to determine your WPA key.  He can later join your network.  

At this point, assume all wireless networking is insecure if you weren't already.  

Tips to make it harder to crack:

1. Use the maximum length or as close as you can for the private key

2. Use random characters, a generated key from one of the many online sites is better.  Don't use something obvious like "luke & caryn's wireless".   No, i've never used that.

3. Enable MAC address filtering (not to be confused with Mac computers)

4. Change your key periodically.  You never know who's on your Internet connection.

5. Use AES with WPA if it's available on your router. It's a little harder to crack.

Reasons you should care:

1. Someone can download illegal or offensive content and it came from your ip address.  You could go to jail or have an unpleasant search situation.  

2. You're paying good money for your internet connection, why should your neighbors freeload? Do you let your neighbor steal your cable too?

3. War driving.  Just google it.

Thu, 10 Jun 2010

9:33 PM - R00t through Excel.. how l33t

 " The flaws in Excel allowed hackers to create tainted spreadsheets that infect a user's PC once they are opened, ..."

http://www.msnbc.msn.com/id/37579736/ns/technology_and_science-security/

This has got to be the dumbest security message I've seen to date.

Mon, 24 May 2010

9:31 PM - Shooting yourself in the foot

(shamelessly stolen from http://apple.slashdot.org/comments.pl?sid=1660824&cid=32302054) 

Are you a programmer and willing to shoot only an appendage?

C
You shoot yourself in the foot.

C++
You accidentally create a dozen clones of yourself and shoot them all in the foot. Providing emergency medical assistance is impossible since you can't tell which are bitwise copies and which are just pointing at others and saying, "That's me, over there."

JAVA
After importing java.awt.right.foot.* and java.awt.gun.right.hand.*, and writing the classes and methods of those classes needed, you've forgotten what the hell you're doing.

Ruby
Your foot is ready to be shot in roughly five minutes, but you just can't find anywhere to shoot it.

PHP
You shoot yourself in the foot with a gun made with pieces from 300 other guns.

ASP.NET
Find a gun, it falls apart. Put it back together, it falls apart again. You try using the   .GUN Framework, it falls apart. You stab yourself in the foot instead.

SQL
SELECT @ammo:=bullet FROM gun WHERE trigger = 'PULLED';
INSERT INTO leg (foot) VALUES (@ammo);

Perl
You shoot yourself in the foot, but nobody can understand how you did it. Six months later, neither can you.

Javascript
You've perfected a robust, rich user experience for shooting yourself in the foot. You then find that bullets are disabled on your gun.

CSS
You shoot your right foot with one hand, then switch hands to shoot your left foot but you realize that the gun has turned into a banana.

FORTRAN
You shoot yourself in each toe, iteratively, until you run out of toes, then you read in the next foot and repeat. If you run out of bullets, you continue anyway because you have no exception-handling ability.

COBOL
Using a COLT 45 HANDGUN, AIM gun at LEG.FOOT, THEN place ARM.HAND.FINGER. on HANDGUN.TRIGGER and SQUEEZE. THEN return HANDGUN to HOLSTER. CHECK whether shoelace needs to be retied.

LISP
You shoot yourself in the appendage which holds the gun with which
you shoot yourself in the appendage which holds the gun with which
you shoot yourself in the appendage which holds the gun with which
you shoot yourself in the appendage which holds the gun with which
you shoot yourself in the appendage which holds   ....

BASIC
Shoot yourself in the foot with a water pistol. On big systems, continue until entire lower body is waterlogged.

Pascal
The compiler won't let you shoot yourself in the foot.

Unix
% ls
foot.c foot.h foot.o toe.c toe.o
% rm *   .o
rm:   .o: No such file or directory
% ls
%

Visual Basic
You'll shoot yourself in the foot, but you'll have so much fun doing it that you won't care.

Ada
After correctly packaging your foot, you attempt to concurrently load the gun, pull the trigger, scream and shoot yourself in the foot. When you try, however, you discover that your foot is of the wrong type.

Assembly
You try to shoot yourself in the foot only to discover you must first reinvent the gun, the bullet, and your foot. After that's done, you pull the trigger, the gun beeps several times, then crashes.

Python
You try to shoot yourself in the foot but you just keep hitting the whitespace between your toes.

Etc...



9:11 PM - Oh the humanity.. 2200 lines

  /**

     * Convert strings with umlaut and other named character entities into utf8 number based character entities.
     * http://code.google.com/p/doctype/wiki/CharacterEntities
     * @param str input string with ä and friends
     * @return real letters
     */
    public static String convertEntitiesToNumeric( final String str )
    {
        String s = str;

        if (s.isEmpty())
        {
            return s;
        }

        // German and other umlaut based letters
        s = StringUtils.replace( s, "ä", "ä" );  // ä
        s = StringUtils.replace( s, "Ä", "Ä" );  // Ä
        s = StringUtils.replace( s, "ü", "ü" );  // ü
        s = StringUtils.replace( s, "Ü", "Ü" );  // Ü
        s = StringUtils.replace( s, "ö", "ö" );  // ö
        s = StringUtils.replace( s, "Ö", "Ö" );  // Ö
        s = StringUtils.replace( s, "ß", "ß" ); // ß
        s = StringUtils.replace( s, "ï", "ï" );  // ï
        s = StringUtils.replace( s, "Ï", "Ï" );  // Ï
        s = StringUtils.replace( s, "ë", "ë" );  // ë
        s = StringUtils.replace( s, "Ë", "Ë" );  // Ë
        s = StringUtils.replace( s, "ÿ", "ÿ" );  // ÿ
        s = StringUtils.replace( s, "Ÿ", "Ÿ" );  // Ÿ

        // A's
        s = StringUtils.replace( s, "á", "á" ); // á
        s = StringUtils.replace( s, "Á", "Á" ); // Á
        s = StringUtils.replace( s, "ă", "ă" ); // ă
        s = StringUtils.replace( s, "Ă", "Ă" ); // Ä‚
        s = StringUtils.replace( s, "∾", "∾" );     // ∾
        s = StringUtils.replace( s, "∿", "∿" );    // ∿
        s = StringUtils.replace( s, "â", "â" );  // â
        s = StringUtils.replace( s, "´", "´" );  // ´
        s = StringUtils.replace( s, "а", "а" );
        s = StringUtils.replace( s, "А", "А" );
        s = StringUtils.replace( s, "Æ", "Æ" );  // Æ
        s = StringUtils.replace( s, "æ", "æ" );  // æ
        s = StringUtils.replace( s, "⁡", "&#x02061" );
        s = StringUtils.replace( s, "𝔞", "𝔞" );
        s = StringUtils.replace( s, "𝔄", "𝔄" );
        s = StringUtils.replace( s, "à", "à" ); // à
        s = StringUtils.replace( s, "ℵ", "ℵ" );// ℵ
        s = StringUtils.replace( s, "ℵ", "ℵ" );  // ℵ
        s = StringUtils.replace( s, "α", "α" );  // α
        s = StringUtils.replace( s, "ā", "ā" );
        s = StringUtils.replace( s, "⨿", "⨿" );
        // skip & and &
        s = StringUtils.replace( s, "∧", "∧" );    // ∧
        s = StringUtils.replace( s, "⩓", "⩓" );
        s = StringUtils.replace( s, "⩕", "⩕" );
        s = StringUtils.replace( s, "⩜", "⩜" );
        s = StringUtils.replace( s, "⩘", "⩘" );
        s = StringUtils.replace( s, "⩚", "⩚" );
        s = StringUtils.replace( s, "∠", "∠" );    // ∠
        s = StringUtils.replace( s, "⦤", "⦤" );
        s = StringUtils.replace( s, "∠", "∠" );
        s = StringUtils.replace( s, "∡", "∡" ); // ∡
        s = StringUtils.replace( s, "⦨", "⦨" );
        s = StringUtils.replace( s, "⦩", "⦩" );
        s = StringUtils.replace( s, "⦪", "⦪" );
        s = StringUtils.replace( s, "⦫", "⦫" );
        s = StringUtils.replace( s, "⦬", "⦬" );
        s = StringUtils.replace( s, "⦭", "⦭" );
        s = StringUtils.replace( s, "⦮", "⦮" );
        s = StringUtils.replace( s, "⦯", "⦯" );
        s = StringUtils.replace( s, "∟", "∟" ); // ∟
        s = StringUtils.replace( s, "⊾", "⊾" );
        s = StringUtils.replace( s, "⦝", "⦝" );
        s = StringUtils.replace( s, "∢", "∢" ); // ∢
        s = StringUtils.replace( s, "Å", "Å" ); // Å
        s = StringUtils.replace( s, "⍼", "⍼" );
        s = StringUtils.replace( s, "ą", "ą" );
        s = StringUtils.replace( s, "Ą", "Ą" );
        s = StringUtils.replace( s, "𝕒", "𝕒" );
        s = StringUtils.replace( s, "𝔸", "𝔸" );
        s = StringUtils.replace( s, "≈", "≈" );
        s = StringUtils.replace( s, "⩯", "⩯" );
        s = StringUtils.replace( s, "≊", "≊" );
        s = StringUtils.replace( s, "⩰", "⩰" );
        s = StringUtils.replace( s, "≋", "≋" );
        // skip '
        s = StringUtils.replace( s, "≈", "≈" ); // ≈
        s = StringUtils.replace( s, "≊", "≊" );
        s = StringUtils.replace( s, "å", "å" ); // å
        s = StringUtils.replace( s, "Å", "Å" ); // Å
        s = StringUtils.replace( s, "𝒶", "𝒶" );
        s = StringUtils.replace( s, "𝒜", "𝒜" );
        s = StringUtils.replace( s, "≔", "≔" );
        s = StringUtils.replace( s, "*", "*" );
        s = StringUtils.replace( s, "≈", "≈" ); // ≈
        s = StringUtils.replace( s, "≍", "≍" ); // ≍
        s = StringUtils.replace( s, "ã", "ã" ); // ã
        s = StringUtils.replace( s, "Ã", "Ã" ); // Ã
        // auml covered above
        s = StringUtils.replace( s, "∳", "∳" );
        s = StringUtils.replace( s, "⨑", "⨑" );

        // b's
        s = StringUtils.replace( s, "∖", "∖" );
        s = StringUtils.replace( s, "⫧", "⫧" );
        s = StringUtils.replace( s, "⌆", "⌆" );
        s = StringUtils.replace( s, "Б", "Б" );
        s = StringUtils.replace( s, "∵", "∵" ); // ∵
        s = StringUtils.replace( s, "ℬ", "ℬ" ); // ℬ
        s = StringUtils.replace( s, "Β", "Β" ); // Β
        s = StringUtils.replace( s, "𝔅", "𝔅" );
        s = StringUtils.replace( s, "𝔹", "𝔹" );
        s = StringUtils.replace( s, "˘", "˘" );
        s = StringUtils.replace( s, "ℬ", "ℬ" );
        s = StringUtils.replace( s, "≎", "≎" );
        s = StringUtils.replace( s, "⫭", "⫭" );
        s = StringUtils.replace( s, "≌", "≌" );
        s = StringUtils.replace( s, "϶", "϶" );
        s = StringUtils.replace( s, "‵", "‵" );
        s = StringUtils.replace( s, "∽", "∽" );
        s = StringUtils.replace( s, "⋍", "⋍" );
        s = StringUtils.replace( s, "⊽", "⊽" );
        s = StringUtils.replace( s, "⌅", "⌅" );
        s = StringUtils.replace( s, "⌅", "⌅" );
        s = StringUtils.replace( s, "⎵", "⎵" );
        s = StringUtils.replace( s, "⎶", "⎶" );
        s = StringUtils.replace( s, "≌", "≌" );
        s = StringUtils.replace( s, "б", "б" );
        s = StringUtils.replace( s, "„", "„" ); // "
        s = StringUtils.replace( s, "∵", "∵" );
        s = StringUtils.replace( s, "∵", "∵" );
        s = StringUtils.replace( s, "⦰", "⦰" );
        s = StringUtils.replace( s, "϶", "϶" );
        s = StringUtils.replace( s, "ℬ", "ℬ" );
        s = StringUtils.replace( s, "β", "β" ); // β
        s = StringUtils.replace( s, "ℶ", "ℶ" );
        s = StringUtils.replace( s, "≬", "≬" );
        s = StringUtils.replace( s, "𝔟", "𝔟" );
        s = StringUtils.replace( s, "⋂", "⋂" );
        s = StringUtils.replace( s, "◯", "◯" );
        s = StringUtils.replace( s, "⋃", "⋃" );
        s = StringUtils.replace( s, "⨀", "⨀" );
        s = StringUtils.replace( s, "⨁", "⨁" );
        s = StringUtils.replace( s, "bigotimes;", "⨂" );
        s = StringUtils.replace( s, "⨆", "⨆" );
        s = StringUtils.replace( s, "★", "★" ); //★
        s = StringUtils.replace( s, "▽", "▽" );
        s = StringUtils.replace( s, "△", "△" );
        s = StringUtils.replace( s, "⨄", "⨄" );
        s = StringUtils.replace( s, "⋁", "⋁" );
        s = StringUtils.replace( s, "⋀", "⋀" );
        s = StringUtils.replace( s, "⤍", "⤍" );
        s = StringUtils.replace( s, "⧫", "⧫" );
        s = StringUtils.replace( s, "▪", "▪" );
        s = StringUtils.replace( s, "▴", "▴" );
        s = StringUtils.replace( s, "▾", "▾" );
        s = StringUtils.replace( s, "◂", "◂" );
        s = StringUtils.replace( s, "▸", "▸" );
        s = StringUtils.replace( s, "␣", "␣" );
        s = StringUtils.replace( s, "▒", "▒" );
        s = StringUtils.replace( s, "░", "░" );
        s = StringUtils.replace( s, "▓", "▓" );
        s = StringUtils.replace( s, "╨", "╨" );
        s = StringUtils.replace( s, "╩", "╩" );
        s = StringUtils.replace( s, "┘", "┘" );
        s = StringUtils.replace( s, "╛", "╛" );
        s = StringUtils.replace( s, "╜", "╜" );
        s = StringUtils.replace( s, "╝", "╝" );
        s = StringUtils.replace( s, "└", "└" );
        s = StringUtils.replace( s, "╘", "╘" );
        s = StringUtils.replace( s, "╙", "╙" );
        s = StringUtils.replace( s, "╚", "╚" );
        s = StringUtils.replace( s, "│", "│" );
        s = StringUtils.replace( s, "║", "║" );
        s = StringUtils.replace( s, "┼", "┼" );
        s = StringUtils.replace( s, "╪", "╪" );
        s = StringUtils.replace( s, "╫", "╫" );
        s = StringUtils.replace( s, "█", "█" );
        s = StringUtils.replace( s, "⌐", "⌐" );
        s = StringUtils.replace( s, "𝕓", "𝕓" );
        s = StringUtils.replace( s, "⊥", "⊥" );
        s = StringUtils.replace( s, "⊥", "⊥" );
        s = StringUtils.replace( s, "⋈", "⋈" );
        s = StringUtils.replace( s, "╗", "╗" );
        s = StringUtils.replace( s, "╔", "╔" );
        s = StringUtils.replace( s, "┌", "┌" );
        s = StringUtils.replace( s, "╖", "╖" );
        s = StringUtils.replace( s, "┐", "┐" );
        s = StringUtils.replace( s, "─", "─" );
        s = StringUtils.replace( s, "┬", "┬" );
        s = StringUtils.replace( s, "╤", "╤" );
        s = StringUtils.replace( s, "╥", "╥" );
        s = StringUtils.replace( s, "╦", "╦" );
        s = StringUtils.replace( s, "┴", "┴" );
        s = StringUtils.replace( s, "╧", "╧" );
        s = StringUtils.replace( s, "╬", "╬" );
        s = StringUtils.replace( s, "┤", "┤" );
        s = StringUtils.replace( s, "╡", "╡" );
        s = StringUtils.replace( s, "╢", "╢" );
        s = StringUtils.replace( s, "╣", "╣" );
        s = StringUtils.replace( s, "├", "├" );
        s = StringUtils.replace( s, "╞", "╞" );
        s = StringUtils.replace( s, "╟", "╟" );
        s = StringUtils.replace( s, "╠", "╠" );
        s = StringUtils.replace( s, "⧉", "⧉" );
        s = StringUtils.replace( s, "⊟", "⊟" );
        s = StringUtils.replace( s, "⊞", "⊞" );
        s = StringUtils.replace( s, "⊠", "⊠" );
        s = StringUtils.replace( s, "‵", "‵" );
        s = StringUtils.replace( s, "˘", "˘" );
        s = StringUtils.replace( s, "¦", "¦" ); // ¦
        s = StringUtils.replace( s, "&brvbar", "¦" );  // ¦  , special case
        s = StringUtils.replace( s, "𝒷", "𝒷" );
        s = StringUtils.replace( s, "⁏", "⁏" );
        s = StringUtils.replace( s, "∽", "∽" );
        s = StringUtils.replace( s, "⋍", "⋍" );
        s = StringUtils.replace( s, "\", "\" );
        s = StringUtils.replace( s, "⧅", "⧅" );
        s = StringUtils.replace( s, "•", "•" ); // •
        s = StringUtils.replace( s, "•", "•" );
        s = StringUtils.replace( s, "≎", "≎" );
        s = StringUtils.replace( s, "≏", "≏" );
        s = StringUtils.replace( s, "⪮", "⪮" );

        // C's
        s = StringUtils.replace( s, "Ч", "Ч" );
        s = StringUtils.replace( s, "ч", "ч" );
        s = StringUtils.replace( s, "©", "©" );
        s = StringUtils.replace( s, "©", "©" );
        s = StringUtils.replace( s, "&COPY", "©" );  // special
        s = StringUtils.replace( s, "&copy", "©" );  // special
        s = StringUtils.replace( s, "ć", "ć" );
        s = StringUtils.replace( s, "Ć", "Ć" );
        s = StringUtils.replace( s, "∩", "∩" ); // ∩
        s = StringUtils.replace( s, "⋒", "⋒" ); // â‹’
        s = StringUtils.replace( s, "ⅅ", "ⅅ" );
        s = StringUtils.replace( s, "ℭ", "ℭ" );
        s = StringUtils.replace( s, "č", "č" );
        s = StringUtils.replace( s, "Č", "Č" );
        s = StringUtils.replace( s, "ç", "ç" ); // ç
        s = StringUtils.replace( s, "Ccedil;", "Ç" );  // Ç
        s = StringUtils.replace( s, "&Ccedil", "Ç" );  // Ç
        s = StringUtils.replace( s, "&ccedil", "ç" );
        s = StringUtils.replace( s, "ĉ", "ĉ" );
        s = StringUtils.replace( s, "Ĉ", "Ĉ" );
        s = StringUtils.replace( s, "∰", "∰" );
        s = StringUtils.replace( s, "ċ", "ċ" );
        s = StringUtils.replace( s, "Ċ", "Ċ" );
        s = StringUtils.replace( s, "¸", "¸" );
        s = StringUtils.replace( s, "·", "·" );
        s = StringUtils.replace( s, "·", "·" );
        s = StringUtils.replace( s, "𝔠", "𝔠" );
        s = StringUtils.replace( s, "𝔠", "𝔠" );
        s = StringUtils.replace( s, "ℭ", "ℭ" );
        s = StringUtils.replace( s, "χ", "χ" ); // χ
        s = StringUtils.replace( s, "Χ", "Χ" ); // Χ
        s = StringUtils.replace( s, "⊙", "⊙" );
        s = StringUtils.replace( s, "⊖", "⊖" );
        s = StringUtils.replace( s, "⊕", "⊕" );
        s = StringUtils.replace( s, "⊗", "⊗" );
        s = StringUtils.replace( s, "∲", "∲" );
        s = StringUtils.replace( s, "”", "”" );
        s = StringUtils.replace( s, "’", "’" );
        s = StringUtils.replace( s, ":", ":" );
        s = StringUtils.replace( s, "∷", "∷" );
        s = StringUtils.replace( s, "≔", "≔" );
        s = StringUtils.replace( s, "⩴", "⩴" );
        s = StringUtils.replace( s, "≡", "≡" );
        s = StringUtils.replace( s, "∮", "∮" );
        s = StringUtils.replace( s, "∯", "∯" );
        s = StringUtils.replace( s, "∮", "∮" );
        s = StringUtils.replace( s, "𝕔", "𝕔" );
        s = StringUtils.replace( s, "ℂ", "ℂ" );
        s = StringUtils.replace( s, "∐", "∐" );
        s = StringUtils.replace( s, "&CounterClockwiseContourIntegral;", "∳" );
        s = StringUtils.replace( s, "✗", "✗" );
        s = StringUtils.replace( s, "⨯", "⨯" );
        s = StringUtils.replace( s, "𝒸", "𝒸" );
        s = StringUtils.replace( s, "𝒞", "𝒞" );
        s = StringUtils.replace( s, "∪", "∪" ); // ∪
        s = StringUtils.replace( s, "⋓", "⋓" );
        s = StringUtils.replace( s, "≍", "≍" );
        s = StringUtils.replace( s, "⩆", "⩆" );
        s = StringUtils.replace( s, "⩄", "⩄" );
        s = StringUtils.replace( s, "⩉", "⩉" );
        s = StringUtils.replace( s, "⩋", "⩋" );
        s = StringUtils.replace( s, "⩇", "⩇" );
        s = StringUtils.replace( s, "⩀", "⩀" );
        s = StringUtils.replace( s, "⁁", "⁁" );
        s = StringUtils.replace( s, "⩌", "⩌" );
        s = StringUtils.replace( s, "ˇ", "ˇ" );
        s = StringUtils.replace( s, "⩍", "⩍" );
        s = StringUtils.replace( s, "⩐", "⩐" );
        s = StringUtils.replace( s, "¸", "¸" );
        s = StringUtils.replace( s, "&cedil", "¸" );
        s = StringUtils.replace( s, "⦲", "⦲" );
        s = StringUtils.replace( s, "¢", "¢" ); // ¢
        s = StringUtils.replace( s, "&cent", "¢" );
        s = StringUtils.replace( s, "✓", "✓" );
        s = StringUtils.replace( s, "✓", "✓" );
        s = StringUtils.replace( s, "○", "○" );
        s = StringUtils.replace( s, "≗", "≗" );
        s = StringUtils.replace( s, "⧃", "⧃" );
        s = StringUtils.replace( s, "ˆ", "#x002C6;" );
        s = StringUtils.replace( s, "≗", "≗" );
        s = StringUtils.replace( s, "↺", "↺" );
        s = StringUtils.replace( s, "↻", "↻" );
        s = StringUtils.replace( s, "®", "®" );
        s = StringUtils.replace( s, "Ⓢ", "Ⓢ" );
        s = StringUtils.replace( s, "⊛", "⊛" );
        s = StringUtils.replace( s, "⊚", "⊚" );
        s = StringUtils.replace( s, "&circleddash;", "&#x0229D;<" );
        s = StringUtils.replace( s, "&cirfnint;", "&#x02A10;" );
        s = StringUtils.replace( s, "&cirmid;", "&#x02AEF;" );
        s = StringUtils.replace( s, "&cirscir;", "&#x029C2;" );
        s = StringUtils.replace( s, "&clubs;", "&#x02663;" ); // ♣
        s = StringUtils.replace( s, "&clubsuit;", "&#x02663;" );
        s = StringUtils.replace( s, "&coloneq;", "&#x02254;" );
        s = StringUtils.replace( s, "&comma;", "&#x0002C;" );
        s = StringUtils.replace( s, "&commat;", "&#x00040;" );
        s = StringUtils.replace( s, "&comp;", "&#x02201;" );
        s = StringUtils.replace( s, "&compfn;", "&#x02218;" );
        s = StringUtils.replace( s, "&complement;", "&#x02201;" );
        s = StringUtils.replace( s, "&complexes;", "&#x02102;" );
        s = StringUtils.replace( s, "&cong;", "&#x02245;" );
        s = StringUtils.replace( s, "&congdot;", "&#x02A6D;" );
        s = StringUtils.replace( s, "&coprod;", "&#x02210;" );
        s = StringUtils.replace( s, "&copysr;", "&#x02117;" );
        s = StringUtils.replace( s, "&crarr;", "&#x021B5;" );
        s = StringUtils.replace( s, "&csub;", "&#x02ACF;" );
        s = StringUtils.replace( s, "&csube;", "&#x02AD1;" );
        s = StringUtils.replace( s, "&csup;", "&#x02AD0;" );
        s = StringUtils.replace( s, "&csupe;", "&#x02AD2;" );
        s = StringUtils.replace( s, "&ctdot;", "&#x022EF;" );
        s = StringUtils.replace( s, "&cudarrl;", "&#x02938;" );
        s = StringUtils.replace( s, "&cudarrr;", "&#x02935;" );
        s = StringUtils.replace( s, "&cuepr;", "&#x022DE;" );
        s = StringUtils.replace( s, "&cuesc;", "&#x022DF;" );
        s = StringUtils.replace( s, "&cularr;", "&#x021B6;" );
        s = StringUtils.replace( s, "&cularrp;", "&#x0293D;" );
        s = StringUtils.replace( s, "&cupbrcap;", "&#x02A48;" );
        s = StringUtils.replace( s, "&cupcup;", "&#x02A4A;" );
        s = StringUtils.replace( s, "&cupdot;", "&#x0228D;" );
        s = StringUtils.replace( s, "&cupor;", "&#x02A45;" );
        s = StringUtils.replace( s, "&curarr;", "&#x021B7;" );
        s = StringUtils.replace( s, "&curarrm;", "&#x0293C;" );
        s = StringUtils.replace( s, "&curlyeqprec;", "&#x022DE;" );
        s = StringUtils.replace( s, "&curlyeqsucc;", "&#x022DF;" );
        s = StringUtils.replace( s, "&curlyvee;", "&#x022CE;" );
        s = StringUtils.replace( s, "&curlywedge;", "&#x022CF;" );
        s = StringUtils.replace( s, "&curren;", "&#x000A4;" );
        s = StringUtils.replace( s, "&curren", "&#x000A4;" );
        s = StringUtils.replace( s, "&curvearrowleft;", "&#x021B6;" );
        s = StringUtils.replace( s, "&curvearrowright;", "&#x021B7;" );
        s = StringUtils.replace( s, "&cuvee;", "&#x022CE;" );
        s = StringUtils.replace( s, "&cuwed;", "&#x022CF;" );
        s = StringUtils.replace( s, "&cwconint;", "&#x02232;" );
        s = StringUtils.replace( s, "&cwint;", "&#x02231;<" );
        s = StringUtils.replace( s, "&cylcty;", "&#x0232D;" );

        // D's
        s = StringUtils.replace( s, "&dd;", "&#x02146;" );
        s = StringUtils.replace( s, "&DD;", "&#x02145;" );
        s = StringUtils.replace( s, "&DDotrahd;", "&#x02911;" );
        s = StringUtils.replace( s, "&DJcy;", "&#x00402;" );
        s = StringUtils.replace( s, "&djcy;", "&#x00452;" );
        s = StringUtils.replace( s, "&DScy;", "&#x00405;" );
        s = StringUtils.replace( s, "&dscy;", "&#x00455;" );
        s = StringUtils.replace( s, "&DZcy;", "&#x0040F;" );
        s = StringUtils.replace( s, "&dzcy;", "&#x0045F;" );
        s = StringUtils.replace( s, "&dagger;", "&#x02020;" );
        s = StringUtils.replace( s, "&Dagger;", "&#x02021;" );
        s = StringUtils.replace( s, "&darr;", "&#x02193;" );
        s = StringUtils.replace( s, "&dArr;", "&#x021D3;" );
        s = StringUtils.replace( s, "&Darr;", "&#x021A1;" );
        s = StringUtils.replace( s, "&dashv;", "&#x022A3;" );
        s = StringUtils.replace( s, "&Dashv;", "&#x02AE4" );
        s = StringUtils.replace( s, "&dcaron;", "&#x0010F;" );
        s = StringUtils.replace( s, "&Dcaron;", "&#x0010E;" );
        s = StringUtils.replace( s, "&dcy;", "&#x00434;" );
        s = StringUtils.replace( s, "&Dcy;", "&#x00414;" );
        s = StringUtils.replace( s, "&Del;", "&#x02207;" );
        s = StringUtils.replace( s, "&delta;", "&#x003B4;" ); // δ
        s = StringUtils.replace( s, "&Delta;", "&#x00394;" ); // Δ
        s = StringUtils.replace( s, "&dfr;", "&#x1D521;" );
        s = StringUtils.replace( s, "&Dfr;", "&#x1D507;" );
        s = StringUtils.replace( s, "&DiacriticalAcute;", "&#x000B4;" );
        s = StringUtils.replace( s, "&DiacriticalDot;", "&#x002D9;" );
        s = StringUtils.replace( s, "&DiacriticalDoubleAcute;", "&#x002DD;" );
        s = StringUtils.replace( s, "&DiacriticalGrave;", "&#x00060;" );
        s = StringUtils.replace( s, "&DiacriticalTilde;", "&#x002DC;" );
        s = StringUtils.replace( s, "&diamond;", "&#x022C4;" );
        s = StringUtils.replace( s, "&Diamond;", "&#x022C4;" );
        s = StringUtils.replace( s, "&DifferentialD;", "&#x02146;" );
        s = StringUtils.replace( s, "&dopf;", "&#x1D555;" );
        s = StringUtils.replace( s, "&Dopf;", "&#x1D53B;" );
        s = StringUtils.replace( s, "&dot;", "&#x002D9;" );
        s = StringUtils.replace( s, "&Dot;", "&#x000A8;" );
        s = StringUtils.replace( s, "&DotDot;", "&#x020DC;" );
        s = StringUtils.replace( s, "&DotEqual;", "&#x02250;" );
        s = StringUtils.replace( s, "&DoubleContourIntegral;", "&#x0222F;" );
        s = StringUtils.replace( s, "&DoubleDot;", "&#x000A8;" );
        s = StringUtils.replace( s, "&DoubleDownArrow;", "&#x021D3;" );
        s = StringUtils.replace( s, "&DoubleLeftArrow;", "&#x021D0;" );
        s = StringUtils.replace( s, "&DoubleLeftRightArrow;", "&#x021D4;" );
        s = StringUtils.replace( s, "&DoubleLeftTee;", "&#x02AE4;" );
        s = StringUtils.replace( s, "&DoubleLongLeftArrow;", "&#x027F8;" );
        s = StringUtils.replace( s, "&DoubleLongRightArrow;", "&#x027F9;" );
        s = StringUtils.replace( s, "&DoubleRightArrow;", "&#x021D2;" );
        s = StringUtils.replace( s, "&DoubleRightTee;", "&#x022A8;" );
        s = StringUtils.replace( s, "&DoubleUpArrow;", "&#x021D1;" );
        s = StringUtils.replace( s, "&DoubleUpDownArrow;", "&#x021D5;" );
        s = StringUtils.replace( s, "&DoubleVerticalBar;", "&#x02225;" );
        s = StringUtils.replace( s, "&downarrow;", "&#x02193;" );
        s = StringUtils.replace( s, "&DownArrow;", "&#x02193;" );
        s = StringUtils.replace( s, "&Downarrow;", "&#x021D3;" );
        s = StringUtils.replace( s, "&DownArrowBar;", "&#x02913;" );
        s = StringUtils.replace( s, "&DownArrowUpArrow;", "&#x021F5;" );
        s = StringUtils.replace( s, "&DownBreve;", "&#x00311;" );
        s = StringUtils.replace( s, "&DownLeftRightVector;", "&#x02950;" );
        s = StringUtils.replace( s, "&DownLeftTeeVector;", "&#x0295E;" );
        s = StringUtils.replace( s, "&DownLeftVector;", "&#x021BD;" );
        s = StringUtils.replace( s, "&DownLeftVectorBar;", "&#x02956;" );
        s = StringUtils.replace( s, "&DownRightTeeVector;", "&#x0295F;" );
        s = StringUtils.replace( s, "&DownRightVector;", "&#x021C1;" );
        s = StringUtils.replace( s, "&DownRightVectorBar;", "&#x02957;" );
        s = StringUtils.replace( s, "&DownTee;", "&#x022A4;" );
        s = StringUtils.replace( s, "&DownTeeArrow;", "&#x021A7;" );
        s = StringUtils.replace( s, "&dscr;", "&#x1D4B9;" );
        s = StringUtils.replace( s, "&Dscr;", "&#x1D49F;" );
        s = StringUtils.replace( s, "&dstrok;", "&#x00111;" );
        s = StringUtils.replace( s, "&Dstrok;", "&#x00110;" );
        s = StringUtils.replace( s, "&dHar;", "&#x02965;" );
        s = StringUtils.replace( s, "&daleth;", "&#x02138;" );
        s = StringUtils.replace( s, "&dash;", "&#x02010;" );
        s = StringUtils.replace( s, "&dbkarow;", "&#x0290F;" );
        s = StringUtils.replace( s, "&dblac;", "&#x002DD;" );
        s = StringUtils.replace( s, "&ddagger;", "&#x02021;" );
        s = StringUtils.replace( s, "&ddarr;", "&#x021CA;" );
        s = StringUtils.replace( s, "&ddotseq;", "&#x02A77;" );
        s = StringUtils.replace( s, "&deg;", "&#x000B0;" );
        s = StringUtils.replace( s, "&deg", "&#x000B0;" );
        s = StringUtils.replace( s, "&demptyv;", "&#x029B1;" );
        s = StringUtils.replace( s, "&dfisht;", "&#x0297F;" );
        s = StringUtils.replace( s, "&dharl;", "&#x021C3;" );
        s = StringUtils.replace( s, "&dharr;", "&#x021C2;" );
        s = StringUtils.replace( s, "&diam;", "&#x022C4;" );
        s = StringUtils.replace( s, "&diamondsuit;", "&#x02666;" );
        s = StringUtils.replace( s, "&diams;", "&#x02666;" );
        s = StringUtils.replace( s, "&die;", "&#x000A8;" );
        s = StringUtils.replace( s, "&digamma;", "&#x003DD;" );
        s = StringUtils.replace( s, "&disin;", "&#x022F2;" );
        s = StringUtils.replace( s, "&div;", "&#x000F7;" );
        s = StringUtils.replace( s, "&divide;", "&#x000F7;" );
        s = StringUtils.replace( s, "&divide", "&#x000F7;" );
        s = StringUtils.replace( s, "&divideontimes;", "&#x022C7;" );
        s = StringUtils.replace( s, "&divonx;", "&#x022C7;" );
        s = StringUtils.replace( s, "&dlcorn;", "&#x0231E;" );
        s = StringUtils.replace( s, "&dlcrop;", "&#x0230D;" );
        s = StringUtils.replace( s, "&dollar;", "&#x00024;" );
        s = StringUtils.replace( s, "&doteq;", "&#x02250;" );
        s = StringUtils.replace( s, "&doteqdot;", "&#x02251;" );
        s = StringUtils.replace( s, "&dotminus;", "&#x02238;" );
        s = StringUtils.replace( s, "&dotplus;", "&#x02214;" );
        s = StringUtils.replace( s, "&dotsquare;", "&#x022A1;" );
        s = StringUtils.replace( s, "&doublebarwedge;", "&#x02306;" );
        s = StringUtils.replace( s, "&downdownarrows;", "&#x021CA;" );
        s = StringUtils.replace( s, "&downharpoonleft;", "&#x021C3;" );
        s = StringUtils.replace( s, "&downharpoonright;", "&#x021C2;" );
        s = StringUtils.replace( s, "&drbkarow;", "&#x02910;" );
        s = StringUtils.replace( s, "&drcorn;", "&#x0231F;" );
        s = StringUtils.replace( s, "&drcrop;", "&#x0230C;" );
        s = StringUtils.replace( s, "&dsol;", "&#x029F6;" );
        s = StringUtils.replace( s, "&dtdot;", "&#x022F1;" );
        s = StringUtils.replace( s, "&dtri;", "&#x025BF;" );
        s = StringUtils.replace( s, "&dtrif;", "&#x025BE;" );
        s = StringUtils.replace( s, "&duarr;", "&#x021F5;" );
        s = StringUtils.replace( s, "&duhar;", "&#x0296F;" );
        s = StringUtils.replace( s, "&dwangle;", "&#x029A6;" );
        s = StringUtils.replace( s, "&dzigrarr;", "&#x027FF;" );

        // E's
        s = StringUtils.replace( s, "&eng;", "&#x0014B;" );
        s = StringUtils.replace( s, "&ENG;", "&#x0014A;" );
        s = StringUtils.replace( s, "&eth;", "&#x000F0;" ); // ð
        s = StringUtils.replace( s, "&ETH;", "&#x000D0;" ); // Ð
        s = StringUtils.replace( s, "&ETH", "&#x000D0;" );  // Ð
        s = StringUtils.replace( s, "&eth", "&#x000F0;" );  // ð
        s = StringUtils.replace( s, "&eacute;", "&#x000E9;" ); // é
        s = StringUtils.replace( s, "&Eacute;", "&#x000C9;" ); // É
        s = StringUtils.replace( s, "&Eacute", "&#x000C9;" );  // É
        s = StringUtils.replace( s, "&eacute", "&#x000E9;" );  // é
        s = StringUtils.replace( s, "&ee;", "&#x02147;" );
        s = StringUtils.replace( s, "&ecaron;", "&#x0011B;" );
        s = StringUtils.replace( s, "&Ecaron;", "&#x0011A;" );
        s = StringUtils.replace( s, "&ecirc;", "&#x000EA;" ); // ê
        s = StringUtils.replace( s, "&Ecirc;", "&#x000CA;" ); // Ê
        s = StringUtils.replace( s, "&Ecirc", "&#x000CA;" );  // Ê
        s = StringUtils.replace( s, "&ecirc", "&#x000EA;" );  // ê
        s = StringUtils.replace( s, "&ecy;", "&#x0044D;" );
        s = StringUtils.replace( s, "&Ecy;", "&#x0042D;" );
        s = StringUtils.replace( s, "&edot;", "&#x00117;" );
        s = StringUtils.replace( s, "&eDot;", "&#x02251;" );
        s = StringUtils.replace( s, "&Edot;", "&#x00116;" );
        s = StringUtils.replace( s, "&efr;", "&#x1D522;" );
        s = StringUtils.replace( s, "&Efr;", "&#x1D508;" );
        s = StringUtils.replace( s, "&egrave;", "&#x000E8;" ); // è
        s = StringUtils.replace( s, "&Egrave;", "&#x000C8;" ); // È
        s = StringUtils.replace( s, "&Egrave", "&#x000C8;" );  // È
        s = StringUtils.replace( s, "&egrave", "&#x000E8;" );  // è
        s = StringUtils.replace( s, "&Element;", "&#x02208;" );
        s = StringUtils.replace( s, "&emacr;", "&#x00113;" );
        s = StringUtils.replace( s, "&Emacr;", "&#x00112;" );
        s = StringUtils.replace( s, "&EmptySmallSquare;", "&#x025FB;" );
        s = StringUtils.replace( s, "&EmptyVerySmallSquare;", "&#x025AB;" );
        s = StringUtils.replace( s, "&eogon;", "&#x00119;" );
        s = StringUtils.replace( s, "&Eogon;", "&#x00118;" );
        s = StringUtils.replace( s, "&eopf;", "&#x1D556;" );
        s = StringUtils.replace( s, "&Eopf;", "&#x1D53C;" );
      

Fri, 21 May 2010

3:06 PM - Mozilla Thunderbird bug

Unlike every other email program on the planet, Mozilla Thunderbird requires one to use mime related instead of mixed mode to embed images within email attachments using the cid stuff.  This has caused me great pain this week.  Outlook worked, iphones worked, windows mail in vista, web based mail, gmail, ... everything except Thunderbird. 

Our implementation sends embedded mails using the javamail api.  Use  final Multipart mp = new MimeMultipart("related");


        // now do the image file attachments
            Set keys;
            keys = images.keySet();

            for (Object key : keys)
            {
                String hashkey = (String) key;
                final MimeBodyPart mbp2 = new MimeBodyPart();
                final DataSource source = new FileDataSource( images.get( hashkey ) ) {

                    @Override
                    public String getContentType()
                    {
                        return "image/jpeg";
                    }
                };
                mbp2.setDataHandler( new DataHandler( source ) );
                mbp2.setHeader( "Content-ID", "<i" + hashkey + ">" );
                mbp2.setFileName( hashkey + ".jpg" );  // temporary hack
                mbp2.setDisposition( Part.INLINE );
                mp.addBodyPart( mbp2 );
            }

3:05 PM - id10t

I just realized I had a permissions error causing bind to fail since stargazer went down for most of my domains.  Holy crap.

Sun, 9 May 2010

10:01 AM - When the GNU makes no sense

 http://www.gnu.org/server/server.html

According to this website, the GNU runs Debian Linux on servers.  They mention the use of non- Free software in Debian.  They justify the use citing the removal of this software.  However, the GNU recommends not using the software because other users are too stupid to know what non-Free software is.  

I find it amazing they don't drink their own kool-aid.  If you're going to recommend Linux distros to others, use them yourself.  It would be like me not running MidnightBSD on my webserver.  

Actually, their website should be running on GNU/HURD right now and not Linux.  

I've also noticed they're starting to call it the GNU Operating System now.  I've heard this rhetoric before.  When GNU HURD is usable, then they can claim they have an operating system.  The core of any operating system is it's kernel and they don't have one.  They have a dream of a kernel that they've restarted on at least three times.  The kernel is the most important part of any operating system.  Without a kernel, you have nothing. Your computer cannot do any useful function.

In other areas, they've also shown a defensive.  They stopped working with BSD projects on support for software components.  It's so bad that the BSD community is working on alternate compilers, assemblers, linkers, replacements for autoconf, etc.  The other day I read about an alternative to diff! 

Once again, the GNU has proven that the "GNU is not UNIX".  

Sat, 8 May 2010

10:23 AM - (no subject)

 Wow I haven't blogged for a month.  My trip to germany went OK.  I found that I like German beer more than I should.  I also got a chance to meet another BSD developer in Germany.  That was nice.  It's good to talk to someone that understands all the work to build an operating system.  

I've spent the last week working on a newsletter that will never get complete.  The client hates it.  It's a large automotive company.  Next week I must rewrite the mail send code to selectively attach images because their ancient Lotus Notes environment can't handle IMAGES in HTML email.  Cheap bastards, call IBM.  

MidnightBSD progress has been slow.  I just want 0.3 out the door so I can start on something new.

Last November, I bought an Iomega Prestige USB 1.5 TB HDD at Best Buy.  It was used to backup the new hard drive I had to buy for my iMac.  The drive has been disconnecting or powering off when in use.  I've tried connecting it to my PC running Vista and Caryn's Mac Pro with no luck.  I contacted Iomega and they sent me a new power adapter.  That did not work.  I suspected the enclosure.  Last night, I gave up and pulled the drive from the enclosure and ran a Samsung tool on it.  The sector scan passed.  The drive itself is fine as far as I can tell.  I'm just going to order a new enclosure for it.

Fri, 26 Mar 2010

8:43 PM - MidnightBSD and OpenJDK

I'm writing this blog entry from javajj running on MidnightBSD on top of OpenJDK6.

This is awesome.

location: Home

Sun, 21 Mar 2010

2:00 PM - skipfish: web app security tool

http://code.google.com/p/skipfish/ 

Skipfish is a  "

 fully automated, active web application security reconnaissance tool"

 

 

 



 

It is a c program used for checking web apps for issues.  I've managed to compile it on MidnightBSD and FreeBSD.  Here are a few required changes:

malloc_np.h is required on FreeBSD and MidnightBSD.  

There are a few preprocessor directives checking for FreeBSD.  These will need to be altered to include MidnightBSD or else the code will not compile.  This was only tested on MidnightBSD 0.3-CURRENT 

Sat, 20 Mar 2010

9:06 PM - Firefox 3.5.8 hmm...

I just spent the last few hours updating firefox on MidnightBSD.  It's always a tiresome experience.  It's great to have a newer browser with some level of security available though.  mports/www/browser35 for those interested

Mon, 15 Mar 2010

8:15 PM - It was newsletter day again

One of the tasks I've been given at work is to write and maintain a newsletter generation tool.  Most people think of it as a simple application that sends and email with some canned text, maybe customized with the persons name similar to the "mergemail" feature in word.  

Well that's only part of what this application does.  It generates four different formats of newsletter, HTML, Text, PDF and a special HTML version to send with the PDF.  The PDFs are 50 pages long for one client everyday.  Today, I had to add stock price monitoring to the newsletter tool.  It checks the price of the stock on regular intervals (hourly) and includes the current price when the newsletter is sent out for this client.  I spent way too much time on this, but I have a feeling it will come up again.

Like everyone else on the Internet, I used Yahoo! Finance data as a source.   You can output a CSV directly from their web app and even query multiple symbols.  I limited it to hourly lookups and then only during market hours using a cron job.  This is probably the 7th cron job running.  They're all Java apps right now.  

I'm really torn on the whole Java thing with this. I think Perl or C would be better choices.  However, since the database schema changes constantly, I just used a jar file containing all the database stuff and pop it in when I do a schema change.  It really simplifies updating them.  

I hate spec changes, but it's common place at my company.  You can never get someone to tell you the whole story at any time or even half the story.  When you do get the story, you find it's changed from the week before.  

Anyway, the stock fetcher is pretty simple and slick.  I just used a Java Url class to fetch the data and then an open source library (LGPL) to parse the csv.  It's easy to parse CSV files yourself, but I didn't feel like taking the time.  

It runs through a loop and checks for each symbol stored in the database with a 30 second pause so as to not klll Yahoo's service.  

I had a fun bug today using html clean and jtidy together.  It seems jtidy was re-encoding the HTML entities again like ampersand so it was screwing up non breaking space, greater than, less than and apostrophe characters in the HTML output.  I have to run both because jtidy sucks.  It doesn't fix several types of invalid HTML.  If I ever get time, I'll try to fix it and upstream it. 

Sun, 28 Feb 2010

4:50 PM - U2 brought in the most money in 2009

According to this BBC article, U2 brought in the most money last year. I can't speak for others, but the Chicago concert rocked.

10:13 AM - Games

I've noticed a new pattern among game developers.  Software has always been licensed, but now we're only buying unkown length licenses to these products.  With a game like World of Warcraft, I know I'm subscribing month to month, but I don't know if they will keep running the server indefinetely.  Eventually the game will die.  WIth a MMORPG, this is acceptible and inevitable.  However, other games like the new Assassin's Creed 2 require a constant Internet connection to play.  They actually download part of the game engine on each load.  If they decide to turn off the servers or go out of business, you lose access to the game forever.  This is the same problem that happened on the Xbox.  I bought an Xbox to play games online.  Soon, EA started turning off sports titles servers.  They want you to buy the new title each year.  That means I'm paying $50 a year to keep playing and the game experience changes each year.  Perhaps with an NBA game, I want to play the Pistons in 2004 instead of 2010.  I realize it costs some money to run servers, but this is rediculous.  Either they build in the cost to run the game servers for several years into the game or they warn people that the servers are only guranteed up for a year. 

I'm in favor of explicit minimums on the boxes (by date).  I want to know if the game comes out March 2010 that it will work until at least March 2011.  I also want to know in February 2011 that I have a month to play possibly.  It dramatically changes how much I'm willing to pay for a title.  If it's so important, they can add a sticker if they extend the time frame to the box.  This is only reasonable.  With other subscription models, I know how long I have.  SInce I'm obviously paying for server time now, I should know how long it lasts. 

I often buy games on Steam.  I know that if Valve decides to pull the plug, I could lose all those games.  It's a risk I've chosen to take.  WIth some games, I don't know how long i have now and in a retail box from a store like best buy, I expect to play the game for several years.  I still play age of empires 2.  I love it.  The game doesn't even run on 64bit windows, but I still play!  I even run 32bit windows just to play.  What if I like a game?  Will I be cut off forever? 

Go: older entries