Popular Money Making Websites

Perm url with updates: http://xahlee.org/js/seo_popular_sites.html

Popular Money Making Websites

Xah Lee, 2010-05-14

Been doing some research on web monetizing and SEO business in the past 2 months. Here's a look at some of the popular sites, what's their content, their traffic rank.

The following data is based on alexa.com.

0.00156 105k modularsystems.sl (Second Life Emeral Viewer)
0.00202 112k staynalive.com (seo)
0.0026 79k xahlee.org (math, programing, gallery, social commentary)
0.0029 72k jensense.com
0.00311 66k writetodone.com (writing tips blog)
0.00358 57k skelliewag.org

0.0043 46k terrydean.org
0.00451 43k cryptome.org (politics, whistle-blower)
0.00529 35k decor8blog.com (home deco blog)
0.0068 32k webdesign10.com (web dev tips)
0.0108 16k webhostingsearch.com (webhosting search) 2010-04-14

0.00661 14k xstreetsl.com (Second Life estore)
0.0076 24k microformats.org (comp tech; ref; tutorial)
0.0109 17k outspokenmedia.com (seo; Rhea Drysdale)
0.0197 9k zenhabits.net

0.0238 8k ask-leo.com (Windows tips blog)
0.0238 7k swik.net
0.0588 2k fark.com (lurid news portal; soft porn; shock)
0.0672 2k labnol.org

0.0668 1.9 seomoz.org (seo; Sarah Bird)
0.0773 2k problogger.net (seo, blogging)
0.0791 2k makeuseof.com (computer use tips)
0.307 0.357k w3schools.com

The first number is the site's “reach” of the past 3 months, defined by Alexa as the fraction of readers of the site with respect of all internet users. Higher the number means more popular. For example, if reach is 0.001, that means 0.1% of internet users visits the site. (multiply the number by 100 to get a percentage.)

The second number is the rank of the site. So, 2k means the site is ranked at 2000 of all websites, by popularity. Note that rank can change a lot during week to week, so is not very reliable figure for popularity. For example, on some months, my site xahlee.org is ranked 50k, but in other months, it's 70k, a difference of 20k, even though the visitors only increased or decreased about 1k or 2k.

Also, last i checked in 2008 or so, alexa under-estimated my site's traffic by perhaps 20% less from actual.

The link is to alexa's data on the site. You can visit the site to see what the site actually is, from a link there.

The text in parenthesis is a rough remark about what the site do.

These data are from alexa as queried sometimes in April.

How Much Are They Making?

Based on my study, my site can generate USD $1k ad revenue per month. From that, one can guess how much other sites are making.

For example, my site has a reach of 0.0026. The site problogger.net has a reach of 0.773. That's 297 times more. So, $1k times 297 is $297k. Well, that's way off. Problogger guy makes 6 digits yearly from 2 of his sites. Assume he makes 100k per year just from the problogger site. That's ~8.3k per month, not 297k. The relation of site's traffic and its ad revenue potential isn't linear. Doubling the traffic will certainly not double the income.

It's is hard to estimate how much each site makes, because there's lots variables, how aggressive they advertise if at all, their reader type, their content type, etc. But, given a site's traffic, a estimate of ad revenue is certainly possible. There's quite a few sites dedicated to providing this info. (See: How To Be A Online Ad Publisher (Monetize Your Website))

(If you are a advertiser, please advertise on my site. I give you the best ad effectiveness price ratio. See: Advertising XahLee.org.)

In 2008, i've also done a survey on popularity of computer programing related sites. See: Computer Language Websites Popularity.

projective geometry: Sylvester-Gallai Theorem

Perm url with updates: http://xahlee.org/math/blog.html

A mathematician, named Phlexicon, contacted me today, about a error in one of my proof in my learning note of Introduction to Real Projective Plane .

We chatted on Skype for about 40 min. He showed me, how my version of the proof on Sylvester-Gallai Theorem was wrong. Though, it's been 13 years since i wrote the proof, so, i couldn't seriously understand it without spending few days reviewing the stuff. Though, he convinced me he's right. I remember, when i was studying it, the proof given in the text seems a bit complex and convoluted, and i thought to myself that it should be done with a simple induction proof. After i did a proof, i wondered a bit why the problem went without a proof for some 40 years. This is back in 1996, and the internet only started, without all the blog and feedback and social networks, and i didn't put my notes online until 2004, and didn't show it to anyone.

He pointed out the Wikipedia article: Sylvester-Gallai theorem. That is a wealth of info.

Phlexicon also showed me a interesting elementary geometry problem. You might try to show it to your kids in highschool. Here's the problem:

Suppose there's a pyramid (as in Egyptian pyramid, with a square bottom), such that each of the triangle faces are Equilateral triangle. Let's call this pyramid p4. Now, let's say there's a tetrahedron, which is also a pyramid but with the base being a equilateral triangle. Let's call this p3. The question is, what is the ratio of volume of p3 and p4. You are to solve this problem by insight, and you are not allowed to use algebraic formulas.

Phlexicon said that this problem can be solved by insight, with 2 “aha” realizations. I thought about it for 20 min yesterday but haven't seen it yet.


Outlook, Outlook Express, Windows Mail, Windows Live Mail, Confusion Ball

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

Outlook, Outlook Express, Windows Mail, Windows Live Mail, Confusion Ball

Xah Lee, 2010-05-13

The state of software industry is still quite fucked. Today, i wanted to import Microsoft Mail to Thunderbird. Guess what? Impossible. What a fuck is this? Microsoft Mail is the default email program from Windows Vista. A major mail software. Thunderbird is also a major mail software. Thunderbird's import tool provide choices for Outlook and Outlook Express, but no Microsoft Mail? It is rather incredible that Thunderbird can't import it by default.

Searching the web, you'll find that if you want to import, you'll have to use some 3rd party import tool written by some joe. From my experience, that means good luck!

So, i decided to upgraded to Windows Live Mail instead.

The email software and importing business is one confused ball. Here's some clarifications:

  • Outlook Express is the bundled free email software on Windows for much of the past 15 years, including Windows 95, Windows 98, Windows XP.
  • Outlook is a commercial email program from Microsoft. It is part of a office application suite. It is a more of a full featured email program than Outlook Express.
  • Windows Mail is the default free bundled email progrom for Windows Vista. It replaced Outlook Express.
  • Windows Live Mail is the default free bundled one on Windows 7. It replaced Windows Mail.

Also note, that Windows Mail and Windows Live Mail is pretty much the same software, not rewrite.

Upgrading from Windows Mail and Windows Live Mail (WLM) is pretty easy. You just download the latter. There's no need to import your mail. You simply start WLM and have all your old emails there. Nice.

For more of my email software experiences, see: Converting Email Formats.

Avoiding Variables in Functional Programing

Perm url with updates: http://xahlee.org/UnixResource_dir/writ/lisp_variables.html

Avoiding Variables in Functional Programing

Xah Lee, 2010-04-29

On 2010-04-28, Zadirion wrote in comp.lang.lisp:

I'm new to functional programming, just barely getting the hang of it, I hope. So from what I understand, side-effects are not desirable when writing functional code. This means setq and variables in general should be avoided.

But suppose I have a list and I need its length not once, but twice or more inside my function. If i'm not supposed to use a variable to store the length of the list, how am I supposed to reuse the result of that computation (the length determining)?

(setq len (length mylist))
(concatenate 'list (subseq 0 (/ len 2)) (subseq (+ (/ len 2) 1) len))

How am i supposed to achieve this without using the len variable? Or am I incorrectly understanding what functional programming is all about? (I come from a c++ background so imperative programming is all I know for now) I could call length each time where needed, but that is obviously very inefficient and unnecessary.

using local variable is fine. In (emacs) lisp, it's like this:

(let (var1 var2 ...)
 (setq var1 val1)
 (setq var2 val2)

the key to remember about functional programing, is that the behavior of your function should only depends on input, and that usually means just the argument it receives. Using local variable is still functional programing, as long as those variables don't leak, such as global variables, and they shouldn't keep a state (such as in OOP).

However, the quest to avoid using variables is of theoretical interest as well as a interesting programing problem of a given language.

There are, academic languages that do not have variables at all. (e.g. Unlambda. A little web search for the word “combinator language” and i also found Joy (programming language) in few seconds, am sure there are others.)

Without a pure functional lang such as Haskell, avoiding variable is difficult or impossible.

Even Haskell, for practical reasons, have local variables, just that you can't change a variable's value. (effectively, they are local “constants”)

In a less strict functional lang OCaml/F#, you can have variables that changes value.

Lisp, as a functional lang, is even less strict than the above ones. Also, it is IMPOSSIBLE to write any non-trivial function without using variables, mutable or not.

In Mathematica, which i've coded for over 10 years, am among the world's say top 1k expert, i often avoid using ANY variables at all. It is not difficult to do. Basically, any function is all just a sequence of application of functions. Though, the code get complicated for average programers to understand, but simple if you understand the function application paradigm.

Mathematica can be considered as a lisp variant. However, lisps (Common Lisp, Scheme Lisp, Emacs Lisp, Arc lisp, NewLisp, all can not avoid variables. I'm pretty sure this includes Clojure lisp, Qi lisp, or, that these two still would cost far more effort or un-natural code to avoid vars than Mathematica)

Part of the reason why it is impossible to avoid using variables in lisp, i'v detailed in the past, in these essays:

In fact, trying to code in no-variable functional style contributed to how i discovered these lisp problems.

Look for the sections that discuss the nesting problem. The nesting syntax is part of the problem, but there are other reasons that i haven't discussed in the above essays. Maybe i'll write a detailed essay about this topic in the future, but now just from the top of my head ... (was going to write perhaps a one sentence description of what i thought are the other reasons other than the nesting syntax, because the problem cannot theoretically be just syntax... but am tired, and i think the issue is more complex then i can think now... will need to think about this another time)

Originally posted to comp.lang.lisp at Source.


Emacs unfill-paragraph, unfill-region, compact-uncompact-block

Perm url with updates: http://xahlee.org/emacs/emacs_unfill-paragraph.html

Emacs unfill-paragraph, unfill-region, compact-uncompact-block

Xah Lee, 2010-05-12

Emacs has a fill-paragraph command. The command add line breaks in the current paragraph, so that each line is no more than about 70 chars. However, there's no unfill-paragraph — a command that does the reverse. Here's the solution.

unfill-paragraph, unfill-region

(defun unfill-paragraph ()
  "Replace newline chars in current paragraph by single spaces.
This command does the reverse of `fill-paragraph'."
  (let ((fill-column 90002000))
    (fill-paragraph nil)))

(defun unfill-region (start end)
  "Replace newline chars in region by single spaces.
This command does the reverse of `fill-region'."
  (interactive "r")
  (let ((fill-column 90002000))
    (fill-region start end)))

You can define a keyboard shortcut for them.

The above code works by setting the variable “fill-column” to a large value then call fill-paragraph to do the work.


A even better command is compact-uncompact-block. It automatically “fill” or “unfill” depending on whether the current paragraph is already “filled”. Also, it automatically works on the current text selection if there's one, so you don't need to choose between “*-paragraph” or “-region” versions.

(defun compact-uncompact-block ()
  "Remove or add line endings on the current block of text.
This command similar to a toggle for `fill-paragraph' and `unfill-paragraph'
When there is a text selection, act on the region.

When in text modes, the “current block” is equivalent to the
current paragraph.  When in programing language modes, “current block”
is defined by between empty lines.

Todo: when in a programing lang mode, make the function more
smart, so that it doesn't cut strings.  Right now, the code uses
fill* functions. A proper implementation to compact is replacing
newline chars by space when the newline char is not inside
string. To uncompact, a proper solution needs to know the basic
syntax of each lang. A simple implementation is to simply insert
newline after “}” or “;” for c-like syntaxes."

  ;; This command symbol has a property “'stateIsCompact-p”, the
  ;; possible values are t and nil. This property is used to easily
  ;; determine whether to compact or uncompact, when this command is
  ;; called again

  (let (bds currentLineCharCount currentStateIsCompact
            (bigFillColumnVal 4333999) (deactivate-mark nil))

      ;; currentLineCharCount is used to determine whether current state
      ;; is compact or not, when the command is run for the first time
      (setq currentLineCharCount
              (setq bds (bounds-of-thing-at-point 'line))
              (length (buffer-substring-no-properties (car bds) (cdr bds)))    
              ;; Note: 'line includes eol if it is not buffer's last line

      ;; Determine whether the text is currently compact.  when the last
      ;; command is this, then symbol property easily tells, but when
      ;; this command is used fresh, right now we use num of chars of
      ;; the cursor line as a way to define current compatness state
      (setq currentStateIsCompact
            (if (eq last-command this-command)
                (get this-command 'stateIsCompact-p)
              (if (> currentLineCharCount fill-column) t nil)

      (if (and transient-mark-mode mark-active)
          (if currentStateIsCompact
              (fill-region (region-beginning) (region-end))
            (let ((fill-column bigFillColumnVal))
              (fill-region (region-beginning) (region-end)))
        (if currentStateIsCompact
            (fill-paragraph nil)
          (let ((fill-column bigFillColumnVal))
            (fill-paragraph nil))

      (put this-command 'stateIsCompact-p
           (if currentStateIsCompact
               nil t)) ) ) )

For a detailed explanation about why this command provides better usability than the several “fill” commands, see: Suggestions on Emacs's Line-Cutting Commands.


Second Life Rich List

Perm url with updates: http://xahlee.org/sl/sl_rich_list.html

Second Life Rich List

Get your Xah Particle Maker today!

Xah Lee, 2010-05-10

Discovered that BusinessWeek made a list of people who has became wealthy thru Second Life.

Special Report: Virtual Life; Virtual World Rich List (2007-07), by Douglas MacMillan. BusinessWeek Special Report. At businessweek.com

They list people who makes more than $5k usd per month, and says the number of such people is over 116. The report is made in 2007. According to a 2009 report by Linden Lab, the number is now 233. (see: Second Life Product Market Value)

Here's the list from BusinessWeek.

Ailin Graef
sl name: Anshe Chung
Business: Virtual real estate.
Site: anshechung.com
Worth: networth more than 1 million

Philip Rosedale
sl name: Philip Linden
Business: Founder of Second Life
Site: lindenlab.com
Worth: $19 giga venture backing

Reuben Steiger
sl name: Reuben Millionsofus
Business: sl presence
Site: millionsOfUs.com
Worth: 6 million, 2007 revenue

Sibley Verbeck
sl name: Sibley Hathor
Business: founder of Electric Sheep Company
Site: ElectricSheepCompany.com
Worth: $15k for building a sl presence.

Alyssa LaRoche
sl name: Aimee Weber
Business: building and scripting and hosting.
Site: AimeeWeber.com
Worth: 30k to 100k to create a presence. 2 to 3 corp clients per month.

Adam Frisby
sl name: Adam Zaius
Business: sim, land.
Site: deepthink.com.au
Worth: average land sale is between $132 and $330.

Kevin Alderman
sl name: Stroker Serpentine
Business: sex stuff.
Site: eros-3d.com
Worth: sales 40 to 50 of his more adult items per day, each $20 to $40.

Peter Lokke
sl name: Crucial Armitage
Business: Crucial Creations, clothing designer
Worth: $0.75 per item; annual revenue ~$100k

Cristiano Diaz
sl name: Cristiano Midnight
Business: Snapzilla website, for sharing screenshots
Site: sluniverse.com
Worth: $33k per year.

Adam Anders
sl name: Barnesworth Anubis
Business: Tableau, real estate.
Site: barnesworthanubis.com
Worth: 110k transactions per year, each $1 to $9.
Want to dash through walls?
Try Xah Tele-Dasher!


Windows shortcut for switching icon view, list view, in folder

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

In Windows Vista, when viewing a folder, you can view it as icons or list or detail. There's no direct keyboard shortcut, but you can do this:

  • Press “Alt v l” for list view.
  • Press “Alt v d” for detail view.
  • Press “Alt v r Enter” for large icon.
  • Press “Alt v m” for medium icon.

You can set a key using AutoHotKey, so that Ctrl+1 is icon view, Ctrl+2 for detail view, similar to the Mac.

Q: Is there a way to switch to next app in Flip 3D?

Yes. Press Ctrl+Win+Tab to go next app. Press Ctrl+Shift+Win+Tab to go next app. Again, you can create a AutoHotKey script so that for example F1 switchs to the previous app, and F2 next app.

I'd be happy to send you little utilities for the above hotkeys. A donation is appreciated.

Emacs Lisp list-matching-lines Improvement

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

Emacs Lisp list-matching-lines

Xah Lee, 2010-05-10

A short elisp tutorial.

Previously, we discussed List Matching Lines and Delete Matching Lines in Emacs. We discussed writing a convient version of list-matching-lines that uses the current word, or text selection. Here's a solution.

(defun list-matching-lines2 ()
  "Show lines in the current buffer matching current word or text selection. 
This command is the similar to `list-matching-lines'.
The differences are:
• The input of this command is the current word.
• If there is a text selection, that is used as input.
• The input is plain text, not regex."
  (let (meat pos1 pos2 bds)
    (if (and transient-mark-mode
        (setq pos1 (region-beginning) pos2 (region-end))
        (setq bds (bounds-of-thing-at-point 'symbol))
        (setq pos1 (car bds) pos2 (cdr bds))))
    (setq meat (buffer-substring-no-properties pos1 pos2))
    (list-matching-lines (regexp-quote meat))

The key to understand our implementation is understanding emacs's concept of region, transient-mark-mode, text selection. If you are confused, see: What's Region, Active Region, transient-mark-mode?.

Our code above also shows a practical idiom, of automatically using the current active region as input. For more idioms, see: Emacs Lisp Idioms.

Note that starting with emacs 23, transient-mark-mode is on by default, and many commands automatically take the current text selection as input if there's one. (see: New Features in Emacs 23) So, our new list-matching-lines is a improvement, but not perfect. To make it a perfect candidate for emacs, our new version should use text selection if there's one, but if there's no text selection, it should still prompt user to enter a input, and the default input should be the current word. Because, otherwise there's no way for user to enter arbitrary input.

Also, our version's input is plain text, not regex. Plain text is probably more often used than regex, but regex is certainly more powerful. It would be a loss if there's no way to use regex. So, if we plan to incorporate our version into emacs, we probably need to think about either creating a new command, or incorporate it as part of list-matching-lines, with a option that interpret the input as string and not regex. To be compatible with overall design of emacs, we might look into what other emacs's commands do when the functionality needs to have both string and regex versions. I think in such situations, emacs usually provides 2 different commands.

Second Life Militaries List

Perm url with updates: http://xahlee.org/sl/sl_military_info.html

Second Life Militaries List

Get your Xah Particle Maker today!

Xah Lee, 2010-05-10

This page lists Second Life military/combat role playing communities. For some video, see: Second Life Military Videos. For some screenshots, see: Furry Soldiers.

If you are interested in sl combat, just visit one of the sim and join them. I'd recommend Chthonic Syndicate at Thorium, because i'm a member there. IM Xah Gloom (me) in sl and i can help you out.

Listed roughly in order of size and activity.

Region: Chronus
Region: Titan

Region: Badnarik

Chthonic Syndicate
Region: Thorium

New Jessie
Region: New Jessie

Region: Base

Region: Krazykat

Region: Verklund
Region: Invade

Vox Aeron
Region: Fenris

Alliance Navy
Region: Cabaret Island

Region: Meliae

World Atheists Warriors
Region: Necromina

Ascendant Initiative
Region: Dorien

Regius Inquisition
Region: Tamarillo

Silver Hawk Army
Region: Fenris

Raven Raiders
Region: Jungle

Black Mamba
Region: Sandey Island

Black Scorpian Mercernaries
Region: Kingston Springs

Blood Fist
Region: Private isle

Region: Gemmarum Insuls

Kratus Mepita
Region: South Purden

Militant Collective
Region: Cosmic Cay

Obsydian Marauders
Region: Prenthai

Omega Tactical Force OTF
Region: Diomede

Delta Force
Region: Bloodwine

Exilion Enclave
Region: Valley

Phoenix Embers
Region: Sub Lupina

Red Wolf
Region: Molly
Notes: half a homested

Sturm Korps Army
Region: Kampfzone

The First Sons
Region: Zoist?

Tercio de Madrid
Region: Great Land

Red Wolf
Region: Molly

Exilion Enclave
Region: Valley

Obsydian Marauders
Region: Prenthai

Omega Tactical Force OTF
Region: Diomede

7th Parachute Infantry Regiment
Region: Ardennes
Want to dash through walls?
Try Xah Tele-Dasher!