The Library Basement
Reading under ground

Category ktl

Separate php-fpm pools for great victory

Let's say you use a pretty standard Nginx/PHp-fpm/Linux/Mariadb ("nephilim"?) stack for hosting web applications. On most distributions you'll have a single php-fpm pool which spawns workers to execute tasks handed to it by the web server, either via a POSIX or TCP socket. That's great for simplicity's sake.

But what if you have some web-app you want to run but don't really trust. HINT: You shouldn't really trust any internet facing application. If there's a remote code execution flaw in the code for webapp foo, an attacker then assumes the security persona of the entire php-fpm pool, including access to other applications' memory, file-system space, and databases. Yikes!

Nothing in the below is particularly novel, but it may be useful nonetheless. There's also the container approach to solving this, which is probably more secure overall, but is not available to everyone. The context of the examples below is running GNU Social on Centos 7. (On Centos 7, nginx runs as the "nginx" user, and php-fpm runs by default as the "apache" user, the same as httpd normally runs as).

Separate Databases

Each application should have its own database with its own unique username and password. I think most people know this, but stating it here for good measure.

Separate User

Each web application should have its own local unprivileged user account. If that account never needs a shell environment, it is best to not give it a login shell either. GNU Social requires a shell to run its queue daemon scripts, so here is how I did it:

useradd -m -s /bin/bash social

Assuming you have "PermitEmptyPasswords no" in your sshd_config, you don't have to set a password. Otherwise set a very strong one. It'll never be used under normal operations.

A note specific to GNU Social: the queue daemons should run as this user as well. We're in a systemd world now on Linux, so see an example of a unit file for queue daemons. You'll want to set the user to set:


Separate File-system Path

Take note of the group your webserver (nginx in my example) runs as. In Centos it is "nginx", in Debian derivatives it appears to be "www-data".

You've extracted your web application's files into /var/www/ . You'll want to lock this down so that only the application pool user and the webserver can have access:

chown -R social:nginx /var/www/
chmod -R o-rwx /var/www/
# Also follow GNU Social's install instructions for setting
# write permissions on avatar/ file/, and the base directory so
# config.php can be written by the installer

This way the web server can read the application's root contents (e.g. php scripts and static files), and the php-fpm pool for your application will have write access (for writing the configuration at install time and uploading files). Other users should have no access to this location (go ahead, test it).

When you create a separate php-fpm pool below, you'll need to provide a session and cache path which are writable by the social user:

mkdir -p /var/lib/social/{cache,session}
chown root:social /var/lib/social/{cache,session}
chmod 770 /var/lib/social/{cache,session}

Separate php-fpm pools

Pools for php-fpm.d are typically found in /etc/php-fpm.d/. Your mileage may vary based on distribution, etc. Take a look at the default pool to see how it is configured.

Depending on the resources of your system, you may want to reduce the value of pm.max_children (and relate settings) to make room for your new pool. This can be tuned depending on the relative resource demands of your pools.

Now copy the default pool to a new file in the same directory called social.conf and edit it. Below are the required edits:

  1. Give the pool a unique socket, either a different path for a POSIX socket, or a different port number for a TCP sockets. Assuming everything is on a single server, I recommend the POSIX socket, e.g. "listen = /var/run/php-fpm-social.sock"
  2. Set "user = social"
  3. Set "group = social"
  4. Set "php_value[session.save_path] = /var/lib/social/session"
  5. Set "php_value[wsdl_cache_dir] = /var/lib/social/cache"

Configure your nginx configuration file for the site to use the unique socket listed above:

fastcgi_pass unix:/var/run/php-fpm-social.sock;

Now you are ready to restart php-fpm and nginx and your queue daemons. If you run the following, you should see some php-fpm workers running as social:

ps aux | grep php-fpm

If there is trouble, there are a few places you'll want to look:

  • nginx error log
  • nginx access log
  • php-fpm error.log
  • php-fpm www-error.log

Assuming that worked, you've got a separate, more-secure install of GNU Social. I did the foolish thing and changed the configuration after installing the site. I don't recommend it, unless you want an exercise in rapid troubleshooting. ;-)

Category: ktl Tags: technology

Moved some git repositories

I have become enamored of Gogs, a self-hosting solution for git repositories, so I've moved most of my personal repositories from a certain large centralized git service provider to my own instance. Check it out:

I understand this may require collaborates to actually use git in the manner in which it was designed - namely as decentralized version control. If you'd like to submit a patch to one of my projects, you'll need to craft a git pull request and email me.

koine-nlp release

Today I am formally releasing koine-nlp 0.2, a Python library for common NLP-related tasks for Koine Greek. I decided to make a fancy koine-nlp homepage with the help of sphinx. It includes info on installation, a tutorial, and an API reference for the koinenlp module. You can find the source repository on my gogs instance.

In the most basic mode of operation, koine-nlp is used to prepare polytonic Greek text for indexing by normalizing. This done by means of the omnibus normalize() function:

>>> import koinenlp
>>> koinenlp.normalize("καὶ ἡ σκοτία αὐτὸ οὐ κατέλαβεν.")
'και η σκοτια αυτο ου κατελαβεν'

There's plenty more to it - see the documentation for more.

I do plan on adding some features in the future, so watch this space.

O Bazan, Where Art Thou?

David Bazan is the greatest Christian songwriter of his generation. This remains true in spite of him no longer being a Christian. Even now his reflections and critiques of Christianity are more powerful than the vast majority of believing artists.

His faith, or lack thereof, has formed the thematic core of his work throughout his career. Bazan cannot (or will not) move on the from the topic. This is fine by me as a listener.

Yet his music is a lot more than his faith. It is beautifully written, brilliantly executed. I love Bazan's songs; I sing along. In this spirit I am embarking on this piece. It is not a review, per se, but a remembrance.


In his early role as a Christian indie artist, Bazan was perhaps best known for being "edgy." Bazan's "Christian" band Pedro the Lion's first E.P. Whole was about drug addiction, after all. He continued to push the envelope in addressing themes of sex, infidelity, loneliness, suicide, corruption, murder and doubt. And then to make his edginess double-bladed, he liked to perform old hymns.

The aforementioned themes were virtually absent from any contemporary Christian music, which is almost always vacuous and expressed in empty positivity. For young Christians like me who themselves liked to think of themselves as "edgy", this produced an immediate and intense affection for Bazan's music.

At last there was a voice of honesty in Christian culture! Honesty is in some sense the central task of art: to let an unflinching eye gaze upon a subject, and to render it into a new medium. In pop Christian music the medium is whitewash.

I should not say that Bazan was alone as a Christian artist. There are other artists, other favorites of mine, who worked at the same task by degrees. However in my estimation, Bazan fulfilled the role best. Perhaps too well.

It seems inevitable in retrospect that this envelope-pushing would lead to Bazan's exiting the faith. With each new album, the edge was being pushed further and further, until Achilles' Heel, the last under the Pedro the Lion moniker, led right to the border:

Who shall I blame
For this sweet and heavy trouble
For every stupid struggle
I don't know
I could buy you a drink
I could tell you all about it
I could tell you why I doubt it
And why I still believe it
And why I need it
And what the Pharisees don't see

But more on that later.

Winners Never Quit

"Winners Never Quit cover art"

My favorite album of Bazan's is Pedro the Lion's Winners Never Quit. It is only 8 tracks and about forty minutes long, but it packs a big punch. The album relates the story of a corrupt politician and his loser brother. Spoiler alert: the politician kills his wife and then himself after she uncovers his bid to steal an election, and the brother survives to have a second chance. You know, good wholesome music.

Briefly: this album is a masterpiece.

First, the music. I love the simple orchestration, and I love the way this simple combo was recorded. Clearly articulated, I feel like I can picture a live band playing the music. Yet Bazan did a good job not letting the simple kit limit the range of sound. On the contrary: we hear folk guitar, vintage indie rock, an ethereal ballad, and some more aggressive fare. They are all heard distinctly, and match the voice of the lyrics.

More important than the production, however, is the composition. Bazan's use of recurring motifs sprinkled through the songs bring make a coherent whole of the album. The listener hears an echo of a previous tune (with which I am obliged to sing the lyrics, being like that). These lead to a thematic tightness which is emphasized in the music, not in spite of it.

In addition, Bazan employs a number of tropes to underline the lyrics to great effect - e.g. "now that's the sort of smack that leaves a bruise" followed by accented attack, evoking the same.

Bazan's music is always good, but I feel like Winners Never Quit is his best example of music being an integral part of the story telling.

Lyrics are the other side of that coin, and here Bazan excels as well. It is a short album and he has a big story to tell, so he has to be economical. It feels cliche to say "show, don't tell" regarding the literary arts, but that is exactly how this album works. Consider the following:

My jail shoes on
The well-kept cemetery lawn

Two lines, nine words; but also: exposition, advancing the plot, revealing the scene, and setting the emotional tone. I think the real challenge in all of this is keeping the lyrics from sounding over-wrought or pretentious.

Yes, Winners Never Quit: a joy to listen to; a joy to sing to yourself; a joy to think upon. Do yourself a favor and have a listen. In my opinion it is the best album of Bazan's career. Probably not the best in each individual element, but the best complete package.


Before commenting on Bazan's religious metamorphosis I wish to bring attention to his musical collaborations outside his own projects. Pedro the Lion and Bazan's current band have always truly been a one-man show. Bazan provides almost all of the creative inputs, and his band plays with him on the road. But that doesn't make Bazan a lone wolf by any stretch. He's making great music with friends, if only in fairly limited doses.

Perhaps the most fruitful of all Bazan collaboration's is with T.W. Walsh. Walsh was a touring member of Pedro the Lion and received some writing credits on Achilles Heel. But more exciting for me was Bazan and Walsh's synth-and-drums project Headphones. The orchestration was a great vehicle for some fresh songs from Bazan. My favorite was "I Never Wanted You" which starts out as cruel parting shot in a breakup but is revealed to be the desperate deflection of a heart-broken man.

More recently Bazan has made an album in a new group - Overseas. It is not clear to me what the future of this collaboration will be, but it was interesting to listen to Bazan participating as a member of an enterprise. You can definitely hear his influence (especially in the songs for which he provides vocals), but it is not dominating.

To end the list of collaborations I have saved Bazan's work with Jason Martin of Starflyer 59. I hold a great affection for Martin (and probably should commit a post to him someday). It was at a Starflyer show that I first heard Bazan play. He was touring in support of Control, the follow-up album to Winners Never Quit. I stood riveted throughout his performance, even overcoming my initial annoyance that Martin had flipped the bill and let Pedro the Lion perform last.

So two of my favorite bands sometimes toured together - bonus! But my joy at this collaboration was fulfilled to an even greater degree when Martin and Bazan started making music together. This culminated with a few songs being published of their direct cooperation:

  • "Broken Arm" on the Starflyer 59 box set Ghosts of the Past
  • "Lost My Shape" - the same lyrics as "Broken Arm" but different music on Bazan's Curse Your Branches
  • "Messes" - the same music as "Broken Arm" but different lyrics on Bazan's Strange Negotiations
  • "Eating Paper" on Strange Negotiations

I hope that someday Martin and Bazan will retire to leisure and be able to make music with each other as often as they please. And Bazan very well may lead me to another favorite musician through his future collaborations.

The Conversion

Bazan has definitely affirmed his exit from the church in interviews. In following his history of musical releases, it is not exactly clear which album is his last "Christian" one. I know many Christian listeners regarded Control as the final straw - here Bazan violated sacred taboos against curse words and explicit lyrics. And there was really no doubt by Strange Negotiations, where Bazan put a semi-nude woman on the album art, I think, to send a very clear message.

I look squarely at Curse Your Branches as the conversion - not of the artist himself, but of the thematic core of his music. This is what I like to call the "God and alcohol" album, where each song seems to wrestle with one or the other, until the final cut "In Stitches", which handles both:

I need no other memory
Of the bits of me I left
When all this lethal drinking
Is to hopefully forget about you

And it is in this same song that teases the listeners:

I might as well admit it
Like I even have a choice
The crew have killed the captain
But they still can hear his voice

There's doubt in doubt.

Of course Bazan shuts the door again in the final verse, and the song ends in an unsettled fashion. But that is what the listeners love to hear.

Incidentally, Bazan's newest music featured on his website is still dealing with Christian themes:

I was trembling with goose-flesh The first time I prayed to speak in tongues

And so on. So the conversion is over, but the conversation is not.

If I look up and the sky's not there...

Did Bazan take believers with him? This seems to be the biggest charge levied against him. It is one thing for a grown man to decide to leave the faith. But it is quite another for an influential musician with an impressionable (mostly younger) audience to do so.

Or, another way to ask: will I let my kids listen to him? Of course they won't want to listen to anything dad does, but hypothetically speaking. Yes, I think so, when they are a certain age. I want them to be able to face tough questions and be stimulated by ideas which are not necessarily "safe" by the standards of Christian culture. However, I will of course at all times accompany that with voices "on the other side," as it were.

That's my recollection of David Bazan for you. Lover of his music, stung but not scandalized by his conversion, thankful for him sharing his experiences.

A categorized, tagged Septuagint corpus

Last year I created a version of the SBLGNT for use as categorized, tagged, corpus for natural language processing. Now I have done the same with a Septuagint text. I am calling it LXXMorph-Corpus. The source for text and tags is my unicode conversion of the CATSS LXXMorph text. There is at least one category for each file.

The text is arranged with one book per file. Certain books in the source LXXMorph text are split where there is significant textual divergence (manuscript B and A, or the Old Greek and Theodotion). Each file has one or more categories (e.g. pentateuch and writings).

Since there is no punctuation in the source text, the files are laid out with one verse per line. A better arrangement from an NLP perspective would be one line per sentence (thereby preserving the semantic structure). Maybe someday we'll have a freely-licensed LXX text which will include sentence breaks.

Each word is accompanied by the morphological tag in the word/tag format (NLTK will automatically split word and tag on the slash). The part of speech tag is separated from the parsing information with a hyphen, which enables the use of the simplify tags function in NLTK.

Here follows an example of how to load this corpus into NLTK:

from nltk.corpus.reader import CategorizedTaggedCorpusReader

def simplify_tag(tag):
        if '-' in tag:
            tag = tag.split('-')[0]
        return tag
        return tag

lxx = CategorizedTaggedCorpusReader('lxxmorph-corpus/', 
    '\d{2}\..*', encoding=u'utf8',

Now through the lxx object you have access to tagged words - lxx.tagged_words(), simplified tags - lxx.tagged_words(simplify_tags=True), tagged sentences - lxx.tagged_sents(), and textual categories - lxx.words(categories='former-prophets').

This is a derivative work of the original CATSS LXXMorph text, and so your use of it is subject to the terms of that license. See the README file for more details.

Spigot 2.2

I have released Spigot 2.2. The primary purpose of this release is to support the use of any arbitrary field in the incoming feed in the format of the outgoing message. Before Spigot limited you to the title or link, but now you can have more options, including author, etc.

This update requires a database schema change as well as an update to your configuration file. The new version will prompt you to upgrade these if necessary. I have provided an upgrade script in the git repo to handle this upgrade for you. New users have nothing to worry about.

Vertically integrating pollution

When I see a an all-electric "zero emission" vehicle, I think of the old deflection: "I gave at the office." In this case, "My emissions were back at the power plant."

Category: κτλ Tags: quips

I, Commish (2): Reforming the league

There is a wide disparity in player payroll among Major League Baseball teams. In 2013 the top team (the NY Yankees) paid its players approximately ten times what the bottom team (the Houston Astros) did. While payroll is not everything in baseball, it does have a fairly strong correlation with the competitiveness of the team. This was born out by the results of this year's Astros team: a dismal 51 wins and 111 losses.

Yet the Astros are hugely profitable. And this is no fluke: thanks to the strength of the business and revenue sharing among the clubs, it is possible to operate a profitable team which is not competitive. But what is good for business is not necessarily good for the league or for the fans. So here are some proposals for increasing the competitiveness of the league.


There are many talented baseball players who make their way onto MLB teams from the United States and all over the world. This does not necessarily mean that there is a enough talent to spread around 30 teams, especially when there is no salary cap or luxury tax. The same goes for coaches and umpires. To promote the strength of the league, it is best to make the talent more dense at that top, and that means eliminating teams.

Thirty is not a great number of teams for sports leagues in general, which, by some ineffable law of the universe, strive for factors of four. So let's cut down the number of major league teams to 24. This way there can be an even number of teams in each league (12), and an equal number of teams in each of three divisions in each league (4).

But what happens to the unlucky six teams which get cut?


As much as it pains me to admit it, there is some innovation in soccer which could be useful here. Major League Baseball could establish a two-tier system with promotion and relegation. The six teams dropping from the bigs would join one of the Triple-A leagues. Additionally, all existing Triple-A teams would have to be unjoined from their parent big league club and made independent. The farm system would have to consist of AA and lower teams. Yes, this is pie in the sky stuff here!

Where I see the strength of this model is in that cities can field a "right-sized" team. The stadium and payroll can match the local market, not the MLB baseline. So Kansas City, for example, could sell out a 25,000 seat stadium, and Miami could field a \$30 million payroll with a straight face. Then the ability of teams to move up and down will match the relative abilities of the franchises and lead to more even competition.

Each year the bottom six teams for MLB (last place in each division) would move down, and the six best AAA clubs would move up. Sadly for Chicago, after 2013 this would have meant losing its entire MLB presence. But in this system, cities cannot take their status for granted, and have to actually compete to stay at the top. And it leaves some room for Cinderalla stories. Maybe the Salt Lake Bees will scrap their way into the major leagues and make a playoff run. This would also provide more excitement for fans to root for their local Triple-A teams: they could get promoted and be playing the Tigers next year.

The overall goal is to let competition drive the motivations of the owners. Obviously playing in the major leagues would afford owners a much greater opportunity for revenue, so it would be in their best interests to field a team which can get there and stay there. If any owners try to coast, they'll get penalized. Fans will be rewarded, because the business goals will more naturally match the competitive aims of the club. And that is for the best.

In my next post, I'll attempt to tackle performance-enhancing drugs, the live ball era, and some random other ideas.

Category: κτλ

I, Commish (1): Back to Basics

I have some fairly radical changes I would want to make if I were the Commissioner of baseball. But before trying anything drastic, there are a few easy fixes I would focus on.

World Series Home Field Advantage and the All-Star Game

The 2002 All-Star Game ending in a tie was un-American. This is baseball, after all! Nonetheless, the decision to base home-field advantage in the World Series on the result of the All-Star game was a silly overreaction. Sure, fans threw beer bottles and commentators skewered Selig in the press. But it was a short-sighted decision.

The All-Star game is supposed to be all about fun. Artificially adding importance to it has the effect of making the whole thing decidedly less fun, since the manager and players know that losing can have real consequences for their team down the line. Honoring the best players in the game is reason enough to hold the All-Star game.

So here is the simple fix: either base home-field advantage in the World Series on overall record (with tiebreak scenarios), or simply have it alternate between leagues.

The Wildcard Play-In

Major League Baseball added a play-in game as a permanent fixture of the wildcard system for the playoffs in 2012. Previously there was only a play-in game if two teams tied for the best at large record in the league. Now there is a game between the next best two teams no matter what.

It seems that the motivation for this additional game is purely to get one extra game with playoff excitement. I also like to think of it as Major League Baseball providing one last chance for the major market teams (especially the Yankees and Red Sox) to make the playoffs.

While I love the excitement of a 163rd game, it is grossly unfair to teams which have earned the wildcard berth outright. Consider Atlanta in 2012, the inaugural year of this system. They were a full six games ahead of the next-closest team, the St. Louis Cardinals. Yet due to the silly one-game play-in, the Braves had their post-season hopes squashed. The 162-game regular season is just too long to let everything come down to a single game. The Wildcard Play-In has to go, reverting to the original system.

Official Replay

The use of video instant-reply to adjudicate sports is the great gnostic heresy of our time. It has already practically ruined football and hockey, and has an unfortunate and growing hold in baseball. The never-ending desire to know "what really happened" will probably inevitably lead to all professional sports adopting replay - and perhaps completely computerizing officiating.

Officials are a human element of the game, just like the athletes. A blown call is a tragic part of the drama of sports, just like a crucial error in the field. The game can survive the errors of officials. It is, after all, just a game. And it has worked well for many decades. Technology cannot perfect baseball, so I would stick with traditional officiating (and booing the umps when they get it wrong).

Free Pete!

I am half expecting Selig to end baseball's lifetime ban on Pete Rose before leaving office. In so doing he would emulate a rich heritage of US Presidents pardoning a slew of criminals on their way out of the White House. Shouldn't Selig endeavor to seem gracious and merciful on his way out?

The ban has gone on long enough, and I think everyone gets the message: do not gamble. If Selig does not free Pete, I will.

Category: κτλ

I, Commish: If I ruled Major League Baseball

Bud Selig will retire as the Commissioner of Major League Baseball after next season. His tenure certainly has been eventful. Under his oversight the league experienced the 1994 strike, expansion and the wildcard format, inter-league play, and the steroid era. The league has never been more popular or profitable, yet Selig is a controversial figure, and will leave a mixed legacy.

I started to imagine how I would execute the job of MLB commissioner. And I let my imagination get a bit carried away, because I also imagined that I had total control of the league, which the office clearly does not. Still I came up with a series of changes I would like to see made to the game. Some are realistic, some are not. Some reflect baseball traditionalism, and some are out of left field. I'll share a bunch of these ideas in a forthcoming series of posts: "I, Commish."

Category: κτλ Tags: basebal

Spigot 2.0

I updated Spigot to work with! In addition, the package is now included in pypi, so you can install it with pip:
pip install spigot

Then you'll have on your path. Running the first time will prompt you to configure one account and one feed. Use --help for all options, and check out the project page for more info. Git repo is here.

A categorized, tagged Greek New Testament corpus

I have published a categorized, tagged Greek New Testament useful for natural language processing. I am calling it sblgnt-corpus. The text comes from the SBGNT and the morphological tags come from the MorphGNT project.

The text is broken up with one book per file. Each file has one or more categories (e.g. gospel and pauline). In the files there is one sentence (not verse) per line. Sentences are demarcated by punctuation . ; and ·. This makes it easy to tokenize sentences by splitting on newlines. Each word is accompanied by the morphological tag in the word/tag format (NLTK will automatically split word and tag on the slash). The part of speech tag is separated from the parsing information with a hyphen, which enables the use of the simplify tags function in NLTK.

Here is an example:

εὐθυμεῖ/V-3PAIS τις/RI-NSM ;/;
ψαλλέτω/V-3PADS ./.

Here follows an example of how to load this corpus into NLTK:

from nltk.corpus.reader import CategorizedTaggedCorpusReader

def simplify_tag(tag):
        if '-' in tag:
            tag = tag.split('-')[0]
        return tag
        return tag

sblgnt = CategorizedTaggedCorpusReader('sblgnt-corpus/', 
    '\d{2}-.*', encoding=u'utf8',

Now through the sblgnt object you have access to tagged words - sblgnt.tagged_words(), simplified tags - sblgnt.tagged_words(simplify_tags=True), tagged sentences - sblgnt.tagged_sents(), and textual categories - sblgnt.words(categories='gospel').

That should be enough to kickstart the exploration of the Greek New Testament with natural language processing.

A review of Harper's classified ads

Harper's Magazine is the second-oldest continuously published magazine in the United States. Its combination of political commentary, general reporting, poetry, short fiction, art, and book reviews is enjoyed by just north of 200,000 subscribers. Based on the advertizing in its pages I surmise that the readership is generally older adults, wealthy, well-educated and intellectual, and mostly in the northeast. And it is this demographic which makes the contents of its classified ads so mystifying and amusing.

The Predictable

There are a few ads which meet my expectations about what sort should be in Harper's. Take for example an ad for the international tea importing business. This strikes me as right up the readership's alley, and it has been present in the classifieds as long as I have subscribed. Strangely the same ad actually appears twice in the current issue, in the outer columns of facing pages, such that when the page is closed, the ads would almosttouch.

Then you have the ad for "holistic organic" skin care products - exactly what older folks with disposable income are supposed to be buying. And the ad for the "documentaries on demand" service, which confusingly places a red heart glyph () in the printed URL.

The final ad in this category is another long-standing one - "European Beret \$14." Just what every American intellectual needs! My favorite part of this one is the rather goofy accompanying picture of middle age man articulating a point whilst wearing a beret. Now is the picture of a genuine European, or meant to convey what an American who purchases such a hat can achieve? As it happens the vendor for these berets is within walking distance of my work, so I may have to stop by for a fitting.

Aspiring Writers

There are a couple of ads for writers. As it happens, this is a rather new trend in Harper's classifieds.

One introduces the reader to book one of a trilogy, and confusingly (there's that word again) asks the reader to "buy it and book 3." I guess book two is dispensable.

And a very audience-aware ad seeks a "literary patron from the 1%." I assure you that no classified ad could more obtusely attempt to capture the zeitgeist of Harper's Magazine than this one. I wish the author well.


Would you like some "unorthodox" reading material? Or perhaps something "tasteful"? These ads are a mainstay. And for whatever reason, their publishers all seem to be based in New Jersey.

Moving to the higher brow, there is an ad for Quaker dating website, but it appears that the core value shared is caring about "social issues" rather than religion. And then there is the website which allows you to "date accomplished people" who have attended certain prestigious universities. Who said anything about this being a classless society?


This next ad actually blurs the lines between pseudoscience and "romance." Is your love life struggling? Try pheromones. Just check this testimonial:

My wife completely changed her reaction to me. Where before she was straining to be affectionate now she is flirty . . . I can hardly believe she is the same woman.

There's nothing like subconscious biological coercion to sweeten a relationship! I am not sure what editorial criteria there are for classified ads in Harper's, but in my opinion this one should be excluded on the grounds that it is either bunk, or (if it really works) disturbing.

There's also a paranoid sounding ad about "water scams" and some crazy tripe about forecasting future events. Really, is Harper's that hard up for a few dollars?


Honestly the Harper's readership does not seem like it would be interested in European hats pseudoscience or dating websites. But as I mentioned, some of these ads are long-standing, so I can only imagine that they work. And perhaps this is an indictment of the Harper's Magazine readership. No matter how sophisticated we perceive ourselves to be, we are still in the market for silliness.

Category: κτλ

"Theft" of ancient texts?

Over at b-greek it was pointed out that some freely-available editions of Patrologia Graeca had been taken from a collection on which Thesaurus Linguae Graecae claimed copyrights.

I'd like to take this opportunity to once again question whether ancient texts should be copyrightable. On the one hand, digital transcription requires significant work and I'd like to see publishers rewarded for their efforts. On the other hand, modern editors of ancient texts have no sensible claim of copyright. Indeed, if their source texts were not in the public domain, they themselves would be guilty of copyright violation, as derivative works are covered by the original author's copyrights.

So how do you keep publishers motivated to continue at transcription without the revenue stream which comes from leveraging copyright law? Once again I'd like to argue for the patronage system. If the text is desired in a digital format, the community at large can raise funds for the transcription effort. Then publishers can be further rewarded by profits made from sale of physical media, etc.

Category: κτλ

Announcing Spigot

I am a StatusNet user (find me @nds on, and from time to time I like to automatically share links to blog posts and other syndicated content on my account. There are some excellent tools to do this, but I was left wanting. Tricklepost has the great feature of being able to limit the rate at which posts come through. However it has the rather onerous requirement of a full-blown mysql install and is not very flexible. is a service which can post to many types of accounts (not just StatusNet), but it is also a full web application and does not have rate-limiting. I wanted something fairly light which I could run on my local system as a cron job.

So I wrote my own. Well, sort of: I stood on the shoulders of the Identicurse project, which had already implemented Python bindings to the StatusNet API.

Spigot is a rate-limiting feed aggregator to StatusNet accounts. It requires only Python 2.6 or greater, standard library modules, and a couple of 3rd-party modules which are easily accessible via the Python package index. It can poll an arbitrary number of feeds and post to an arbitrary number of accounts. You can set a minimum interval between posts for each feed. See the project page for information on obtaining and running it.

This is the first major Python project I've seen from start to finish, so I am fairly proud. Please contact me with any bugs or requests or patches.