Przeglądaj źródła

Merge branch 'master' into cray-next

cray
Mitch Tishmack 10 lat temu
rodzic
commit
eeaeaefe0a
19 zmienionych plików z 2609 dodań i 2641 usunięć
  1. +4
    -11
      Makefile
  2. +1042
    -0
      bin.org
  3. +3
    -0
      ddiff
  4. +0
    -0
      defaults.el
  5. +395
    -0
      dotprofile.org
  6. +41
    -1
      emacs.org
  7. +4
    -4
      etangle
  8. +140
    -0
      git.org
  9. +32
    -0
      haskell.org
  10. +122
    -0
      misc.org
  11. +171
    -0
      nix.org
  12. +23
    -0
      osx-nonix.el
  13. +93
    -0
      perl.org
  14. +29
    -2625
      readme.org
  15. +22
    -0
      tangle.el
  16. +152
    -0
      tmux.org
  17. +36
    -0
      vim.org
  18. +103
    -0
      x.org
  19. +197
    -0
      zsh.org

+ 4
- 11
Makefile Wyświetl plik

@@ -6,22 +6,15 @@ LAST:=$(shell cat .last || echo 0)
NEXT:=$(shell l=$(LAST); ((l=l+1)); echo $$l) NEXT:=$(shell l=$(LAST); ((l=l+1)); echo $$l)
NEXTGEN:=$(PWD)/generation/$(NEXT) NEXTGEN:=$(PWD)/generation/$(NEXT)
LASTGEN:=$(PWD)/generation/$(LAST) LASTGEN:=$(PWD)/generation/$(LAST)
TANGLERS:=readme.org emacs.org
TANGLERS:=$(shell ls -d *.org)
GEN:=$(LAST) GEN:=$(LAST)
OPTIONS:= OPTIONS:=


all: clean tangle-next

tmp:
install -dm755 $@
INSTALLDIRS=tmp $(NEXTGEN) $(LASTGEN) generation/$(GEN)


$(NEXTGEN):
install -dm755 $@

$(LASTGEN):
install -dm755 $@
all: clean tangle-next


generation/$(GEN):
$(INSTALLDIRS):
install -dm755 $@ install -dm755 $@


generation: $(NEXTGEN) $(LASTGEN) tmp generation: $(NEXTGEN) $(LASTGEN) tmp


+ 1042
- 0
bin.org Wyświetl plik

@@ -0,0 +1,1042 @@
#+TITLE: ~/bin files
#+AUTHOR: Mitch Tishmack
#+STARTUP: hidestars
#+STARTUP: odd
#+BABEL: :cache yes
#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no

~/bin files and other shenanigans

* ~/bin/cidr

A stupid script I wrote ages ago to help me be lazy with cidr
notation for stuff. Setup the wrong netmask a few times and
you too, will wish for something similar.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/cidr :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Convert input ip/cidr|netmask|hexnetmask to useable network information.
#

use strict;
use warnings;
use Socket;
use Sys::Hostname;

#
# Globalish vars
#
$ENV{PATH} = '/usr/bin:/bin:/usr/sbin:/sbin'; # Paranoia, know thy name!
my ($fqdn_regexp) = qr/([0-9,a-z,A-Z,\-,\_]+)\.([0-9,a-z,A-Z,\-,\_]+)\.(com|gov)/;

#
# converts a 1-word (4 byte) signed or unsigned integer into a dotted decimal
# ip address.
#
sub int2ip {
my $n=int(pop);
return(sprintf("%d.%d.%d.%d", ($n>>24)&0xff,($n>>16)&0xff,
($n>>8)&0xff,$n&0xff));
};

#
# Convert a host/ip/netmask/cidr/etc.... to a hash of information
# Example: host.domain.tld/24 will get the ip and calculate the netmask info
# equally if host.domain.tld corresponds with 1.2.3.4 the following is valid
# 1.2.3.4/255.255.255.0 would obtain the same information.
#
# die()'s if anything isn't kosher.
#
# Ultra long function, probably needs to be looked at for condensing/splitting.
#
sub cidr2raw {
my $rawinput = pop;
my ($lhs, $rhs, $j, $uip) = (undef, undef, undef, undef);
my ($ucidr) = 0;
my ($network, $bits, $netmask, $broadcast, $low, $high);

if ($rawinput =~ qr/(.*)\/(.*)/){
$lhs = $1; $rhs = $2;
}else{
die "Input: $rawinput not expected.\n";
};

#
# Handle ip/hostname for left hand side.
if ($lhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){
foreach my $dotted (($1,$2,$3,$4)){
if (($dotted > 255) or ($dotted < 0)){
die "FATAL: ipv4 address entered, $lhs entered is impossible, $dotted is not between 0-255.\n";
};
};
$uip = inet_ntoa(scalar gethostbyname($lhs));
die "FATAL: Cannot determine hostname for $lhs$!\n" if (!defined($lhs));
}elsif ($lhs =~ $fqdn_regexp){
my $tmp = gethostbyname($lhs);
die "FATAL: Cannot determine ip for $lhs" if (!defined($tmp));
$uip = inet_ntoa($tmp);
}else{
die "FATAL: host value not fully qualified, or not an ip <$lhs>\n";
};

#
# Handle the netmask/cidr for the right hand side,
#
# All input netmasks are converted to a cidr address for notation
if ($rhs =~ qr/^(\d+)$/){ # /cidr
$ucidr = $1;
die "FATAL: Invalid CIDR <$ucidr>.$!\n" if (($ucidr > 32) or ($ucidr < 0));
}elsif ($rhs =~ qr/(0[xX])?([0-9,a-f,A-F]{7})/){ # /0xhexnetmask
my $trimmed = $2;
my $insane = 0;
foreach my $byte (split('', unpack("B32", pack("H*", $trimmed)))){
($byte) ? $ucidr++ : $insane++;
die "FATAL: $rhs is not a valid hex netmask.$!\n" if ($insane and $byte);
};
}elsif ($rhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){ # /255.255.255.0 form
my @a = ($1, $2, $3, $4);
my $insane = 0;
foreach my $t (@a){
die "FATAL: Netmask out of range. Input <$rhs> Invalid <$t>$!\n" if (($t < 0) or ($t > 255));
};
foreach my $byte (split('', unpack("B32", pack("C4", @a)))){
($byte) ? $ucidr++ : $insane++;
die "FATAL: $rhs is not a valid netmask.$!\n" if ($insane and $byte);
};
}else{
die "FATAL: Unknown or invalid netmask value entered. <$rhs>\n";
};

#
# Network math GO! This is the meat of the function.
my (@uip) = split(/\./, $uip);
$network = 0;
for ($j = 0; $j <= $#uip; $j++){
$network += int($uip[$j])<<((3-$j)*8);
};

$bits = 0; $j = 0;
for ($j = 31 - $ucidr; $j >= 0; $j--){
$bits |= 1<<$j;
};

$netmask = 0xffffffff^$bits;
$low = ($network&$netmask);
$high = ($network&$netmask)+$bits-1;
$broadcast = ($network&$netmask)|$bits;
my ($guessed_hostname,undef,undef,undef,undef) = gethostbyaddr(inet_aton($uip), AF_INET);

#
# Throw the info back, they get a hash with zie info they may/may not need.
# All up to the caller what they want to use.
#
return ("inet4" => $uip,
"netmask" => int2ip($netmask),
"broadcast" => int2ip($broadcast),
"cidr" => $ucidr,
"router" => int2ip($low+1),
"network" => int2ip($low),
"high" => int2ip($high),
"hostname" => $guessed_hostname,
);
};

#package Main; # future use

foreach my $arg (@ARGV){
my %stuff = cidr2raw($arg);
printf("%s/%s is %s/%s\n%-12s\t%s\n%-12s\t%s\n%-12s\t%s\n%-12s\t%s\n%-12s\t%s\n",
$stuff{"inet4"},$stuff{"cidr"},
$stuff{"network"},$stuff{"cidr"},
"Netmask",$stuff{"netmask"},
"Broadcast",$stuff{"broadcast"},
"Network",$stuff{"network"},
"Router",$stuff{"router"},
"HighUsable",$stuff{"high"},
);
};
#+END_SRC

* ~/bin/dns

Just a silly dns script that slighly mimics the old host utility
of yore. Can also do reverse lookups.

Example:
$ dns google.com
google.com is 216.58.216.206
google.com is also google.com
$ dns 216.58.216.206
ord31s21-in-f206.1e100.net is 216.58.216.206
ord31s21-in-f206.1e100.net is also ord31s21-in-f206.1e100.net

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/dns :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Stupid script to help with dns information. Solaris 9/8 lack the host utility.
# Which this (kinda) mimics, except the mx record crap
use strict;
use warnings;
use Socket;
use Sys::Hostname;

my $input = shift || hostname();
my $lookup = $input;

if ( $lookup =~ /\d+[.]\d+[.]\d+[.]\d+/smx ) {
$lookup = ( gethostbyaddr inet_aton($lookup), AF_INET )[0];
die "Error: Unable to reverse lookup ip $input.\n" if ( $lookup eq q{} );
}

my $ipv4 = gethostbyname $lookup;

die "Error: $lookup doesn't have any known ip addresses\n"
if ( !defined $ipv4 );

$ipv4 = inet_ntoa($ipv4);

my ( $short_name, $aliases, $addrtype, $len, @addrs ) = gethostbyname $lookup;

foreach my $ipv4 (@addrs) {
$ipv4 = inet_ntoa($ipv4);
print "$lookup is $ipv4\n";
}

print "$lookup is also $short_name\n";
if ( defined $aliases and "$aliases" ne q{} ) {
print "aliases are ($aliases)\n";
}
exit 0;
#+END_SRC

* ~/bin/ts

Stupid simple timestamp script that just takes input, and prefixes a timestamp to to output. Thats it.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/ts :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Timestamp stdin and then print to stdout and flush.
#
# Thats about it. Might add a quick and dirty option to allow you to
# specify the time output whatnot. But this is intended to be simple.
use strict;
use warnings;
use POSIX qw(strftime);
use IO::Handle;
STDOUT->autoflush(1);

while(<STDIN>){
my $now = time;
my $tz = strftime(('%z', (localtime $now)));
$tz =~ s/(\d{2})(\d{2})/$1:$2/smx;
my $time = strftime('%Y-%m-%dT%H:%M:%S', (localtime $now));
print "$time$tz ".$_;
};
#+END_SRC

* ~/bin/diskhog

Old script I wrote after I had to figure out where space was used and it was mostly all in a directory with a ton of small files.

Written in anger. Not all that useful nominally.

Defaults to /tmp if you don't specify where, also defaults to the top 10 offenders/users of space.

Its not particuarly bright, or even good code. If you want ALL THE THINGS, pass -n -1 in and you will get a ton of output. Good luck with that.

Example:
$ diskhog
1.79m /private/tmp
1.38m /private/tmp/wifi-Ea5Y9F.log
420.57k /private/tmp/sysp.xml
161.17k /private/tmp/KSOutOfProcessFetcher.12572.ppfIhqX0vjaTSb8AJYobDV7Cu68=/ksfetch
161.17k /private/tmp/KSOutOfProcessFetcher.12572.ppfIhqX0vjaTSb8AJYobDV7Cu68=
0.00k /private/tmp/com.apple.launchd.yaVsd6J1re
0.00k /private/tmp/cvcd
0.00k /private/tmp/com.apple.launchd.IPS1lPqGTD
0.00k /private/tmp/com.apple.launchd.voZH6WFol3
0.00k /private/tmp/ct.shutdown
$ diskhog -n 4 /tmp
1.79m /private/tmp
1.38m /private/tmp/wifi-Ea5Y9F.log
420.57k /private/tmp/sysp.xml
161.17k /private/tmp/KSOutOfProcessFetcher.12572.ppfIhqX0vjaTSb8AJYobDV7Cu68=

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/diskhog :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Find out who is hogging disk space and where.
#
# Argument is the directory to start from. Only calculates size of files.
# Adds the size of files in a directory to the size of the parent directory only.
#
# Defaults to top 10 directories/files.
#
# Override with -n num to list whatever amount of large things you desire.
# Or if you want to abuse the parser, use -1 for all files/directories.
#
# Defaults to pwd for space.
#

use File::Find;
use Getopt::Long;
use Cwd;

my $debug;
my $statbug;
(exists($ENV{"DEBUG"})) ? $debug++ : undef;
my $dir = Cwd::abs_path($ARGV[-1] || Cwd::getcwd());
my %diskhogs = ();
my %inodes = ();
my ($topdev,undef,undef,undef,undef,undef,undef,undef) = lstat($dir);
local $opt_displaynum = 10;

GetOptions( 'n=i', => \$opt_displaynum,
);

find(\&sieve, $dir);

#
# For outputing the size of a bunch of bytes in g/m/k depending upon the size
#
sub byte_print {
my $byte_k = 1_024;
my $byte_m = $byte_k**2;
my $byte_g = $byte_k**3;
my $bytes = pop;
my $base = $bytes;
my $suffix = "nil";
my $out_string = "BUG";
if($bytes > $byte_g){
$base = $bytes / $byte_g;
$suffix = "g";
}elsif($bytes > $byte_m){
$base = $bytes / $byte_m;
$suffix = "m";
}else{
$base = $bytes / $byte_k;
$suffix = "k";
};
$out_string = sprintf("%.2f%s", $base, $suffix);
return $out_string;
};

#
# Dumb function to return if an inode has already been seen.
# So we handle hard links sane(er-ish-ly) in size calculations.
# This has more truthiness(tm).
#
sub seeninode{
my $what = pop();
my $ret = 0;
unless(exists($inodes{$what})){
$inodes{$what} = 0;
print "New inode $what added to seen inodes.\n" if $debug;
}else{
$inodes{$what}++;
$ret++;
print "Found a hardlink for $what.\n" if $debug;
};
return $ret;
};

sub sieve {
my $file = $File::Find::name;
my $filedir = $File::Find::dir;
my @statinfo = lstat($file);
my $dev = $statinfo[0];
my $inode = $statinfo[1];
my $size = $statinfo[7];
my $blocksize = 512; # field 11 is the "preferred" block size, which appears
# to not match the actual blocksize of the filesystems
# in use. For now every hard drive uses 512bytes/block.
# Will revisit this when 4096byte/block hard drives arrive
my $apparentsize = $statinfo[12] * $blocksize;

print "$file\@$filedir \<$topdev\>\=\<$dev\>\n" if $debug;
print "size,apparentsize,blocksize = <$statinfo[7],$apparentsize\,$blocksize\>\n" if $debug;
#
# Try to handle sparse files.
#
if ($size > $apparentsize) {
print "Sparse file $file!\n" if $debug;
$size = $apparentsize;
};

$dev = (-l $file) ? 0xdeadbeef : $dev;
if (($file =~ m/\/proc|\/chroot|udev\/devices/) ||
($dev != $topdev) || seeninode($inode)){
print "Pruned $file.\n" if $debug;
$File::Find::prune = 1;
next;
};
unless ($dev){
# Yay, we can't l(stat) files. This version of perl is broken.
# Snag information from ls, assume it's a file. Thanks Solaris 8, you suck.
$statbug++;
warn "Hit empty device statbug while stat()ing file <$file>.\n";
my $ls = qx(ls -ld $file);
my @raw = split(/\s+/, $ls);
$diskhogs{"$file"} = $raw[4];
$diskhogs{"$filedir"} += $raw[4];
}elsif (-f){
if ($debug){
print "Adding $file size ", &byte_print($size), " to $filedir.\n";
print "Adding $file size ", &byte_print($size), "\n";
};
$diskhogs{"$file"} = $size;
$diskhogs{"$filedir"} += $size;
}elsif (-d){
print "Adding $file size ".&byte_print($size)."\n" if $debug;
$diskhogs{"$file"} += $size;
};
if ($debug) {
print "$file from $filedir has size ".&byte_print($diskhogs{"$file"})."\n";
};
};

#
# Reverse sort the keys by size.
#
my @sorted = sort {$diskhogs{$b} <=> $diskhogs{$a}} keys %diskhogs;

splice @sorted, $opt_displaynum if @sorted > $opt_displaynum;

warn "Found one or more instances of the stat() call statbug. This is normally only present on Solaris 8 with stock perl.\n" if $statbug;

foreach (@sorted){
printf "%-9s%s\n", &byte_print($diskhogs{$_}), $_;
};

if ($debug){
print "DEBUG INFORMATION:\n";
foreach (keys %diskhogs){
printf "%-9s%s\n", &byte_print($diskhogs{$_}), $_;
};
};
#+END_SRC

* ~/bin/ifinfo

I don't remember now why I wrote this but its just a simpler view
of interfaces on a system.

Probably some old solaris holdover thing I can nuke.

Example:
$ ifinfo
gif0@1280 127.0.0.1/8 a:b:c:d:e:f
en1@1500 10.1.10.15/24 a:b:c:d:e:f
bridge100@1500 192.168.64.1/24 a:b:c:d:e:f

Comes in slightly handy, no guarantees it parses ifconfig right tho.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/ifinfo :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Because ifconfig output is... overly verbose.
#
# Output information from ifconfig -a like so:
# interface:mtu ipv4/cidr mac_address ipv6_addr(if applicable)
# ipv6 is not yet in place due to a: lazy, b: can't use it yet.
#

use strict;
use Socket;
use Sys::Hostname;
$ENV{'PATH'}='/sbin:/usr/sbin:/bin:/usr/bin';

my ($fqdn_regexp) = qr/([0-9,a-z,A-Z,\-,\_]+)\.([0-9,a-z,A-Z,\-,\_]+)\.(com|gov)/;

#
# converts a 1-word (4 byte) signed or unsigned integer into a dotted decimal
# ip address.
#
sub int2ip {
my $n=int(pop);
return(sprintf("%d.%d.%d.%d", ($n>>24)&0xff,($n>>16)&0xff,
($n>>8)&0xff,$n&0xff));
};

#
# Convert a host/ip/netmask/cidr/etc.... to a hash of information
# Example: host.domain.tld/24 will get the ip and calculate the netmask info
# equally if host.domain.tld corresponds with 1.2.3.4 the following is valid
# 1.2.3.4/255.255.255.0 would obtain the same information.
#
# die()'s if anything isn't kosher.
#
# Ultra long function, probably needs to be looked at for condensing/splitting.
#
sub cidr2raw {
my $rawinput = pop;
my ($lhs, $rhs, $j, $uip) = (undef, undef, undef, undef);
my ($ucidr) = 0;
my ($network, $bits, $netmask, $broadcast, $low, $high);

if ($rawinput =~ qr/(.*)\/(.*)/){
$lhs = $1; $rhs = $2;
}else{
die "Input: $rawinput not expected.\n";
};

#
# Handle ip/hostname for left hand side.
if ($lhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){
foreach my $dotted (($1,$2,$3,$4)){
if (($dotted > 255) or ($dotted < 0)){
die "FATAL: ipv4 address entered, $lhs entered is impossible, $dotted is not between 0-255.\n";
};
};
$uip = "$1.$2.$3.$4";
};
#
# Handle the netmask/cidr for the right hand side,
#
# All input netmasks are converted to a cidr address for notation
if ($rhs =~ qr/^(\d+)$/){ # /cidr
$ucidr = $1;
die "FATAL: Invalid CIDR <$ucidr>.$!\n" if (($ucidr > 32) or ($ucidr < 0));
}elsif ($rhs =~ qr/(0[xX])?([0-9,a-f,A-F]{7})/){ # /0xhexnetmask
my $trimmed = $2;
my $insane = 0;
foreach my $byte (split('', unpack("B32", pack("H*", $trimmed)))){
($byte) ? $ucidr++ : $insane++;
die "FATAL: $rhs is not a valid hex netmask.$!\n" if ($insane and $byte);
};
}elsif ($rhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){ # /255.255.255.0 form
my @a = ($1, $2, $3, $4);
my $insane = 0;
foreach my $t (@a){
die "FATAL: Netmask out of range. Input <$rhs> Invalid <$t>$!\n" if (($t < 0) or ($t > 255));
};
foreach my $byte (split('', unpack("B32", pack("C4", @a)))){
($byte) ? $ucidr++ : $insane++;
die "FATAL: $rhs is not a valid netmask.$!\n" if ($insane and $byte);
};
}else{
die "FATAL: Unknown or invalid netmask value entered. <$rhs>\n";
};

#
# Network math GO! This is the meat of the function.
my (@uip) = split(/\./, $uip);
$network = 0;
for ($j = 0; $j <= $#uip; $j++){
$network += int($uip[$j])<<((3-$j)*8);
};

$bits = 0; $j = 0;
for ($j = 31 - $ucidr; $j >= 0; $j--){
$bits |= 1<<$j;
};

$netmask = 0xffffffff^$bits;
$low = ($network&$netmask);
$high = ($network&$netmask)+$bits-1;
$broadcast = ($network&$netmask)|$bits;

#
# Throw the info back, they get a hash with zie info they may/may not need.
# All up to the caller what they want to use.
#
return ("inet4" => $uip,
"netmask" => int2ip($netmask),
"broadcast" => int2ip($broadcast),
"cidr" => $ucidr,
"router" => int2ip($low+1),
"network" => int2ip($low),
"high" => int2ip($high),
);
};

my @ifout;
if ($ENV{'TESTING'} ne '') {
while(<>){
chomp($_);
last if ($_ eq '');
push(@ifout, $_);
# sleep 1;
# print STDERR $_ . "\n";
}
}else{
open IFCONFIG, "ifconfig -a |";
@ifout = <IFCONFIG>;
close IFCONFIG;
}

# This seems wrong but it makes parsing easier due to solaris
# non root ifconfig not displaying the mac address. Reverse the output.
#
@ifout = reverse(@ifout);

my @output = ();

my ($ifname, $ifether, $ifmtu, $ifipv4, $ifnetmask, $ifipv6) = (undef,undef,undef,undef,undef,undef);
sub printiface{
# assume a /32 if we don't know it
unless (defined($ifnetmask)) {
warn "$ifname has indeterminant netmask assuming /32\n";
$ifnetmask = '32';
}

unless (defined($ifnetmask)) {
$ifether = 'unknown';
}

unless ($ifname =~ m/lo.*/){
my %netinfo = cidr2raw("$ifipv4\/$ifnetmask");
$ifnetmask = $netinfo{"cidr"};
$ifether = lc($ifether);
my $line = sprintf "%-16s %-18s %-17s\n", "$ifname\@$ifmtu", "$ifipv4\/$ifnetmask", $ifether;
push @output, $line;
}

# reset vars
($ifname, $ifether, $ifmtu, $ifipv4, $ifnetmask, $ifipv6) = (undef,undef,undef,undef,undef,undef);
};

foreach my $line (@ifout) {
if ($line =~ /inet\s+(\d+[.]\d+[.]\d+[.]\d+)\s+/){
$ifipv4 = $1;
}
if ($line =~ m/ether\s([:,0-9,a-f,A-F]{11,})/){
$ifether =$1;
}
if ($line =~ m/^([\w,\:\d+]+)\s+.*HWaddr\s([:,0-9,a-f,A-F]{11,})/){
$ifname = $1;
$ifether = $2;
}
if ($line =~ m/^(.*)\:\s+.*mtu\s(\d+)/){
$ifname = $1;
$ifmtu = $2;
}
if ($line =~ m/MTU[:](\d+)/){
$ifmtu = $1;
}
if ($line =~ m/inet\saddr\:(\d+[.]\d+[.]\d+[.]\d+)/){
$ifipv4 = $1;
}
if ($line =~ m/netmask\s+(0[xX])?([a-f,A-F,0-9]{8})/){
$ifnetmask = $2;
}
if ($line =~ m/Mask[:](\d+\.\d+\.\d+\.\d+)/){
$ifnetmask = $1;
}
if ($line =~ m/netmask\s+(\d+[.]\d+[.]\d+[.]\d+)/){
$ifnetmask = $1;
}
if ($line =~ m/netmask\s+0\s+broadcast/){
$ifnetmask = '0';
}

print ":$ifether:$ifname:$ifmtu:$ifipv4:$ifnetmask:$ifipv6:\n" if ($ENV{'DEBUG'} ne '');
printiface() if ($ifname and $ifmtu and $ifipv4 );
};

if (scalar(@output) < 1){
warn "No interfaces? Scripts busted yo.\n";
}else{
foreach my $line (reverse(@output)){
print $line;
}
}
#+END_SRC
* ~/bin/iso8601

Mostly because I use iso8601 timestamps and its nice to use them
generally without depending on gnu date.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/iso8601 :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#-*-mode: Perl; coding: utf-8;-*-
use strict;
use warnings;
use POSIX qw(strftime);

my $now = time;
my $tz = strftime(('%z', (localtime $now)));
$tz =~ s/(\d{2})(\d{2})/$1:$2/smx;
my $time = strftime('%Y-%m-%dT%H:%M:%S', (localtime $now));
print "$time$tz\n";
exit 0;
#+END_SRC

* ~/bin/whoson

Basically getent passwd $username/$uid to show who is on a system.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/whoson :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Because i'm lazy and sick of typing in getent passwd $someusername/uid
#

my %who_cmds = ("solaris", "/bin/who -q",
"linux", "/usr/bin/who -q",
"darwin", "/usr/bin/who -q",
);

my $who_cmd = $who_cmds{$^O};

local %users = ();

foreach my $l (qx/$who_cmd/){
next if($l =~ m/^\#.*/);
foreach my $user (split(/\s+/,$l)){
unless(exists($users{$user})){
$users{$user} = 0;
}else{
$users{$user}++;
};
};
};

foreach my $user (keys %users){
my $gecos = ( getpwnam($user) )[6];
my $count = $users{$user} + 1;
my $output = "$user\, ".((defined($gecos)) ? "$gecos, " : '')."is logged in on $count tty".(($count>1) ? "\'s" : '')."\n";
print $output;
};
#+END_SRC

* ~/bin/gecos

Silly wrapper perl script that makes it easier to get at the gecos string for a $user/$uid.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/gecos :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Dumb wrapper to get the gecos information from a uid/username.

foreach my $input (@ARGV){
my $gecos = undef;
my $uid = undef;
my $name = undef;
if ( $input =~ m/^\d+$/ ) {
( $name,$uid,$gecos ) = ( getpwuid($input) )[0,2,6];
} else {
( $name,$uid,$gecos ) = ( getpwnam($input) )[0,2,6];
}
print "$name is '$gecos' uid '$uid'\n" if $gecos;
}
#+END_SRC

* ~/bin/hatimerun

Stupid perl script to mimic hatimerun for systems that don't have it.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/hatimerun :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# hatimerun in perl, sorta
#
use Getopt::Long;

my $opt_exitcode = 99;
my $opt_killcode = 9;
my $opt_timeout = 60;

GetOptions( 'e=i' => \$opt_exitcode,
'k=i' => \$opt_killcode,
't=i' => \$opt_timeout,
'h' => \&opt_help,
'help' => \&opt_help,
);

sub opt_help{
my $message = <<__END__;
UX: ERROR: invalid syntax
usage: [-e return code][-k kill signal][-t seconds to wait]
[-h][--help]

Options
--help, -h Prints this help text.
-e Exit code to return on timeout.
NOTE: 99 by default.
-k Signal number to send via kill.
NOTE: 9 by default.
-t Timeout in seconds before alarming.
NOTE: 60 by default.

__END__
print $message;
exit 1;
};

my $pid;

local $SIG{ALRM} = sub { kill $opt_killcode, $pid or die "Kill failed: $!";
die "Timeout!\n"};

eval{
my $x = defined($pid = fork());

unless ($pid){
print qx(@ARGV);
die "Exec of ", join(' ', @ARGV), " failed at $!\n";
};

alarm $opt_timeout;
waitpid $pid => 0;
alarm 0;
exit 0;
};

if ($@){
die "Nothing to do!\n" unless $@ eq "Timeout!\n";
exit $opt_exitcode;
}else{
exit 0;
};
#+END_SRC

* ~/bin/ptree.pl

Silly perl based ptree alike implementation. Mad old code that should be avoided at all costs but it works and I'm not fixing it unless I need to.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/ptree.pl :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# ptree for linux/darwin/solaris. I got sick of ps and pstree on linux.
# ptree works on solaris fine, but doesn't exist for darwin/linux/etc...
#
# TODO: Allow passing a regexp instead of a pid and passing multiple pids.
#

local $ENV{"PATH"} = '/bin:/usr/bin:/sbin:/usr/sbin';
local $debug = 0;

(exists($ENV{"DEBUG"})) ? $debug = 1 : undef;
($debug) ? local $| = 1 : undef; # disable buffering for STDERR and STDOUT

sub debug_print {
($debug) && warn pop;
};

local @cmd = ('/bin/ps');
local $init = 0;
local $start = 1;

if ($^O eq "linux"){
push(@cmd, 'ajxSw');
$start = 0;
}elsif ($^O =~ m/darwin|freebsd/){
push(@cmd, 'Ajwww');
}elsif ($^O eq "solaris"){
@cmd = ('/usr/ucb/ps');
if ((-x "/bin/zonename") && !(qx(zonename) eq "global\n")){
$init = qx(pgrep zsched);
chomp($init);
$start = $init;
};
push(@cmd, 'laxwww');
}else{
die "$^O isn't a known os to this script\n";
};

local @ps = qx(@cmd);
($?) ? die $cmd[0]." posix return code $?\n" : undef;

local %proc;
local @trail;

(defined($ARGV[0])) ? $start = $ARGV[0] : undef;

debug_print("Dump of raw line array data:\n");

foreach my $x (@ps){
my $cmd_index = 9;
my $ppid = -1;
my $pid = -1;
next if ($x =~ m/.*PID.*/);
my @line = split(m/\s+/,$x);
splice(@line, 0, 1) unless ($line[0] =~ m/\d+/);
splice(@line, 0, 1) if ("$line[0]" eq "");

if ($^O eq "linux"){
($ppid,$pid) = @line;
$cmd_index = 9;
}elsif ($^O =~ m/darwin|freebsd/){
($pid,$ppid) = @line;
$cmd_index = 8;
}elsif ($^O eq "solaris"){
(undef, undef, $pid,$ppid) = @line;
for($x=$cmd_index; $x < 14; $x++){
$cmd_index = ($line[$x] =~ m/\d+\:\d+/) ? ($x + 1) : $cmd_index;
};
};

my $command = join(' ', @line[$cmd_index..$#line++]);
(!defined $proc{$pid}) ? $proc{$pid}->{"children"} = [ ] : undef;
(!defined $proc{$ppid}) ? $proc{$ppid}->{"children"} = [ ] : undef;
$proc{$pid}->{"pid"} = $pid;
$proc{$pid}->{"command"} = $command;
$proc{$pid}->{"ppid"} = $ppid;
push(@{$proc{$ppid}->{"children"}},$pid);
debug_print(join(',', @line[0..($#line-1)])."\n");
};

if ($debug){
debug_print("Done reading ps output\nDump of Hash\n");
foreach my $key (sort({$a <=> $b} (keys %proc))){
$ppid = $proc{$key}->{"ppid"};
$command = $proc{$key}->{"command"};
$children = join(',', @{$proc{$key}->{"children"}});
debug_print("PID<$key> PPID<$ppid> Children<$children> Command<$command>\n");
};
};

sub intrail{
my $crumb = pop;
my $ret = 0;
map {$ret++ if ($crumb == $_)} @trail;
return $ret;
};

sub addchildren{
my $start_node = pop;
foreach my $child (@{$proc{$start_node}->{"children"}}){
next if (!defined($child) || ($start_node == $child));
debug_print("Start ($start_node) Add child $child.\n");
push(@trail, $child);
addchildren($child);
};
};

sub addparents{
my $start_node = pop;
my $parent = $proc{$start_node}->{"ppid"};
return unless (defined($start_node));
return if (($parent == $start_node) || !(defined($parent))); # At the top of the tree, or in a zone
debug_print("Start ($start_node) Add parent $parent.\n");
push(@trail, $parent);
addparents($parent) if ($parent != $init);
};

sub printnode{
my $start_node = pop;
my $indent = pop;
if (intrail($start_node)){
my $pid = $proc{$start_node}->{"pid"};
my $ppid = $proc{$start_node}->{"ppid"};
my $cmdline = $proc{$start_node}->{"command"};
my $indentation = ' 'x($indent);
if ($pid == $init){
my $s = $^O." kernel";
if ($cmdline ne ''){
$s = $s." <$cmdline>";
};
$cmdline = $s;
};
printf("%s%d %s\n", $indentation, $pid, $cmdline);
foreach my $child (@{$proc{$start_node}->{"children"}}){
next if ($pid == $child);
printnode($indent+1,$child);
};
};
};

my $valid = 0;
foreach my $j (keys %proc){ ($j == $start) ? $valid++ : undef; };

debug_print("Starting from <$start>, validity is<$valid>\n");

if ($valid){
if (!$start){
@trail = keys %proc;
push(@trail, $start); push(@trail, 1);
debug_print("Done with adding $start to trail.\n");
}else{
push(@trail, $start);
debug_print("Adding children from $start.\n");
addchildren($start);
debug_print("Adding parents from $start.\n");
addparents($start);
};

@trail = sort(@trail);

debug_print("Trail is: ".join(',', @trail)."\nStarting at pid $start\ninit pid $init\n");
print "PID COMMAND\n";
my $startindent = 0;
(intrail($startindent)) ? $startindent = -1 : undef;
printnode($startindent,$init);
}else{
die "pid $start doesn't exist.\n";
};

exit 0;
#+END_SRC

* ~/bin/portchk

Just find out if a port responds to anything tcp related or not.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/portchk :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Dumb wrapper to get the gecos information from a uid/username.

foreach my $input (@ARGV){
my $gecos = undef;
my $uid = undef;
my $name = undef;
if ( $input =~ m/^\d+$/ ) {
( $name,$uid,$gecos ) = ( getpwuid($input) )[0,2,6];
} else {
( $name,$uid,$gecos ) = ( getpwnam($input) )[0,2,6];
}
print "$name is '$gecos' uid '$uid'\n" if $gecos;
}
#+END_SRC

* ~/bin/notify

OSX only really, just fires off a notification when its ran.

Example:
notify "some command" "not ok"

First param is the message, second title of the notification.

#+BEGIN_SRC sh :mkdirp yes :tangle (when (eq osx-p t) "tmp/bin/notify") :results replace :tangle-mode (identity #o755)
#!/bin/sh
message=${1:="no message"}
title=''
if [ "${2}" != "" ]; then
message="${2}"
title="${1}"
fi
notification="display notification \"${message}\""
[ "${title}" != "" ] && notification="${notification} with title \"${title}\""

osascript -e "${notification}"
#+END_SRC

* ~/bin/today

Stupid ruby script I wrote to highlight the week/day in a calendar.

#+BEGIN_SRC ruby :mkdirp yes :tangle tmp/bin/today :results replace :tangle-mode (identity #o755)
#!/usr/bin/env ruby
cal, today, week_color, day_color, reset = %x(cal).split(%r(\n)), Time.now.day, %x(tput sgr0;tput setab 4;tput setaf 7), %x(tput sgr0; tput setab 0;tput setaf 7;tput bold), %x(tput sgr0)
done=false
cal.each do |line|
if done then
puts line
next
end
if(line =~ /^(.*\s+?)#{today}(\s+?.*)$/ or
line =~ /^(.*\s+?)#{today}$/ or
line =~ /^()#{today}(\s+?.*)$/ or
line =~ /^#{today}$/ ) then
puts "#{week_color}#{$1}#{day_color}#{today}#{week_color}#{$2}#{reset}"
done=true
else
puts line
end
end
#+END_SRC

+ 3
- 0
ddiff Wyświetl plik

@@ -22,4 +22,7 @@ for file in $(find . -type f -print); do
fi fi
done done


if [ $rc != 0 ]; then
echo differences between ${src} and ${dest}
fi
exit $rc exit $rc

options.el → defaults.el Wyświetl plik


+ 395
- 0
dotprofile.org Wyświetl plik

@@ -0,0 +1,395 @@
#+TITLE: .profile
#+AUTHOR: Mitch Tishmack
#+STARTUP: hidestars
#+STARTUP: odd
#+BABEL: :cache yes
#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no :tangle tmp/.profile

~/.profile setup in all its peculiarities.

* PS1

#+BEGIN_SRC sh
# -*- mode: Shell-script; -*-
# Common .profile
#
# DO NOT EDIT, managed by org mode
_uname=$(uname)
_uname_n=$(uname -n)
_hostname=$(hostname)
export _uname _uname_n _hostname
#+END_SRC

OSX uses hostname -s for getting hostname

#+BEGIN_SRC sh :tangle (when (eq osx-p t) "tmp/.profile")
_host=$(hostname -s)
#+END_SRC

Otherwise we just use what uname -n sent.

#+BEGIN_SRC sh
_host=${_host:=${_uname_n}}
#+END_SRC

* PATH
** haskell
#+BEGIN_SRC sh :tangle (when (eq haskell-p t) "tmp/.profile")
PATH="${PATH}:${HOME}/.cabal/bin"
#+END_SRC
** General
#+BEGIN_SRC sh :tangle "tmp/.profile"
PATH="${PATH}:${HOME}/bin:${HOME}/.local/bin"
export PATH
#+END_SRC

* Functions
** General
Generally useful functions.

#+BEGIN_SRC sh
# cat out a : separated env variable
# variable is the parameter
cat_env()
{
set | grep '^'"$1"'=' > /dev/null 2>&1 && eval "echo \$$1" | tr ':' '
' | awk '!/^\s+$/' | awk '!/^$/'
}

# Convert a line delimited input to : delimited
to_env()
{
awk '!a[$0]++' < /dev/stdin | tr -s '
' ':' | sed -e 's/\:$//' | awk 'NF > 0'
}

# Unshift a new value onto the env var
# first arg is ENV second is value to unshift
# basically prepend value to the ENV variable
unshift_env()
{
new=$(eval "echo $2; echo \$$1" | to_env)
eval "$1=${new}; export $1"
}

# Opposite of above, but echos what was shifted off
shift_env()
{
first=$(cat_env "$1" | head -n 1)
rest=$(cat_env "$1" | awk '{if (NR!=1) {print}}' | to_env)
eval "$1=$rest; export $1"
echo "${first}"
}

# push $2 to $1 on the variable
push_env()
{
have=$(cat_env "$1")
new=$(printf "%s
%s" "$have" "$2" | to_env)
eval "$1=$new; export $1"
}

# Remove a line matched in $HOME/.ssh/known_hosts for when there are legit
# host key changes.
nukehost()
{
if [ -z "$1" ]; then
echo "Usage: nukehost <hostname>"
echo " Removes <hostname> from ssh known_host file."
else
sed -i -e "/$1/d" ~/.ssh/known_hosts
fi
}

# Cheap copy function to make copying a file via ssh from one host
# to another less painful, use pipeviewer to give some idea as to progress.
ssh-copyfile()
{
if [ -z "$1" -o -z "$2" ]; then
echo "Usage: copy source:/file/location destination:/file/location"
else
srchost="$(echo "$1" | awk -F: '{print $1}')"
src="$(echo "$1" | awk -F: '{print $2}')"
dsthost="$(echo "$2" | awk -F: '{print $1}')"
dst="$(echo "$2" | awk -F: '{print $2}')"
size=$(ssh "$srchost" du -hs "$src" 2> /dev/null)
size=$(echo "${size}" | awk '{print $1}')
echo "Copying $size to $dst"
ssh "$srchost" "/bin/cat \$src" 2> /dev/null | pv -cb -N copied - | ssh "$dsthost" "/bin/cat - > \$dst" 2> /dev/null
fi
}

# extract function to automate being lazy at extracting archives.
extract()
{
if [ -f "$1" ]; then
case ${1} in
*.tar.bz2|*.tbz2|*.tbz) bunzip2 -c "$1" | tar xvf -;;
*.tar.gz|*.tgz) gunzip -c "$1" | tar xvf -;;
*.tz|*.tar.z) zcat "$1" | tar xvf -;;
*.tar.xz|*.txz|*.tpxz) xz -d -c "$1" | tar xvf -;;
*.bz2) bunzip2 "$1";;
*.gz) gunzip "$1";;
*.jar|*.zip) unzip "$1";;
*.rar) unrar x "$1";;
*.tar) tar -xvf "$1";;
*.z) uncompress "$1";;
*.rpm) rpm2cpio "$1" | cpio -idv;;
*) echo "Unable to extract <$1> Unknown extension."
esac
else
print "File <$1> does not exist."
fi
}

# Tcsh compatibility so I can be a lazy bastard and paste things directly
# if/when I need to.
setenv()
{
export "$1=$2"
}

# Just to be lazy, set/unset the DEBUG env variable used in my scripts
debug()
{
if [ -z "$DEBUG" ]; then
if [ -z "$1" ]; then
echo Setting DEBUG to "$1"
setenv DEBUG "$1"
else
echo Setting DEBUG to default
setenv DEBUG default
fi
else
echo Unsetting DEBUG
unset DEBUG
fi
}

login_shell()
{
[ "$-" = "*i*" ]
}

# Yeah, sick of using the web browser for this crap
# Use is NUM FROM TO and boom get the currency converted from goggle.
cconv()
{
curl -L --silent\
"https://www.google.com/finance/converter?a=$1&from=$2&to=$3" \
| grep converter_result \
| perl -pe 's|[<]\w+ \w+[=]\w+[>]||g;' -e 's|[<][/]span[>]||'
}
#+END_SRC

** git
#+BEGIN_SRC sh :tangle (when (eq git-p t) "tmp/.profile")
maybe_git_repo()
{
# assume https if input doesn't contain a protocol
proto=https
destination=${HOME}/src
echo "${1}" | grep '://' > /dev/null 2>&1
[ $? = 0 ] && proto=$(echo "${1}" | sed -e 's|[:]\/\/.*||g')
git_dir=$(echo "${1}" | sed -e 's|.*[:]\/\/||g')
rrepo="${proto}://${git_dir}"

# strip user@, :NNN, and .git from input uri's
repo="${destination}/"$(echo "${git_dir}" |
sed -e 's/\.git$//g' |
sed -e 's|.*\@||g' |
sed -e 's|\:[[:digit:]]\{1,\}\/|/|g' |
tr -d '~')

if [ ! -d "${repo}" ]; then
git ls-remote "${rrepo}" > /dev/null 2>&1
if [ $? = 0 ]; then
mkdir -p "${repo}"
echo "git clone ${rrepo} ${repo}"
git clone --recursive "${rrepo}" "${repo}"
else
echo "${rrepo} doesn't look to be a git repository"
fi
fi
[ -d "${repo}" ] && cd "${repo}"
}

gh()
{
maybe_git_repo "https://github.com/${1}"
}

bb()
{
maybe_git_repo "https://bitbucket.org/${1}"
}
#+END_SRC
** haskell
#+BEGIN_SRC sh :tangle (when (eq haskell-p t) "tmp/.profile")
hmap()
{
ghc -e "interact ($*)"
}

hmapl()
{
hmap "unlines.($*).lines"
}

hmapw()
{
hmapl "map (unwords.($*).words)"
}
#+END_SRC
** nix
#+BEGIN_SRC sh :tangle (when (eq nix-p t) "tmp/.profile")
mk_nix_shell()
{
cabal2nix --sha256="0" . \
| perl -0777 -p -e 's/{.+}:/{ haskellPackages ? (import <nixpkgs> {}).haskellPackages }:/s' \
| sed -E -e 's/(cabal\.mkDerivation)/with haskellPackages; \1/' -e 'sXsha256 = "0";Xsrc = "./.";X' \
> shell.nix;
}

nix_env_setup()
{
# The nix installer put something like this into the .profile.
# BAD INSTALLER NO COOKIE!
if [ -e ${HOME}/.nix-profile/etc/profile.d/nix.sh ]; then
. ${HOME}/.nix-profile/etc/profile.d/nix.sh;
export NIX_PATH=${HOME}/src/github.com/NixOS/nixpkgs:nixpkgs=${HOME}/src/github.com/NixOS/nixpkgs
export NIX_CFLAGS_COMPILE="-idirafter /usr/include"
export NIX_CFLAGS_LINK="-L/usr/lib"

NIX_GHC=$(type -p ghc > /dev/null 2>&1)
if [ -n "$NIX_GHC" ]; then
eval $(grep export "$NIX_GHC")
fi
fi

nr()
{
nix-shell --run "$(echo $@)"
}
}

nix_env_setup
#+END_SRC

Workaround stupid ssl crap with recent nix.

#+BEGIN_SRC sh :tangle (when (and (eq nix-p t) (eq osx-p t)) "tmp/.profile")
SSL_CERT_FILE="${HOME}/.nix-profile/etc/ssl/certs/ca-bundle.crt"
GIT_SSL_CAINFO=$SSL_CERT_FILE
export SSL_CERT_FILE
export GIT_SSL_CAINFO
#+END_SRC

TODO Add linux ca-bundle detection
if test -e /etc/ssl/certs/ca-bundle.crt ; # Fedora, NixOS
set -xg SSL_CERT_FILE /etc/ssl/certs/ca-bundle.crt ;
else if test -e /etc/ssl/certs/ca-certificates.crt ; # Ubuntu, Debian
set -xg SSL_CERT_FILE /etc/ssl/certs/ca-certificates.crt

** tmux
#+BEGIN_SRC sh :tangle (when (eq tmux-p t) "tmp/.profile")
t()
{
if [ -z "$1" ]; then
echo "Supply a tmux session name to connect to/create"
else
tmux has-session -t "$1" 2>/dev/null
[ $? != 0 ] && tmux new-session -d -s "$1"
tmux attach-session -d -t "$1"
fi
}
#+END_SRC
** x
#+BEGIN_SRC sh :tangle (when (eq x-p t) "tmp/.profile")
modmap()
{
[ -f "${HOME}/.Xmodmap" ] && xmodmap "${HOME}/.Xmodmap"
}
#+END_SRC
* Aliases
** General
#+BEGIN_SRC sh
# general aliases
alias s="\$(which ssh)"
alias quit='exit'
alias cr='reset; clear'
alias a=ag
alias n=noglob
alias l=ls
alias L='ls -dal'
alias cleandir="find . -type f \( -name '*~' -o -name '#*#' -o -name '.*~' -o -name '.#*#' -o -name 'core' -o -name 'dead.letter*' \) | grep -v auto-save-list | xargs -t rm"

# Prefer less for paging duties.
which less > /dev/null 2>&1
if [ $? -eq 0 ]; then
alias T="\$(which less) -f +F"
else
alias T="\$(which tail) -f"
fi

alias e=emacs
alias de=emacs --debug-init -nw
alias ec=emacsclient
alias ect=emacsclient -t
alias oec=emacsclient -n -c
alias stope=emacsclient -t -e "(save-buffers-kill-emacs)(kill-emacs)"
alias kille=emacsclient -e "(kill-emacs)"
#+END_SRC

** osx
#+BEGIN_SRC sh :tangle (when (eq osx-p t) "tmp/.profile")
alias o='open -a'
#+END_SRC
** git
#+BEGIN_SRC sh :tangle (when (eq git-p t) "tmp/.profile")
alias g=git
#+END_SRC
** haskell
#+BEGIN_SRC sh :tangle (when (eq haskell-p t) "tmp/.profile")
alias ghce="ghc -e ':l ~/.ghc.hs' -e"
#+END_SRC
** mosh
#+BEGIN_SRC sh :tangle (when (eq mosh-p t) "tmp/.profile")
alias m=mosh
#+END_SRC

** tmux
#+BEGIN_SRC sh :tangle (when (eq tmux-p t) "tmp/.profile")
alias tl='tmux ls'
#+END_SRC

* cray

Cray specific stuff.

#+BEGIN_SRC sh :tangle (when (eq cray-p t) "tmp/.profile")
stash()
{
maybe_git_repo "ssh://git@stash.us.cray.com:7999/${1}.git" || \
maybe_git_repo "ssh://git@stash.us.cray.com:7999/~${1}.git"
}

haste()
{
set -e
URL=http://buildservice.us.cray.com:7777/
if [ ! -z "$@" ]; then
for x in "$@"; do
if [ -f "${x}" ]; then
curl -X POST -s -d "@${x}" ${URL}documents | awk -F '"' '{print "'$URL'"$4}';
else
echo "file ${x} does not exist to upload"
fi
done
else
cat /dev/stdin | curl -X POST -s -d "@-" ${URL}documents | awk -F '"' '{print "'$URL'"$4}';
fi
set +e
}
#+END_SRC

+ 41
- 1
emacs.org Wyświetl plik

@@ -9,6 +9,18 @@


Startup related tasks/setup that might be used later on. Startup related tasks/setup that might be used later on.


*** tangle functions

Duplicated from tangle.el just to make using org easier.

TODO: make this stuff work sanely in emacs org mode and
via external tangling. Not tangled for now.

#+BEGIN_SRC emacs-lisp :tangle no
(defun tangle/yn (p) (if (bound-and-true-p p) "yes" "no"))
(defun tangle/file (p file) (if (bound-and-true-p p) (concat "tmp/" file) "no"))
#+END_SRC

*** emacs package setup *** emacs package setup


Setup the builtin emacs package manager. Setup the builtin emacs package manager.
@@ -596,6 +608,9 @@ Highlight matching ()'s []'s etc...


*** org-mode *** org-mode


- foo
- bar

Org-mode keybindings and settings, pretty sparse really. Org-mode keybindings and settings, pretty sparse really.


#+BEGIN_SRC emacs-lisp #+BEGIN_SRC emacs-lisp
@@ -606,13 +621,38 @@ Org-mode keybindings and settings, pretty sparse really.
("C-c c" . org-capture) ("C-c c" . org-capture)
("C-c l" . org-store-link) ("C-c l" . org-store-link)
("C-c p" . org-latex-export-to-pdf)) ("C-c p" . org-latex-export-to-pdf))
:init (use-package org-bullets)
:init (use-package org-bullets
:config
(progn
(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))))
:config :config
(progn (progn
(custom-set-variables (custom-set-variables
'(org-log-done t) '(org-log-done t)
'(org-hide-leading-stars t) '(org-hide-leading-stars t)
'(org-hide-emphasis-markers t)
) )
(font-lock-add-keywords 'org-mode
'(("^ +\\([-*]\\) "
(0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•"))))))
(let* ((variable-tuple (cond ((x-list-fonts "Source Sans Pro") '(:font "Source Sans Pro"))
((x-list-fonts "Lucida Grande") '(:font "Lucida Grande"))
((x-list-fonts "Verdana") '(:font "Verdana"))
((x-family-fonts "Sans Serif") '(:family "Sans Serif"))
(nil (warn "Cannot find a Sans Serif Font. Install Source Sans Pro."))))
(base-font-color (face-foreground 'default nil 'default))
(headline `(:inherit default :weight bold :foreground ,base-font-color)))

(custom-theme-set-faces 'user
`(org-level-8 ((t (,@headline ,@variable-tuple))))
`(org-level-7 ((t (,@headline ,@variable-tuple))))
`(org-level-6 ((t (,@headline ,@variable-tuple))))
`(org-level-5 ((t (,@headline ,@variable-tuple))))
`(org-level-4 ((t (,@headline ,@variable-tuple :height 1.1))))
`(org-level-3 ((t (,@headline ,@variable-tuple :height 1.25))))
`(org-level-2 ((t (,@headline ,@variable-tuple :height 1.5))))
`(org-level-1 ((t (,@headline ,@variable-tuple :height 1.75))))
`(org-document-title ((t (,@headline ,@variable-tuple :height 1.5 :underline nil))))))
(org-reload) (org-reload)
) )
) )


+ 4
- 4
etangle Wyświetl plik

@@ -1,13 +1,13 @@
;;-*-mode: emacs-lisp; coding: utf-8;-*- ;;-*-mode: emacs-lisp; coding: utf-8;-*-
;; Copyright: 2016 Mitchell Tishmack ;; Copyright: 2016 Mitchell Tishmack
;; Tangle an org mode file with babel using emacs. ;; Tangle an org mode file with babel using emacs.
(load-file (if (getenv "OPTIONS")
(concat (concat "./" (getenv "OPTIONS")) ".el")
"./options.el"))

(require 'org-install) (require 'org-install)
(require 'org) (require 'org)


(load-file "./tangle.el")

(load-defaults-or-options)

;; Iterate through all the files given and tangle them ;; Iterate through all the files given and tangle them
(dolist (dolist
(file command-line-args-left) (file command-line-args-left)


+ 140
- 0
git.org Wyświetl plik

@@ -0,0 +1,140 @@
#+TITLE: Git Configuration
#+AUTHOR: Mitch Tishmack
#+STARTUP: hidestars
#+STARTUP: odd
#+BABEL: :cache yes
#+PROPERTY: header-args :cache yes :padline no :comments no

General git configuration split out into sections mostly.

* ~/.gitconfig
:PROPERTIES:
:header-args: :tangle tmp/.gitconfig :comments no :padline no :cache yes :mkdirp yes
:END:
** pager
#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig")
[pager]
color = true
#+END_SRC
** color
#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig")
[color]
status = auto
diff = auto
branch = auto
[color "status"]
added = green
changed = blue
untracked = red
[color "branch"]
current = green
local = blue
remote = red
[color "diff"]
meta = blue bold
frag = black reverse
old = red reverse
new = green reverse
#+END_SRC
** alias
#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig")
[alias]
begin = !git init && git commit --allow-empty -m 'Initial empty commit'
up = !git pull --rebase && git push
wsdiff = diff --color-words --ignore-space-at-eol --ignore-space-change --ignore-all-space --ignore-all-space
wdiff = diff --color-words
ci = commit
ciu = commit --all
co = checkout
ds = diff --stat
ba = branch --all
st = status --short --branch
s = status --short --branch --untracked-files=no
unstage = reset HEAD
tlog = log --graph --color=always --abbrev-commit --date=relative --pretty=oneline
hist = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
slog = log --oneline --decorate
fixup = commit --fixup
squash = commit --squash
ri = rebase --interactive --autosquash
ra = rebase --abort
effit = reset --hard
# What commits differ between branches, note, equivalent commits are omitted.
# Use this with three dot operator aka master...origin/master
cpdiff = log --no-merges --left-right --graph --cherry-pick --oneline
# Same as ^ only equivalent commits are listed with a = sign.
cmdiff = log --no-merges --left-right --graph --cherry-mark --oneline
# git update with submodule update
sup = git pull && git submodule update --init --recursive
# git clone with submodules
sc = !git clone --recursive $1
# what files are getting updated a lot
churn = !git log --all -M -C --name-only --format='format:' "$@" | sort | grep -v '^$' | uniq -c | sort | awk 'BEGIN {print "count,file"} {print $1 "," $2}'
# help the gc a bit and get a bit more space back for a local clone
trim = !git reflog expire --expire=now --all && git gc --prune=now
#+END_SRC
** github
#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig")
[github]
user = mitchty
#+END_SRC
** credential
#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig")
[credential]
helper = netrc -v -f ~/.netrc.gpg -f ~/.netrc
#+END_SRC
** advice
#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig")
[advice]
statushints = false
#+END_SRC
** gui
#+BEGIN_SRC conf :tangle (tangle/file 'git-p ".gitconfig")
[gui]
fontui = -family Monaco -size 8 -weight normal -slant roman -underline 0 -overstrike 0
fontdiff = -family Monaco -size 8 -weight normal -slant roman -underline 0 -overstrike 0
#+END_SRC
** http
#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig")
[http]
postBuffer = 209715200
#+END_SRC
** push
#+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig")
[push]
default = simple
#+END_SRC
** url rewrites
#+BEGIN_SRC conf :tangle (tangle/file 'git-p ".gitconfig")
[url "https://github.com/"]
insteadOf = git://github.com/
#+END_SRC
** username/email
#+BEGIN_SRC conf :tangle (tangle/file 'git-p ".gitconfig")
[user]
name = Mitch Tishmack
email = mitch.tishmack@gmail.com
#+END_SRC

* ~/.gitignore
:PROPERTIES:
:header-args: :tangle tmp/.gitignore :comments no :padline no :cache yes :mkdirp yes
:END:

Common crap/build artifacts that git should always ignore.

#+BEGIN_SRC conf :tangle no
.*~
*~
.\#*
\#*
\#*\#
.\#*\#
.DS_Store
*.pyc
*.rbc
*.elc
*.swp
*.[oa]
*.hi
#+END_SRC

+ 32
- 0
haskell.org Wyświetl plik

@@ -0,0 +1,32 @@
#+TITLE: Haskell Configuration
#+AUTHOR: Mitch Tishmack
#+STARTUP: hidestars
#+STARTUP: odd
#+BABEL: :cache yes
#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no

Haskell setup.

* ~/.ghci
Ghci setup, mostly just cosmetics.

#+BEGIN_SRC haskell :tangle tmp/.ghci
:l ~/.ghc.hs
:set prompt "λ "
:set +t
#+END_SRC

* ~/.ghc.hs

What to automatically have loaded into ghci sessions.

#+BEGIN_SRC haskell :tangle tmp/.ghc.hs
import Control.Applicative
import Control.Monad
import Data.Monoid
import Data.Maybe
import Data.List
import Data.Bool
import qualified Data.Set as S
import qualified Data.Map as M
#+END_SRC

+ 122
- 0
misc.org Wyświetl plik

@@ -0,0 +1,122 @@
#+TITLE: Misc Configuration
#+AUTHOR: Mitch Tishmack
#+STARTUP: hidestars
#+STARTUP: odd
#+BABEL: :cache yes
#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no

Stuff that didn't fit anywhere else.

* ~/.dir_colors

For BSD ps, make colors closer to what the GNU utilities produce by default.

#+BEGIN_SRC conf :tangle tmp/.dir_colors :results replace
COLOR tty

TERM ansi
TERM color-xterm
TERM con132x25
TERM con132x30
TERM con132x43
TERM con132x60
TERM con80x25
TERM con80x28
TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM cons25
TERM console
TERM cygwin
TERM dtterm
TERM eterm-color
TERM Eterm
TERM gnome
TERM konsole
TERM kterm
TERM linux
TERM linux-c
TERM mach-color
TERM putty
TERM rxvt
TERM rxvt-cygwin
TERM rxvt-cygwin-native
TERM rxvt-unicode
TERM screen
TERM screen-bce
TERM screen-w
TERM screen.linux
TERM vt100
TERM xterm
TERM xterm-256color
TERM xterm-color
TERM xterm-debian

# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
NORMAL 00 # global default, although everything should be something.
FILE 00 # normal file
DIR 01;34 # directory
LINK 01;36 # symbolic link. (If you set this to 'target' instead of a
# numerical value, the color will match the file pointed to)
FIFO 40;33 # pipe
SOCK 01;35 # socket
DOOR 01;35 # door
BLK 40;33;01 # block device driver
CHR 40;33;01 # character device driver
ORPHAN 01;05;37;41 # orphaned syminks
MISSING 01;05;37;41 # ... and the files they point to

# This is for files with execute permission:
EXEC 01;32

# List any file extensions like '.gz' or '.tar' that you would like ls
# to colorize below. Put the extension, a space, and the color init string.
# (and any comments you want to add after a '#')

.cmd 01;32 # executables (bright green)
.exe 01;32
.com 01;32
.btm 01;32
.bat 01;32
.sh 01;32
.csh 01;32
.ksh 01;32
.zsh 01;32

.tar 01;31 # archives / compressed (bright red)
.tgz 01;31
.arj 01;31
.taz 01;31
.lzh 01;31
.zip 01;31
.z 01;31
.Z 01;31
.gz 01;31
.bz2 01;31
.bz 01;31
.tbz2 01;31
.tz 01;31
.deb 01;31
.rpm 01;31
.rar 01;31 # app-arch/rar
.ace 01;31 # app-arch/unace
.zoo 01;31 # app-arch/zoo
.cpio 01;31 # app-arch/cpio
.7z 01;31 # app-arch/p7zip
.rz 01;31 # app-arch/rzip
#+END_SRC

* ~/.hushlogin

Because who gives a rats when and where I last logged on from?

#+BEGIN_SRC conf :tangle tmp/.hushlogin :results replace
#+END_SRC

+ 171
- 0
nix.org Wyświetl plik

@@ -0,0 +1,171 @@
#+TITLE: Nix Configuration
#+AUTHOR: Mitch Tishmack
#+STARTUP: hidestars
#+STARTUP: odd
#+BABEL: :cache yes
#+PROPERTY: header-args :tangle tmp/.nixpkgs/config.nix :cache yes :padline no :mkdirp yes :comments no

Nix user config.nix setup.

#+BEGIN_SRC conf :tangle (when (eq nix-p t) "tmp/.nixpkgs/config.nix")
{
allowUnfree = true;
allowBroken = true;

packageOverrides = pkgs: rec {
pinentry = pkgs.pinentry.override { gtk2 = null; qt4 = null; ncurses = null; };
gnupg = pkgs.gnupg.override { x11Support = false; pinentry = false; };
youtube-dl = pkgs.youtube-dl.override { pandoc = null; };

# This didn't work
# haskell = pkgs.haskell // {
# packages = pkgs.haskell.packages // {
# ghc = pkgs.haskell.packages.ghc.override {
# overrides = self: pkgs: {
# idris = self.callPackage ./idris-0.10.nix {};
# };
# };
# };
# };

# Nor this
# idris = pkgs.haskell.lib.overrideCabal pkgs.idris (oldAttrs: {
# version = "0.10";
# sha256 = "043adsnadjxfyk8lqkv6dgq3l6qijsj5s4rpky0zy06x5k5gx4sm";
# });


default = with pkgs; buildEnv {
name = "default";
paths = [
ansible
ack
aria
iperf
cacert
curl
clang
clang-analyzer
diffutils
patchutils
gitAndTools.gitFull
gitAndTools.git-extras
bazaarTools
mercurial
subversionClient
gist
mercurial
docbook5
entr
emacs
gnupg1compat
gnutar
gnumake
sloccount
cloc
less
multitail
rlwrap
gdbm
mosh
htop
# imagemagick also busted on osx now
keychain
silver-searcher
aspell
aspellDicts.en
openssl
pinentry
pbzip2
pigz
pv
postgresql
readline
rsync
sqlite
# texLiveFull and now this things broken on osx nix, sigh
tmux
tree
wget
wakelan
unzip
upx
xz
multimarkdown
jq
# rtags broken again on osx, fix it
# p7zip broken again on osx, god nix is terribad at keeping things working
unrar
watch
nox
mutt
duply
zsh
pylint
python27Packages.howdoi
python27Packages.youtube-dl
python27Packages.pyflakes
python27Packages.flake8
python27Packages.virtualenv
python27Packages.pip
# xhyve compiles normally, figure out hypervisor framework issue
lastpass-cli
haskellPackages.alex
haskellPackages.happy
haskellPackages.bake
haskellPackages.cabal-dependency-licenses
haskellPackages.cabal-install
haskellPackages.cabal-meta
haskellPackages.ghc-core
haskellPackages.ghc-mod
haskellPackages.hasktags
haskellPackages.hindent
haskellPackages.hoogle
haskellPackages.hspec
haskellPackages.pandoc
haskellPackages.shake
haskellPackages.ShellCheck
haskellPackages.stack
haskellPackages.nats
haskellPackages.transformers-compat
];
};
};
}
#+END_SRC

Because idris 0.11 fails its testsuite, got no time to figure it out right now.

#+END_SRC conf :tangle (when (eq nix-p t) ".nixpkgs/idris-0.10.nix")
{ mkDerivation, annotated-wl-pprint, ansi-terminal, ansi-wl-pprint
, async, base, base64-bytestring, binary, blaze-html, blaze-markup
, bytestring, cheapskate, containers, deepseq, directory, filepath
, fingertree, fsnotify, haskeline, mtl, network
, optparse-applicative, parsers, pretty, process, safe, split
, stdenv, text, time, transformers, transformers-compat, trifecta
, uniplate, unix, unordered-containers, utf8-string, vector
, vector-binary-instances, zip-archive, zlib
}:
mkDerivation {
pname = "idris";
version = "0.10";
sha256 = "043adsnadjxfyk8lqkv6dgq3l6qijsj5s4rpky0zy06x5k5gx4sm";
isLibrary = true;
isExecutable = true;
libraryHaskellDepends = [
annotated-wl-pprint ansi-terminal ansi-wl-pprint async base
base64-bytestring binary blaze-html blaze-markup bytestring
cheapskate containers deepseq directory filepath fingertree
fsnotify haskeline mtl network optparse-applicative parsers pretty
process safe split text time transformers transformers-compat
trifecta uniplate unix unordered-containers utf8-string vector
vector-binary-instances zip-archive zlib
];
executableHaskellDepends = [
base directory filepath haskeline transformers
];
homepage = "http://www.idris-lang.org/";
description = "Functional Programming Language with Dependent Types";
license = stdenv.lib.licenses.bsd3;
}
#+END_SRC

+ 23
- 0
osx-nonix.el Wyświetl plik

@@ -0,0 +1,23 @@
;;-*-mode: emacs-lisp; coding: utf-8;-*-
;; All these variables control what/how readme.org gets tangled
;; into dotfiles. Off by default set to t to turn them on as
;; needed.

;; OS types
(setq bsd-p nil)
(setq linux-p nil)
(setq osx-p t)

;; Optional things
(setq nix-p nil)
(setq tmux-p t)
(setq git-p t)
(setq emacs-p t)
(setq vim-p nil)
(setq zsh-p t)
(setq mosh-p t)
(setq x-p t)

;; Language specific
(setq haskell-p t)
(setq perl-p t)

+ 93
- 0
perl.org Wyświetl plik

@@ -0,0 +1,93 @@
#+TITLE: Perl Configuration
#+AUTHOR: Mitch Tishmack
#+STARTUP: hidestars
#+STARTUP: odd
#+BABEL: :cache yes
#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no

Mostly old holdovers from the days of perl, just perlcritic and perltidy configuration.

* ~/.perlcriticrc

What to complain about by default.

#+BEGIN_SRC conf :tangle tmp/.perlcritirc :results replace
# Show the severity level
severity = 1

# Basically show what profile is complaining
verbose = %f:%l:%c: %m, %e (%p, severity %s)\n

# Don't warn on these variables
[Variables::ProhibitPunctuationVars]
allow = $@ $!

# Ignore syscall returns on print, it not actually returning is... whatever.
[InputOutput::RequireCheckedSyscalls]
exclude_functions = print say

# Allow things like print qx(somecmd) in a void context to work, this is ok.
[InputOutput::ProhibitBacktickOperators]
only_in_void_context = 1

# I actually like using unless... so don't piss me off whinging about it
[-ControlStructures::ProhibitUnlessBlocks]

# The following only apply to modules
[-Modules::RequireVersionVar]
[-ErrorHandling::RequireCarping]

# Tabs suck, no
[CodeLayout::ProhibitHardTabs]
allow_leading_tabs = 0

# For small regexes, no /x at the end is fine, 12 should be enough
[RegularExpressions::RequireExtendedFormatting]
minimum_regex_length_to_complain_about = 12

# These are kosher kthxbai
[ControlStructures::ProhibitPostfixControls]
allow = for if until unless

# For POE, we do things like my $foo = $_[HEAP]; and thats OK
[Subroutines::RequireArgUnpacking]
allow_subscripts = 1

# For POD documentation, I don't care about required sections.
[Documentation::RequirePodSections]
lib_sections = NAME | SYNOPSIS | DESCRIPTION | AUTHOR | COPYRIGHT | SEE ALSO
script_sections = NAME | SYNOPSIS | DESCRIPTION | AUTHOR | COPYRIGHT | SEE ALSO

# This is for POD documentation mainly.
[CodeLayout::ProhibitHardTabs]
allow_leading_tabs = 1
#+END_SRC

* ~/.perltidyrc

Control how perltidy should clean things up.

#+BEGIN_SRC conf :tangle tmp/.perltidyrc :results replace
# cuddled elses pls
-ce
# indent 2 spaces
-i=2
# for tokens with things like arrays, start the data next line down one indent in
-lp
# align closing tokens for things like arrays with the opening token
-cti=1
# default, but spaces between multiple entries, none with one arg
-pt=1
# line encoding
-ole=unix
# braces not on new line
-nsbl
# stack opening tokens, don't create a new line with one token, note no stacking of closing tokens
-sot
# no space before ;'s in for loops
-nsfs
# Make curly braces act more like the args param
-bbt=1
# Trim qw whitespaces
-tqw
#+END_SRC

+ 29
- 2625
readme.org Wyświetl plik

@@ -56,7 +56,7 @@ Where N is the generation you want to copy.


** How does it work? ** How does it work?


It is really rather simple, the makefile isn't that complex. Look at that
It is really rather simple, the [[file:Makefile][Makefile]] isn't that complex. Look at that
for details. for details.


This isn't intended to cover everything. This could be considered a template This isn't intended to cover everything. This could be considered a template
@@ -70,7 +70,7 @@ files is the users job, not this setup.


** Explanation of what is happening ** Explanation of what is happening


The file options.el controls predicates that change how files get tangled to files.
The file [[file:defaults.el][defaults.el]] controls predicates that change how files get tangled to files.


This allows me to tangle files that would be useful for linux/bsd/etc... This allows me to tangle files that would be useful for linux/bsd/etc...
without affecting the existing files. without affecting the existing files.
@@ -96,7 +96,7 @@ to generate config files, not necessarily to use them.
Should be easy enough to either clone this repo or copy things to a new repo Should be easy enough to either clone this repo or copy things to a new repo
and hack in what you need. Your call. and hack in what you need. Your call.


But, say you have a heading, take .profile which comes up next, under the
But, say you have a heading, take .profile as an example, under an org mode
heading you would just add: heading you would just add:


#+BEGIN_SRC org :tangle no #+BEGIN_SRC org :tangle no
@@ -122,2634 +122,38 @@ Pretty simple, just add a source block like normal:


#+END_SRC #+END_SRC


** TODO
- [ ] Auto load-file options.el to make code blocks editable in their major
modes.
- [ ] Need to have some way to autocleanup old generations. Rm works for now
so meh.
- [ ] Need to add the ability to detect that make is generating a pointless
new generation. Aka generation N and generation N-1 are the same, just leave
N and don't increment.
- [ ] Maybe checksum file contents somehow and use that?
- [ ] More? For now its functional.

* ~/.profile
:PROPERTIES:
:header-args: :tangle tmp/.profile :comments no :padline no :cache yes :mkdirp yes
:END:

** PS1

#+BEGIN_SRC sh
# -*- mode: Shell-script; -*-
# Common .profile
#
# DO NOT EDIT, managed by org mode
_uname=$(uname)
_uname_n=$(uname -n)
_hostname=$(hostname)
export _uname _uname_n _hostname
#+END_SRC

OSX uses hostname -s for getting hostname

#+BEGIN_SRC sh :tangle (when (eq osx-p t) "tmp/.profile")
_host=$(hostname -s)
#+END_SRC

Otherwise we just use what uname -n sent.

#+BEGIN_SRC sh
_host=${_host:=${_uname_n}}
#+END_SRC

** PATH
*** osx
OSX homebrew leftovers, need to make sure it make sense any longer as I've switched to nix.

#+BEGIN_SRC sh :tangle (when (eq osx-p t) "tmp/.profile")
osx_release=$(sw_vers -productVersion | sed -e 's/\.[0-9]\{1\}//2')
brew_home=/usr/local/brew/${osx_release}
PATH="${brew_home}/bin:/usr/local/bin:${PATH}"
export PATH
#+END_SRC
*** haskell
#+BEGIN_SRC sh :tangle (when (eq haskell-p t) "tmp/.profile")
PATH="${PATH}:${HOME}/.cabal/bin"
#+END_SRC
*** General
#+BEGIN_SRC sh :tangle "tmp/.profile"
PATH="${PATH}:${HOME}/bin"
export PATH
#+END_SRC

** Functions
*** General
Generally useful functions.

#+BEGIN_SRC sh
# cat out a : separated env variable
# variable is the parameter
cat_env()
{
set | grep '^'"$1"'=' > /dev/null 2>&1 && eval "echo \$$1" | tr ':' '
' | awk '!/^\s+$/' | awk '!/^$/'
}

# Convert a line delimited input to : delimited
to_env()
{
awk '!a[$0]++' < /dev/stdin | tr -s '
' ':' | sed -e 's/\:$//' | awk 'NF > 0'
}

# Unshift a new value onto the env var
# first arg is ENV second is value to unshift
# basically prepend value to the ENV variable
unshift_env()
{
new=$(eval "echo $2; echo \$$1" | to_env)
eval "$1=${new}; export $1"
}

# Opposite of above, but echos what was shifted off
shift_env()
{
first=$(cat_env "$1" | head -n 1)
rest=$(cat_env "$1" | awk '{if (NR!=1) {print}}' | to_env)
eval "$1=$rest; export $1"
echo "${first}"
}

# push $2 to $1 on the variable
push_env()
{
have=$(cat_env "$1")
new=$(printf "%s
%s" "$have" "$2" | to_env)
eval "$1=$new; export $1"
}

# Remove a line matched in $HOME/.ssh/known_hosts for when there are legit
# host key changes.
nukehost()
{
if [ -z "$1" ]; then
echo "Usage: nukehost <hostname>"
echo " Removes <hostname> from ssh known_host file."
else
sed -i -e "/$1/d" ~/.ssh/known_hosts
fi
}

# Cheap copy function to make copying a file via ssh from one host
# to another less painful, use pipeviewer to give some idea as to progress.
ssh-copyfile()
{
if [ -z "$1" -o -z "$2" ]; then
echo "Usage: copy source:/file/location destination:/file/location"
else
srchost="$(echo "$1" | awk -F: '{print $1}')"
src="$(echo "$1" | awk -F: '{print $2}')"
dsthost="$(echo "$2" | awk -F: '{print $1}')"
dst="$(echo "$2" | awk -F: '{print $2}')"
size=$(ssh "$srchost" du -hs "$src" 2> /dev/null)
size=$(echo "${size}" | awk '{print $1}')
echo "Copying $size to $dst"
ssh "$srchost" "/bin/cat \$src" 2> /dev/null | pv -cb -N copied - | ssh "$dsthost" "/bin/cat - > \$dst" 2> /dev/null
fi
}

# extract function to automate being lazy at extracting archives.
extract()
{
if [ -f "$1" ]; then
case ${1} in
*.tar.bz2|*.tbz2|*.tbz) bunzip2 -c "$1" | tar xvf -;;
*.tar.gz|*.tgz) gunzip -c "$1" | tar xvf -;;
*.tz|*.tar.z) zcat "$1" | tar xvf -;;
*.tar.xz|*.txz|*.tpxz) xz -d -c "$1" | tar xvf -;;
*.bz2) bunzip2 "$1";;
*.gz) gunzip "$1";;
*.jar|*.zip) unzip "$1";;
*.rar) unrar x "$1";;
*.tar) tar -xvf "$1";;
*.z) uncompress "$1";;
*.rpm) rpm2cpio "$1" | cpio -idv;;
*) echo "Unable to extract <$1> Unknown extension."
esac
else
print "File <$1> does not exist."
fi
}

# Tcsh compatibility so I can be a lazy bastard and paste things directly
# if/when I need to.
setenv()
{
export "$1=$2"
}

# Just to be lazy, set/unset the DEBUG env variable used in my scripts
debug()
{
if [ -z "$DEBUG" ]; then
if [ -z "$1" ]; then
echo Setting DEBUG to "$1"
setenv DEBUG "$1"
else
echo Setting DEBUG to default
setenv DEBUG default
fi
else
echo Unsetting DEBUG
unset DEBUG
fi
}

login_shell()
{
[ "$-" = "*i*" ]
}

# Yeah, sick of using the web browser for this crap
# Use is NUM FROM TO and boom get the currency converted from goggle.
cconv()
{
curl -L --silent\
"https://www.google.com/finance/converter?a=$1&from=$2&to=$3" \
| grep converter_result \
| perl -pe 's|[<]\w+ \w+[=]\w+[>]||g;' -e 's|[<][/]span[>]||'
}
#+END_SRC

*** git
#+BEGIN_SRC sh :tangle (when (eq git-p t) "tmp/.profile")
maybe_git_repo()
{
# assume https if input doesn't contain a protocol
proto=https
destination=${HOME}/src
echo "${1}" | grep '://' > /dev/null 2>&1
[ $? = 0 ] && proto=$(echo "${1}" | sed -e 's|[:]\/\/.*||g')
git_dir=$(echo "${1}" | sed -e 's|.*[:]\/\/||g')
rrepo="${proto}://${git_dir}"

# strip user@, :NNN, and .git from input uri's
repo="${destination}/"$(echo "${git_dir}" |
sed -e 's/\.git$//g' |
sed -e 's|.*\@||g' |
sed -e 's|\:[[:digit:]]\{1,\}\/|/|g' |
tr -d '~')

if [ ! -d "${repo}" ]; then
git ls-remote "${rrepo}" > /dev/null 2>&1
if [ $? = 0 ]; then
mkdir -p "${repo}"
echo "git clone ${rrepo} ${repo}"
git clone --recursive "${rrepo}" "${repo}"
else
echo "${rrepo} doesn't look to be a git repository"
fi
fi
[ -d "${repo}" ] && cd "${repo}"
}

gh()
{
maybe_git_repo "https://github.com/${1}"
}

bb()
{
maybe_git_repo "https://bitbucket.org/${1}"
}
#+END_SRC
*** haskell
#+BEGIN_SRC sh :tangle (when (eq haskell-p t) "tmp/.profile")
hmap()
{
ghc -e "interact ($*)"
}

hmapl()
{
hmap "unlines.($*).lines"
}

hmapw()
{
hmapl "map (unwords.($*).words)"
}
#+END_SRC
*** nix
#+BEGIN_SRC sh :tangle (when (eq nix-p t) "tmp/.profile")
mk_nix_shell()
{
cabal2nix --sha256="0" . \
| perl -0777 -p -e 's/{.+}:/{ haskellPackages ? (import <nixpkgs> {}).haskellPackages }:/s' \
| sed -E -e 's/(cabal\.mkDerivation)/with haskellPackages; \1/' -e 'sXsha256 = "0";Xsrc = "./.";X' \
> shell.nix;
}

nix_env_setup()
{
# The nix installer put something like this into the .profile.
# BAD INSTALLER NO COOKIE!
if [ -e ${HOME}/.nix-profile/etc/profile.d/nix.sh ]; then
. ${HOME}/.nix-profile/etc/profile.d/nix.sh;
export NIX_PATH=${HOME}/src/github.com/NixOS/nixpkgs:nixpkgs=${HOME}/src/github.com/NixOS/nixpkgs
export NIX_CFLAGS_COMPILE="-idirafter /usr/include"
export NIX_CFLAGS_LINK="-L/usr/lib"

NIX_GHC=$(type -p ghc > /dev/null 2>&1)
if [ -n "$NIX_GHC" ]; then
eval $(grep export "$NIX_GHC")
fi
fi

nr()
{
nix-shell --run "$(echo $@)"
}
}

nix_env_setup
#+END_SRC

Workaround stupid ssl crap with recent nix.

#+BEGIN_SRC sh :tangle (when (and (eq nix-p t) (eq osx-p t)) "tmp/.profile")
SSL_CERT_FILE="${HOME}/.nix-profile/etc/ssl/certs/ca-bundle.crt"
GIT_SSL_CAINFO=$SSL_CERT_FILE
export SSL_CERT_FILE
export GIT_SSL_CAINFO
#+END_SRC

TODO Add linux ca-bundle detection
if test -e /etc/ssl/certs/ca-bundle.crt ; # Fedora, NixOS
set -xg SSL_CERT_FILE /etc/ssl/certs/ca-bundle.crt ;
else if test -e /etc/ssl/certs/ca-certificates.crt ; # Ubuntu, Debian
set -xg SSL_CERT_FILE /etc/ssl/certs/ca-certificates.crt

*** tmux
#+BEGIN_SRC sh :tangle (when (eq tmux-p t) "tmp/.profile")
t()
{
if [ -z "$1" ]; then
echo "Supply a tmux session name to connect to/create"
else
tmux has-session -t "$1" 2>/dev/null
[ $? != 0 ] && tmux new-session -d -s "$1"
tmux attach-session -d -t "$1"
fi
}
#+END_SRC
*** x
#+BEGIN_SRC sh :tangle (when (eq x-p t) "tmp/.profile")
modmap()
{
[ -f "${HOME}/.Xmodmap" ] && xmodmap "${HOME}/.Xmodmap"
}
#+END_SRC
*** cray
#+BEGIN_SRC sh :tangle (when (eq cray-p t) "tmp/.profile")
stash()
{
maybe_git_repo "ssh://git@stash.us.cray.com:7999/${1}.git" || \
maybe_git_repo "ssh://git@stash.us.cray.com:7999/~${1}.git"
}

haste()
{
set -e
URL=http://buildservice.us.cray.com:7777/
if [ ! -z "$@" ]; then
for x in "$@"; do
if [ -f "${x}" ]; then
curl -X POST -s -d "@${x}" ${URL}documents | awk -F '"' '{print "'$URL'"$4}';
else
echo "file ${x} does not exist to upload"
fi
done
else
cat /dev/stdin | curl -X POST -s -d "@-" ${URL}documents | awk -F '"' '{print "'$URL'"$4}';
fi
set +e
}
#+END_SRC
** Aliases
*** General
#+BEGIN_SRC sh
# general aliases
alias s="\$(which ssh)"
alias quit='exit'
alias cr='reset; clear'
alias a=ag
alias n=noglob
alias l=ls
alias L='ls -dal'
alias cleandir="find . -type f \( -name '*~' -o -name '#*#' -o -name '.*~' -o -name '.#*#' -o -name 'core' -o -name 'dead.letter*' \) | grep -v auto-save-list | xargs -t rm"

# Prefer less for paging duties.
which less > /dev/null 2>&1
if [ $? -eq 0 ]; then
alias T="\$(which less) -f +F"
else
alias T="\$(which tail) -f"
fi

alias e=emacs
alias de=emacs --debug-init -nw
alias ec=emacsclient
alias ect=emacsclient -t
alias oec=emacsclient -n -c
alias stope=emacsclient -t -e "(save-buffers-kill-emacs)(kill-emacs)"
alias kille=emacsclient -e "(kill-emacs)"
#+END_SRC

*** osx
#+BEGIN_SRC sh :tangle (when (eq osx-p t) "tmp/.profile")
alias o='open -a'
#+END_SRC
*** git
#+BEGIN_SRC sh :tangle (when (eq git-p t) "tmp/.profile")
alias g=git
#+END_SRC
*** haskell
#+BEGIN_SRC sh :tangle (when (eq haskell-p t) "tmp/.profile")
alias ghce="ghc -e ':l ~/.ghc.hs' -e"
#+END_SRC
*** mosh
#+BEGIN_SRC sh :tangle (when (eq mosh-p t) "tmp/.profile")
alias m=mosh
#+END_SRC

*** tmux
#+BEGIN_SRC sh :tangle (when (eq tmux-p t) "tmp/.profile")
alias tl='tmux ls'
#+END_SRC
* ~/bin

** ~/bin/cidr

A stupid script I wrote ages ago to help me be lazy with cidr
notation for stuff. Setup the wrong netmask a few times and
you too, will wish for something similar.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/cidr :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Convert input ip/cidr|netmask|hexnetmask to useable network information.
#

use strict;
use warnings;
use Socket;
use Sys::Hostname;

#
# Globalish vars
#
$ENV{PATH} = '/usr/bin:/bin:/usr/sbin:/sbin'; # Paranoia, know thy name!
my ($fqdn_regexp) = qr/([0-9,a-z,A-Z,\-,\_]+)\.([0-9,a-z,A-Z,\-,\_]+)\.(com|gov)/;

#
# converts a 1-word (4 byte) signed or unsigned integer into a dotted decimal
# ip address.
#
sub int2ip {
my $n=int(pop);
return(sprintf("%d.%d.%d.%d", ($n>>24)&0xff,($n>>16)&0xff,
($n>>8)&0xff,$n&0xff));
};

#
# Convert a host/ip/netmask/cidr/etc.... to a hash of information
# Example: host.domain.tld/24 will get the ip and calculate the netmask info
# equally if host.domain.tld corresponds with 1.2.3.4 the following is valid
# 1.2.3.4/255.255.255.0 would obtain the same information.
#
# die()'s if anything isn't kosher.
#
# Ultra long function, probably needs to be looked at for condensing/splitting.
#
sub cidr2raw {
my $rawinput = pop;
my ($lhs, $rhs, $j, $uip) = (undef, undef, undef, undef);
my ($ucidr) = 0;
my ($network, $bits, $netmask, $broadcast, $low, $high);

if ($rawinput =~ qr/(.*)\/(.*)/){
$lhs = $1; $rhs = $2;
}else{
die "Input: $rawinput not expected.\n";
};

#
# Handle ip/hostname for left hand side.
if ($lhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){
foreach my $dotted (($1,$2,$3,$4)){
if (($dotted > 255) or ($dotted < 0)){
die "FATAL: ipv4 address entered, $lhs entered is impossible, $dotted is not between 0-255.\n";
};
};
$uip = inet_ntoa(scalar gethostbyname($lhs));
die "FATAL: Cannot determine hostname for $lhs$!\n" if (!defined($lhs));
}elsif ($lhs =~ $fqdn_regexp){
my $tmp = gethostbyname($lhs);
die "FATAL: Cannot determine ip for $lhs" if (!defined($tmp));
$uip = inet_ntoa($tmp);
}else{
die "FATAL: host value not fully qualified, or not an ip <$lhs>\n";
};

#
# Handle the netmask/cidr for the right hand side,
#
# All input netmasks are converted to a cidr address for notation
if ($rhs =~ qr/^(\d+)$/){ # /cidr
$ucidr = $1;
die "FATAL: Invalid CIDR <$ucidr>.$!\n" if (($ucidr > 32) or ($ucidr < 0));
}elsif ($rhs =~ qr/(0[xX])?([0-9,a-f,A-F]{7})/){ # /0xhexnetmask
my $trimmed = $2;
my $insane = 0;
foreach my $byte (split('', unpack("B32", pack("H*", $trimmed)))){
($byte) ? $ucidr++ : $insane++;
die "FATAL: $rhs is not a valid hex netmask.$!\n" if ($insane and $byte);
};
}elsif ($rhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){ # /255.255.255.0 form
my @a = ($1, $2, $3, $4);
my $insane = 0;
foreach my $t (@a){
die "FATAL: Netmask out of range. Input <$rhs> Invalid <$t>$!\n" if (($t < 0) or ($t > 255));
};
foreach my $byte (split('', unpack("B32", pack("C4", @a)))){
($byte) ? $ucidr++ : $insane++;
die "FATAL: $rhs is not a valid netmask.$!\n" if ($insane and $byte);
};
}else{
die "FATAL: Unknown or invalid netmask value entered. <$rhs>\n";
};

#
# Network math GO! This is the meat of the function.
my (@uip) = split(/\./, $uip);
$network = 0;
for ($j = 0; $j <= $#uip; $j++){
$network += int($uip[$j])<<((3-$j)*8);
};

$bits = 0; $j = 0;
for ($j = 31 - $ucidr; $j >= 0; $j--){
$bits |= 1<<$j;
};

$netmask = 0xffffffff^$bits;
$low = ($network&$netmask);
$high = ($network&$netmask)+$bits-1;
$broadcast = ($network&$netmask)|$bits;
my ($guessed_hostname,undef,undef,undef,undef) = gethostbyaddr(inet_aton($uip), AF_INET);

#
# Throw the info back, they get a hash with zie info they may/may not need.
# All up to the caller what they want to use.
#
return ("inet4" => $uip,
"netmask" => int2ip($netmask),
"broadcast" => int2ip($broadcast),
"cidr" => $ucidr,
"router" => int2ip($low+1),
"network" => int2ip($low),
"high" => int2ip($high),
"hostname" => $guessed_hostname,
);
};

#package Main; # future use

foreach my $arg (@ARGV){
my %stuff = cidr2raw($arg);
printf("%s/%s is %s/%s\n%-12s\t%s\n%-12s\t%s\n%-12s\t%s\n%-12s\t%s\n%-12s\t%s\n",
$stuff{"inet4"},$stuff{"cidr"},
$stuff{"network"},$stuff{"cidr"},
"Netmask",$stuff{"netmask"},
"Broadcast",$stuff{"broadcast"},
"Network",$stuff{"network"},
"Router",$stuff{"router"},
"HighUsable",$stuff{"high"},
);
};
#+END_SRC

** ~/bin/dns

Just a silly dns script that slighly mimics the old host utility
of yore. Can also do reverse lookups.

Example:
$ dns google.com
google.com is 216.58.216.206
google.com is also google.com
$ dns 216.58.216.206
ord31s21-in-f206.1e100.net is 216.58.216.206
ord31s21-in-f206.1e100.net is also ord31s21-in-f206.1e100.net

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/dns :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Stupid script to help with dns information. Solaris 9/8 lack the host utility.
# Which this (kinda) mimics, except the mx record crap
use strict;
use warnings;
use Socket;
use Sys::Hostname;

my $input = shift || hostname();
my $lookup = $input;

if ( $lookup =~ /\d+[.]\d+[.]\d+[.]\d+/smx ) {
$lookup = ( gethostbyaddr inet_aton($lookup), AF_INET )[0];
die "Error: Unable to reverse lookup ip $input.\n" if ( $lookup eq q{} );
}

my $ipv4 = gethostbyname $lookup;

die "Error: $lookup doesn't have any known ip addresses\n"
if ( !defined $ipv4 );

$ipv4 = inet_ntoa($ipv4);

my ( $short_name, $aliases, $addrtype, $len, @addrs ) = gethostbyname $lookup;

foreach my $ipv4 (@addrs) {
$ipv4 = inet_ntoa($ipv4);
print "$lookup is $ipv4\n";
}

print "$lookup is also $short_name\n";
if ( defined $aliases and "$aliases" ne q{} ) {
print "aliases are ($aliases)\n";
}
exit 0;
#+END_SRC

** ~/bin/ts

Stupid simple timestamp script that just takes input, and prefixes a timestamp to to output. Thats it.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/ts :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Timestamp stdin and then print to stdout and flush.
#
# Thats about it. Might add a quick and dirty option to allow you to
# specify the time output whatnot. But this is intended to be simple.
use strict;
use warnings;
use POSIX qw(strftime);
use IO::Handle;
STDOUT->autoflush(1);

while(<STDIN>){
my $now = time;
my $tz = strftime(('%z', (localtime $now)));
$tz =~ s/(\d{2})(\d{2})/$1:$2/smx;
my $time = strftime('%Y-%m-%dT%H:%M:%S', (localtime $now));
print "$time$tz ".$_;
};
#+END_SRC

** ~/bin/diskhog

Old script I wrote after I had to figure out where space was used and it was mostly all in a directory with a ton of small files.

Written in anger. Not all that useful nominally.

Defaults to /tmp if you don't specify where, also defaults to the top 10 offenders/users of space.

Its not particuarly bright, or even good code. If you want ALL THE THINGS, pass -n -1 in and you will get a ton of output. Good luck with that.

Example:
$ diskhog
1.79m /private/tmp
1.38m /private/tmp/wifi-Ea5Y9F.log
420.57k /private/tmp/sysp.xml
161.17k /private/tmp/KSOutOfProcessFetcher.12572.ppfIhqX0vjaTSb8AJYobDV7Cu68=/ksfetch
161.17k /private/tmp/KSOutOfProcessFetcher.12572.ppfIhqX0vjaTSb8AJYobDV7Cu68=
0.00k /private/tmp/com.apple.launchd.yaVsd6J1re
0.00k /private/tmp/cvcd
0.00k /private/tmp/com.apple.launchd.IPS1lPqGTD
0.00k /private/tmp/com.apple.launchd.voZH6WFol3
0.00k /private/tmp/ct.shutdown
$ diskhog -n 4 /tmp
1.79m /private/tmp
1.38m /private/tmp/wifi-Ea5Y9F.log
420.57k /private/tmp/sysp.xml
161.17k /private/tmp/KSOutOfProcessFetcher.12572.ppfIhqX0vjaTSb8AJYobDV7Cu68=

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/diskhog :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Find out who is hogging disk space and where.
#
# Argument is the directory to start from. Only calculates size of files.
# Adds the size of files in a directory to the size of the parent directory only.
#
# Defaults to top 10 directories/files.
#
# Override with -n num to list whatever amount of large things you desire.
# Or if you want to abuse the parser, use -1 for all files/directories.
#
# Defaults to pwd for space.
#

use File::Find;
use Getopt::Long;
use Cwd;

my $debug;
my $statbug;
(exists($ENV{"DEBUG"})) ? $debug++ : undef;
my $dir = Cwd::abs_path($ARGV[-1] || Cwd::getcwd());
my %diskhogs = ();
my %inodes = ();
my ($topdev,undef,undef,undef,undef,undef,undef,undef) = lstat($dir);
local $opt_displaynum = 10;

GetOptions( 'n=i', => \$opt_displaynum,
);

find(\&sieve, $dir);

#
# For outputing the size of a bunch of bytes in g/m/k depending upon the size
#
sub byte_print {
my $byte_k = 1_024;
my $byte_m = $byte_k**2;
my $byte_g = $byte_k**3;
my $bytes = pop;
my $base = $bytes;
my $suffix = "nil";
my $out_string = "BUG";
if($bytes > $byte_g){
$base = $bytes / $byte_g;
$suffix = "g";
}elsif($bytes > $byte_m){
$base = $bytes / $byte_m;
$suffix = "m";
}else{
$base = $bytes / $byte_k;
$suffix = "k";
};
$out_string = sprintf("%.2f%s", $base, $suffix);
return $out_string;
};

#
# Dumb function to return if an inode has already been seen.
# So we handle hard links sane(er-ish-ly) in size calculations.
# This has more truthiness(tm).
#
sub seeninode{
my $what = pop();
my $ret = 0;
unless(exists($inodes{$what})){
$inodes{$what} = 0;
print "New inode $what added to seen inodes.\n" if $debug;
}else{
$inodes{$what}++;
$ret++;
print "Found a hardlink for $what.\n" if $debug;
};
return $ret;
};

sub sieve {
my $file = $File::Find::name;
my $filedir = $File::Find::dir;
my @statinfo = lstat($file);
my $dev = $statinfo[0];
my $inode = $statinfo[1];
my $size = $statinfo[7];
my $blocksize = 512; # field 11 is the "preferred" block size, which appears
# to not match the actual blocksize of the filesystems
# in use. For now every hard drive uses 512bytes/block.
# Will revisit this when 4096byte/block hard drives arrive
my $apparentsize = $statinfo[12] * $blocksize;

print "$file\@$filedir \<$topdev\>\=\<$dev\>\n" if $debug;
print "size,apparentsize,blocksize = <$statinfo[7],$apparentsize\,$blocksize\>\n" if $debug;
#
# Try to handle sparse files.
#
if ($size > $apparentsize) {
print "Sparse file $file!\n" if $debug;
$size = $apparentsize;
};

$dev = (-l $file) ? 0xdeadbeef : $dev;
if (($file =~ m/\/proc|\/chroot|udev\/devices/) ||
($dev != $topdev) || seeninode($inode)){
print "Pruned $file.\n" if $debug;
$File::Find::prune = 1;
next;
};
unless ($dev){
# Yay, we can't l(stat) files. This version of perl is broken.
# Snag information from ls, assume it's a file. Thanks Solaris 8, you suck.
$statbug++;
warn "Hit empty device statbug while stat()ing file <$file>.\n";
my $ls = qx(ls -ld $file);
my @raw = split(/\s+/, $ls);
$diskhogs{"$file"} = $raw[4];
$diskhogs{"$filedir"} += $raw[4];
}elsif (-f){
if ($debug){
print "Adding $file size ", &byte_print($size), " to $filedir.\n";
print "Adding $file size ", &byte_print($size), "\n";
};
$diskhogs{"$file"} = $size;
$diskhogs{"$filedir"} += $size;
}elsif (-d){
print "Adding $file size ".&byte_print($size)."\n" if $debug;
$diskhogs{"$file"} += $size;
};
if ($debug) {
print "$file from $filedir has size ".&byte_print($diskhogs{"$file"})."\n";
};
};

#
# Reverse sort the keys by size.
#
my @sorted = sort {$diskhogs{$b} <=> $diskhogs{$a}} keys %diskhogs;

splice @sorted, $opt_displaynum if @sorted > $opt_displaynum;

warn "Found one or more instances of the stat() call statbug. This is normally only present on Solaris 8 with stock perl.\n" if $statbug;

foreach (@sorted){
printf "%-9s%s\n", &byte_print($diskhogs{$_}), $_;
};

if ($debug){
print "DEBUG INFORMATION:\n";
foreach (keys %diskhogs){
printf "%-9s%s\n", &byte_print($diskhogs{$_}), $_;
};
};
#+END_SRC
** ~/bin/ifinfo

I don't remember now why I wrote this but its just a simpler view
of interfaces on a system.

Probably some old solaris holdover thing I can nuke.

Example:
$ ifinfo
gif0@1280 127.0.0.1/8 a:b:c:d:e:f
en1@1500 10.1.10.15/24 a:b:c:d:e:f
bridge100@1500 192.168.64.1/24 a:b:c:d:e:f

Comes in slightly handy, no guarantees it parses ifconfig right tho.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/ifinfo :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Because ifconfig output is... overly verbose.
#
# Output information from ifconfig -a like so:
# interface:mtu ipv4/cidr mac_address ipv6_addr(if applicable)
# ipv6 is not yet in place due to a: lazy, b: can't use it yet.
#

use strict;
use Socket;
use Sys::Hostname;
$ENV{'PATH'}='/sbin:/usr/sbin:/bin:/usr/bin';

my ($fqdn_regexp) = qr/([0-9,a-z,A-Z,\-,\_]+)\.([0-9,a-z,A-Z,\-,\_]+)\.(com|gov)/;

#
# converts a 1-word (4 byte) signed or unsigned integer into a dotted decimal
# ip address.
#
sub int2ip {
my $n=int(pop);
return(sprintf("%d.%d.%d.%d", ($n>>24)&0xff,($n>>16)&0xff,
($n>>8)&0xff,$n&0xff));
};

#
# Convert a host/ip/netmask/cidr/etc.... to a hash of information
# Example: host.domain.tld/24 will get the ip and calculate the netmask info
# equally if host.domain.tld corresponds with 1.2.3.4 the following is valid
# 1.2.3.4/255.255.255.0 would obtain the same information.
#
# die()'s if anything isn't kosher.
#
# Ultra long function, probably needs to be looked at for condensing/splitting.
#
sub cidr2raw {
my $rawinput = pop;
my ($lhs, $rhs, $j, $uip) = (undef, undef, undef, undef);
my ($ucidr) = 0;
my ($network, $bits, $netmask, $broadcast, $low, $high);

if ($rawinput =~ qr/(.*)\/(.*)/){
$lhs = $1; $rhs = $2;
}else{
die "Input: $rawinput not expected.\n";
};

#
# Handle ip/hostname for left hand side.
if ($lhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){
foreach my $dotted (($1,$2,$3,$4)){
if (($dotted > 255) or ($dotted < 0)){
die "FATAL: ipv4 address entered, $lhs entered is impossible, $dotted is not between 0-255.\n";
};
};
$uip = "$1.$2.$3.$4";
};
#
# Handle the netmask/cidr for the right hand side,
#
# All input netmasks are converted to a cidr address for notation
if ($rhs =~ qr/^(\d+)$/){ # /cidr
$ucidr = $1;
die "FATAL: Invalid CIDR <$ucidr>.$!\n" if (($ucidr > 32) or ($ucidr < 0));
}elsif ($rhs =~ qr/(0[xX])?([0-9,a-f,A-F]{7})/){ # /0xhexnetmask
my $trimmed = $2;
my $insane = 0;
foreach my $byte (split('', unpack("B32", pack("H*", $trimmed)))){
($byte) ? $ucidr++ : $insane++;
die "FATAL: $rhs is not a valid hex netmask.$!\n" if ($insane and $byte);
};
}elsif ($rhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){ # /255.255.255.0 form
my @a = ($1, $2, $3, $4);
my $insane = 0;
foreach my $t (@a){
die "FATAL: Netmask out of range. Input <$rhs> Invalid <$t>$!\n" if (($t < 0) or ($t > 255));
};
foreach my $byte (split('', unpack("B32", pack("C4", @a)))){
($byte) ? $ucidr++ : $insane++;
die "FATAL: $rhs is not a valid netmask.$!\n" if ($insane and $byte);
};
}else{
die "FATAL: Unknown or invalid netmask value entered. <$rhs>\n";
};

#
# Network math GO! This is the meat of the function.
my (@uip) = split(/\./, $uip);
$network = 0;
for ($j = 0; $j <= $#uip; $j++){
$network += int($uip[$j])<<((3-$j)*8);
};

$bits = 0; $j = 0;
for ($j = 31 - $ucidr; $j >= 0; $j--){
$bits |= 1<<$j;
};

$netmask = 0xffffffff^$bits;
$low = ($network&$netmask);
$high = ($network&$netmask)+$bits-1;
$broadcast = ($network&$netmask)|$bits;

#
# Throw the info back, they get a hash with zie info they may/may not need.
# All up to the caller what they want to use.
#
return ("inet4" => $uip,
"netmask" => int2ip($netmask),
"broadcast" => int2ip($broadcast),
"cidr" => $ucidr,
"router" => int2ip($low+1),
"network" => int2ip($low),
"high" => int2ip($high),
);
};

my @ifout;
if ($ENV{'TESTING'} ne '') {
while(<>){
chomp($_);
last if ($_ eq '');
push(@ifout, $_);
# sleep 1;
# print STDERR $_ . "\n";
}
}else{
open IFCONFIG, "ifconfig -a |";
@ifout = <IFCONFIG>;
close IFCONFIG;
}

# This seems wrong but it makes parsing easier due to solaris
# non root ifconfig not displaying the mac address. Reverse the output.
#
@ifout = reverse(@ifout);

my @output = ();

my ($ifname, $ifether, $ifmtu, $ifipv4, $ifnetmask, $ifipv6) = (undef,undef,undef,undef,undef,undef);
sub printiface{
# assume a /32 if we don't know it
unless (defined($ifnetmask)) {
warn "$ifname has indeterminant netmask assuming /32\n";
$ifnetmask = '32';
}

unless (defined($ifnetmask)) {
$ifether = 'unknown';
}

unless ($ifname =~ m/lo.*/){
my %netinfo = cidr2raw("$ifipv4\/$ifnetmask");
$ifnetmask = $netinfo{"cidr"};
$ifether = lc($ifether);
my $line = sprintf "%-16s %-18s %-17s\n", "$ifname\@$ifmtu", "$ifipv4\/$ifnetmask", $ifether;
push @output, $line;
}

# reset vars
($ifname, $ifether, $ifmtu, $ifipv4, $ifnetmask, $ifipv6) = (undef,undef,undef,undef,undef,undef);
};

foreach my $line (@ifout) {
if ($line =~ /inet\s+(\d+[.]\d+[.]\d+[.]\d+)\s+/){
$ifipv4 = $1;
}
if ($line =~ m/ether\s([:,0-9,a-f,A-F]{11,})/){
$ifether =$1;
}
if ($line =~ m/^([\w,\:\d+]+)\s+.*HWaddr\s([:,0-9,a-f,A-F]{11,})/){
$ifname = $1;
$ifether = $2;
}
if ($line =~ m/^(.*)\:\s+.*mtu\s(\d+)/){
$ifname = $1;
$ifmtu = $2;
}
if ($line =~ m/MTU[:](\d+)/){
$ifmtu = $1;
}
if ($line =~ m/inet\saddr\:(\d+[.]\d+[.]\d+[.]\d+)/){
$ifipv4 = $1;
}
if ($line =~ m/netmask\s+(0[xX])?([a-f,A-F,0-9]{8})/){
$ifnetmask = $2;
}
if ($line =~ m/Mask[:](\d+\.\d+\.\d+\.\d+)/){
$ifnetmask = $1;
}
if ($line =~ m/netmask\s+(\d+[.]\d+[.]\d+[.]\d+)/){
$ifnetmask = $1;
}
if ($line =~ m/netmask\s+0\s+broadcast/){
$ifnetmask = '0';
}

print ":$ifether:$ifname:$ifmtu:$ifipv4:$ifnetmask:$ifipv6:\n" if ($ENV{'DEBUG'} ne '');
printiface() if ($ifname and $ifmtu and $ifipv4 );
};

if (scalar(@output) < 1){
warn "No interfaces? Scripts busted yo.\n";
}else{
foreach my $line (reverse(@output)){
print $line;
}
}
#+END_SRC
** ~/bin/iso8601

Mostly because I use iso8601 timestamps and its nice to use them
generally without depending on gnu date.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/iso8601 :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#-*-mode: Perl; coding: utf-8;-*-
use strict;
use warnings;
use POSIX qw(strftime);

my $now = time;
my $tz = strftime(('%z', (localtime $now)));
$tz =~ s/(\d{2})(\d{2})/$1:$2/smx;
my $time = strftime('%Y-%m-%dT%H:%M:%S', (localtime $now));
print "$time$tz\n";
exit 0;
#+END_SRC
** ~/bin/whoson

Basically getent passwd $username/$uid to show who is on a system.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/whoson :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Because i'm lazy and sick of typing in getent passwd $someusername/uid
#

my %who_cmds = ("solaris", "/bin/who -q",
"linux", "/usr/bin/who -q",
"darwin", "/usr/bin/who -q",
);

my $who_cmd = $who_cmds{$^O};

local %users = ();

foreach my $l (qx/$who_cmd/){
next if($l =~ m/^\#.*/);
foreach my $user (split(/\s+/,$l)){
unless(exists($users{$user})){
$users{$user} = 0;
}else{
$users{$user}++;
};
};
};

foreach my $user (keys %users){
my $gecos = ( getpwnam($user) )[6];
my $count = $users{$user} + 1;
my $output = "$user\, ".((defined($gecos)) ? "$gecos, " : '')."is logged in on $count tty".(($count>1) ? "\'s" : '')."\n";
print $output;
};
#+END_SRC
** ~/bin/gecos

Silly wrapper perl script that makes it easier to get at the gecos string for a $user/$uid.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/gecos :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Dumb wrapper to get the gecos information from a uid/username.

foreach my $input (@ARGV){
my $gecos = undef;
my $uid = undef;
my $name = undef;
if ( $input =~ m/^\d+$/ ) {
( $name,$uid,$gecos ) = ( getpwuid($input) )[0,2,6];
} else {
( $name,$uid,$gecos ) = ( getpwnam($input) )[0,2,6];
}
print "$name is '$gecos' uid '$uid'\n" if $gecos;
}
#+END_SRC

** ~/bin/hatimerun

Stupid perl script to mimic hatimerun for systems that don't have it.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/hatimerun :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# hatimerun in perl, sorta
#
use Getopt::Long;

my $opt_exitcode = 99;
my $opt_killcode = 9;
my $opt_timeout = 60;

GetOptions( 'e=i' => \$opt_exitcode,
'k=i' => \$opt_killcode,
't=i' => \$opt_timeout,
'h' => \&opt_help,
'help' => \&opt_help,
);

sub opt_help{
my $message = <<__END__;
UX: ERROR: invalid syntax
usage: [-e return code][-k kill signal][-t seconds to wait]
[-h][--help]

Options
--help, -h Prints this help text.
-e Exit code to return on timeout.
NOTE: 99 by default.
-k Signal number to send via kill.
NOTE: 9 by default.
-t Timeout in seconds before alarming.
NOTE: 60 by default.

__END__
print $message;
exit 1;
};

my $pid;

local $SIG{ALRM} = sub { kill $opt_killcode, $pid or die "Kill failed: $!";
die "Timeout!\n"};

eval{
my $x = defined($pid = fork());

unless ($pid){
print qx(@ARGV);
die "Exec of ", join(' ', @ARGV), " failed at $!\n";
};

alarm $opt_timeout;
waitpid $pid => 0;
alarm 0;
exit 0;
};

if ($@){
die "Nothing to do!\n" unless $@ eq "Timeout!\n";
exit $opt_exitcode;
}else{
exit 0;
};
#+END_SRC

** ~/bin/ptree.pl

Silly perl based ptree alike implementation. Mad old code that should be avoided at all costs but it works and I'm not fixing it unless I need to.

#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/ptree.pl :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# ptree for linux/darwin/solaris. I got sick of ps and pstree on linux.
# ptree works on solaris fine, but doesn't exist for darwin/linux/etc...
#
# TODO: Allow passing a regexp instead of a pid and passing multiple pids.
#

local $ENV{"PATH"} = '/bin:/usr/bin:/sbin:/usr/sbin';
local $debug = 0;

(exists($ENV{"DEBUG"})) ? $debug = 1 : undef;
($debug) ? local $| = 1 : undef; # disable buffering for STDERR and STDOUT

sub debug_print {
($debug) && warn pop;
};

local @cmd = ('/bin/ps');
local $init = 0;
local $start = 1;

if ($^O eq "linux"){
push(@cmd, 'ajxSw');
$start = 0;
}elsif ($^O =~ m/darwin|freebsd/){
push(@cmd, 'Ajwww');
}elsif ($^O eq "solaris"){
@cmd = ('/usr/ucb/ps');
if ((-x "/bin/zonename") && !(qx(zonename) eq "global\n")){
$init = qx(pgrep zsched);
chomp($init);
$start = $init;
};
push(@cmd, 'laxwww');
}else{
die "$^O isn't a known os to this script\n";
};

local @ps = qx(@cmd);
($?) ? die $cmd[0]." posix return code $?\n" : undef;

local %proc;
local @trail;

(defined($ARGV[0])) ? $start = $ARGV[0] : undef;

debug_print("Dump of raw line array data:\n");

foreach my $x (@ps){
my $cmd_index = 9;
my $ppid = -1;
my $pid = -1;
next if ($x =~ m/.*PID.*/);
my @line = split(m/\s+/,$x);
splice(@line, 0, 1) unless ($line[0] =~ m/\d+/);
splice(@line, 0, 1) if ("$line[0]" eq "");

if ($^O eq "linux"){
($ppid,$pid) = @line;
$cmd_index = 9;
}elsif ($^O =~ m/darwin|freebsd/){
($pid,$ppid) = @line;
$cmd_index = 8;
}elsif ($^O eq "solaris"){
(undef, undef, $pid,$ppid) = @line;
for($x=$cmd_index; $x < 14; $x++){
$cmd_index = ($line[$x] =~ m/\d+\:\d+/) ? ($x + 1) : $cmd_index;
};
};

my $command = join(' ', @line[$cmd_index..$#line++]);
(!defined $proc{$pid}) ? $proc{$pid}->{"children"} = [ ] : undef;
(!defined $proc{$ppid}) ? $proc{$ppid}->{"children"} = [ ] : undef;
$proc{$pid}->{"pid"} = $pid;
$proc{$pid}->{"command"} = $command;
$proc{$pid}->{"ppid"} = $ppid;
push(@{$proc{$ppid}->{"children"}},$pid);
debug_print(join(',', @line[0..($#line-1)])."\n");
};

if ($debug){
debug_print("Done reading ps output\nDump of Hash\n");
foreach my $key (sort({$a <=> $b} (keys %proc))){
$ppid = $proc{$key}->{"ppid"};
$command = $proc{$key}->{"command"};
$children = join(',', @{$proc{$key}->{"children"}});
debug_print("PID<$key> PPID<$ppid> Children<$children> Command<$command>\n");
};
};

sub intrail{
my $crumb = pop;
my $ret = 0;
map {$ret++ if ($crumb == $_)} @trail;
return $ret;
};

sub addchildren{
my $start_node = pop;
foreach my $child (@{$proc{$start_node}->{"children"}}){
next if (!defined($child) || ($start_node == $child));
debug_print("Start ($start_node) Add child $child.\n");
push(@trail, $child);
addchildren($child);
};
};

sub addparents{
my $start_node = pop;
my $parent = $proc{$start_node}->{"ppid"};
return unless (defined($start_node));
return if (($parent == $start_node) || !(defined($parent))); # At the top of the tree, or in a zone
debug_print("Start ($start_node) Add parent $parent.\n");
push(@trail, $parent);
addparents($parent) if ($parent != $init);
};

sub printnode{
my $start_node = pop;
my $indent = pop;
if (intrail($start_node)){
my $pid = $proc{$start_node}->{"pid"};
my $ppid = $proc{$start_node}->{"ppid"};
my $cmdline = $proc{$start_node}->{"command"};
my $indentation = ' 'x($indent);
if ($pid == $init){
my $s = $^O." kernel";
if ($cmdline ne ''){
$s = $s." <$cmdline>";
};
$cmdline = $s;
};
printf("%s%d %s\n", $indentation, $pid, $cmdline);
foreach my $child (@{$proc{$start_node}->{"children"}}){
next if ($pid == $child);
printnode($indent+1,$child);
};
};
};

my $valid = 0;
foreach my $j (keys %proc){ ($j == $start) ? $valid++ : undef; };

debug_print("Starting from <$start>, validity is<$valid>\n");

if ($valid){
if (!$start){
@trail = keys %proc;
push(@trail, $start); push(@trail, 1);
debug_print("Done with adding $start to trail.\n");
}else{
push(@trail, $start);
debug_print("Adding children from $start.\n");
addchildren($start);
debug_print("Adding parents from $start.\n");
addparents($start);
};

@trail = sort(@trail);

debug_print("Trail is: ".join(',', @trail)."\nStarting at pid $start\ninit pid $init\n");
print "PID COMMAND\n";
my $startindent = 0;
(intrail($startindent)) ? $startindent = -1 : undef;
printnode($startindent,$init);
}else{
die "pid $start doesn't exist.\n";
};

exit 0;
#+END_SRC
* External Tanglers


** ~/bin/portchk
Putting everything in readme.org was getting annoying. So started to split
things apart. Org links to all the


Just find out if a port responds to anything tcp related or not.


#+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/portchk :results replace :tangle-mode (identity #o755)
#!/usr/bin/env perl
#
# Dumb wrapper to get the gecos information from a uid/username.
| name | file |
|----------+----------------|
| emacs | [[file:emacs.org][emacs.org]] |
| tmux | [[file:tmux.org][tmux.org]] |
| git | [[file:git.org][git.org]] |
| x | [[file:x.org][x.org]] |
| nix | [[file:nix.org][nix.org]] |
| zsh | [[file:zsh.org][zsh.org]] |
| vim | [[file:vim.org][vim.org]] |
| misc | [[file:misc.org][misc.org]] |
| .profile | [[file:dotprofile.org][dotprofile.org]] |
| ~/bin | [[file:bin.org][bin.org]] |


foreach my $input (@ARGV){
my $gecos = undef;
my $uid = undef;
my $name = undef;
if ( $input =~ m/^\d+$/ ) {
( $name,$uid,$gecos ) = ( getpwuid($input) )[0,2,6];
} else {
( $name,$uid,$gecos ) = ( getpwnam($input) )[0,2,6];
}
print "$name is '$gecos' uid '$uid'\n" if $gecos;
}
#+END_SRC

** ~/bin/notify

OSX only really, just fires off a notification when its ran.

Example:
notify "some command" "not ok"

First param is the message, second title of the notification.

#+BEGIN_SRC sh :mkdirp yes :tangle (when (eq osx-p t) "tmp/bin/notify") :results replace :tangle-mode (identity #o755)
#!/bin/sh
message=${1:="no message"}
title=''
if [ "${2}" != "" ]; then
message="${2}"
title="${1}"
fi
notification="display notification \"${message}\""
[ "${title}" != "" ] && notification="${notification} with title \"${title}\""

osascript -e "${notification}"
#+END_SRC

** ~/bin/today

Stupid ruby script I wrote to highlight the week/day in a calendar.

#+BEGIN_SRC ruby :mkdirp yes :tangle tmp/bin/today :results replace :tangle-mode (identity #o755)
#!/usr/bin/env ruby
cal, today, week_color, day_color, reset = %x(cal).split(%r(\n)), Time.now.day, %x(tput sgr0;tput setab 4;tput setaf 7), %x(tput sgr0; tput setab 0;tput setaf 7;tput bold), %x(tput sgr0)
done=false
cal.each do |line|
if done then
puts line
next
end
if(line =~ /^(.*\s+?)#{today}(\s+?.*)$/ or
line =~ /^(.*\s+?)#{today}$/ or
line =~ /^()#{today}(\s+?.*)$/ or
line =~ /^#{today}$/ ) then
puts "#{week_color}#{$1}#{day_color}#{today}#{week_color}#{$2}#{reset}"
done=true
else
puts line
end
end
#+END_SRC

** Cray specific
*** ~/bin/essh

Expect ssh, to aide login to smw's etc..
#+BEGIN_SRC expect :tangle (when (eq cray-p t) "tmp/bin/essh") :mkdirp yes :tangle-mode (identity #o755)
#!/usr/bin/expect
set prompt "> "
set password [lindex $argv 1]
set connstr [lindex $argv 0]

if {$argc > 2} {
eval spawn ssh -q $connstr "[lrange $argv 2 end]"
set timeout 3600
expect {
timeout {
puts "Command took too long"
exit 1
}

"yes/no" {
send "yes\r"
exp_continue
}

"assword:" {
send -- "$password\r"
exp_continue
}
}
} else {
spawn ssh -q $connstr
set timeout 5
expect {
timeout {
puts "Connection timed out"
exit 1
}

"yes/no" {
send "yes\r"
exp_continue
}

"assword:" {
send -- "$password\r"
exp_continue
}

"$prompt" {
interact
}
}
}
#+END_SRC
*** ~/bin/escp

Similar to the above only for scp.

#+BEGIN_SRC expect :tangle (when (eq cray-p t) "tmp/bin/escp") :mkdirp yes :tangle-mode (identity #o755)
#!/usr/bin/expect
set prompt "> "
set password [lindex $argv 0]

if {$argc > 2} {
eval spawn scp -q "[lrange $argv 1 end]"
set timeout 3600
expect {
timeout {
puts "Command took too long"
exit 1
}

"yes/no" {
send "yes\r"
exp_continue
}

"assword:" {
send -- "$password\r"
exp_continue
}
}
}
#+END_SRC
*** ~/bin/flushdns

For some reason this sometimes needs to happen, stupid work dns.

#+BEGIN_SRC sh :tangle-mode (identity #o755) :tangle (when (and (eq cray-p t) (eq osx-p t)) "tmp/bin/flushdns") :mkdirp yes :tangle-mode (identity #o755)
#!/bin/sh

set +e
dscacheutil -flushcache
sudo killall -HUP mDNSResponder
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
exit $?
#+END_SRC
*** ~/bin/tomod
#+BEGIN_SRC sh :tangle (when (eq cray-p t) "tmp/bin/tomod") :mkdirp yes :tangle-mode (identity #o755)
#!/usr/bin/env sh
#-*-mode: Shell-script; coding: utf-8;-*-
export script=$(basename "$0")
export dir=$(cd "$(dirname "$0")"; pwd)
export iam=${dir}/${script}

remote=cfosbld01

export PATH=/usr/local/brew/10.10/bin:~/bin:${PATH}
branch=$(git rev-parse --abbrev-ref HEAD)

if [ $? -ne 0 ]; then
echo not on a branch or in a git repo
exit 2
fi

base_git="$(pwd)"
opwd="${base_git}"

while true; do
if [ -d ".git" ]; then
base_git="$(pwd)"
break
fi

if [ "$(pwd)" == "/" ]; then
echo "No .git base directory found from ${opwd}"
exit 2
fi
((count=$count+1))
cd ..
done

svn_url=$(git svn info --url)
remote_svn="/notbackedup/users/mtishmack/mod_data/${branch}"

ssh $remote "module load cpkg sdev craysvn; rm -fr ${remote_svn}; mkdir -p ${remote_svn} && svn co ${svn_url} ${remote_svn} > /dev/null 2>&1;"
echo "rsyncing local git branch to ${remote}:${remote_svn}"

rsync \
--stats \
--checksum \
-avz \
--hard-links \
--exclude=.git \
--delete-excluded \
--delete \
--filter="-rs_.svn" \
--filter="-ss_covhtml" \
--filter="-ss_dev.yml" \
--filter="-ss_.gitignore" \
--filter="-ss_*.log" \
--filter="-ss_.\#*" \
--filter="-ss_*.swp" \
--filter="-ss_*.pyc" \
--filter="-ss_venv" \
--filter="-ss_testdirs" \
--filter="-ss_testfiles" \
--filter="-ss_.*.git.*" \
--filter="-ss_*.o" \
--filter="-ss_*.o.cmd" \
--filter="-ss_*.ko" \
--filter="-ss_*.ko.cmd" \
--filter="-ss_*.tmp_versions" \
"${base_git}/" "${remote}:${remote_svn}"
echo "done rsyncing ${base_git} to ${remote}:${remote_svn}"
#+END_SRC
*** ~/bin/towip
#+BEGIN_SRC sh :tangle (when (eq cray-p t) "tmp/bin/towip") :mkdirp yes :tangle-mode (identity #o755)
#!/usr/bin/env sh
#-*-mode: Shell-script; coding: utf-8;-*-
export script=$(basename "$0")
export dir=$(cd "$(dirname "$0")"; pwd)
export iam=${dir}/${script}

remote=cfosbld01

export PATH=/usr/local/brew/10.10/bin:~/bin:${PATH}
branch=$(git rev-parse --abbrev-ref HEAD)

if [ $? -ne 0 ]; then
echo not on a branch or in a git repo
exit 2
fi

base_git="$(pwd)"
opwd="${base_git}"

while true; do
if [ -d ".git" ]; then
base_git="$(pwd)"
break
fi

if [ "$(pwd)" == "/" ]; then
echo "No .git base directory found from ${opwd}"
exit 2
fi
((count=$count+1))
cd ..
done

svn_url=$(git svn info --url)
remote_svn="/notbackedup/users/mtishmack/wip-dws"

ssh $remote "module load cpkg sdev craysvn; rm -fr ${remote_svn}; mkdir -p ${remote_svn} && svn co ${svn_url} ${remote_svn} > /dev/null 2>&1;"

echo "rsyncing local git branch to ${remote}:${remote_svn}"

rsync \
--progress \
--checksum \
-avz \
--hard-links \
--exclude=.git \
--delete-excluded \
--delete \
--filter="-rs_.svn" \
--filter="-ss_covhtml" \
--filter="-ss_dev.yml" \
--filter="-ss_.gitignore" \
--filter="-ss_*.log" \
--filter="-ss_.\#*" \
--filter="-ss_*.swp" \
--filter="-ss_*.pyc" \
--filter="-ss_*.o" \
--filter="-ss_*.o.cmd" \
--filter="-ss_*.tmp_versions" \
--filter="-ss_venv" \
--filter="-ss_testdirs" \
--filter="-ss_testfiles" \
--filter="-ss_.*.git.*" \
"${base_git}/" "${remote}:${remote_svn}"
echo "done rsyncing ${base_git} to ${remote}:${remote_svn}"
#+END_SRC
* git
** ~/.gitconfig
:PROPERTIES:
:header-args: :tangle tmp/.gitconfig :comments no :padline no :cache yes :mkdirp yes
:END:

General git configuration.

*** pager
#+BEGIN_SRC conf
[pager]
color = true
#+END_SRC
*** color
#+BEGIN_SRC conf
[color]
status = auto
diff = auto
branch = auto
[color "status"]
added = green
changed = blue
untracked = red
[color "branch"]
current = green
local = blue
remote = red
[color "diff"]
meta = blue bold
frag = black reverse
old = red reverse
new = green reverse
#+END_SRC
*** alias
#+BEGIN_SRC conf
[alias]
begin = !git init && git commit --allow-empty -m 'Initial empty commit'
up = !git pull --rebase && git push
wsdiff = diff --color-words --ignore-space-at-eol --ignore-space-change --ignore-all-space --ignore-all-space
wdiff = diff --color-words
ci = commit
ciu = commit --all
co = checkout
ds = diff --stat
ba = branch --all
st = status --short --branch
s = status --short --branch --untracked-files=no
unstage = reset HEAD
tlog = log --graph --color=always --abbrev-commit --date=relative --pretty=oneline
hist = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
slog = log --oneline --decorate
fixup = commit --fixup
squash = commit --squash
ri = rebase --interactive --autosquash
ra = rebase --abort
effit = reset --hard
# What commits differ between branches, note, equivalent commits are omitted.
# Use this with three dot operator aka master...origin/master
cpdiff = log --no-merges --left-right --graph --cherry-pick --oneline
# Same as ^ only equivalent commits are listed with a = sign.
cmdiff = log --no-merges --left-right --graph --cherry-mark --oneline
# git update with submodule update
sup = !git checkout master && git pull && git submodule update --init --recursive
# git clone with submodules
sc = !git clone --recursive $1
# what files are getting updated a lot
churn = !git log --all -M -C --name-only --format='format:' "$@" | sort | grep -v '^$' | uniq -c | sort | awk 'BEGIN {print "count,file"} {print $1 "," $2}'
# help the gc a bit and get a bit more space back for a local clone
trim = !git reflog expire --expire=now --all && git gc --prune=now
#+END_SRC
*** github
#+BEGIN_SRC conf
[github]
user = mitchty
#+END_SRC
*** credential
#+BEGIN_SRC conf
[credential]
helper = netrc -v -f ~/.netrc.gpg -f ~/.netrc
#+END_SRC
*** advice
#+BEGIN_SRC conf
[advice]
statushints = false
#+END_SRC
*** gui
#+BEGIN_SRC
[gui]
fontui = -family Monaco -size 8 -weight normal -slant roman -underline 0 -overstrike 0
fontdiff = -family Monaco -size 8 -weight normal -slant roman -underline 0 -overstrike 0
#+END_SRC
*** http
#+BEGIN_SRC
[http]
postBuffer = 209715200
#+END_SRC
*** push
#+BEGIN_SRC conf
[push]
default = simple
#+END_SRC
*** url rewrites
#+BEGIN_SRC conf
[url "https://github.com/"]
insteadOf = git://github.com/
#+END_SRC
*** username/email
#+BEGIN_SRC conf
[user]
name = Mitch Tishmack
email = mitch.tishmack@gmail.com
#+END_SRC

** ~/.gitignore

Common crap/build artifacts that git should always ignore.

#+BEGIN_SRC conf :tangle tmp/.gitignore :results replace
.*~
*~
.\#*
\#*
\#*\#
.\#*\#
.DS_Store
*.pyc
*.rbc
*.elc
*.swp
*.[oa]
*.hi
#+END_SRC

* x
** ~/.Xdefaults

X defaults, just urxvt for the moment. Slightly linux/bsd only but not really.

#+BEGIN_SRC conf :tangle (when (eq x-p t) "tmp/.Xdefaults") :results replace
! urxvt generalish stuff
!
urxvt*termName: rxvt-256color
urxvt*font: xft:menlo:size=12:antialias=true
urxvt*perl-ext-common: default,matcher
urxvt*jumpScroll: true
urxvt*cursorColor: pink
urxvt*loginShell: true
urxvt*scrollBar: true
urxvt*scrollstyle: next
urxvt*scrollBar_right: true
urxvt*scrollTtyOutput: false
urxvt*cursorBlink: true
urxvt*saveLines: 10000
urxvt*urlLauncher: /usr/bin/google-chrome
urxvt*matcher.button: 1
urxvt*allowWindowOps: true
#+END_SRC

** ~/.Xmodmap

Swap around left/right clicks basically.

#+BEGIN_SRC conf :tangle (when (and (eq x-p t) (not (eq osx-p t))) "tmp/.Xmodmap")
pointer = 3 2 1 4 5
#+END_SRC

OSX is odd.

#+BEGIN_SRC conf :tangle (when (and (eq x-p t) (eq osx-p t)) "tmp/.Xmodmap")
pointer = 1 2 3 4 5
#+END_SRC

** ~/.Xresources

I can't remember why I did all this effort. But I'll remove it some year I bet.

#+BEGIN_SRC conf :tangle (when (eq x-p t) "tmp/.Xresources") :results replace
#define brightblack #ffffff
#define normblack #f9f9f9
#define normgreen #00cc33
#define brightgreen #00cc99
#define normblue #f00033
#define brightblue #0099ff
#define normcyan #66ccff
#define brightcyan #66ccff
#define normwhite #060606
#define brightwhite #000000
#define normyellow #ffcc33
#define brightyellow #ffcc33
#define normred #ff3300
#define brightred #ff3300
#define normmagenta #ff66ff
#define brightmagenta #ff66ff

*background: normblack
*foreground: normwhite
*fading: 40
*fadeColor: brightblack
*cursorColor: brightcyan
*pointerColorBackground: #3f3f3f
*pointerColorForeground: #f3f3f3

*color0: #090909
*color1: #f00000
*color2: normgreen
*color3: normyellow
*color4: #0066ff
*color5: normmagenta
*color6: normcyan
*color7: #c8c8c8
*color8: #888888
*color9: #f00033
*color10: brightgreen
*color11: brightyellow
*color12: #0099ff
*color13: brightmagenta
*color14: brightcyan
*color15: #f9f9f9
#+END_SRC
* zsh
** ~/.zprofile

Make sure that zsh sources ~/.profile correctly on login.

#+BEGIN_SRC sh :tangle tmp/.zprofile :results replace
emulate sh
source ~/.profile
emulate zsh

# zsh does this differently
login_shell()
{
[[ -o login ]]
}
#+END_SRC

** ~/.zshrc

Zsh configuration, its not too crazy... I think. Don't judge me.

#+BEGIN_SRC sh :tangle tmp/.zshrc :results replace
#-*-mode: Shell-script; coding: utf-8;-*-
# zsh specific global aliases
alias -g silent="> /dev/null 2>&1"
alias -g noerr="2> /dev/null"
alias -g stdboth="2>&1"

# mainly for firefox, because it can suck up the cycles, but not when
# in a SIGSTOP state you can't use any power then firefox.
alias -g sigcont='kill -CONT '
alias -g sigstop='kill -STOP '

# Keybindings, what few there are.
bindkey -v
bindkey '^P' push-line # Saves the current line and returns to it afterwards.

# General history options
export HISTSIZE=5000
export SAVEHIST=${HISTSIZE}
export HISTFILE=~/.zsh_history

# I like my options
setopt append_history
setopt extended_history
setopt hist_reduce_blanks
setopt hist_no_store
setopt hist_ignore_dups
setopt histignorespace
setopt no_hist_beep
setopt no_list_beep
setopt share_history
setopt inc_append_history
setopt auto_menu
setopt bash_auto_list

# Options that don't need to be set.
unsetopt bad_pattern # No, don't warn me on bad file patterns kthxbai.

# The rest of the story (tm) (c) (r) in option settings.
setopt equals
setopt notify
setopt auto_cd
setopt glob_dots
setopt print_exit_value # I love you zsh for this, print out non zero exits.

other_term()
{
case $TERM in
*xterm*|*rxvt*|(dt|k|e)term)
print -Pn "\e]2;%~\a"
;;
sun-cmd)
print -Pn "\e]l%~\e\\"
;;
*)
;;
esac
}

chpwd()
{
[[ -o interactive ]] || return
case $TERM in
eterm-color) # getting emacs terminal to not be annoying... sucks
print -Pn ""
;;
*)
if [[ $SSH_TTY != '' ]]; then
case $ORIG_TERM in
eterm-color)
print -Pn ""
;;
*)
other_term
;;
esac
fi
;;
esac
}

# Needs to be reviewed a bit.
zstyle ':completion:*' squeeze-slashes true
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31'
zstyle ':completion:*:*:*:*:processes' force-list always

# No need to setup ssh known host parsing as root, just regular users.
# This is pretty old using compctl, need to update eventually.
Language specific


if [[ "$LOGNAME" != "root" ]]; then
zmodload zsh/mathfunc
if [[ -f "$HOME/.ssh/known_hosts" ]]; then
hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[0-9]*}%%\ *}%%,*})
zstyle ':completion:*:(ssh|scp|cssh):*' hosts $hosts
zstyle ':completion:*:*:*:hosts-host' ignored-patterns '|1|*' loopback localhost
fi
zstyle ':completion:::complete*' use-cache 1

# This really should be closer to the definition of extract.
compctl -g '*.tar.bz2 *.tbz2 *.tbz *.tar.gz *.tgz *.bz2 *.gz *.jar *.zip *.rar *.tar *.Z *.tZ *.tar.Z' + -g '*(-/)' extract
fi

# More history options for newer zsh versions
setopt share_history
setopt hist_save_no_dups
setopt hist_find_no_dups
setopt hist_no_functions
setopt hist_expire_dups_first

bindkey ' ' magic-space # Complete spaces too dammit, i'm lazy.

alias edirs='ls -d **/*(/^F)' # empty directories
zstyle ':completion:*:*:kill:*' menu yes select
zstyle ':completion:*:kill:*' force-list always
zstyle ':completion:*:kill:*:processes' command "ps x"
zstyle ':completion:*' menu select=2

autoload -U compinit
autoload -U colors && colors
autoload -Uz vcs_info

bindkey -e

local userat="%{$fg[blue]%}%n%(!.%{$fg[red]%}.%{$fg[blue]%})%{$reset_color%}%B@%b%{$fg[blue]%}%m%b"
local pwd="%B%~%b"
local userchar="%(!.#.$)"

zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:*' check-for-changes true
setopt prompt_subst

precmd()
{
vcs_info
}

# +N/-N upstream info
function +vi-git-st() {
local ahead behind
local -a gitstatus

ahead=$(git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l | sed -e 's|^ *||g')
behind=$(git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l | sed -e 's|^ *||g')

(( $ahead )) && gitstatus+=( "+${ahead}" )
(( $behind )) && gitstatus+=( "-${behind}" )

hook_com[misc]+=${(j:/:)gitstatus}
}

# Untracked crap in the repo not covered by .gitignore?
function +vi-git-untracked(){
if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' ]] && \
git status --porcelain | grep '??' &> /dev/null ; then
hook_com[staged]+="%{$fg[red]%}N"
fi
}

local branch="%{$fg[green]%}%b%c%u%{$fg[green]%}%{$reset_color%}"
zstyle ':vcs_info:*' formats "%m $branch"
zstyle ':vcs_info:*' actionformats "%a $branch"
zstyle ':vcs_info:*' stagedstr "%{$fg[blue]%}S"
zstyle ':vcs_info:*' unstagedstr "%{$fg[blue]%}M"
zstyle ':vcs_info:git*+set-message:*' hooks git-untracked git-st
PROMPT="%(!.#.$) " # $ as a user # as root
RPROMPT='${vcs_info_msg_0_} ${PWD/#$HOME/~}'
#+END_SRC

* tmux
** ~/.tmux.conf

Tmux configuration. Pretty boring in most ways.

#+BEGIN_SRC conf :tangle tmp/.tmux.conf
# Setup utf8 by default and vi mode
set-window-option -g utf8 on
set-window-option -g mode-keys vi
set-window-option -g aggressive-resize on

# Force zsh to be a login shell
set-option -g default-command 'zsh -l'
set-option -g default-terminal 'xterm-256color'

# Status line options, mainly coloring
set-window-option -g window-status-bg colour6
set-window-option -g window-status-fg black
set-window-option -g window-status-current-bg white

# Status line options
set-option -g status-bg black
set-option -g status-fg colour7
set-option -g status-left-length 24
set-option -g status-left ''
set-option -g status-right-length 13
set-option -g status-right "%a %H:%M:%S"
set-option -g status-interval 7
set-option -g status-utf8 on

# Pane border options, mimics the status line coloring
set-option -g pane-border-bg colour15
set-option -g pane-border-fg colour82
set-option -g pane-active-border-bg colour15
set-option -g pane-active-border-fg colour2

# Alert related things
set-option -g visual-activity on
set-option -g visual-bell on
set-option -g message-bg colour7
set-option -g message-fg black

# Pass through the window title and display it automatically on changes.
set-option -g set-titles on
set-option -g set-titles-string '#T'
set-window-option -g automatic-rename on

# Key rebinding to make things more au naturalle
bind-key R \
source-file ~/.tmux.conf \;\
display 'reloaded tmux config'

# Log pane output to a file, save with an iso8601 datestamp
bind-key o \
pipe-pane -o "cat >> $HOME/tmux-`iso8601`.log" \;\
set-window-option window-status-current-fg green \;

bind-key O \
pipe-pane \;\
set-window-option window-status-current-fg default \;

bind-key N new-session -t default

# Using s for synchronizing panes, means that s for choosing sessions
# is now e
unbind-key s # interactive select sessions
bind-key e choose-tree

# (un)synchronize panes with prefix-s
bind-key s \
if-shell \
"tmux show-window-options | grep 'synchronize-panes on'" \
"set-window-option window-status-current-bg colour7; \
set-window-option pane-active-border-fg colour2; \
set-window-option pane-active-border-bg colour15; \
set-window-option synchronize-panes off; \
display 'synchronization off'" \
"set-window-option window-status-current-bg red; \
set-window-option pane-active-border-fg red; \
set-window-option pane-active-border-bg colour15; \
set-window-option synchronize-panes on; \
display 'synchronizing'"

# same thing as ^ so it sets up things if we were started with
# something else that set synchronization.
if-shell \
"tmux show-window-options | grep 'synchronize-panes on' || /bin/true" \
"set-window-option window-status-current-bg red; \
set-window-option pane-active-border-fg yellow; \
set-window-option pane-active-border-bg red"

# Setup splits to be less annoying
bind-key \ split-window -h
bind-key - split-window -v

# vi keybindings for pane navigation
bind-key k select-pane -U
bind-key j select-pane -D
bind-key h select-pane -L
bind-key l select-pane -R

# Make it so that I can detach/etc while holding control down,
# PURE LAZY
bind-key C-d detach
bind-key C-n next-window
bind-key C-p previous-window

bind-key C-k select-pane -U
bind-key C-j select-pane -D
bind-key C-h select-pane -L
bind-key C-l select-pane -R

# Non confirming kill pane plskthxbai
bind-key x kill-pane

# In case something I run exits straight away, i'd like to know about it.
set-option -g set-remain-on-exit on

# Lets change the prefix key so we don't clobber emacs back one char key
unbind-key C-b

# hacky, but C-\ isn't used by anything overly important in emacs
set-option -g prefix 'C-\'

# two C-\'s == C-\, if i need it, likely not
bind 'C-\' send-prefix

# Delay in sending things is dumb
set-option -s escape-time 1

# so we can scroll the mouse, select panes, etc...
set -g mouse on
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"
bind-key m \
if-shell \
"tmux show-options -g | grep 'mouse on'" \
"set -g mouse off; \
display 'Mouse modes off'" \
"set -g mouse on; \
display 'Mouse modes on'"
#+END_SRC

#+BEGIN_SRC conf :tangle (when (not (eq osx-p t)) "tmp/.tmux.conf")
# Assume linux for things, load osx stuff only on osx
bind C-p run "tmux set-buffer \"$(xclip -o)\"; tmux paste-buffer"
bind C-y run "tmux save-buffer - | xclip -i"
#+END_SRC
* vim
** ~/.vimrc

What remains of my days from being a vim user.

#+BEGIN_SRC conf :tangle tmp/.vimrc :results replace
set nocompatible
set backspace=indent,eol,start
set history=50 " keep 50 lines of command line history
set ruler " show the cursor position all the time
set showcmd " display incomplete commands
set incsearch " do incremental searching
map Q gq
if &t_Co > 2 || has("gui_running")
syntax on
set hlsearch
endif
if has("autocmd")
filetype plugin indent on
augroup vimrcEx
au!
autocmd FileType text setlocal textwidth=78
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal g`\"" |
\ endif

augroup END
else
set autoindent " always set autoindenting on
endif " has("autocmd")
#+END_SRC

* nix
#+BEGIN_SRC conf :mkdirp yes :tangle (when (eq nix-p t) "tmp/.nixpkgs/config.nix")
{pkgs}: {
allowUnfree = true;
allowBroken = true;

packageOverrides = pkgs: with pkgs; {
pinentry = pkgs.pinentry.override {
gtk2 = null;
qt4 = null;
ncurses = null;
};
gnupg = pkgs.gnupg.override {
x11Support = false;
pinentry = true;
};
youtube-dl = pkgs.youtube-dl.override {
pandoc = null;
};

# haskellPackages = haskellPackages.override {
# extension = self : super : {
# cabal = pkgs.haskellPackages.cabalNoTest;
# };
# };

default = with pkgs; buildEnv {

name = "default";

paths = [
ansible
ack
aria
iperf
cacert
curl
clang
clang-analyzer
diffutils
patchutils
gitAndTools.gitFull
gitAndTools.git-extras
bazaarTools
mercurial
subversionClient
gist
mercurial
docbook5
entr
emacs
gnupg1compat
gnutar
gnumake
sloccount
cloc
less
multitail
rlwrap
gdbm
mosh
htop
imagemagick
keychain
silver-searcher
aspell
aspellDicts.en
openssl
pinentry
pbzip2
pigz
pv
postgresql
readline
rsync
sqlite
texLiveFull
tmux
tree
wget
wakelan
unzip
upx
xz
multimarkdown
jq
# rtags broken again on osx, fix it
p7zip
unrar
watch
nox
mutt
duply
zsh
pylint
python27Packages.howdoi
python27Packages.youtube-dl
python27Packages.pyflakes
python27Packages.flake8
python27Packages.virtualenv
python27Packages.pip
# xhyve compiles normally, figure out hypervisor framework issue
# lastpass-cli no worky on osx TODO fix this it works on homebrew
];
};
env_hs =
pkgs.haskell.packages.ghc7103.ghcWithPackages
(haskellPackages: with haskellPackages; [
alex
happy
bake
cabal-dependency-licenses
cabal-install
cabal-meta
ghc-core
ghc-mod
hasktags
hindent
hoogle
hspec
# idris # zlib is complaining for some reason, hmmm
pandoc
shake
ShellCheck
stack
stylish-haskell
nats
transformers-compat
]
);
};
}
#+END_SRC
* Language related
** Haskell
*** ~/.ghci

Ghci setup, mostly just cosmetics.

#+BEGIN_SRC haskell :tangle tmp/.ghci :results replace
:l ~/.ghc.hs
:set prompt "λ "
:set +t
#+END_SRC

*** ~/.ghc.hs

What to automatically have loaded into ghci sessions.

#+BEGIN_SRC haskell :tangle tmp/.ghc.hs :results replace
import Control.Applicative
import Control.Monad
import Data.Monoid
import Data.Maybe
import Data.List
import Data.Bool
import qualified Data.Set as S
import qualified Data.Map as M
#+END_SRC

** Perl
*** ~/.perlcriticrc

What to complain about by default.

#+BEGIN_SRC conf :tangle tmp/.perlcritirc :results replace
# Show the severity level
severity = 1

# Basically show what profile is complaining
verbose = %f:%l:%c: %m, %e (%p, severity %s)\n

# Don't warn on these variables
[Variables::ProhibitPunctuationVars]
allow = $@ $!

# Ignore syscall returns on print, it not actually returning is... whatever.
[InputOutput::RequireCheckedSyscalls]
exclude_functions = print say

# Allow things like print qx(somecmd) in a void context to work, this is ok.
[InputOutput::ProhibitBacktickOperators]
only_in_void_context = 1

# I actually like using unless... so don't piss me off whinging about it
[-ControlStructures::ProhibitUnlessBlocks]

# The following only apply to modules
[-Modules::RequireVersionVar]
[-ErrorHandling::RequireCarping]

# Tabs suck, no
[CodeLayout::ProhibitHardTabs]
allow_leading_tabs = 0

# For small regexes, no /x at the end is fine, 12 should be enough
[RegularExpressions::RequireExtendedFormatting]
minimum_regex_length_to_complain_about = 12

# These are kosher kthxbai
[ControlStructures::ProhibitPostfixControls]
allow = for if until unless

# For POE, we do things like my $foo = $_[HEAP]; and thats OK
[Subroutines::RequireArgUnpacking]
allow_subscripts = 1

# For POD documentation, I don't care about required sections.
[Documentation::RequirePodSections]
lib_sections = NAME | SYNOPSIS | DESCRIPTION | AUTHOR | COPYRIGHT | SEE ALSO
script_sections = NAME | SYNOPSIS | DESCRIPTION | AUTHOR | COPYRIGHT | SEE ALSO

# This is for POD documentation mainly.
[CodeLayout::ProhibitHardTabs]
allow_leading_tabs = 1
#+END_SRC

*** ~/.perltidyrc

Control how perltidy should clean things up.

#+BEGIN_SRC conf :tangle tmp/.perltidyrc :results replace
# cuddled elses pls
-ce
# indent 2 spaces
-i=2
# for tokens with things like arrays, start the data next line down one indent in
-lp
# align closing tokens for things like arrays with the opening token
-cti=1
# default, but spaces between multiple entries, none with one arg
-pt=1
# line encoding
-ole=unix
# braces not on new line
-nsbl
# stack opening tokens, don't create a new line with one token, note no stacking of closing tokens
-sot
# no space before ;'s in for loops
-nsfs
# Make curly braces act more like the args param
-bbt=1
# Trim qw whitespaces
-tqw
#+END_SRC

* Misc

Stuff that logically doesn't fit elsewhere or in any other category.

** ~/.dir_colors

For BSD ps, make colors closer to what the GNU utilities produce by default.

#+BEGIN_SRC conf :tangle tmp/.dir_colors :results replace
COLOR tty

TERM ansi
TERM color-xterm
TERM con132x25
TERM con132x30
TERM con132x43
TERM con132x60
TERM con80x25
TERM con80x28
TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM cons25
TERM console
TERM cygwin
TERM dtterm
TERM eterm-color
TERM Eterm
TERM gnome
TERM konsole
TERM kterm
TERM linux
TERM linux-c
TERM mach-color
TERM putty
TERM rxvt
TERM rxvt-cygwin
TERM rxvt-cygwin-native
TERM rxvt-unicode
TERM screen
TERM screen-bce
TERM screen-w
TERM screen.linux
TERM vt100
TERM xterm
TERM xterm-256color
TERM xterm-color
TERM xterm-debian

# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
NORMAL 00 # global default, although everything should be something.
FILE 00 # normal file
DIR 01;34 # directory
LINK 01;36 # symbolic link. (If you set this to 'target' instead of a
# numerical value, the color will match the file pointed to)
FIFO 40;33 # pipe
SOCK 01;35 # socket
DOOR 01;35 # door
BLK 40;33;01 # block device driver
CHR 40;33;01 # character device driver
ORPHAN 01;05;37;41 # orphaned syminks
MISSING 01;05;37;41 # ... and the files they point to

# This is for files with execute permission:
EXEC 01;32

# List any file extensions like '.gz' or '.tar' that you would like ls
# to colorize below. Put the extension, a space, and the color init string.
# (and any comments you want to add after a '#')

.cmd 01;32 # executables (bright green)
.exe 01;32
.com 01;32
.btm 01;32
.bat 01;32
.sh 01;32
.csh 01;32
.ksh 01;32
.zsh 01;32

.tar 01;31 # archives / compressed (bright red)
.tgz 01;31
.arj 01;31
.taz 01;31
.lzh 01;31
.zip 01;31
.z 01;31
.Z 01;31
.gz 01;31
.bz2 01;31
.bz 01;31
.tbz2 01;31
.tz 01;31
.deb 01;31
.rpm 01;31
.rar 01;31 # app-arch/rar
.ace 01;31 # app-arch/unace
.zoo 01;31 # app-arch/zoo
.cpio 01;31 # app-arch/cpio
.7z 01;31 # app-arch/p7zip
.rz 01;31 # app-arch/rzip
#+END_SRC

** ~/.hushlogin

Because who gives a rats when and where I last logged on from?

#+BEGIN_SRC conf :tangle tmp/.hushlogin :results replace
#+END_SRC
| name | file |
|---------+-------------|
| haskell | [[file:haskell.org][haskell.org]] |
| perl | [[file:perl.org][perl.org]] |


* TODO
- [ ] Figure out some way to make code blocks editable with :tangle, it sucks not being able to edit blocks as they are.
- [ ] Need to have some way to autocleanup old generations. Rm works for now so meh.
- [ ] Need to add the ability to detect that make is generating a pointless new generation. Aka generation N and generation N-1 are the same, just leave N and don't increment.
- [ ] Maybe checksum file contents somehow and use that?
- [ ] More? For now its functional.


* Reference for babel stuff * Reference for babel stuff




+ 22
- 0
tangle.el Wyświetl plik

@@ -0,0 +1,22 @@
;;-*-mode: emacs-lisp; coding: utf-8;-*-
;; File: tangle.el

;; Load the default options used or what was passed in as OPTIONS
(defun load-defaults-or-options ()
(load-file (if (getenv "OPTIONS")
(concat (concat "./" (getenv "OPTIONS")) ".el")
"./defaults.el")))

;; Define functions we use in :tangle blocks

;; tangle/yn
;; tangle to "yes" or "no" if the predicate given exists and defined as t.
;;
;; Iff predicate is bound, and t, "yes"
;; rest is "no"
(defun tangle/yn (p) (load-defaults-or-options) (if (bound-and-true-p p) "yes" "no"))

;; tangle/file
;; tangle to filename if predicate is bound and t
;; Note, prepends tmp/ to the filename to conform to match expected layout
(defun tangle/file (p file) (load-defaults-or-options) (if (bound-and-true-p p) (concat "tmp/" file) "no"))

+ 152
- 0
tmux.org Wyświetl plik

@@ -0,0 +1,152 @@
#+TITLE: Tmux Configuration
#+AUTHOR: Mitch Tishmack
#+STARTUP: hidestars
#+STARTUP: odd
#+BABEL: :cache yes
#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no

Tmux configuration. Pretty boring in most ways.

#+BEGIN_SRC conf :tangle (tangle/file tmux-p ".tmux.conf")
# Setup utf8 by default and vi mode
set-window-option -g utf8 on
set-window-option -g mode-keys vi
set-window-option -g aggressive-resize on

# Force zsh to be a login shell
set-option -g default-command 'zsh -l'
set-option -g default-terminal 'xterm-256color'

# Status line options, mainly coloring
set-window-option -g window-status-bg colour6
set-window-option -g window-status-fg black
set-window-option -g window-status-current-bg white

# Status line options
set-option -g status-bg black
set-option -g status-fg colour7
set-option -g status-left-length 24
set-option -g status-left ''
set-option -g status-right-length 13
set-option -g status-right "%a %H:%M:%S"
set-option -g status-interval 7
set-option -g status-utf8 on

# Pane border options, mimics the status line coloring
set-option -g pane-border-bg colour15
set-option -g pane-border-fg colour82
set-option -g pane-active-border-bg colour15
set-option -g pane-active-border-fg colour2

# Alert related things
set-option -g visual-activity on
set-option -g visual-bell on
set-option -g message-bg colour7
set-option -g message-fg black

# Pass through the window title and display it automatically on changes.
set-option -g set-titles on
set-option -g set-titles-string '#T'
set-window-option -g automatic-rename on

# Key rebinding to make things more au naturalle
bind-key R \
source-file ~/.tmux.conf \;\
display 'reloaded tmux config'

# Log pane output to a file, save with an iso8601 datestamp
bind-key o \
pipe-pane -o "cat >> $HOME/tmux-`iso8601`.log" \;\
set-window-option window-status-current-fg green \;

bind-key O \
pipe-pane \;\
set-window-option window-status-current-fg default \;

bind-key N new-session -t default

# Using s for synchronizing panes, means that s for choosing sessions
# is now e
unbind-key s # interactive select sessions
bind-key e choose-tree

# (un)synchronize panes with prefix-s
bind-key s \
if-shell \
"tmux show-window-options | grep 'synchronize-panes on'" \
"set-window-option window-status-current-bg colour7; \
set-window-option pane-active-border-fg colour2; \
set-window-option pane-active-border-bg colour15; \
set-window-option synchronize-panes off; \
display 'synchronization off'" \
"set-window-option window-status-current-bg red; \
set-window-option pane-active-border-fg red; \
set-window-option pane-active-border-bg colour15; \
set-window-option synchronize-panes on; \
display 'synchronizing'"

# same thing as ^ so it sets up things if we were started with
# something else that set synchronization.
if-shell \
"tmux show-window-options | grep 'synchronize-panes on' || /bin/true" \
"set-window-option window-status-current-bg red; \
set-window-option pane-active-border-fg yellow; \
set-window-option pane-active-border-bg red"

# Setup splits to be less annoying
bind-key \ split-window -h
bind-key - split-window -v

# vi keybindings for pane navigation
bind-key k select-pane -U
bind-key j select-pane -D
bind-key h select-pane -L
bind-key l select-pane -R

# Make it so that I can detach/etc while holding control down,
# PURE LAZY
bind-key C-d detach
bind-key C-n next-window
bind-key C-p previous-window

bind-key C-k select-pane -U
bind-key C-j select-pane -D
bind-key C-h select-pane -L
bind-key C-l select-pane -R

# Non confirming kill pane plskthxbai
bind-key x kill-pane

# In case something I run exits straight away, i'd like to know about it.
set-option -g set-remain-on-exit on

# Lets change the prefix key so we don't clobber emacs back one char key
unbind-key C-b

# hacky, but C-\ isn't used by anything overly important in emacs
set-option -g prefix 'C-\'

# two C-\'s == C-\, if i need it, likely not
bind 'C-\' send-prefix

# Delay in sending things is dumb
set-option -s escape-time 1

# so we can scroll the mouse, select panes, etc...
set -g mouse on
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"
bind-key m \
if-shell \
"tmux show-options -g | grep 'mouse on'" \
"set -g mouse off; \
display 'Mouse modes off'" \
"set -g mouse on; \
display 'Mouse modes on'"
#+END_SRC

Only set xclip for x setup.

#+BEGIN_SRC conf :tangle (eq (tangle/file tmux-p ".tmux.conf") (tangle/file x-p ".tmux.conf"))
bind C-p run "tmux set-buffer \"$(xclip -o)\"; tmux paste-buffer"
bind C-y run "tmux save-buffer - | xclip -i"
#+END_SRC

+ 36
- 0
vim.org Wyświetl plik

@@ -0,0 +1,36 @@
#+TITLE: Vim Configuration
#+AUTHOR: Mitch Tishmack
#+STARTUP: hidestars
#+STARTUP: odd
#+BABEL: :cache yes
#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no :tangle tmp/.vimrc

What remains of my days from being a vim user.

#+BEGIN_SRC conf :tangle tmp/.vimrc :results replace
set nocompatible
set backspace=indent,eol,start
set history=50 " keep 50 lines of command line history
set ruler " show the cursor position all the time
set showcmd " display incomplete commands
set incsearch " do incremental searching
map Q gq
if &t_Co > 2 || has("gui_running")
syntax on
set hlsearch
endif
if has("autocmd")
filetype plugin indent on
augroup vimrcEx
au!
autocmd FileType text setlocal textwidth=78
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal g`\"" |
\ endif

augroup END
else
set autoindent " always set autoindenting on
endif " has("autocmd")
#+END_SRC

+ 103
- 0
x.org Wyświetl plik

@@ -0,0 +1,103 @@
#+TITLE: X Configuration
#+AUTHOR: Mitch Tishmack
#+STARTUP: hidestars
#+STARTUP: odd
#+BABEL: :cache yes
#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no

X related configuration, nothing overly huge to be honest just stupid configuration.

* ~/.Xdefaults
:PROPERTIES:
:header-args: :tangle (when (eq x-p t) "tmp/.Xdefaults") :comments no :padline no :cache yes :mkdirp yes
:END:

X defaults, just urxvt for the moment. Slightly linux/bsd only but not really.

#+BEGIN_SRC conf
! urxvt generalish stuff
!
urxvt*termName: rxvt-256color
urxvt*font: xft:menlo:size=12:antialias=true
urxvt*perl-ext-common: default,matcher
urxvt*jumpScroll: true
urxvt*cursorColor: pink
urxvt*loginShell: true
urxvt*scrollBar: true
urxvt*scrollstyle: next
urxvt*scrollBar_right: true
urxvt*scrollTtyOutput: false
urxvt*cursorBlink: true
urxvt*saveLines: 10000
urxvt*urlLauncher: /usr/bin/google-chrome
urxvt*matcher.button: 1
urxvt*allowWindowOps: true
#+END_SRC

* ~/.Xmodmap
:PROPERTIES:
:header-args: :tangle (when (eq x-p t) "tmp/.Xmodmap") :comments no :padline no :cache yes :mkdirp yes
:END:

Swap around left/right clicks basically.

#+BEGIN_SRC conf :tangle (when (not (and (eq x-p t) (eq osx-p t))) "tmp/.Xmodmap")
pointer = 3 2 1 4 5
#+END_SRC

OSX is odd/inverted cause reasons (who cares why).

#+BEGIN_SRC conf :tangle (when (and (eq x-p t) (eq osx-p t)) "tmp/.Xmodmap")
pointer = 1 2 3 4 5
#+END_SRC

* ~/.Xresources
:PROPERTIES:
:header-args: :tangle (when (eq x-p t) "tmp/.Xresources") :comments no :padline no :cache yes :mkdirp yes
:END:

I can't remember why I did all this effort. But I'll remove it some year I bet.

#+BEGIN_SRC conf
#define brightblack #ffffff
#define normblack #f9f9f9
#define normgreen #00cc33
#define brightgreen #00cc99
#define normblue #f00033
#define brightblue #0099ff
#define normcyan #66ccff
#define brightcyan #66ccff
#define normwhite #060606
#define brightwhite #000000
#define normyellow #ffcc33
#define brightyellow #ffcc33
#define normred #ff3300
#define brightred #ff3300
#define normmagenta #ff66ff
#define brightmagenta #ff66ff

*background: normblack
*foreground: normwhite
*fading: 40
*fadeColor: brightblack
*cursorColor: brightcyan
*pointerColorBackground: #3f3f3f
*pointerColorForeground: #f3f3f3

*color0: #090909
*color1: #f00000
*color2: normgreen
*color3: normyellow
*color4: #0066ff
*color5: normmagenta
*color6: normcyan
*color7: #c8c8c8
*color8: #888888
*color9: #f00033
*color10: brightgreen
*color11: brightyellow
*color12: #0099ff
*color13: brightmagenta
*color14: brightcyan
*color15: #f9f9f9
#+END_SRC

+ 197
- 0
zsh.org Wyświetl plik

@@ -0,0 +1,197 @@
#+TITLE: Zsh Configuration
#+AUTHOR: Mitch Tishmack
#+STARTUP: hidestars
#+STARTUP: odd
#+BABEL: :cache yes
#+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no

~/.zshrc and ~/.zprofile setup. Nothing too special.

* ~/.zprofile

Make sure that zsh sources ~/.profile correctly on login.

#+BEGIN_SRC sh :tangle tmp/.zprofile :results replace
emulate sh
source ~/.profile
emulate zsh

# zsh does this differently
login_shell()
{
[[ -o login ]]
}
#+END_SRC

* ~/.zshrc

Zsh configuration, its not too crazy... I think. Don't judge me.

#+BEGIN_SRC sh :tangle tmp/.zshrc :results replace
#-*-mode: Shell-script; coding: utf-8;-*-
# zsh specific global aliases
alias -g silent="> /dev/null 2>&1"
alias -g noerr="2> /dev/null"
alias -g stdboth="2>&1"

# mainly for firefox, because it can suck up the cycles, but not when
# in a SIGSTOP state you can't use any power then firefox.
alias -g sigcont='kill -CONT '
alias -g sigstop='kill -STOP '

# Keybindings, what few there are.
bindkey -v
bindkey '^P' push-line # Saves the current line and returns to it afterwards.

# General history options
export HISTSIZE=5000
export SAVEHIST=${HISTSIZE}
export HISTFILE=~/.zsh_history

# I like my options
setopt append_history
setopt extended_history
setopt hist_reduce_blanks
setopt hist_no_store
setopt hist_ignore_dups
setopt histignorespace
setopt no_hist_beep
setopt no_list_beep
setopt share_history
setopt inc_append_history
setopt auto_menu
setopt bash_auto_list

# Options that don't need to be set.
unsetopt bad_pattern # No, don't warn me on bad file patterns kthxbai.

# The rest of the story (tm) (c) (r) in option settings.
setopt equals
setopt notify
setopt auto_cd
setopt glob_dots
setopt print_exit_value # I love you zsh for this, print out non zero exits.

other_term()
{
case $TERM in
*xterm*|*rxvt*|(dt|k|e)term)
print -Pn "\e]2;%~\a"
;;
sun-cmd)
print -Pn "\e]l%~\e\\"
;;
*)
;;
esac
}

chpwd()
{
[[ -o interactive ]] || return
case $TERM in
eterm-color) # getting emacs terminal to not be annoying... sucks
print -Pn ""
;;
*)
if [[ $SSH_TTY != '' ]]; then
case $ORIG_TERM in
eterm-color)
print -Pn ""
;;
*)
other_term
;;
esac
fi
;;
esac
}

# Needs to be reviewed a bit.
zstyle ':completion:*' squeeze-slashes true
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31'
zstyle ':completion:*:*:*:*:processes' force-list always

# No need to setup ssh known host parsing as root, just regular users.
# This is pretty old using compctl, need to update eventually.

if [[ "$LOGNAME" != "root" ]]; then
zmodload zsh/mathfunc
if [[ -f "$HOME/.ssh/known_hosts" ]]; then
hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[0-9]*}%%\ *}%%,*})
zstyle ':completion:*:(ssh|scp|cssh):*' hosts $hosts
zstyle ':completion:*:*:*:hosts-host' ignored-patterns '|1|*' loopback localhost
fi
zstyle ':completion:::complete*' use-cache 1

# This really should be closer to the definition of extract.
compctl -g '*.tar.bz2 *.tbz2 *.tbz *.tar.gz *.tgz *.bz2 *.gz *.jar *.zip *.rar *.tar *.Z *.tZ *.tar.Z' + -g '*(-/)' extract
fi

# More history options for newer zsh versions
setopt share_history
setopt hist_save_no_dups
setopt hist_find_no_dups
setopt hist_no_functions
setopt hist_expire_dups_first

bindkey ' ' magic-space # Complete spaces too dammit, i'm lazy.

alias edirs='ls -d **/*(/^F)' # empty directories
zstyle ':completion:*:*:kill:*' menu yes select
zstyle ':completion:*:kill:*' force-list always
zstyle ':completion:*:kill:*:processes' command "ps x"
zstyle ':completion:*' menu select=2

autoload -U compinit
autoload -U colors && colors
autoload -Uz vcs_info

bindkey -e

local userat="%{$fg[blue]%}%n%(!.%{$fg[red]%}.%{$fg[blue]%})%{$reset_color%}%B@%b%{$fg[blue]%}%m%b"
local pwd="%B%~%b"
local userchar="%(!.#.$)"

zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:*' check-for-changes true
setopt prompt_subst

precmd()
{
vcs_info
}

# +N/-N upstream info
function +vi-git-st() {
local ahead behind
local -a gitstatus

ahead=$(git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l | sed -e 's|^ *||g')
behind=$(git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l | sed -e 's|^ *||g')

(( $ahead )) && gitstatus+=( "+${ahead}" )
(( $behind )) && gitstatus+=( "-${behind}" )

hook_com[misc]+=${(j:/:)gitstatus}
}

# Untracked crap in the repo not covered by .gitignore?
function +vi-git-untracked(){
if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' ]] && \
git status --porcelain | grep '??' &> /dev/null ; then
hook_com[staged]+="%{$fg[red]%}N"
fi
}

local branch="%{$fg[green]%}%b%c%u%{$fg[green]%}%{$reset_color%}"
zstyle ':vcs_info:*' formats "%m $branch"
zstyle ':vcs_info:*' actionformats "%a $branch"
zstyle ':vcs_info:*' stagedstr "%{$fg[blue]%}S"
zstyle ':vcs_info:*' unstagedstr "%{$fg[blue]%}M"
zstyle ':vcs_info:git*+set-message:*' hooks git-untracked git-st
PROMPT="%(!.#.$) " # $ as a user # as root
RPROMPT='${vcs_info_msg_0_} ${PWD/#$HOME/~}'
#+END_SRC

Ładowanie…
Anuluj
Zapisz