Author Archives: Galen Charlton

Coding in an age of impunity

Do you prefer that your coding not be mixed with politics? That your libraries stand alone in pristine neutrality? You are already doomed to disappointment, whether you know it or not; but especially on this blog from this day forward.

Consider this: when all the laws are smashed flat, what chance do codes of conduct and codes of ethics stand?

I hope we do not all find out; I fear we might.

To say that the election of Trump marks the beginning of an age of impunity is of course a lie: the unanswered trampling of the oppressed that has been going on for years, for decades, for millennia did not start last Tuesday.

And yet, things can get worse; have gotten worse. I can link to this without betraying confidences; I can point out this for an example near my home; I can listen to my friends who walk a much more dangerous path than mine.

Suffice it to say that Trump need not sign a single law, appoint a single judge, to cause ill during his tenure — those emboldened by his ascension can act on their hate and have done so. And who is going to advise Trump to repudiate them… Stephen Bannon?

Thought not.

What follows seems almost laughable in its insufficiency, particularly if the Trump administration goes full fascist, but defense in depth, perhaps?

We need to look to our codes, and buttress what we can.

Codes of conduct for professional conferences? I’m under no illusion that the Code4Lib Code of Conduct or the ALA Statement of Appropriate Conduct guarantee safety for anyone… but implemented correctly, and with teeth, they might at least maintain spaces where hate cannot operate with complete impunity.

The ACM Code of Ethics? Principles 1.2 (avoid harm to others), 1.4 (be fair and take action not to discriminate), 1.7 (respect the privacy of others), and 1.8 (honor confidentiality) are more important than ever: nuclear weapons may kill us quick, but software is all too easily turned into an instrument of oppression.

The ALA Code of Ethics? Privacy has always been a matter of life and death for especially vulnerable library patrons. Now, we live in a time when Newt Gingrich is, unironically, suggesting that that the thing to do is to revive the House Un-American Activities Committee and Trump threatens to silence those who mock him.

What can we expect in an age of impunity? For some, the disaster is now. Trump may well lead us into a quick general disaster: nuclear war, global depression, genocide. Against that, computers and libraries may not amount to much — but we can but use whatever tools we can seize to survive and to perpetuate our stories.

A longer, slower disaster is possible — and here, we must watch for more subtle traps: compromises that may or may not mitigate immediate pain, that may or may not pave the way for worse and worse. Or perhaps, we may yet see change for the better (though climate change looms over all).

Either way, we must look to our codes, strengthen what we can, protect life where we can.

And yes, the preceding feels utterly laughable. In fact, I would relish being taken for a fool, a chicken little whose reputation for prognostication is so bad that my assertion that the sun will rise tomorrow is met with cries of “pull the other one!”

I don’t expect that hope will come so easily.

An easy vote

A political post for today.

Two and a half weeks ago I stood in line for a hour in Lawrenceville, Gwinnett County, Georgia and participated in early voting.

Some of the decisions I had to make were a little difficult. Consider the statewide ballot initiatives. Two of them were about allocating money for specific purposes — and I felt torn about both, on procedural grounds: it within the power of an elected, representative state legislature to levy taxes and spend the receipts as they see fit. Sending to the voters the question of where to direct tax proceeds from the sale of fireworks is an abdication of responsibility on the part of the legislators, who could just as well deal with it in the general budget. Similarly, the legislature could directly fund anti-human-trafficking programs. I voted for amendments 2 and 4, but reluctantly.

Another difficult decision: voting for supervisors for the Gwinnett County Soil and Water Conservation District. That’s pretty important: Gwinnett County is growing, and we’re in a drought. And yet, I couldn’t find much information about the candidates positions or professional affiliations.

Other decisions were easy: yes, Jim Shealey, I hope you make it in as chair of the county commission: it would be nice to see steps towards getting light rail in Gwinnett County.

No, Mr. Privatize Nuclear Waste Management, privatization pixie dust, no matter how much is sprinkled, neither makes the half-life any shorter nor relieves government of the ultimate expense of dealing with the stuff.

No, Butch Conway, I am not in favor of Gwinnett County’s participation in the 287(g) program: immigration enforcement is a federal responsibility, and Gwinnett County does not need its sheriff’s deputies playing immigration cop. I’m just sorry nobody is running against you.

No, incumbents of the County Commission and Board of Education, I don’t particularly care for your gerrymandering ways. I do not actually need the people who represent me to all look like me. Gwinnett County is a majority-minority county now. Live with it.

Yes, Pedro Marin, you stay put in the statehouse, opposing things like RFRA.

 

One decision was really easy.

I am with her.

I voted for Hillary Clinton with alacrity and pleasure.

I am certainly not for Trump. He is a joke of candidate; he is racist; he is misogynist; he has no self-control; he has no policies that would survive a momentary breeze, save perhaps the enrichment of his own ego.

A Trump administration would cause incalculable harm; his merely running has already done so. And this is personal: I have friends who have watched the climate of transphobia grow this year — friends who are afraid that their marriages may be taken away from them — friends under crushing student debt who do not need a feckless man blowing up the economy — friends who see increasing anti-Semitism and hate against Muslims and hate against black people and hate against all difference — who know exactly where this can lead to.

Oh, by the way: a Trump administration would harm people who look like me, a white man. Over the long run — whither our souls if we do not give up hegemony? — but possibly in the short term. White male privilege is an amazingly ineffective shield against nuclear blast.

But more importantly, I am for Clinton. She’s not merely (and by far) the lesser of two evils; I believe that a Clinton administration will result in more justice and equity at home and will allow us to play our part on the global stage with dignity. I believe that she will do better against climate change; I believe that she will appoint prudent people to run the government.

Of course, her ability to do that depends on a lot whether she gets a Senate that will work with her, rather than obstruct everything she does.

If you haven’t voted already, please do so today.

And stay safe out there.

Visualizing the global distribution of Evergreen installations from tarballs

In August I made a map of Koha installations based on geolocation of the IP addresses that retrieved the Koha Debian package. Here’s an equivalent map for Evergreen:

Downloads of Evergreen tarballs in past 52 weeks

Click to get larger image

As with the Koha map, this is based on the last 52 weeks of Apache logs as of the date of this post. I included only complete downloads of Evergreen ILS tarballs and excluded downloads done by web crawlers.  A total of 1,317 downloads from 838 distinct IP addresses met these criteria.

The interactive version can be found on Plotly.

How to build an evil library catalog

Consider a catalog for a small public library that features a way to sort search results by popularity. There are several ways to measure “popularity” of a book: circulations, hold requests, click-throughs in the catalog, downloads, patron-supplied ratings, place on bestseller lists, and so forth.

But let’s do a little thought experiment: let’s use a random number generator to calculate popularity.

However, the results will need to be plausible. It won’t do to have the catalog assert that the latest J.D. Robb book is gathering dust in the stacks. Conversely, the copy of 1959 edition of The geology and paleontology of the Elk Mountain and Tabernacle Butte area, Wyoming that was given to the library right after the last weeding is never going to be a doorbuster.

So let’s be clever and ensure that the 500 most circulated titles in the collection retain their expected popularity rating. Let’s also leave books that have never circulated alone in their dark corners, as well as those that have no cover images available. The rest, we leave to the tender mercies of the RNG.

What will happen? If patrons use the catalog’s popularity rankings, if they trust them — or at least are more likely to look at whatever shows up near the top of search results — we might expect that the titles with an artificial bump from the random number generator will circulate just a bit more often.

Of course, testing that hypothesis by letting a RNG skew search results in a real library catalog would be unethical.

But if one were clever enough to be subtle in one’s use of the RNG, the patrons would have a hard time figuring out that something was amiss.  From the user’s point of view, a sufficiently advanced search engine is indistinguishable from a black box.

This suggests some interesting possibilities for the Evil Librarian of Evil:

  • Some manual tweaks: after all, everybody really ought to read $BESTBOOK. (We won’t mention that it was written by the ELE’s nephew.)
  • Automatic personalization of search results. Does geolocation show that the patron’s IP address is on the wrong side of the tracks? Titles with a lower reading level just got more popular!
  • Has the patron logged in to the catalog? Personalization just got better! Let’s check the patron’s gender and tune accordingly!

Don’t be the ELE.

But as you work to improve library catalogs… take care not to become the ELE by accident.

A small thought on library and tech unions in light of a lockout

I’ve never been a member of a union. Computer programmers — and IT workers in general — in the U.S. are mostly unorganized. Not only that, they tend to resist unions, even though banding together would be a good idea.

It’s not necessarily a matter of pay, at least not at the moment: many IT workers have decent to excellent salaries. Of course not all do, and there are an increasing number of IT job categories that are becoming commoditized. Working conditions at a lot of IT shops are another matter: the very long hours that many programmers and sysadmins work are not healthy, but it can be very hard to be first person in the office to leave at a reasonable quitting time day.

There are other reasons to be part of a union as an IT worker. Consider one of the points in the ACM code of ethics: “Respect the privacy of others.” Do you have a qualm about writing a web tracker? It can be hard to push back all by yourself against a management imperative to do so. A union can provide power and cover: what you can’t resist singly, a union might help forestall.

The various library software firms I’ve worked for have not been exceptions: no unions. At the moment, I’m also distinctly on the management side of the table.

Assuming good health, I can reasonably expect to spend another few decades working, and may well switch from management to labor and back again — IT work is squishy like that. Either way, I’ll benefit from the work — and blood, and lives — of union workers and organizers past and future. (Hello, upcoming weekend! You are literally the least of the good things that unions have given me!)

I may well find myself (or more likely, people representing me) bargaining hard with or against a union. And that’s fine.

However, if I find myself sitting, figuratively or literally, on the management side of a negotiation table, I hope that I never lose sight of this: the union has a right to exist.

Unfortunately, the U.S. has a long history of management and owners rejecting that premise, and doing their level best to break unions or prevent them from forming.

The Long Island University Faculty Federation, which represents the full time and adjunct faculty at the Brooklyn campus of LIU, holds a distinction: it was the first union to negotiate a collective bargaining agreement for faculty at a private university in the U.S.

Forty-four years later, the administration of LIU Brooklyn seems determined to break LIUFF, and have locked out the faculty. Worse, LIU has elected not to continue the health insurance of the LIUFF members. I have only one word for that tactic: it is an obscenity.

As an aside, this came to my attention last week largely because I follow LIU librarian and LIUFF secretary Emily Drabinski on Twitter. If you want to know what’s going on with the lockout, follow her blog and Twitter account as well as the #LIUlockout hashtag.

I don’t pretend that I have a full command of all of the issues under discussion between the university and the union, but I’ve read enough to be rather dubious that the university is presently acting in good faith. There’s plenty of precedent for university faculty unions to work without contracts while negotiations continue; LIU could do the same.

Remember, the union has a right to exist. Applies to LIUFF, to libraries, and hopefully in time, to more IT shops.

If you agree with me that lockouts are wrong, please consider joining me in donating to the solidarity fund for the benefit of LIUFF members run the by American Federation of Teachers.

The blossoming of the Mellie-cat

A cat who has decided to take up more space in the world.

A cat who has decided to take up more space in the world.

Sixteen years is long enough, surely, to get to know a cat.

Nope.

Amelia had always been her mother’s child. She had father and sister too, but LaZorra was the one Mellie always cuddled up to and followed around. Humans were of dubious purpose, save for our feet: from the scent we trod back home Mellie seemed to learn all she needed of the outside world.

Her father, Erasmus, left us several years ago; while Mellie’s sister mourned, I’m not sure Rasi’s absence made much of an impression on our clown princess — after all, LaZorra remained, to provide orders and guidance and a mattress.

Where Zorri went, Mellie followed — and thus a cat who had little use for humans slept on our bed anyway.

Recently, we lost both LaZorra and Sophia, and we were afraid: afraid that Amelia’s world would close in on her. We were afraid that she would become a lost cat, waiting alone for comfort that would never return.

The first couple days after LaZorra’s passing seemed to bear our fears out. Amelia kept to her routine and food, but was isolated. Then, some things became evident.

Our bed was, in fact, hers. Hers to stretch out in, space for my legs be damned.

Our feet turned out not to suffice; our hands were required too. For that matter, for the first time in her life, she started letting us brush her.

And she enjoyed it!

Then she decided that we needed correction — so she began vocalizing, loudly and often.

And now we have a cat anew: talkative and demanding of our time and attention, confident in our love.

Sixteen years is not long enough to get to know a cat.

Visualizing the global distribution of Koha installations from Debian packages

A picture is worth a thousand words:

Downloads of Koha Debian packages in past 52 weeks

Click to get larger image.

This represents the approximate geographic distribution of downloads of the Koha Debian packages over the past year. Data was taken from the Apache logs from debian.koha-community.org, which MPOW hosts. I counted only completed downloads of the koha-common package, of which there were over 25,000.

Making the map turned out to be an opportunity for me to learn some Python. I first adapted a Python script I found on Stack Overflow to query freegeoip.net and get the latitude and longitude corresponding to each of the 9,432 distinct IP addresses that had downloaded the package.

I then fed the results to OpenHeatMap. While that service is easy to use and is written with GPL3 code, I didn’t quite like the fact that the result is delivered via an Adobe Flash embed.  Consequently, I turned my attention to Plotly, and after some work, was able to write a Python script that does the following:

  1. Fetch the CSV file containing the coordinates and number of downloads.
  2. Exclude as outliers rows where a given IP address made more than 100 downloads of the package during the past year — there were seven of these.
  3. Truncate the latitude and longitude to one decimal place — we need not pester corn farmers in Kansas for bugfixes.
  4. Submit the dataset to Plotly with which to generate a bubble map.

Here’s the code:

An interactive version of the bubble map is also available on Plotly.

Cats who reside in story

The tragedy of keeping house with cats is that their lives are so short in comparison to our own.

On Friday, Marlene and I put Sophie to rest; today, LaZorra. Four years ago, we lost Erasmus; before that, Scheherazade and Jennyfur. At the moment, we have just one, Amelia. It was a relief that she got a clean bill of health on Saturday… but she is nonetheless sixteen years old. The inexorability of time weighs heavily on me today.

I have no belief that there is any continuation of thought or spirt or soul after the cessation of life; the only persistence I know of for our cats is in the realm of story. And it is not enough: I am not good enough with words to capture and pin down the moment of a cat sleeping and purring on my chest or how the limbs of our little feline family would knot and jumble together.

Words are not nothing, however, so I shall share some stories about the latest to depart.

2016-03-11 07.54.55

LaZorra was named after the white “Z” on her back, as if some bravo had decided to mark her before she entered this world. LaZorra was a cat of great brain, while her brother Erasmus was not. We would joke that LaZorra had claimed not only her brain cells, but those of her daughters Sophia and Amelia. (Who were also Erasmsus’ children; suffice it to say that I thought I had more time to spay LaZorra than was actually the case).

Although she was a young mother, LaZorra was a good one. Scheherazade was alive at the time and also proved to be a good auntie-cat.

Very early on, a pattern was set: Sophie would cuddle with her father Rasi; Mellie with her mother Zorrie. LaZorra would cuddle with me; as would Erasmus; per the transitive property, I ended up squished.

But really, it took only one cat to train me. For a while LaZorra had a toy that she would drag to me when she wanted me to play with her. I always did; morning, afternoon, evening, at 2 in the morning…

“NO!”

Well, that was Marlene reminding me that once I taught a cat that I could be trained to play with her at two a.m. that there would be no end of it—nor any rest for us—so I did not end up being perfectly accommodating.

But I came close. LaZorra knew that she was due love and affection; that her remit included unlimited interference with keyboards and screens. And in the end, assistance when she could no longer make even the slight jump to the kitchen chair.

Sophia

When we lost Erasmus to cancer, Marlene and I were afraid that Sophie would inevitably follow. For her, Rasi was her sun, moon, and stars. We had Erasmus euthanized at home so that the others would know that unlike the many trips for chemo, that this time he was not coming back. Nonetheless, Sophie would often sit at the door, waiting for her daddy to come back home.

She never stopped doing that until we moved.

It was by brush and comb, little by little as she camped out on the back of the couch, that I showed her that humans might just possibly be good for something (though not as a substitute for her daddy-cat). It is such a little thing, but I hold it as one of my personal accomplishments that I helped her look outward again.

Eventually those little scritches on the back of the couch became her expected due: we learned that we were to pay the Sophie-toll every time we passed by her.

Both LaZorra and Sophie were full of personality—and thus, they were often the subjects of my “Dear Cat” tweets. I’ll close with a few of them.

Butter to LaZorra was as mushrooms to hobbits:

At times, she was a little too clever for her own good:

Sophie was the only cat I’ve known to like popping bubblewrap:

Sophie apparently enjoyed the taste of cables:

LaZorra was the suitcase-inspector-in-chief:

And, of course, they could be counted on to help with computation:

They both departed this world with pieces of our hearts in their claws.

What makes the annual Code4Lib conference special?

There’s now a group of people taking a look at whether and how to set up some sort of ongoing fiscal entity for the annual Code4Lib conference.  Of course, one question that comes to mind is why go to the effort? What makes the annual Code4Lib conference so special?

There are lot of narratives out there about how the Code4Lib conference and the general Code4Lib community has helped people, but for this post I want to focus on the conference itself. What does the conference do that is unique or uncommon? Is there anything that it does that would be hard to replicate under another banner? Or to put it another way, what makes Code4Lib a good bet for a potential fiscal host — or something worth going to the effort of forming a new non-profit organization?

A few things that stand out to me as distinctive practices:

  • The majority of presentations are directly voted upon by the people who plan to attend (or who are at least invested enough in Code4Lib as a concept to go to the trouble of voting).
  • Similarly, keynote speakers are nominated and voted upon by the potential attendees.
  • Each year potential attendees vote on bids by one or more local groups for the privilege of hosting the conference.
  • In principle, most any aspect of the structure of the conference is open to discussion by the broader Code4Lib community — at any time.
  • Historically, any surplus from a conference has been given to the following year’s host.
  • Any group of people wanting to go to the effort can convene a local or regional Code4Lib meetup — and need not ask permission of anybody to do so.

Some practices are not unique to Code4Lib, but are highly valued:

  • The process for proposing a presentation or a preconference is intentionally light-weight.
  • The conference is single-track; for the most part, participants are expected to spend most of each day in the same room.
  • Preconferences are inexpensive.

Of course, some aspects of Code4Lib aren’t unique. The topic area certainly isn’t; library technology is not suffering any particular lack of conferences. While I believe that Code4Lib was one of the first libtech conferences to carve out time for lightning talks, many conferences do that nowadays. Code4Lib’s dependence on volunteer labor certainly isn’t unique, although putting aside keynote speakers) Code4Lib may be unique in having zero paid staff.

Code4Lib’s practice of requiring local hosts to bootstrap their fiscal operations from ground zero might be unique, as is the fact that its planning window does not extend much past 18 months. Of course, those are both arguably misfeatures that having fiscal continuity could alleviate.

Overall, the result has been a success by many measures. Code4Lib can reliably attract at least 400 or 500 attendees. Given the notorious registration rush each fall, it could very likely be larger. With its growth, however, come substantially higher expectations placed on the local hosts, and rather larger budgets — which circles us right back to the question of fiscal continuity.

I’ll close with a question: what have I missed? What makes Code4Lib qua annual conference special?

Update 2016-06-29: While at ALA Annual, I spoke with someone who mentioned another distinctive aspect of the conference: the local host is afforded broad latitude to run things as they see fit; while there is a set of lore about running the event and several people who have been involved in multiple conferences, there is no central group that dictates arrangements.  For example, while a couple recent conferences have employed a professional conference organizer, there’s nothing stopping a motivated group from doing all of the work on their own.

Naming and responding to hate — YAPC::NA and ALA Annual in Orlando

Tomorrow we will drive to Orlando, as next week I’m attending two conferences: the Perl Conference (YAPC::NA) and the American Library Association’s Annual 2016 conference.

A professional concern shared by my colleagues in software development and libraries is the difficult problem of naming. Naming things, naming concepts, naming people (or better yet, using the names they tell us to use).

Names have power; names can be misused.

In light of what happened in Orlando on 12 June, the very least we can do is to choose what names we use carefully. What did happen? That morning, a man chose to kill 49 people and injure 53 others at a gay bar called the Pulse. A gay bar that was holding a Latin Night. Most of those killed were Latinx; queer people of color, killed in a spot that for many felt like home. The dead have names.

Names are not magic spells, however. There is no one word we can utter that will undo what happened at the Pulse nor immediately construct a perfect bulwark against the tide of hate. The software and library professions may be able to help reduce hate in the long run… but I offer no platitudes today.

Sometimes what is called for is blood, or cold hard cash. If you are attending YAPC:NA or ALA Annual and want to help via some means identified by those conferences, here are options:

I will close with this: many of our LGBT colleagues will feel pain from the shooting at a level more visceral than those of us who are not LGBT — or Latinx — or people of color. Don’t be silent about the atrocity, but first, listen to them; listen to the folks in Orlando who know what specifically will help the most.