apt-get install -y avahi-utils
Dear [First Name], | |
We're really sorry but our systems were compromised and the attackers | |
managed to take a copy of your passwords. | |
The passwords were stored as: | |
[ ] Bcrypt hashes with a cost factor of X | |
[ ] PBKDF2 hashes with an iteration count of X | |
[ ] scrypt because I am Colin Percival |
#!/usr/bin/perl | |
# | |
# A pattern matching tool for jstack output. Can search for a pattern in the stacktraces, | |
# then show details of just the matching threads, either showing all of the stacktrace or | |
# just lines matching the search pattern, or matching any other patterns. | |
# | |
# For example, to see which threads are currently accessing the database and show the | |
# stacktrace lines containing your own classes: | |
# jstack-grep postgres <pid> -i com.xk72 | |
# |
diff -r bb795f69be65 src/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java | |
--- a/src/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java Sun May 29 14:03:11 2016 +1200 | |
+++ b/src/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java Sun May 29 16:09:37 2016 +1200 | |
@@ -71,6 +71,17 @@ | |
initialize(1024, null); | |
} | |
+ private static void checkKeySize(int keysize) | |
+ throws InvalidParameterException { | |
+ |
import { Map, fromJS } from 'immutable' | |
function toImmutable<T>(array: T[]): ImmutableList<T> | |
function toImmutable<T extends object>(obj: T): ImmutableObject<T> | |
function toImmutable<T>(value: T): ImmutableObject<T> | ImmutableList<T> { | |
return fromJS(value) | |
} | |
type Diff<T, U> = T extends U ? never : T |
diff --git a/mopidy_alsamixer/__init__.py b/mopidy_alsamixer/__init__.py | |
index 8f4312a..8916efa 100644 | |
--- a/mopidy_alsamixer/__init__.py | |
+++ b/mopidy_alsamixer/__init__.py | |
@@ -22,6 +22,9 @@ class Extension(ext.Extension): | |
schema = super(Extension, self).get_config_schema() | |
schema['card'] = config.Integer(minimum=0) | |
schema['control'] = config.String() | |
+ schema['min_volume'] = config.Integer(minimum=0, maximum=100) | |
+ schema['max_volume'] = config.Integer(minimum=0, maximum=100) |
In order to migrate from hosted GitLab to GitHub, I decided to use command-line git to mirror each repository from within the GitLab storage on our server.
The script uses the GitHub API to create a new private repository, and then uses the git command-line tool to mirror the repository.
The script keeps track of which repositories have been migrated by creating hidden .migrated-github-<repository>
files. If you run the script again, these repositories will be skipped. This means you can re-run the script to recover from errors, such as a repository containing a file larger than 100MB (see https://rtyley.github.io/bfg-repo-cleaner/ for a solution to that).
If you choose to remove those files, you can still run the script multiple times as it mirrors the repository to GitHub. This approach could be used to pick up any changes made in GitLab before the final changeover to GitHub. But see the next paragraph...
#!/bin/bash -eu | |
# Update the git remotes on git working copies contained in the given parent folder. | |
# | |
# usage: bulk-update-git-remotes.sh <path containing git repo(s)> <remote search> <remote replace> | |
# | |
# e.g. bulk-update-git-remotes.sh ~/git github.com/foo gitlab.com/bar | |
dryrun=0 | |
while getopts ":n" opt; do |
function search(ob, needle, path = [], seen = new Map()) { | |
if (seen.has(ob)) { | |
return | |
} | |
seen.set(ob, true) | |
for (const key of Object.keys(ob)) { | |
if (typeof ob[key] === 'string') { | |
if (ob[key].indexOf(needle) !== -1) { | |
const pathDesc = [...path, key].map(pathKey => Number(pathKey) == pathKey ? `[${pathKey}]` : `.${pathKey}`).join('').substring(1) |
body { | |
background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNyIgdmlld0JveD0iMCAwIDE2IDE3Ij4KICA8cGF0aCBmaWxsPSIjRkZGRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNiw4IEwxNiw0LjAwNjg0NTQ3IEMxNiwzLjQ0OTk0ODc2IDE1LjU1MTg5NDUsMyAxNC45OTkxMjgzLDMgTDEzLDMgTDEzLDUuMDAwMTkyNTEgQzEzLDUuNTUyMzcwOTQgMTIuNTU2MTM1Miw2IDEyLDYgQzExLjQ0NzcxNTMsNiAxMSw1LjU1NjI4MzM1IDExLDUuMDAwMTkyNTEgTDExLDMgTDUsMyBMNSw1LjAwMDE5MjUxIEM1LDUuNTUyMzcwOTQgNC41NTYxMzUxOCw2IDQsNiBDMy40NDc3MTUyNSw2IDMsNS41NTYyODMzNSAzLDUuMDAwMTkyNTEgTDMsMyBMMS4wMDA4NzE2NiwzIEMwLjQ0NDYzMDg2MSwzIDAsMy40NTA3ODAwNyAwLDQuMDA2ODQ1NDcgTDAsOCBMMTYsOCBaIE0xNiw5IEwxNiwxNS45OTMxNTQ1IEMxNiwxNi41NDkyMTk5IDE1LjU1NTM2OTEsMTcgMTQuOTk5MTI4MywxNyBMMS4wMDA4NzE2NiwxNyBDMC40NDgxMDU1MDUsMTcgMCwxNi41NTAwNTEyIDAsMTUuOTkzMTU0NSBMMCw5IEwxNiw5IFogTTQsMiBDMy40NDc3MTUyNSwyIDMsMS41NTIyODQ3NSAzLDEgQzMsMC40NDc3MTUyNSAzLjQ0NzcxNTI1LDAgNCwwIEM0LjU1MjI4NDc1LDAgNSwwLjQ0NzcxNTI1IDUsMSBDNSwxLjU1MjI4NDc1IDQuNTUyMjg0NzUsMiA0LDIgWiBNMTI |