Skip to content

Instantly share code, notes, and snippets.

library(tidyverse)
prefixes <- c("luke","Luke","lUKE","jim","Jim","sandy")
df <- tibble(
id = str_c(sample(prefixes,100,replace=T),stringi::stri_rand_strings(100,length=3)),
num = runif(100)
)
df <- df %>%
@mhoban
mhoban / fix_authors.py
Created June 27, 2022 00:00
python script to fix inconsistent author names in a zotero library (adapted from https://gist.github.com/douglasrizzo/b1d324d0698120ebf8b1c0c91d8c251c)
#!/usr/bin/env python3
"""
Usage: fix_authors.py (((-g | -u) (-k <api-key> -i <lib-id>)) | (-c <config-file>)) [-f -q -s <config-file> -n <to-ignore> ...]
Options:
-g --group Library is a group library
-u --user Library is a user library
-k --key <api-key> Zotero API key
-i --id <lib-id> Zotero library ID
-c --config <config-file> Specify config file (json) with library/API details

How to fix the gaping security hole in the Chai Open qPCR machine

The Chai Open qPCR machine (https://www.chaibio.com/openqpcr/) is a great little democratizing molecular biology instrument. Unfortunately, the manufacturers shipped it with SSH and a default password with sudo access enabled! This means that anyone who can find the IP address of your qPCR machine can take it over and do whatever they want with it, including using it as a way to attack the rest of your network. Fortunately, this problem is pretty easy to fix.

This assumes you have access to a unix-like terminal (like the MacOS terminal). In short, you'll want to login to the machine, change the default password, and disable root login. For extra safety, I recommend contacting the manufacturer for fresh firmware image and flashing your firmware. That should clear out anything that's potentially been compromised. You'll need the IP address of your qPCR machine too, here we're calling it 10.0.0.100. The default username is debian and th

@mhoban
mhoban / 4pike.R
Last active December 30, 2020 17:44
library(tidyverse)
library(readxl)
library(writexl)
# which file to mess with
xlfile <- "~/tmp/bookofthedead.xlsx"
sheets <- excel_sheets(xlfile)
xlsheets <- map(sheets,~{
read_xlsx(xlfile,sheet=.x)
12 898
Tarsius_syrichta AAGTTTCATTGGAGCCACCACTCTTATAATTGCCCATGGCCTCACCTCCTCCCTATTATTTTGCCTAGCAAATACAAACTACGAACGAGTCCACAGTCGAACAATAGCACTAGCCCGTGGCCTTCAAACCCTATTACCTCTTGCAGCAACATGATGACTCCTCGCCAGCTTAACCAACCTGGCCCTTCCCCCAACAATTAATTTAATCGGTGAACTGTCCGTAATAATAGCAGCATTTTCATGGTCACACCTAACTATTATCTTAGTAGGCCTTAACACCCTTATCACCGCCCTATATTCCCTATATATACTAATCATAACTCAACGAGGAAAATACACATATCATATCAACAATATCATGCCCCCTTTCACCCGAGAAAATACATTAATAATCATACACCTATTTCCCTTAATCCTACTATCTACCAACCCCAAAGTAATTATAGGAACCATGTACTGTAAATATAGTTTAAACAAAACATTAGATTGTGAGTCTAATAATAGAAGCCCAAAGATTTCTTATTTACCAAGAAAGTA-TGCAAGAACTGCTAACTCATGCCTCCATATATAACAATGTGGCTTTCTT-ACTTTTAAAGGATAGAAGTAATCCATCGGTCTTAGGAACCGAAAA-ATTGGTGCAACTCCAAATAAAAGTAATAAATTTATTTTCATCCTCCATTTTACTATCACTTACACTCTTAATTACCCCATTTATTATTACAACAACTAAAAAATATGAAACACATGCATACCCTTACTACGTAAAAAACTCTATCGCCTGCGCATTTATAACAAGCCTAGTCCCAATGCTCATATTTCTATACACAAATCAAGAAATAATCATTTCCAACTGACATTGAATAACGATTCATACTATCAAATTATGCCTAAGCTT
Lemur_catta AAGCTTCATAGGAGCAACCATTCTAATAATCGCACATGGCCTTACATCATCCATATTATTCTGTCTAGCCAACTCTAACTACGAACGA
#NEXUS
begin data;
dimensions ntax=12 nchar=898;
format datatype=dna interleave=no gap=-;
matrix
Tarsius_syrichta AAGTTTCATTGGAGCCACCACTCTTATAATTGCCCATGGCCTCACCTCCTCCCTATTATTTTGCCTAGCAAATACAAACTACGAACGAGTCCACAGTCGAACAATAGCACTAGCCCGTGGCCTTCAAACCCTATTACCTCTTGCAGCAACATGATGACTCCTCGCCAGCTTAACCAACCTGGCCCTTCCCCCAACAATTAATTTAATCGGTGAACTGTCCGTAATAATAGCAGCATTTTCATGGTCACACCTAACTATTATCTTAGTAGGCCTTAACACCCTTATCACCGCCCTATATTCCCTATATATACTAATCATAACTCAACGAGGAAAATACACATATCATATCAACAATATCATGCCCCCTTTCACCCGAGAAAATACATTAATAATCATACACCTATTTCCCTTAATCCTACTATCTACCAACCCCAAAGTAATTATAGGAACCATGTACTGTAAATATAGTTTAAACAAAACATTAGATTGTGAGTCTAATAATAGAAGCCCAAAGATTTCTTATTTACCAAGAAAGTA-TGCAAGAACTGCTAACTCATGCCTCCATATATAACAATGTGGCTTTCTT-ACTTTTAAAGGATAGAAGTAATCCATCGGTCTTAGGAACCGAAAA-ATTGGTGCAACTCCAAATAAAAGTAATAAATTTATTTTCATCCTCCATTTTACTATCACTTACACTCTTAATTACCCCATTTATTATTACAACAACTAAAAAATATGAAACACATGCATACCCTTACTACGTAAAAAACTCTATCGCCTGCGCATTTATAACAAGCCTAGTCCCAATGCTCATATTTCTATACACAAATCAAGAAATAATCATTTCCAACTGACATTGAATAACGATTCATACTATCAAATTATGCCTAAGCTT
Lemur_catta
BEGIN mrbayes;
outgroup <outgroup>
[HKY+I+G]
lset nst=2 rates=invgamma;
[HKY+I]
lset applyto=() nst=2 rates=propinv
[HKY+G]
lset applyto=() nst=2 rates=gamma
[HKY]
lset applyto=() nst=2

##GTR lset applyto=() nst=6 # GTR lset applyto=() nst=6 rates=propinv # GTR + I lset applyto=() nst=6 rates=gamma # GTR + gamma lset applyto=() nst=6 rates=invgamma # GTR + I + gamma

##SYM

lset applyto=() nst=6                           # SYM

prset applyto=() statefreqpr=fixed(equal)

#!/bin/bash
f=TAATAGGTTTGGGGAAAATAGGGCAAGGGAAATTAAAGCAATTAATAAGACTGCGAAGCCTAGTAGATCTTTGTAGGAGAAGTATGGGTGGAAGGAAATTTTGTCTGCATCTGAATTAAGTCCTGTGGGGTTGTTAGACCCTGATTCATGGAGAAAAATAAGATGTACTAGTGTGGCACCTGCAATTACAAAGGGAAATAAGAAGTGGAATGTAAAGAATCGTGTAAGGGTAGCATTGTCGATAGAGAAGCCCCCTCAGATTCATTGGACTAGAGCATCCCCCACATAGGGGAAAGCTGATAGAAGGTTAGTAATGACTGTGGCTCCTCAGAATGACATTTGACCTCAAGGTAGTACGTAACCTACAAAAGCTGTCATTATTACTAGTAGAAGTAGTACTACTCCCACATTTCAGGTTTCTTTGTAAAGGTAGGAACCATAATAAAGACCCCGGCCAATGTGGAGATAAATGCAGATAAAGAAAAATGAAGCTCCGTTAGCGTGTATGTTTCGGATTATTCAGCCGTAATTTACATCTCGGCAGATGTGGGTAACAGATGAAAATGCCGTAGAAATATCTGATGTGTAGTGTATAGCAAGGAATAGCCCGGTAAGAATTTGTGCAATAAGGCAGAGGCCTAATAGA
echo length ${#f}
for i in $(seq 0 60 ${#f}); do
echo ${f:$i:60}
done
#with -r (extended) option:
s/(.{$len})/\1\n/g