The Boston Diaries

The ongoing saga of a programmer who doesn't live in Boston, nor does he even like Boston, but yet named his weblog/journal “The Boston Diaries.”

Go figure.

Wednesday, November 01, 2017

“More than iron, more than lead, more than gold I need electricity. I need it more than I need lamb or pork or lettuce or cucumber. I need it for my dreams.”

Today is the first of November, which means it's the start of NaNoGenMo. I finished one novel, had one collapse in on itself, and all the intentions of doing one but missed a year. I hope to do better this year.

I've spent the past few hours coming up with a few ideas (even if one is to just write a program that spews “meow” out 50,000 times) and doing a deep dive into the dark musty corners of my harddrive for resources (I just found a file containing the parts of speech of over 100,000 English words I downloaded (or generated) from somewhere in 2004—wow, useful!), so I'm expecting to have something by the end of the month.

Sunday, November 05, 2017

The Boston Diaries—now ad free!

Way, way back in February of 2006, I added the block of Amazon products to my blog (and frankly, I'm surprised it was that long ago—who knew?). At the time, I was picking one of the “keywords” (which I keep for all entries, and are more like phrases than actual words) at random from all the entries on the page being displayed. Over three years later (September of 2009, no blog entry about this) I changed to just picking a random “keyword” from the top entry on the page. My thought for that change was that since the ad block always appears next to the top entry, I might get a better response from readers if the book selections from Amazon matched the topic of the entry they were next to.

Okay, there were still the odd problems, like when the keyword “dead zombie languages rising from the dead” was picked (I don't blame Amazon for giving up and displaying a generic ad when given that as a search term). But it was better than before.

Then in January of this year (again no blog entry about this) I thought it might be better to actually pick the “keyword” I sent to Amazon instead of having it picked at random. That might actually improve the selection process a bit more, so I added some code to handle that.

Which brings us to today.

I have noticed over the past month or so that Amazon is always displaying a generic “Shop at Amazon” banner and try as I might, I could not get a list of books (or any other product) to show up. I wondered if the link changed (but Amazon is pretty good about keeping links working) so I checked and no, pretty much the only ads you can run now are either the generic ads like I'm getting (and that's all you can get at the size I use) or ads for a particular product.

Well … darn.

Here I went to the trouble to try to target specific items (mostly books) to readers, and Amazon has finally said, “Nope. Not gonna do it.”

So that's that. The Amazon block is gone. Besides, it wasn't worth it anymore, as I haven't earned enough for a cup of coffee from Starbucks since my last payout (whenever that was, it's been that long). And it sucks, since when it was working, the books being shown were relevent to the post and could (in theory, if my blog were a bit more targeted towards a demographic or topic) benefit both me and Amazon with a sale. That's one thing that I really haven't seen outside of GoogleLinkedMyFacePlusInSpaceBook—well done targeted advertising (inside GoogleLinkedMyFaceBookPlusInSpace? Scarily targeted advertising).


My stance of tail call optimizations has changed over time

In writing the previous entry, I came across a post I made ten years ago about tail call optmization where I stated that I disliked it. But that was then, this is now, and now, I like tail call optimizations.

At the time I wrote that, I only thought tail call optimzations applied to a certain class of recursive functions, but no, it can be done in non-recursive functions as well. There may be limitations in when it can be done, but it's applicable to more than just recursive functions.

It's just a shame that such things are taught poorly and with bad examples (if at all—the term “tail call optimization” never came up in college). Of course, it would help if the language used for teaching supported the concepts as well (when I was in college, it was FORTRAN-77, Pascal and C—I'm not sure if FORTRAN-77 even supports recursion; Pascal was a pedagogical language designed by a computer scientist well known for being critical of the computer industry; and C was just a step above assembly language). Even some population langauges used for teaching today (cough—Python—cough) don't support tail call optimization because it's confusing or something.

Sheesh.


How come the “easy projects” never are?

My idea for NaNoGenMo 2015 was based off an idea that A. K. Dewdney had in 1985 [Yeah, that worked out so well. —Editor] [Shut up, you! —Sean], so I thought I would return to that well and implement an idea that Douglas Hofstadter had in 1983:

You can amuse yourself by looking up the definition of a common word in the dictionary and replacing the main words in it by their definitions. I once carried this process out for “love” (defined as “A strong affection for or attachment or devotion to a person or persons”), substituting for “strong”, ”affection”, “attachment”, “devotion”, and “person”, and coming up with this concoction:

A morally powerful mental state or tendency, having strength of character or will for, or affectionate regard, or loyalty, faithfulness, or deep affection to, a human being or beings, escpecially as distinguished from a thing or lower animal.

But not being satisfied with that, I carried the whole process one step further. This was my result:

A set of circumstances or attributes characterizing a person or thing at a given time in, whch, or by the conscious or unconscious together as a unit full of or having a specific ability or capacity in a manner relating to, dealing with, or capable of making the distinction between right and wrong in conduct, or an inclination to move or act in a particular direction or way, baving the state or quality of being strong in moral strength, self-discipline, or fortitude, or the act or process of volition for, or consideration, attention, or concern full of fond or tender feeling for, or the quality, state, or instance of being faithful to, those persons or ideals that one is under obligation to defend of support, or the condition, quality or state of being worthy of trust, or a strongly felt fond or tender feeling to a creature or creatures of or characteristic of a person, or persons, that lives or exists, or is assumed to do so, particularly as separated or marked off by differences from that which is conceived, spoken of, or referred to as existing as an individual entity, or from any living organism inferior in rank, dignity, or authority, typically capable of moving about but not of making its own food by photosynthesis.

Isn't it romantic? …

Metamagical Themas: Questing for the Essence of Mind and Pattern (hey, I may have gotten rid of the Amazon ads, but I still have my affiliate link)

It's a straightforward program:

  1. Set our corpus to a single word, “love.”
  2. For each word in our corpus, replace said word with its definition.
  3. If we haven't reached 50,000 words, repeat step 2.

It can't be that hard, right? It should only be an hour of work, at the most, right?

Two days later …

Well, that was easy! [See? —Editor] [SHUT UP! –Sean]

So it starts out with a dictionary I downloaded from Project: Gutenberg. Oh look—it's in some vague HTMLish markup language (even though the file says it's HTML, it's not HTML) so I should be able to parse what I want out of this. It can't be that much work. The format is straightforward:

otherstuff <hw> word </hw> otherstuff <def> definition </def> otherstuff

And I'm not two dozen words in when parsing fails. I check, and the text I'm up against is:

<hw><hw> word </hw> ... <hw> otherword </hw> ... <hw> ... <def> definition </def>

You have got to be kidding me! That is not even valid HTMLish markup! So I code, and I code and I code code code …

<mhw> ... <hw> word </hw> ... <hw> otherword </hw> ... </mhw> ... <def> definition </def>

It's not even consistently bad markup! So I code, and I code and I code code code …


<hw> word </hw> ... definition </def>

<hw> word </hw> ... <hw> word </hw> ... <def> definition </def> ...

And I'm not even past “AD” in the dictionary!

I do what I should have done when I encountered the first problem and search for a better machine readable dictionary online. And I find one. The markup is sane! And documented! A few hours later and I can parse every one of the 106,622 definitions in the dictionary!

Now I can implement my idea.

Sheesh.

Tuesday, November 07, 2017

The Shadow Sean Conners

I've had a Gmail account for nearly a decade now, although I never use it. I think I got one back in the day to see for myself the hype around this new email service from Google. I obtained the account early enough to snag the address sean.conner@gmail.com (but don't send anything there—it might be months before I get to it).

But the weird thing is that I constantly get email meant for other Sean Conners. I checked today and …

And all this just in the past week!

What I find amazing and uncomprehensible is … do these other Sean Conners not know their own email address? Do they just assume sean.conner@gmail.com will somehow, magically, get to them? Do they not care? Do other people sending the email just assume that sean.conner@gmail.com will get to the Sean Conner they know?

What's going on?

I do respond to some of these (the ones that don't appear to be spam at least), informing the sender that they have the wrong Sean Conner, but rarely do I ever get a message back.

It's bizarre.


Love is … a freaking wall of text

And so I implemented my idea in about all of an hour. The code itself is pretty straightforward:

require "org.conman.math".randomseed()

local fixcase = Cs(
                    (R"az" / function(c) return c:upper() end + P(1))
                    * P(1)^0
                  )

local function lookup(term)
  local list
  
  if dict[term] then
    list = dict[term]
  else
    local l = fixcase:match(term)
    if dict[l] then
      list = dict[l]
    else
      return term
    end
  end
  
  return list[math.random(#list)]
end

local word   = R("''","--","AZ","az")^1
local term   = word / lookup
             + P(1)
local corpus = Cs(term^1)

local count  = Cf(
                   Cc(0) * (word * Cc(1) + P(1) * Cc(0))^1,
                   function(acc,count)
                     return acc + count
                   end
                 )
                 
local text = "Love"
local num
local loop = 0

repeat
  loop = loop + 1
  text = corpus:match(text)
  num  = count:match(text)
until num >= 50000

print(string.format([[

                                 Love is ...

                            A Definitional Novel
                        in %d expansions and %d words
                        
                        
]],loop,num))

print(wrap(text))

The first line initializes the random number generator, then an LPeg expression to uppercase the leading character of a word (that's how most of the terms in the dictionary I used appear). Then we have a function that returns either a random defintion of a given term, or if no definition exists, the term itself. Next is the definition of a “word” with the expression word—one or more letters, dashes or apostrophes. The next expression, term, either finds a “word” and does the definition lookup via lookup() or just whatever non-word text it finds (punctuation marks mostly). The expression corpus will run term multiple times, replacing the input with the translated output (this is a “substitution capture as it's called in LPeg).

The count expression just counts words—it's a folding capture which accumulates a single result. In this case, we start with 0 (Cc(0)), then for each “word” in the input it returns a 1; otherwise a 0 (word * Cc(1) + P(1) * Cc(0)), which is added to our accumulator using the given anonymous function.

Then it's a matter of starting with “Love” and running this a few times until we get over 50,000 words.

What I didn't expect (but should have) is the “Wall Of Text” that is generated:

To denote having as a possession or an appendage; as, the firmament with its stars; a bride with a large fortune. One of whom inquires can be made as to the integrity, capacity, and the like, of another. Apposition; connection; antithesis; opposition; as, they engaged hand to hand. a That which terminates, circumscribes, restrains, or confines; the bound, border, or edge; the utmost extent; as, the limit of a walk, of a town, of a country; the limits of human knowledge or endeavor. Denoting nearness or distance, either in space or time; from; as, within a league of the town; within an hour of the appointed time. The period at which any definite event occurred, or person lived; age; period; era; as, the Spanish Armada was destroyed in the time of Queen Elizabeth; – often in the plural; as, ancient times; modern times.; as, With privilege or possession; – used to denote a holding, possession, or seisin; as, in by descent; in by purchase; in of the seisin of her husband. an A measure of distance traveled.; As a substance for any noun of the neuter gender; as, here is the book, take it home. happened One who is in office; – the opposite of out. See Thee. A wooden block shaped like the human foot, on which boots and shoes are formed. A division of the Roman people formed according to their property, for the purpose of voting for civil officers.; To inclose; to take in; to harvest. all Of or belonging to me; – used always attributively; as, my body; my book; – mine is used in the predicate; as, the book is mine. See Mine. The potential principle, or force, by which the organs of animals and plants are started and continued in the performance of their several and cooperative functions; the vital force, whether regarded as physical or spiritual‥ A Freely; licentiously. Yellow or gold color, – represented in drawing or engraving by small dots. Worthy of consideration; requiring to be observed, borne in mind, or attended to. A numeral; a word or character denoting a number; as, to put a number on a door‥ phrases, and To denote a connection of friendship, support, alliance, assistance, countenance, etc.; hence, on the side of. That which refers to something; a specific direction of the attention; as, a reference in a text-book. Extent; limit; degree of comprehension; inclusion as far as; as, they met us to the number of three hundred. a The space or thing defined by limits. Denoting the agent, or person by whom, or thing by which, anything is, or is done; by. To measure, as in music or harmony.; as, With reference to circumstances or conditions; as, he is in difficulties; she stood in a blaze of light. an Fixed or appointed time; conjuncture; a particular time or occasion; as, the hour of greatest peril; the man for the hour.; As a substitute for such general terms as, the state of affairs, the condition of things, and the like; as, how is it with the sick man? happened With reference to circumstances or conditions; as, he is in difficulties; she stood in a blaze of light. A word placed before nouns to limit or individualize their meaning. A wooden block shaped like the human foot, on which boots and shoes are formed. A division of the Roman people formed according to their property, for the purpose of voting for civil officers.; The specific signification of in is situation or place with respect to surrounding, environment, encompassment, etc. It is used with verbs signifying being, resting, or moving within limits, or within circumstances or conditions of any kind conceived of as limiting, confining, or investing, either wholly or in part. In its different applications, it approaches some of the meanings of, and sometimes is interchangeable with, within, into, on, at, of, and among. all Of or belonging to me; – used always attributively; as, my body; my book; – mine is used in the predicate; as, the book is mine. See Mine. Figuratively: The potential or animating principle, also, the period of duration, of anything that is conceived of as resembling a natural organism in structure or functions; as, the life of a state, a machine, or a book; authority is the life of government‥ (usually Relating to, or containing, more than one; designating two or more; as, a plural word.) an acquaintance Ere; before; sooner than. acquaintances Originally, an interrogative pronoun, later, a relative pronoun also; – used always substantively, and either as singular or plural. See the Note under What, pron., 1. As interrogative …

Love is …

and so on for another 12,856 lines.

A literal “Wall Of Text.”

It also overshot the 50,000 words by 120,007 words. Yes, there are a total of 170,007 words (minus the title) in this “novel.” And what was totally surprising to me is the number of times through the expansion loop—only four.

From “Love” to “To denote having as a possession or an appendage; as, the firmament …” in four steps.

I found the “ending” to be somewhat amusing:

… Denoting identity or equivalence; – used with a name or appellation, and equivalent to the relation of apposition; as, the continent of America; the city of Rome; the Island of Cuba. To work, as raw or partly wrought materials, into suitable forms for use; as, to manufacture wool, cotton, silk, or iron… adventures.

Love is …

Apparantly, love contains tourist hotspots, industrial production and adventures. Who knew?

Monday, November 13, 2017

It shouldn't be this hard to support another syndication feed format

A few days ago I came across a new syndication feed format (like RSS or Atom)—JSON Feed:

We — Manton Reece and Brent Simmons — have noticed that JSON has become the developers’ choice for APIs, and that developers will often go out of their way to avoid XML. JSON is simpler to read and write, and it’s less prone to bugs.

So we developed JSON Feed, a format similar to RSS and Atom but in JSON. It reflects the lessons learned from our years of work reading and publishing feeds.

See the spec. It’s at version 1, which may be the only version ever needed. If future versions are needed, version 1 feeds will still be valid feeds.

JSON Feed: Home

It's not like I need another syndication format, and it's still unclear just how popular JSON Feed really is, but hey, I thought, it should be pretty easy to add this. It looks simple enough:

{
    "version": "https://jsonfeed.org/version/1",
    "title": "My Example Feed",
    "home_page_url": "https://example.org/",
    "feed_url": "https://example.org/feed.json",
    "items": [
        {
            "id": "2",
            "content_text": "This is a second item.",
            "url": "https://example.org/second-item"
        },
        {
            "id": "1",
            "content_html": "<p>Hello, world!</p>",
            "url": "https://example.org/initial-post"
        }
    ]
}

I just need to add another entry to the template section of the configuration file, create a few templates files, and as they say in England, “the brother of your mother is Robert” (how they know my mother's brother is Robert, I don't know—the English are weird like that).

But the issue is filling in the content_text field. The first issue—JSON is encoded using UTF-8. For me, that's not an issue, as I'm using UTF-8 (and even before I switched to using UTF-8, I was using ASCII, which is valid UTF-8 by design). But in theory, someone could be using mod_blog with some other encoding scheme, which means an invalid JSON Feed unless fed through a character set conversion routine, which I don't support in mod_blog.

But even assuming I did, that still doesn't mean I'm out of the water.

Suppose this was my content:

<p>"Hello," said the politician, lying.</p>

<p>"Back up!" I said, using my left hand to quickly cover my wallet in my back pocket.
"You aren't getting any money from me!"</p>

If you check the syntax of JSON, you'll see that the double quote character " needs to be converted to \". A similar transformation is required for the blank line, being converted to \n. And I have no code written in mod_blog for such conversions.

It's not like it would be that much code to write. When I added support for RSS and Atom, I had to write code. But it irks me that I have to special case a lot of string processing.

Yes, yes, I know—mod_blog is written in C, which is a horrible choice for string processing. But even if I picked a better language suited to the task, I would still have to write code to manually transform strings from, say, ISO-8859-1 to UTF-8 and code to convert HTML to a form of non-HTML:

&lt;p&gt;&quot;Hello,&quot; said the politician, lying.&lt;/p&gt;

&lt;p&gt;&quot;Back up!&quot; I said, using my left hand to quickly cover my wallet in my back pocket.
&quot;You aren't getting any money from me!&quot;&lt;/p&gt;

(Not to get all meta, but to display the first example HTML, I had to encode it into the non-HTML you see above, and to display the non-HTML you see above, I have to encod the non-HTML into non-non-HTML—or in other words, convert the output yet again. So, to show a simple & in this page, I have to encode it as &amp;, and to show that, I have to encode it as &amp;amp, in ever deepening layers of Inception-like encoding. By the way, that was encoded as &amp;amp;amp;—just for your information.)

I spent way too much time trying to generalize a solution, only to ultimately reject the code. I'll probably just add the code I need to support JSON Feed and call it a day, because solving the issue once and for all is just too much work.


It shouldn't be this hard to deploy a new version

I spent more time fighting git and Github than I did in writing the code to support the JSON Feed. Yeah, the code was straightforward and I had it done rather quickly. Deploying the code was something else entirely.

So I finished the code, and the new templates to generate the feed and my tests were good and life was fine. I then committed my changes to git and that's where the first problem occured—not all the changes were committed! The issue came down to an overbroad directive to git to ignore a certain file—it was a general “ignore all files of the given name” instead of “ignore this one file” that I forgot about. So I tagged the release (version 5.0.0), pushed the changes to Github (for public consumption of the source code) and then went to update the copy of mod_blog on the server. It was there when I discovered the critical missing file (one of the templates for the new JSON Feed).

Sigh.

I had been a bit too hasty in pushing the code out to Github, so now I was stuck with releasing version 5.0.1. Only now something got munged up with my copy of the code on the server since it compiled the program with a version number of 5.0.0-1-gd096362 instead of a version number of 5.0.1.

A bit of background: I use git to tag versions, and in the Makefile I have the following bit of code:

VERSION := $(shell git describe --tag)

...

override CFLAGS  +=-DPROG_VERSION='"$(VERSION)"'

so I don't have to update the version number in code by hand (the override exists so I can specify different compiler flags and still have the version information propagated to the program; I also handle the case when git isn't available, but that comes in later in my tale of woe). Running git tag showed a tag of 5.0.1, but git describe --tag was only coming up with 5.0.0-1-gd096362.

Wat?

Did I not update things properly? Was it a problem with the version of git on the server? Did I lose the signal? Was it lost in translation? Wat?

Some quick changes, try version 5.0.2. That worked—kind of. Now on the server the version was reporting back version 5.0.1.

Then I discovered another issue. I have code in the Makefile to handle the case when the version number isn't available through git—it's just a check to see if git describe --tag returned anything and if not, use a hard coded version specified in the Makefile. Now, to prevent me from pushing an update to Github with an incorrect version number in the Makefile, I have a script that is supposed to run when I push changes to Github (specifically, when I push changes to a remote host). Only the last change to that script rendered it non-executable, so it wasn't running. The version on Github had the wrong version number specified in the Makefile, and I was still having this weird “one version back” problem on the server.

I was still having problems with version 5.0.3 when I gave up. I wanted a nice, clean, 5.0.0 release, and instead, I was on my way to version 5.0.137 the way things were going. And all because I didn't check in a critical file because of a typo. If only I hadn't pushed the code to Github so quickly. If only there were a way to remove the tagged versions from Github, but there didn't seem to be an obvious way to me.

As I eventually found out, there was a way—from the command line on my development machine, I just had to run this blindingly obvious sequence of commands:

GenericUnixPrompt> git tag -d 12345
GenericUnixPrompt> git push origin :refs/tags/12345

Obvious.

I'm surprised I didn't realize that sooner.

So I removed the tags for versions 5.0.3, 5.0.2, 5.0.1, and 5.0.0, made sure I had all the files and whatnot, and re-released version 5.0.0.

Good Lord!

So now all is right with the world, and I have a new JSON Feed file.

Tuesday, November 14, 2017

My­Face­Google­LinkedBook­Plus­In­Space is stalking me

I was a bit surprised to see an ad for the ceramic Department 56 National Lampoon Christmas Vacation The Griswold Family Tree on Face­Google­Linked­MySpace­Book­Plus­In. It was surprising because yesterday, Bunny came across a picture of an inflatable National Lampoon Christmas Vacation The Griswold Family Tree and was threatening her brother with it. She did a search and found the one on Amazon and sent her brother the link.

Now, why would I be getting the ad on Linked­My­Face­GoogleIn­Space­Book­Plus? Is Face­Google­Linked­MyBook­Plus­In­Space listening in to us via our phones? Does the NSA have a sideline of selling information to advertisers to help their bottom line? Is Linked­My­Face­GooglePlus­In­Space­Book psychic (or psychotic—could go either way)?

No. It's just simple tracking via the web [“Simple,” he says. Ha! —Editor].

Bunny did a search for the Griswold Family Tree (or something along those lines) and some of the resulting pages she visited included bits of of HTML or Javascript or images that said “person from such-n-such IP address did a search for this.” And some of that tracking is either done directly by Google­Linked­My­FacePlus­In­Space­Book or is sold to them. Bunny does not have a Linked­My­Face­GoogleSpace­Book­Plus­In account (she did at one point, several years ago, for all of five hours) but that doesn't mean Face­Google­Linked­MyPlus­In­Space­Book doesn't keep track of her. They do.

But what does that have to do with me?

Well, I do have a My­Face­Google­LinkedIn­Space­Book­Plus account. And Google­Linked­My­FacePlus­In­Space­Book knows I log in from the same IP address that did a search for “The Griswold Family Tree” and while I may not have been the one that did the search (since the search wasn't tied to an account—and just because I'm not logged in doesn't mean Linked­My­Face­GoogleIn­Space­Book­Plus can't track my viewing habits on the web), I did come from an IP address that did! And thus, I too, might be interested in the ceramic Department 56 National Lampoon Christmas Vacation The Griswold Family Tree.

No, not really.


New York? Chicago? They have nothing on Detroit pizza

My favorite pizza place is a bit of a drive. A twenty-hour drive of nearly 1,350 miles to Buddy's.

Yeah, I don't go there that often. It's a shame, because the pizza is that good. It's Detroit-style pizza, made in square, blue steel pans (from the automotive industry) with the sauce on top, and yes, Buddy's defined Detroit-style pizza.

And guess what? There's a video on Youtube about Detroit-style pizza:

[If properly dried and trimmed, New York-style pizza could be used to make a box for Detroit-style pizza.]

My dad, who probably hasn't had Buddy's Pizza in thirty years, still pines for it, and kicks himself to this day for not getting the receipe from his sister (who worked at Buddy's for a number of years).

Darn. Now I want Detroit-style pizza.

Update on Thursday, November 16th, 2017

Now I really want Buddy's pizza.

Thursday, November 16, 2017

I know! I know! I should just get in the car and start driving

Apropos my previous post, Dad sent along this review of Buddy's pizza:

[The reviewers are right!  That crust is some seriously buttery Christmas right there.]

Yeah, Buddy's pizza is just that good! And my reaction to pizza crust matches that of Corey's—it's usually just there but the crust on Buddy's pizza can easily stand on its own.

Gosh darn it. Now I really want Buddy's pizza.

Friday, November 17, 2017

I'm no expert in search engine optimizations, but I think I know more about the subject than this guy

From
David Parker <davidparker@weboptimizes.com>
To
sean@conman.org
Subject
Serious issue found while visiting your website
Date
Fri, 17 Nov 2017 06:17:14 -0500

Dear owner of conman.org <http://conman.org>,

Hope everything is fine at your end.

Would you like to know some of the reasons why your website is not getting enough visitors who might turn to be your potential customers/clients?

I am SEO expert of a leading SEO service provider company. As per my analysis , your website is not performing well in the Google organic search. Also your traffic is poor form last couple of months due to some of the reasons. Some of the aspects given bellow.

          Due to poor back links
          Irrelevant content used in website
          Keywords not in good position
          Due to errors and issues present in the website
          Unorganized social media accounts

If my proposal sound's interesting for your business goals, feel free to email me, or can provide me with your phone number and the best time to call you. I am also available for an online meeting to present you this website audit report.

I look forward to hearing from you - thanks!

We also provide Web-designing and development service.

Best Regards,

David Parker

SEO Expert

PS: I am not spamming. I have studied your website, prepared an FREE audit report and believe I can help with your business promotion.
[image: beacon]

Sometimes, a piece of spam will catch my eye, and this otherwise unexceptional piece of spam did. Aside from a few grammar mistakes (“sound's” and “an Free”) and the horrible HTML (although it did include a plain text version, so there's that) used in the email (probably vomited up by Microsoft Word from the looks of it) I'm not sure why this caught my eye.

To me, it's obvious that he never even looked at my site as I don't sell anything. I also have to wonder what “errors and issues present in the website” David is referring to, as I can't find any errors. Broken links, check. Keywords not in a good position, um … I guess? Errors and issues? I'm not seeing any.

But I was curious, and I decided to check out the domain he sent the email from, weboptimizes.com. And wow, what a wonderful site:

Index of /

Apache Server at weboptimizes.com Port 80

Index of /

Half the links there are forbidden, and the other half return no information.

I really have to wonder how much of an “expert” David is, and what “leading SEO service provider company” he works for. Because so far, I'm not seeing “expert” or “leading company” in this email.

So of course I replied.

From
Sean Conner <sean@conman.org>
To
David Parker <davidparker@weboptimizes.com>
Subject
Re: Serious issue found while visiting your website
Date
Fri, 17 Nov 2017 18:31:56 -0500

It was thus said that the Great David Parker once stated:

Hope everything is fine at your end.

It is, thanks. How are things with you?

PS: I am not spamming. I have studied your website, prepared an FREE audit report and believe I can help with your business promotion.

A free report? Sure, please send it to me.

I can't wait for my Free report!

Update on Monday, November 20th, 2017

I got my FREE report!

Monday, November 20, 2017

“And why beholdest thou the mote that is in thy brother's eye, but considerest not the beam that is in thine own eye?”

From
Victor Green <sales@qtonix.com>
To
sean@conman.org
Subject
Re: Attract more customers to your Website Sean - 2G
Date
Tue, 21 Nov 2017 04:27:17 +0530

Hi Sean,

Just took an initial look at your site http://www.conman.org/ and found that there are not enough keywords in the source code of your website resulting in loss of valuable opportunities.

About us, we are Qtonix Software and have been in this domain for the last decade and have amassed 500+ clients in the US alone. For details, please visit http://www.qtonix.com/.

We will not only put your site at the top of Google, but also ensure visits from target viewers. We will do a total competitor analysis and market analysis and give you 50 targeted key words to choose from (a mixture of long tail specific keywords and high volume ones). That done, we will optimize your website as per those keywords to attract the target visitor.

Your social media presence is minimal and not integrated with your site. We will do regular postings on your behalf and create and manage your brand awareness, driving in more traffic from Social Media.

Today visitors depend a lot on reviews and we will ensure that you have only positive reviews on Social Media as well as your website.

The site has an alarming 6 HTML Coding errors making it difficult for Google to navigate the site properly. You can check the link https://validator.w3.org/nu/?doc=http%3A%2F%2Fwww.conman.org.

Organic Traffic to your site using the concerned keywords is only 5 and there has been a disastrous reduction in traffic since August 2017.

I saw this spam, and I thought, this is how you sell yourself as an SEO expert! You give your company name, and specific indications of what you can fix. It wasn't until I got to the bottom of the email that I realized this was my “Free report!”

Unlike most companies, we are offering you a unique Money Back Guarantee, under which you can get all your investment refunded within the first 30 days, in case you are not happy with our services. For more details, please visit http://www.qtonix.com/money-back-guarantee/.

Please send me your direct number and a convenient time so that I can share more with you.

Thanks

Victor Green
/SEO Consultant/
Qtonix Software Pvt Ltd
p: XXXXXXXXXXXX m: XXXXXXXXXXXX
s: sales.qtonix
w: www.qtonix.com <http://www.qtonix.com> e: sales@qtonix.com

On 11/20/2017 9:39 PM, Alisha Qtonix wrote:

———- Forwarded message ———-

From
Sean Conner <sean@conman.org <mailto:sean@conman.org>>
To
David Parker <davidparker@weboptimizes.com <mailto:davidparker@weboptimizes.com>>
Subject
Re: Serious issue found while visiting your website
Date
Sat, Nov 18, 2017 at 5:01 AM

It was thus said that the Great David Parker once stated:

Hope everything is fine at your end.

It is, thanks.  How are things with you?

PS: I am not spamming. I have studied your website, prepared an FREE audit report and believe I can help with your business promotion.

A free report?  Sure, please send it to me.

So … David Parker is Alisha Qtonix? Or David Parker forwarded it to Alisha Qtonix? Who then forwarded it to Victor Green? Okay …

But then immediately afterwards, I received another email from Victor Green:

From
Victor Green <sales@qtonix.com>
To
sean@conman.org
Subject
Re: Attract more visitors to your Website Sean - 2G
Date
Tue, 21 Nov 2017 04:41:18 +0530

Apologies, the trailing mail was sent inadvertently. (Subject was wrong!)

Victor Green
/SEO Consultant/
Qtonix Software Pvt Ltd
p: XXXXXXXXXXXX m: XXXXXXXXXXXX
s: sales.qtonix
w: www.qtonix.com <http://www.qtonix.com> e: sales@qtonix.com

On 11/21/2017 4:27 AM, Victor Green wrote:

Hi Sean,

Just took an initial look at your site http://www.conman.org/ and found that there are not enough keywords in the source code of your website resulting in loss of valuable opportunities.

About us, we are Qtonix Software and have been in this domain for the …

It quoted the entirety of the previous email.

Wow.

I honestly didn't expect an answer back. And now I know where the “errors and issues present in the website” came from—an experimental HTML validator. I'm using HTML 4 for my website, and had he used the main validator, Victor would have seen my site passing quite readily. Just for kicks, I decided to return the favor and validate one of the sites sent as an example of their work and man … fifty-three errors! And just to make sure it wasn't an anomaly, I tried another one (out of the 11 sent) and this was better—only fifty errors.

Their own site does much better—only three errors, but still, if you are going to show me the errors on my page, it might be a good idea to check your own site first.

I'm just saying.

I think I should point this out to them.

Friday, November 24, 2017

Microsoft Corporation has stopped the Windows services on my computer. Fancy that

I notice that I missed a call from 866-978-7311. It's not unusual for me to miss calls on my phone, but it is unusual when unknown callers leave voice mail. Must be important, I thought, for them to leave a message. I better listen to it.

The voice is obviously a robot with a feminine voice. “8387. Let me repeat. This is very imprtant call to notify you, that your Microsoft Windows License Key, has been expired in your computer, so Microsoft Corporation has stopped the Windows services in your computer. To renew the Windows License Key, please call me 66 [sic] 978-8387. I will repeat, 866-978-8387.

Okay then! Good thing to know that Microsoft Corporation has stopped all the Windows services in my computer, given that I don't have Windows install on any of my computers. I just hate it when Windows services just run all willy-nilly on my computer. How nice of Microsoft to shut them down.

I'm not even upset that my Microsoft Windows License Key has expired, as I never purchased a copy of Windows in my entire life.

So thank you, robotic female voice from 866-978-7311 for giving me such good news.

Thursday, November 30, 2017

While my chances of winning are zero, I still have my dollar

From
John Hawthorne <XXXXXXXXXXXXXXXXX>
To
root@conman.org
Subject
Feedback
Date
Thu, 30 Nov 2017 00:09:50 +0000

Hello there,

On your page http://boston.conman.org/2009/09/14.1 I noticed that you are linking to an article about the chances at winning the lottery. I just wanted to ask for some feedback about what you thought of an article that I recently wrote.

You can see it right here:

https://www.lottoland.com.au/magazine/want-to-improve-your-chances-of-winning-the-lottery-heres-how.html

If you were interested it would be great if you wanted to add my article as a resource on the page I mentioned. If you prefer you may also republish the article.

Thank you,

John.

I suppose John was operating under the theory that “it doesn't hurt to ask.”

The post in question isn't so much about the chances at winning the lottery (although I stand a better chance of being Tom Cruise than of winning the Mega Millions Jackpot) as it's best not to play at all.

There's nothing in my post (or the article I linked to) about how to improve your chances at winning.

Sigh.

The advice given in the link (which I read so you don't have to) simply boils down to “buy more tickets with less commonly picked numbers” with some dodgy math thrown in, like this bit from the page:

Ethan Wolff-Mann puts it this way: In a basic lottery with just one prize, $1 tickets, and 100 people playing, any jackpot over $100 will mean that a ticket will be worth more than the $1 it costs. If you bought all the tickets for $100, you would win the jackpot and take home more than what you paid. So theoretically, at a certain size, a lottery ticket can actually be worth more than what you pay for it.

Yes, but …

In this case, yes, the expected value is greater than $1. So if the jackpot is $200, then the expected value is $2. But that's not the case for most lotteries. I'm looking at the latest Florida Lottery payouts, and man, the expected value just isn't there. The chance of getting 3 out of 6 numbers (easiest to win) is 1 in 71 (1.4% chance) and for that, you spent $1 to win $5, or an expected value of 7¢.

Yeah, lotteries are a tax on the innumerate.

Obligatory Picture

[“Only the highest fidelity images are used for identification purposes!”

Obligatory Links

Obligatory Miscellaneous

You have my permission to link freely to any entry here. Go ahead, I won't bite. I promise.

The dates are the permanent links to that day's entries (or entry, if there is only one entry). The titles are the permanent links to that entry only. The format for the links are simple: Start with the base link for this site: http://boston.conman.org/, then add the date you are interested in, say 2000/08/01, so that would make the final URL:

http://boston.conman.org/2000/08/01

You can also specify the entire month by leaving off the day portion. You can even select an arbitrary portion of time.

You may also note subtle shading of the links and that's intentional: the “closer” the link is (relative to the page) the “brighter” it appears. It's an experiment in using color shading to denote the distance a link is from here. If you don't notice it, don't worry; it's not all that important.

It is assumed that every brand name, slogan, corporate name, symbol, design element, et cetera mentioned in these pages is a protected and/or trademarked entity, the sole property of its owner(s), and acknowledgement of this status is implied.

Copyright © 1999-2018 by Sean Conner. All Rights Reserved.