OJS

Our library is OJS-curious these days, so I thought I’d set up a test instance so that we can kick the tires. This post is a quick summary of the steps needed to get this working:

  1. Install KVM and virt-manager (and dependencies) on my laptop, to create and manage virtual machines.
  2. Spend quite a while debugging virt-manager, which was throwing an error. After a lot of digging, I realized I needed to enable virtualization in the BIOS.
  3. Create a VM using the virt-manager GUI. I wanted to do this project in a VM because I really didn’t want to bork my daily setup; a VM solves this problem very nicely.
  4. Install Debian bookworm as the guest OS. This took forever because (a) Debian installs are slow, (b) my laptop is not high powered, and (c) I provisioned the VM very minimally. I did some yoga while it whirred.
  5. Boot up the guest OS and install PHP and PostgreSQL.
  6. Install some more PHP dependencies: both those specified by OJS, and some others needed to support PostgreSQL.
  7. Set up the database, with the help of claude.ai :)
  8. Run the development server that is included with OJS, and do the required setup by loading the configuration page on localhost. The installation process then kicks off.
  9. Answer a few more questions, and voilĂ ! Up and running!

I think this took me about four hours altogether, but I bet you could dispatch it more quickly!

Posted in debian, ojs, vm | Leave a comment

Code4Lib 2025

The annual Code4Lib conference was earlier this week, and as always, it was inspiring and motivating. This was my 5th Code4Lib, and it has become an important part of my professional life. Talks range from the very high-level to the very detailed, and it is testament to this community that they reliably inspire no matter where they fall on this continuum.

Anyhow, here are some things I came back to my office wanting to tackle:

  • Add a “Suggest this page for accessibility remediation” link to all of our LibGuides pages, so that users can flag accessibility issues.
  • Go further in my weird journey into GitHub-LibGuides integration. I met someone else at the reception who is also doing this work, and we had an intense, long talk about our approaches.
  • Write some Vue code to randomly swap out the jumbotron image on our library home page. This should be a fun, smallish project that I made some good initial progress on at the conference.

I’m already anticipating the next Code4Lib!

Posted in code4lib, conference | Leave a comment

Pivot

As I get older, I recognize that my capacity to contribute meaningful code to librarianship is diminishing. For me, coding was originally a backup plan: a career path that I could pursue if I didn’t get tenure. But it didn’t come to that, thankfully. Also, it turned out that I love coding, and that it has brought me a great deal of joy over the years. But the window of opportunity to transition to a programming role has rapidly closed. The impression I get is that by my age, most coders have become managers and stop writing software as intensively.

Anyhow, I am fine with this. There’s not much I can do about it anyway. The result is that I should probably not continue to put all my eggs in one programming basket, and find something else to do with my time. So recently I’ve been focusing more on “peri-scholarhship”. Going forward, I want to put more of my efforts into supporting librarianship by writing articles, reading them, reviewing them, editing them, working in the publication process, and so on. I know I’m a marginal participant in this world, at best. But my calculation is that with the years I have left in the profession, I’ll be able to make more of a contribution via peri-scholarship than I would by continuing to chase JavaScript libraries.

All this to say that posts to this blog may become less frequent. I hope you’ll stay subscribed to the feed, because I’m not closing down the blog, just shifting the emphasis elsewhere for a bit.

Posted in old | Leave a comment

Obligatory static site generator post

This past week, the CUNY Academic Commons — the home for this blog — was offline for a few days, as they were migrating to new hosting. Then, when it came back, you may have noticed that the theme for the blog was all wonky, and some of the functionality was not working.

Anyhow, this got me thinking that maybe I shouldn’t be relying on the Commons. WordPress has had a number of problems for quite a while now. While I enjoy being on a managed platform where, for the most part, I don’t really have to worry about things, I really chafe at the lack of customizability, too. It might be time to move on.

So over the weekend I did a test migration to Pelican, a static site generator in Python. The results were pretty good. I was able to customize (so satisfying!) a Pelican theme and import my WordPress archive. The Pelican blog is running on localhost here and it looks and works fine.

In the end, I do think Pelican is probably the better technology. I only hesitate to switch because I don’t want to break all of the inbound links.

Posted in blog, python, static site generator | Leave a comment

Log

On Saturday, March 14th, 2020, the day after we were sent home on account of the plague’s arrival in New York, I started keeping a log of all of the work things that I did. With very few exceptions, I’ve kept logging every day since then. The log is now approaching 10,000 entries, so I thought I should do some sort of summary. I wrote a quick Python script to do some keyword counting, and here are the top mentions (excluding stopwords):

  1. talk (1159)
  2. email (1056)
  3. reference (776)
  4. meeting (623)
  5. work (578)
  6. committee (493)
  7. post (367)
  8. blog (316)
  9. tweeting (309)
  10. writing (303)
  11. website (275)
  12. paper (261)
  13. chat (256)
  14. send (240)
  15. alma (222)
  16. update (214)
  17. new (197)
  18. acquisitions (190)
  19. annual (189)
  20. submit (185)

I’m surprised “tweeting” is in there, as we shut down our library Twitter/X account upon Elon’s takeover in 2022, and I haven’t had a personal Twitter account since 2017. But it’s there, so it was obviously front of mind at the time.

Posted in python | Leave a comment

Further into GitHub Actions

Since my last post, I’ve been moving more things over to GitHub Actions. It has been an interesting journey. Some things are pretty straightforward to port from PythonAnywhere Tasks. Others have puzzled me a bit more.

As an example of the latter, I wanted to set up my rss-to-mastodon bot as a GitHub Action. It’s not a complicated bit of code — it posts the latest from an RSS feed to Mastodon — but one piece was tricky: the code relies on a file that contains the title of the last blog post that it has processed. How do you persist (and possibly modify) this one little piece of data across invocations?

The main challenge here is that, with GitHub Actions, you don’t really have a persistent filesystem. You do however, have a temporary filesystem pre-populated with whatever is committed to your git repository. So with a bit of yaml and bash, you can read a text file — which you’ve stored in your GitHub repository — and pass it as an argument to a Python script:

- name: 'run the python script'
  run: |
    pip install -r requirements.txt
    python fetch.py "$(< last_post.txt)"

Which works great. You can then access this positional argument with Python’s argparse library, and you’re off and running.

But we’re not done. Once your Python code has executed, the last_post.txt file needs to be updated with the latest data. You can try writing to file, you can even commit to git, but that is not going to be sufficient, because the filesystem is going to disappear in a few seconds. So you need to run through the whole add, commit and push workflow to push the changes to the remote repository (in this case, GitHub). The remote repository will be all that remains once the job runs to completion.

- name: 'commit if changed'
  run: |
    git add last_post.txt
    if [[ $(git diff --staged --name-only) ]]; then
      git commit -m "Saved new post [skip actions]"
      git push origin main
    else
      echo "No changes detected"
    fi

This bit of yaml and bash commits and pushes (if there are any changes). That’s it! If you want to see the whole workflow in yaml, it is available here.

To be clear, this is not the only possible way to solve this problem; I did consider other options (such as caching, or file storage extensions), which have their own advantages and disadvantages. I welcome your thoughts as to what you think is best!

Posted in git, github, shell, yaml | Comments closed

GitHub Actions

Today I moved some bots from PythonAnywhere over to GitHub Actions. This is a follow-up to my previous post about migrating the front-end of the bots over to mastodon.ocert.at. Now I’m modernizing the back-end with GitHub Actions.

There were a few reasons for this switch:

  • I get GitHub Pro services for free via the GitHub Education program, so there’s really no reason to pay $5/month for PythonAnywhere.
  • As I’ve discussed before, I think that PythonAnywhere is dying, so it’s best to get out of there before things get really ugly.
  • My work with the Alma Extensibility Task Force is moving toward GitLab CI/CD, so this was a good opportunity to learn about YAML and deploying via git. This part was super interesting and I have already learned a lot. I am hoping this experience with GitHub Actions translates well to GitLab.
  • And lastly, it’s just nice to move to some more modern tooling. Shiny new things are nice.

GitHub has been catching a lot of criticism this week over on the Fediverse for rolling out their Copilot AI tool to everyone, but I’ll pass over that without comment.

Posted in git, github, pythonanywhere | Comments closed

Coding with those who show up

This week, I have a new paper out titled “Coding with those who show up: Two methodologies on technical committee work” in Information Technology and Libraries. It is licensed CC-BY-NC, so you can read it for free here.

The point of the article is that the literature on “laissez-faire leadership” is disproportionately (and in my opinion, sometimes incorrectly) negative about hands-off leadership styles. While that literature is largely quantitative, I read it with a humanistic approach to ask whether what they say and claim is defensible. My conclusion, reading “against the literature,” is that laissez-faire leadership is sometimes — possibly under very specific circumstances — valuable and useful. This analysis is supplemented with two case studies of a laissez-faire approach in committees in our library.

I hope you enjoy the paper and I’d be curious to hear your thoughts!

Posted in leadership, research, writing | Comments closed

Eight months with Debian

I checked the date of my previous post, and it has been eight months that I have been running Debian on this old HP laptop. Here are a few things that have struck me about the move from Ubuntu:

  1. The desktop environment can be pretty much identical. I am still running Gnome now — as I was on Ubuntu — and while it may be a different version, I would have a hard time pointing out any differences.
  2. At the outset, I had troubles with a flickering monitor. I spent quite a bit of time installing drivers and tinkering with settings, and while I can’t confidently say that it was something I did, the flickering has stopped.
  3. Debian stable’s commitment to, uh, stability, is a double-edged sword. I had been following Ubuntu’s six-month releases, and was used to having the latest. Stable moves much more slowly. I appreciate the reliability, but sometimes you just want to install something new that isn’t supported yet, and that can be frustrating.
  4. Partly as a result of (3), I find I’m building software from source more often. I almost never did this on Ubuntu, but with Debian it seems like it’s a regular occurrence.

Anyhow, these are my thoughts. My intention is not enrage some faction of linux nerds, but just to point out what I’ve noticed. I am happy with Debian; probably happier than I was with Ubuntu.

Posted in debian, linux, ubuntu | Comments closed

CUNY IT Conference 2024

The past two days, I have been at CUNY’s 23rd annual IT Conference. It’s a conference I enjoy, even though it’s geared toward IT professionals, which I am decidedly not. Nonetheless, the smattering of librarian presentations is usually enough to keep me occupied and contented throughout the conference.

I did catch some of the presentations by the IT folk. They were relentlessly AI focused. I would be more eye-rolling about this, but some of the presenters were reasonably pragmatic about the future of AI in higher ed. Perhaps a dose of pragmatism and realism is a useful antidote to the dour doomerism I’ve been carrying around about this topic. So right now, as I sip my Friday night tea, I’m doing my best to attempt look at AI from their point of view. We’ll see if this brings any insights.

Posted in ai, conference | Comments closed
  • Subscribe to this blog via email

Skip to toolbar