Skip to content

Instantly share code, notes, and snippets.

View ftrain's full-sized avatar

Paul Ford ftrain

View GitHub Profile
@ftrain
ftrain / n3tosql.pl
Last active April 30, 2021 16:54
Convert n3 triples to SQL in SQLite3, your own Very Shitty Triplestore.
#!/usr/bin/perl
while (<>) {
s/'/''/g;
/^([^\s]+)\s*([^\s]+)\s*(.+)\s+\.\s*$/;
my $s = $1;
my $p = $2;
my $o = $3;
$s=~s/[<>]//g;
$p=~s/[<>]//g;
@ftrain
ftrain / spellingbee.py
Last active September 17, 2020 04:23
Spelling Bee solver
import argparse
from math import ceil
from more_itertools import powerset
from ordered_set import OrderedSet
"""
$ pip install more_itertools ordered_set
$ python spellingbee.py RACFKOT -h
usage: spellingbee.py [-h] [--words WORDS] CHARACTERS
@ftrain
ftrain / keybase.md
Created November 13, 2019 17:00
Keybase proof of identity

Keybase proof

I hereby claim:

  • I am ftrain on github.
  • I am ftrain (https://keybase.io/ftrain) on keybase.
  • I have a public key ASDM7VU2lSOHT1XBQ4IdkIv3O21V6lTe7fQLLbnG1Bop3Qo

To claim this, I am signing this object:

#!/bin/bash
#
# A script that takes a Twitter data archive, which is produced as a
# set of JavaScript files (different from the regular archive, which
# is CSV and HTML), and converts the `tweet.js` file, which contains
# all of the tweets, into tractable JSON, one tweet per line. It then
# inserts /that/ into a SQLite3 database, and extracts a simple
# relational table of tweets from the JSON. Finally, it runs datasette
# on the resulting database to allow you to explore.
Sometimes there's a terrible penalty for telling the truth.
—The Great Lie (1941)
Sometimes even Cupid needs a little help!
—The Model and the Marriage Broker (1951)
Sometimes any man can be a giant . . .
—Giant (1956)
Sometimes murder is just a way to pass the time.
@ftrain
ftrain / bing-gobble.pl
Created April 27, 2015 02:54
Get the counts for words on sites with bing!
#!/usr/bin/perl
# Copyright (c) 2015, Paul Ford, ford@ftrain.com
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
#!/bin/bash
#
# _ _ __
# __ _ __ _ _ __| |__ (_)/ _|_ _
# / _` |/ _` | '__| '_ \| | |_| | | |
#| (_| | (_| | | | |_) | | _| |_| |
# \__, |\__,_|_| |_.__/|_|_| \__, |
# |___/ |___/
#
#
@ftrain
ftrain / actually.js
Last active November 10, 2023 01:16
A program that generates actuallies
/*
actually.js
_ _ _
__ _ __ _ __ _ __ _ ___| |_ _ _ __ _| | |_ _
/ _` |/ _` |/ _` |/ _` |/ __| __| | | |/ _` | | | | | |
| (_| | (_| | (_| | (_| | (__| |_| |_| | (_| | | | |_| |_
\__,_|\__,_|\__,_|\__,_|\___|\__|\__,_|\__,_|_|_|\__, ( )
|___/|/
*/
;; simplest fold definition
(define (fold f init l)
(if (null? l) init (fold f (f init (car l)) (cdr l))))
;; by this time you are almost certainly comfortable with signatures like:
;; Int -> Int
(fold + 0 '[1 2 3 4 5])
;; => 15
(def date-parsers [nil (java.text.SimpleDateFormat. "yyyy") (java.text.SimpleDateFormat. "yyyy-M") (java.text.SimpleDateFormat. "yyyy-M-dd")])
(def grains [:decade :year :month :day]) ;; what's decade doing?
(map #(let [[_ year month day] (re-find #"(\d{2,4})[-_]([\dx]{2})[-_]([\dx]{2})" %)
date (first (split-with (partial not= "xx") [(if (= (count year) 2) (str "19" year) year) month day]))]
[(.parse (parsers (count date)) (clojure.string/join "-" date)) (grains (count date))])
["thefilehasaname__1939-xx-01.mp3"
"thefilehasaname__39_01_01.mp3"
"thefilehasaname__39-01-01.mp3"