# use process redirection to capture the mount point and dev entry
IFS=$'\n' read -rd '\n' mount_point dev_entry < <(
# mount the diskimage (leave out -readonly if making changes to the file system)
hdiutil attach -readonly -plist "$dmg_path" | \
#!/usr/bin/perl -w
use Getopt::Long;
# use diagnostics;
sub usage {
my $name = $0;
$name =~ s/.*\///;
print <<EOT;
Usage: $name [options] in-list other-list
get_data() {
# if the parameter is a local file just cat it (for testing) otherwise try curl
{ test -r "$1" && cat "$1" || curl -s "$1"; } | \
jq --raw-output \
'.[] | "\(.symbol | ascii_downcase) \(.price_usd)"'
process() {
## setting up a personal git repository that you can push change sets to
## ssh-host: a host defined in ~/.ssh/config (see: ssh_config(5))
## camaro: the name of the repo
# on a remote host or local filesystem:
git init --bare camaro.git # (option: use --shared if there are other contributors)
# on local host cd to camaro directory:
git remote add origin ssh-host:[path/]camaro.git
# (for origin on local filesystem: git remote add origin file:///media/volume-name/camaro.git)
# print value pairs from an array in lower case
jq --raw-output '.[] | "\(.key_1 | ascii_downcase) \(.key_2 | ascii_downcase)"'
# convert `key=value` lines into `{"key":"value"}` json
jq --raw-input 'split("=") | {(.[0]):.[1]}' some.conf | jq --slurp 'add'
# validate json (bad)
echo '{hello: "there"}' | jq . >/dev/null 2>&1 && echo good json || echo bad json
bad json
#!/usr/bin/perl -w
use Net::CIDR;
use Getopt::Long;
# Net::CIDR one liner:
# perl -mNet::CIDR -ne 'print if Net::CIDR::cidrlookup($_, ("", "", ""))'
# TODO: add ip address validation
# Use awk to to redirect docker build output to stderr for visual feedback
# while capturing the image id on stdout when the build is sucessfull
ID=$(docker build . | awk '{print > "/dev/stderr"} END {if (/^Successfully built /) print $NF; else exit 1}')
# given docker volume path, return local storage path
doc2loc(){ docker inspect --format "{{range .Mounts}}{{if eq .Destination \"$1\"}}{{.Source}}{{end}}{{end}}" $2;}
agree() {
local question="$1"
while true; do
read -p "$question " answer
case $answer in
[Yy]|[Yy][Ee][Ss]) return 0 ;;
[Nn]|[Nn][Oo]|'') return 1 ;; # empty string is default
View ontouchdo
# sample usage:
# ontouchdo malformed.html 'clear; xmllint --noout --valid malformed.html 2>&1 | head -n20'
# Now fix some things in malformed.html and save. See the remaining errors in real time. Ctrl-c to quit.
[ ! -r "$1" ] && echo 'Nothing to watch.' && exit 1
[ ! -n "$2" ] && echo 'Nothing to do.' && exit 1

configuring opendkim with postfix on ubuntu

Replace with your domain. All occurrences of the string 'mail' are know as the selector and can be any alpha numeric string.

Install opendkim:

$ sudo apt-get install opendkim opendkim-tools