Skip to content

Instantly share code, notes, and snippets.

@admackin
admackin / tmux-build.sh
Created October 15, 2012 00:29
Build tmux (iTerm2 version) as a local single-user installation on Ubuntu 10.04
#!/bin/sh
mkdir tmp
cd tmp
wget https://github.com/downloads/libevent/libevent/libevent-2.0.20-stable.tar.gz | tar xzf -
cd libevent-2.0.20-stable
./configure --prefix=$HOME/local && make && make install
cd ..
@admackin
admackin / meshparse.py
Created February 22, 2012 06:13
Parse the 'desc' XML from MeSH (Medical Subject Headings) into Python objects
from xml.etree import cElementTree as elemtree
from datetime import date
"""
Use this to parse XML from MeSH (Medical Subject Headings). More information
on the format at: http://www.ncbi.nlm.nih.gov/mesh
End users will primarily want to call the `parse_mesh` function and do something
with the output.
"""
@admackin
admackin / mysql-backup.sh
Last active October 25, 2022 08:54
Rolling MySQL database backups
#!/bin/sh
# use with cron entries such as:
#3 */2 * * * $HOME/bin/mysql-backup.sh dbname backupname hourly H
#8 1 * * * $HOME/bin/mysql-backup.sh dbname backupname daily a
#33 2 1,8,15,23 * * $HOME/bin/mysql-backup.sh dbname backupname weekly d
#33 2 28 * * $HOME/bin/mysql-backup.sh dbname backupname monthly b
DB_NAME="$1"
BACK_ROOT="$2"
@admackin
admackin / multiproc-keyboard-interrupt.py
Last active July 11, 2022 02:28
Shows how to fork a pool of Python processes using multiprocessing, and sensibly handle keyboard interrupts (terminate gracefully on completion, but kill all on SIGINT)
import multiprocessing
import time
import signal
import sys
# based on http://stackoverflow.com/a/6191991/1711188
# but instead of calling Pool.join(), we just close and manually poll for processes exiting
# also it assumes we have a finite number of jobs we want to run; if they complete
# it terminates in the normal way
@admackin
admackin / .bashrc
Last active February 10, 2022 22:06
Sane SSH_AUTH_SOCK handling for Screen and Tmux, so that new SSH agents created by subsequent logons are still usable.
_ssh_auth_save() {
ln -sf "$SSH_AUTH_SOCK" "$HOME/.ssh/ssh-auth-sock.$HOSTNAME"
}
alias screen='_ssh_auth_save ; export HOSTNAME=$(hostname) ; screen'
alias tmux='_ssh_auth_save ; export HOSTNAME=$(hostname) ; tmux'
@admackin
admackin / setclasspath.sh
Created March 21, 2012 01:07
Set Java CLASSPATH for a set of library Jars using BASH
#!/bin/sh
# use this for any package (such as ClearParser) which requires setting the
# classpath to a particular set of jar files
if [ -z $BASH_SOURCE ] ; then
echo "Script must be sourced (using '.' or 'source') and run under bash >= 3.0"
exit 1
fi
script_path="${BASH_SOURCE%/*}"
@admackin
admackin / replace-emoji.py
Created August 21, 2014 06:15
Remove emoji characters from a file
#!/usr/bin/env python
from codecs import open
from contextlib import nested
import re
import sys
from os import path
# The regex ranges below may not work on narrow builds of python < 3.3
# see http://stackoverflow.com/a/25417872/1711188
@admackin
admackin / ConvertTrav.scala
Last active December 18, 2015 04:48
Implicit conversion for Traversable instances where the elements are convertible. Scala implicit conversions are handy (if controversial). But when methods return pre-constructed collections of a type, the implicit conversion won't work - see http://stackoverflow.com/questions/8935811/scala-implicit-conversion-of-a-generic-argument?rq=1 This so…
/** Implicit conversion for Traversable instances where the elements are convertible - possibly controversial */
implicit def convTrav[S, T, I[S] <: Traversable[S]](input: I[S])(implicit c: S => T): I[T] =
(input map c).asInstanceOf[I[T]]
/** Less controversial version of the above using the pimp-my-library pattern
- to use this, you must explicitly call .as[TypeName] on the source Traversable */
trait Convertible[M[A], A] {
def as[B](implicit f: A => B): M[B]
}
@admackin
admackin / pretty-print-ptb.py
Last active December 11, 2015 05:39
Pretty-print PTB trees from a file
#!/usr/bin/env python
import sys
from contextlib import nested
from nltk import tree
def pretty_print(filenames):
for f in filenames:
with nested(open(f), open(f + '.pretty', 'w')) as (inf, outf):
for line in inf:
@admackin
admackin / rangefilter.py
Created July 23, 2012 00:03
Python range filter - allows quick retrieval of keys within a given range
from blist import sorteddict, blist
class RangeFilter(sorteddict):
def filter_items(self, lt=None, lte=None, gt=None, gte=None):
"""Return the items with keys corresponding to the supplied parameters
('lt' denotes 'less than', 'gte' denotes 'greater than or equal' etc)
"""
bottom, top = self._get_range_indexes(lt, lte, gt, gte)
return self.items()[bottom:top]