Twitter's url shortner t.co

Twitter's url shortner t.co

Old news. Twitter is now using “t.co” to shorten url posted thru twitter.com. However, url will be displayed as the original following ellipsis.

For example, go to this page: http://xahlee.org/sl/lsl-script_count.html, click on the tweet button. Then, twitter generates a link like this 〔http://t.co/BAPV0SJ9〕, but when viewed in twitter.com, it is displayed as 〔xahlee.org/sl/lsl-script_…〕. And when you copy the text, the shortened url is copied.

According to twitter, quote:

Twitter's link service (http://t.co) is used on all links included in Direct Message notification emails …

If you just use twitter.com to post a normal tweet, it's not shorterned. For example, if you post 〔http://google.com/〕 or〔http://xahlee.org/Periodic_dosage_dir/skami_prosa.html〕 it'll come out as is.


ErgoEmacs v1.9.3.1 lisp packages released

ErgoEmacs v1.9.3.1 lisp packages released. See announcement here: Source groups.google.com.

Can be installed on any OS with a working emacs 23.2.

ErgoEmacs v1.9.3 Release Notes Highlight

Download at: http://code.google.com/p/ergoemacs/downloads/

Linux/Unix X11 Mouse Button Numbering Scheme

Perm url with updates: http://xahlee.org/kbd/X11_mouse_button_numbering.html

Linux/Unix X11 Mouse Button Numbering Scheme

Xah Lee, 2011-05-28

For some odd reason, if you have a 5-button mouse, the 5th button (aka “forward button”) in emacs has syntax <mouse-5> in Windows and Mac, but on Ubuntu 10.04 Linux running Gnome 2.x, it's <mouse-9>.

In unix X11, here seems to be how they assign the mouse buttons.

  • 1 = left button
  • 2 = middle button (pressing the scroll wheel)
  • 3 = right button
  • 4 = roll scroll wheel up
  • 5 = roll scroll wheel down
  • 6 = push/tilt scroll wheel left (some mouse only)
  • 7 = push/tilt scroll wheel right (some mouse only)
  • 8 = 4th button (aka backward button)
  • 9 = 5th button (aka forward button)

In emacs, you can find out the mouse button or wheel syntax by calling “describe-key” then press the button.

In X11, you can call “xev” to see any keyboard/mouse event and their naming.

Mouse Numbering on Windows and Mac

The numbering also depends on OS and mouse driver.

For example, on Mac OS X 10.4.x, using a Microsoft 5-buttons mouse, the numbering changes depending on whether you have Microsoft's mouse driver (IntelliPoint) installed.

Numbering Scheme on Mac OS X with Microsoft 5-buttons Mouse without IntelliPoint Software

If you don't have IntelliPoint installed, then Mac OS X doesn't register the mouse wheel tilt left/right, and your Backward (4th) button is the same as right-button, and Forward (5th) button is 4th button.

Here's the numbering reported by emacs's “describe-key”.

  • <mouse-1> = left button
  • <mouse-2> = middle button (pressing the scroll wheel)
  • <mouse-3> = right button
  • <wheel-up> = roll scroll wheel up
  • <wheel-down> = roll scroll wheel down
  • none = push/tilt scroll wheel left (some mouse only)
  • none = push/tilt scroll wheel right (some mouse only)
  • <mouse-3> = 4th button (aka backward button)
  • <mouse-4> = 5th button (aka forward button)

programing: yada yada operator

I haven't really programed perl for like 5 years (except running my old programs weekly). Today, while browsing the perldoc perlop, i noticed this:

Yada Yada Operator

The yada yada operator (noted ... ) is a placeholder for code. Perl parses it without error, but when you try to execute a yada yada, it throws an exception with the text Unimplemented :

LOL. That must be new, or i totally forgot about it.

Emacs Lisp Scripting Quirk: Relative Paths

Perm url with updates: http://xahlee.org/emacs/elisp_relative_path.html

Emacs Lisp Scripting Quirk: Relative Paths

Xah Lee, 2011-05-28

Here's a useful function, and also a little detail on a quirk of elisp scripting about relative paths.

Suppose you have 2 scripts, B and C. You are coding file B. You know the relative path from B to C. (Suppose C in is in a sub-directory of B.) You do not know the absolute path at run time because these scripts may be installed anywhere. Your B can call C by the fact that you know the relative path. In Perl, Python, and perhaps most other scripting langs, we can rely on this to work.

However, in emacs lisp, when a file A calls your B, emacs doesn't update its notion of current dir, so B's call to C by relative path will be broken, because emacs will assume it's relative to A.

The following function solves this problem.

(defun fullpath-relative-to-current-file (file-relative-path)
  "Returns the full path of FILE-RELATIVE-PATH, relative to file location where this function is called.

Example: If you have this line
 (fullpath-relative-to-current-file \"../xyz.el\")
in the file at
then the return value is
Regardless how or where emacs_lib.el is called.

This function solves 2 problems.

 ① If you have file A, that calls the `load' on a file at B, and
B calls “load” on file C using a relative path, then Emacs will
complain about unable to find C. Because, emacs does not switch
current directory with “load”.

 To solve this problem, when your code only knows the relative
path of another file C, you can use the variable `load-file-name'
to get the current file's full path, then use that with the
relative path to get a full path of the file you are interested.

 ② To know the current file's full path, emacs has 2 ways:
`load-file-name' and `buffer-file-name'.  If the file is loaded
by “load”, then load-file-name works but buffer-file-name
doesn't.  If the file is called by `eval-buffer', then
load-file-name is nil. You want to be able to get the current
file's full path regardless the file is run by “load” or
interactively by “eval-buffer”."
  (concat (file-name-directory (or load-file-name buffer-file-name)) file-relative-path)

See also: What's the difference between load-file, load, require, autoload?.

emacs lisp util; benefits of compiling your elisp code

Spend 6 hours in past 2 days to clean up my custom emacs init files.

Turns out there is just a lot to clean. I have 6.5k lines. (not counting elisp libs.) Most of my custom elisp code has to do with html for my website.

A compiled elisp code will load ~6 times faster, AND run ~6 times faster. But also, i realized it's good to compile your lisp code because it'll tell you errors such as using free variable (that is, you are using a var that you forgot to put inside “let”). I found ~5 instances of leaked vars. Surprising, it'll also tell you that you are using “equal” with only one argument. Normal loading of code won't tell you that.

Now there are sizable number of utils you might grab. Get at: Xah Lee's Emacs Customization Files.

See also: Organize Your “dot emacs” Init File in 5 Minutes.


Emacs on Ubuntu Linux

Perm url with updates: http://xahlee.org/emacs/emacs_on_ubuntu_linux.html

Installed Ubuntu Linux recently, together with emacs 23.2.1 on it. Of course, then i grabbed ErgoEmacs. I was half expecting whatnot bugs or at least some frustration, but actually, it's quite smooth! I've been using ErgoEmacs for about 4 years now and it'd be quite painful to fall back to plain old GNU Emacs.

Still, i did find a few problems.

Emacs Dired Recursive Load Error

Once you loaded ErgoEmacs, everytime you try to open a file or directory, you get a “Recursive load” error:

expand-file-name: Recursive load: "/usr/share/emacs/23.2/lisp/net/tramp.elc", "/usr/share/emacs/23.2/lisp/shell.elc", "/usr/share/emacs/23.2/lisp/net/tramp.elc", "/usr/share/emacs/23.2/lisp/shell.elc", "/usr/share/emacs/23.2/lisp/net/tramp.elc", "/usr/share/emacs/23.2/lisp/shell.elc", "/usr/share/emacs/23.2/lisp/net/tramp.elc", "/usr/share/emacs/23.2/lisp/shell.elc", "/usr/share/emacs/23.2/lisp/net/tramp.elc"

(Tramp is a package integrated with GNU emacs. It lets you work with files in remote servers.)

I couldn't think of where that error came from. Plain GNU Emacs doesn't have that error, only when ErgoEmacs is loaded. However, ErgoEmacs doesn't redefine “find-file” in any way. A Google search turns up a post in GNU emacs mailing list. See: The old tramp recursive load (2011-05-08) By FredCroot. @ Source lists.gnu.org.

There seems to be some change in tramp. The solution suggested is just to load tramp in your init file, and that solved the problem for me. Like this:

(require 'tramp)

Linux/Emacs Copy/Paste Problem

In linux, if copy/paste doesn't work with other apps, you need to add this line:

(setq x-select-enable-clipboard t)

X11, Jamie Zawinski, Don Hopkins

Emacs's kill-ring is independent of OS's clipboard, and added to the complexity is that X11 itself has very complex and idiotic copy/paste system. (X11 itself is a complete fuckup, inside out.) See:

Note that Jamie Zawinski (aka jwz) is a celebrity. See:

Don Hopkins is also well known. See the Wikipedia article linked at the bottom of the bottom of The X-Windows Disaster.

Emacs isn't Bundled with Linuxes

Am rather pissed that emacs isn't bundled by default with Ubunto. In fact, when you try to install it, it's considered a un-supported package (i.e. in the package category of “universe”.) That's kinda a flying-fuck-in-the-face insult to the number one FSF Free software.

Ubuntu Linux Package Classfication
FSF Free softwareNon-FSF-free software

Of course, i know why linuxes don't support emacs. It's because the haughty GNU Emacs people refuse to make it work well. When a software's copy/paste doesn't work with the rest of the system, and with its key shortcuts and terminology completely incompatible with the rest, how could Gnome, KDE, Debian, Ubuntu, promote it as first-class citizen?

(on the other hand, vi is always bundled, because it's more considered as a sys admin tool, part of the shell tool bag, used inside text terminal. (See also: Emergency vi (vi tutorial)))

Reunion with unix

The last time i worked in unix daily in a serious way is from 1998 to 2002 (not counting Mac OS X). It is good to be back! Emacs is significantly faster when in linux than compared to on Windows. Starting up ErgoEmacs takes about 5 times faster! (4 secs on Linux, perhaps 16 seconds on Windows) I guess there's a lot muck going on going thru Windows API, and i know for a certainty that FSF actively resist in improving emacs for Microsoft Windows. Spell checking a file on linux is i estimate at least 10 times faster than compared to doing it in Windows emacs with aspell thru Cygwin.

Also, in Windows, with Cygwin, it's one big headache. You have to install every tool (rsync, unison, curl, wget, ssh, perl, python, imagemagick, optipng/pngcrush, w3m, aspell, zip/unzip, …). The Cygwin installer is one piece of unintuitive error-prone shit. The package depository mirror sites keep coming and going. The Windows Console is one worst command line interface possible in my 15 years of using over 10+ command line consoles. I don't think Microsoft has updated it for 10 years. (though, they did create the powerful PowerShell with its own very functional command line interface.)

Window Managers, Now and Then

In Linux, the terminal is just great. The last time i used linux is around 2000. At the time, the Gnome project is barely announced (first release in 1999). Now, gnome-terminal is fantastic, even support tabs. The terminal app on X11 i had in mind is xterm, and whoa it's still there, runs, with its bitmapped font, just as i remembered it. The clunky X11 of 10 years ago with its concrete-slab appearance and its tens of idiotic so-called “window managers” are gone, replaced today with Gnome. (initially, KDE and Gnome's look-n-feel is 100% copy of MS Windows, but now seems diverged.)

It feels sooo good to be back with unix terminal.

X11 on Solaris. (img src en.wikipedia.org) This is CDE. This is how i remember X11, ~1999. Mac OS of the time, or even Windows, is ten times better. (See: The Unix Pestilence.)

Here's some old school window manager CDE, Motif, AfterStep, GNUstep, Window Maker.


Computing: mega vs mibi, kilo vs kibi

Perm url with updates: http://xahlee.org/comp/mega_vs_mebi.html

Computing: mega vs mibi, kilo vs kibi

Xah Lee, 2011-05-26

You know what kilo, mega, means right? like, a kilogram is one thousand grams. It's quite simple, going by the powers of 10, adding 3 zeros for each higher level.

kilo = 10^3 = 1000^1 =         1,000
mega = 10^6 = 1000^2 =     1,000,000
giga = 10^9 = 1000^3 = 1,000,000,000

But in computing, there's a abomination. kilo doesn't mean 1000, it means 1024, and mega isn't a million, but 1048576. WTF?

In your blogs, please do not say kilobyte to mean 1024 bytes. Use the following terms:

kibi = 2^10 = 1024^1 =             1,024
mibi = 2^20 = 1024^2 =         1,048,576
gibi = 2^30 = 1024^3 =     1,073,741,824

Let the terms: kilo, mega, giga, be what they always meant universally, that is, powers of 10.

See: Binary prefix and Timeline of binary prefixes. Interesting quotes:

One source of consumer confusion is the difference in the way many operating systems display hard drive sizes, compared to the way hard drive manufacturers describe them. As noted previously, hard drives are described and sold using “GB” or “TB” in their SI meaning: one billion and one trillion bytes. Many current operating systems and other software however display hard drive and file sizes using “MB”, “GB” or other SI-looking prefixes in their “binary” meaning, just as they do for displays of RAM capacity. (This is fairly recent. The presentation of hard disk drive capacity by an operating system using “MB” in a binary sense appears no earlier than Macintosh Finder after 1984. Prior to that, on the systems that had a hard disk drive, capacity was presented in decimal digits with no prefix of any sort (e.g., MS/PC DOS CHKDSK command).)

I am surprised to learn that the change actually has been adopted by a few. Quote:

2009. Apple Inc. uses the SI decimal definitions for capacity (e.g., 1 kilobyte = 1000 bytes) in the Mac OS X v10.6 operating system to conform with standards body recommendations and avoid conflict with hard drive manufacturers' specifications.[84][85]

2010. The Ubuntu operating system uses the IEC prefixes for base-2 numbers as of the 10.10 release.[86]

Way to go, Apple and Ubuntu.

When fixing this problem, there are 2 ways. One is simply always use powers of 10, and abolish the 1024 shit, like Apple has done. The other way is to use the proper binary prefix, as Ubuntu has done. I favor the abolishment of talking of numbers by powers of 2 because ultimately it's simply a side-effect, by-product, of engineering. (such as the data types of extreme idiocy of “long”, “double”, “float” in programing languages.) Of course, due to inherent digital circuits, often we need to talk of numbers in terms of binary powers (e.g. byte, memory, data transmissions). In that case, i faver using math expressions. e.g. 1024 would be written as 1*2^10. So, one mibi byte would be written as 1*2^20.


There are few scumbags in society that tried to take advantage of this situation. Quote:

Willem Vroegh v. Eastman Kodak Company

On 20 February 2004, Willem Vroegh filed a lawsuit against Lexar Media, Dane–Elec Memory, Fuji Photo Film USA, Eastman Kodak Company, Kingston Technology Company, Inc., Memorex Products, Inc.; PNY Technologies Inc., SanDisk Corporation, Verbatim Corporation, and Viking Interworks alleging that their descriptions of the capacity of their flash memory cards were false and misleading.

Vroegh claimed that a 256 MB Flash Memory Device had only 244 MB of accessible memory. “Plaintiffs allege that Defendants marketed the memory capacity of their products by assuming that one megabyte equals one million bytes and one gigabyte equals one billion bytes.” The plaintiffs wanted the defendants to use the traditional values of 10242 for megabyte and 10243 for gigabyte. The plaintiffs acknowledged that the IEC and IEEE standards define a MB as one million bytes but stated that the industry has largely ignored the IEC standards.[38]

The manufacturers agreed to clarify the flash memory card capacity on the packaging and web sites.[39] The consumers could apply for “a discount of ten percent off a future online purchase from Defendants’ Online Stores Flash Memory Device”.[40]

Orin Safier v. Western Digital Corporation

On 7 July 2005, an action entitled “Orin Safier v. Western Digital Corporation, et al.,” was filed in the Superior Court for the City and County of San Francisco, Case No. CGC-05-442812. The case was subsequently moved to the Northern District of California, Case No. 05-03353 BZ.[41]

Although Western Digital maintained that their usage of units is consistent with “the indisputably correct industry standard for measuring and describing storage capacity”, and that they “cannot be expected to reform the software industry”, they agreed to settle in March 2006 with 14 June 2006 as the Final Approval hearing date.[42]

Western Digital offered to compensate customers with a free download of backup and recovery software valued at US$30. They also paid $500,000 in fees and expenses to San Francisco lawyers Adam Gutride and Seth Safier, who filed the suit. The settlement called for Western Digital to add a disclaimer to their later packaging and advertising.[43][44][45]

Cho v. Seagate Technology (US) Holdings, Inc.

A lawsuit (Cho v. Seagate Technology (US) Holdings, Inc., San Francisco Superior Court, Case No. CGC-06-453195) was filed against Seagate Technology, alleging that Seagate overrepresented the amount of usable storage by 7% on hard drives sold between March 22, 2001 and September 26, 2007. The case was settled without Seagate admitting wrongdoing, but agreeing to supply those purchasers with free backup software or a 5% refund on the cost of the drives.[46]

Determine OS Type (Windows/Mac/Linux) in Emacs

Determine OS Type (Windows/Mac/Linux) in Emacs

Many of us work with several operating systems. When you write your emacs customization (the 〔.emacs〕 file), sometimes you need to know what OS you are on. Here's how to do it.

;; make the mouse 5th button (forward button) do close buffer.
 ((string-equal system-type "windows-nt") ; any flavor of Windows
  (global-set-key (kbd "<mouse-5>") 'close-current-buffer)
 ((string-equal system-type "gnu/linux")
  (global-set-key (kbd "<mouse-9>") 'close-current-buffer)
 ((string-equal system-type "darwin") ; Mac
  (global-set-key (kbd "<mouse-5>") 'close-current-buffer) )

For some odd reason, if you have a 5-button mouse, the 5th button (aka “forward button”) in emacs has syntax <mouse-5>, but on Ubuntu 10.04 Linux, it's <mouse-9>. On Windows and Mac, scrolling mouse wheel down is <wheel-down>, but in linux it's <mouse-5>. (you can find out the syntax of a mouse button/wheel by calling “describe-key” then press a button or wheel.)

Functional Programing: stop using recursion, cons. Use map & vectors

Functional Programing: stop using recursion, cons. Use map & vectors

This is important but i think most lispers and functional programers still don't know it.

See: Guy Steele on Parallel Programing.

Lists (as cons, car, cdr) in the lisp world has always been some kinda cult. Like, if you are showing some code example and you happened to use lisp vector datatype and not cons (lists) and it doesn't really matter in your case, but some lisper will always rise up to bug you, either as innocent curious question or attacking you for not “understanding” lisp. (just as other idiocies happen in other lang that lispers see but other langs don't see)

It's interesting to me that all other high level langs: Mathematica, perl, python, php, javascript, all don't have linked list as lisp's list. It's also curious that somehow lispers never realises this. I've been having problems with lisp's cons ever since i'm learning Scheme Lisp in 1998 (but mostly the reason is language design at syntax and lack of abstraction level in calling “cons, car, cdr” stuff, without indexing mechanism). Realizing the algorithmic property and parallel-execution issues of linked list is only recent years.


Windows: is Your USB Drive Fast Enough for ReadyBoost?

Perm url with updates: http://xahlee.org/mswin/Windows_ReadyBoost_flashdrive.html

Windows: is Your USB Drive Fast Enough for ReadyBoost?

Xah Lee, 2011-05-20, 2011-05-22

Windows Vista and 7 has a Readyboost feature. Basically, if you have any flash drive on your system (such as usb drive), the OS will use it as a cache system to speed up any file access operations. Quote from Wikipedia:

ReadyBoost is a disk cache component of Microsoft Windows, first introduced with Microsoft's Windows Vista in 2006 and bundled with Windows 7 in 2009. It works by using flash memory, a USB flash drive, SD card, CompactFlash or any kind of portable flash mass storage system as a cache.

So, i though i just plug in my usb drive and my computer will be faster. That's not the case. There are few requirements. Quote:

For a device to be compatible and useful it must conform to these requirements:

  • The removable media's capacity must be at least 256 MB (250 MB after formatting). Windows Vista x86 & x86-64 is limited to using 4 GB; this restriction has been removed in Windows 7.
  • Windows 7 allows up to eight devices for a maximum of 256 GB of additional memory.[5]
  • The device must have an access time of 1 ms or less.
  • The device must be capable of 2.5 MB/s read speeds for 4 KB random reads spread uniformly across the entire device, and 1.75 MB/s write speeds for 512 KB random writes spread uniformly across the device.

You can right click on the drive and choose Properties, under ReadyBoost tab, to see if ReadyBoost is active for that drive. Sadly, for me, it's not. But what requirement i'm missing? More quote from Wikipedia:

Windows Vista and Windows 7 include a command-line utility called "winsat" to test the performance of random read and write speeds. The Command Prompt must be run with administrative privileges, otherwise test results will not be visible after testing.

To test random reads (4096 for 4 KB):

winsat disk -read -ran -ransize 4096 -drive ‹driveletter›

For random writes (524288 for 512 KB):

winsat disk -write -ran -ransize 524288 -drive ‹driveletter›

So, to test, press the Win Logo button. In search field, type “cmd”, then right click on the “cmd.exe” then choose “Run as administrator”.

Here's my output:

Microsoft Windows [Version 6.0.6002]
Copyright (c) 2006 Microsoft Corporation.  All rights reserved.

C:\Windows\system32>winsat disk -read -ran -ransize 4096 -drive J
Windows System Assessment Tool
> Running: Feature Enumeration v1.0.0.0 ''
> Run Time 00:00:01.93
> Running: Storage Performance Assessment via Profiling v1.0.0.0 '-read -ran -ransize 4096 -drive J'
> Run Time 00:00:10.27
> Disk Performance                           2.15 MB/s
> Total Run Time 00:00:13.34

C:\Windows\system32>winsat disk -write -ran -ransize 524288 -drive J
Windows System Assessment Tool
> Running: Feature Enumeration v1.0.0.0 ''
> Run Time 00:00:00.48
> Running: Storage Performance Assessment via Profiling v1.0.0.0 '-write -ran -ransize 524288 -drive J'
> Run Time 00:10:33.85
> Disk Performance                           3.75 MB/s
> Total Run Time 00:10:35.42


It seems my usb drive's access time is not fast enough. Mine is 2.15 MiB per second, while required is 2.5 MiB. It's a 16 GB drive by Kingston. I don't know what's the problem. Is is due to low quality chips in the product?

Solution: Plug It in the Back!

A PC usually have several usb ports in the front, and several in the back. They might be using different usb controllers. For some odd reason, when i plug it in the back, Windows says my drive can use ReadyBoost feature. However, i use the command line to test the speed again, both the reported read and write speed is actually slower. So, i don't know what to make of this.

Should You Format Your Usb Drive to FAT32, NTFS, or exFAT?

Intuitively, i thought NTFS is best, while i don't know what's exFAT. Turns out, am wrong.

For generic use of usb drive (not as ReadyBost), the best choice are, from best to worst:

  • exFAT is Microsoft's file system designed for flash drives. This is is best, but you may not be able to use your usb drive on Linux, Windows XP or older Mac machines, car music players, etc. (Mac OS X 10.6.5 and later supports it.)
  • FAT32 is the default format. Can be used by Windows, Mac, Linux.
  • NTFS is more advanced than FAT32, however, it's not suitable for flash drives.

Windows Vista must have Service Pack 1 to support exFAT.

USB formatted with NTFS

If your USB drive is formatted with NTFS, then, you should always use “Safely Remove” before you unplug it.

Also, if you constantly exchange files from different computers of different accounts, then NTFS is not suitable, because it supports more permissions and you may get permission denied problems.

Format for ReadyBost

For ReadyBost, the best choice is exFAT, but Windows Vista doesn't support using that format for ReadyBost. The second best choice is NTFS, because FAT32 doesn't support files of large size.

What's Windows CLSID? Second Life UUID?

Perm url with updates: http://xahlee.org/mswin/windows_CLSID_GUID_UUID.html

What's Windows CLSID? Second Life UUID?

Xah Lee, 2011-05-22

you know how on Windows you see this strings like this {838f9f38-f241-11de-a663-002421597a5c}? For example, on my PC, i have these files generated by Windows Vista:


And in my Event Viewer (〔Control Panel\Administrative Tools\Event Viewer〕 or 〔%SystemRoot%\system32\eventvwr.msc /s〕), for example there's a message:

The application-specific permission settings do not grant Local Launch permission for the COM Server application with CLSID {C97FCC79-E628-407D-AE68-A06AD6D8B4D1} to the user NT AUTHORITY\SYSTEM SID (S-1-5-18) from address LocalHost (Using LRPC). This security permission can be modified using the Component Services administrative tool.

What are those long strings?

CLSID = Globally unique identifier

That string is basically just a ID string. It is long because it is meant to be unique, to the degree that a randomly generated string will unlikely to be the same.

It is 32 digits of hexadecimal. So, the total possible such string is 16^32, which is 340282366920938463463374607431768211456 or approximately 10^39. Here's a example:

It is written in blocks separated by hyphen, then enclosed by curly brackets.

 12345678 1234 1234 1234 123456789012
 8        4    4    4    12

Here's a quote from Wikipedia Globally unique identifier:

Microsoft Windows uses GUIDs internally to identify the classes and interfaces of COM objects. A script can activate a specific class or object without having to know the name or location of the dynamic linked library that contains it.

Quote from Microsoft 2.5.5 Globally Unique Identifiers (GUIDs) @ Source msdn.microsoft.com:

In Microsoft Windows® programming and in Windows operating systems, a globally unique identifier (GUID), as specified in [RFC4122], is a 128-bit value that is a binary unique identifier (ID) for a specific entity. The term universally unique identifier (UUID) is sometimes used in Windows protocol specifications as a synonym for GUID.

CLSID = UUID = Universally unique identifier

Microsoft CLSID is just a different name for the scheme known as UUID (Universally Unique Identifier). The essence is that it's just a sequence of 32 hexadecimal digits, generated randomly, used to assign a ID to items.

It's used in Second Life too. In Second Life, every “agent” (that is, every account in Second Life), has a UUID, and every item you see in Second Life has a UUID (e.g. images (aka textures), objects (prims), sounds, animation files). For example, here's a LSL code excerpt:

key pSprite = "1f9e3064-47e1-87bd-1b82-20638ae6e36e"; // particle image.

updateParticle() {
    // make particle, with burstrate and sprite age depending on avatar speed
    float speed = llVecMag(llGetVel());
    if (speed < 1.) {
        bRate = 1.;
        pAge = 1.2;
    } else {
        bRate = distBetweenCrumb/speed;
        pAge = trailLength / speed;
    partyOn ( pPtrn, beginColor, endColor, bRate, pAge, (key)pSprite, startScale, endScale, changeOrientationQ );