Never been to CodeSnippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world (or not, you can keep them private!)

About this user

Mark James Adams http://raysend.com/mark/

Install ikiwiki in an arbitrary directory

ikiwiki doesn't install using PREFIX= like normal programs (it still wants to put stuff in /etc/ikiwiki).

perl Makefile.PL DESTDIR=/path/to/install/dir PREFIX="" INSTALL_BASE="/"

No source code.

Remember you don't always need code in a formal language to express your idea.

Remember text.

Shell history command count

Counts how many times each command appears in your shell history.

bash:

history | awk '{print $2}' | sort | uniq -c | sort -rn | head


zsh:

history -1000 | awk '{print $2}' | sort | uniq -c | sort -rn | head

Install postgres gem on Mac OS X 10.5 (Leopard)

When upgrading or installing recent versions of the postgres ruby gem on Leopard the following error appears

	===========   WARNING   ===========

		You are building this extension on OS X without setting the
		ARCHFLAGS environment variable, and PostgreSQL does not appear
		to have been built as a universal binary. If you are seeing this
		message, that means that the build will probably fail.

		Try setting the environment variable ARCHFLAGS
		to '-arch i386' before building.

		For example:
		(in bash) $ export ARCHFLAGS='-arch i386'
		(in tcsh) $ setenv ARCHFLAGS '-arch i386'

		Then try building again.

		===================================


The trick is to set the ARCHFLAGS variable inside the sudo command using env.

sudo env ARCHFLAGS="-arch i386" gem install postgres

Nginx configure options for Accel w/FLV support

Build nginx on an Accelerator with support for flash video. Assumes you have PCRE and OpenSSL built as per the wiki/forum. Keep everything tidy in /opt/local/nginx.

./configure --prefix=/opt/local/nginx --with-http_ssl_module --with-openssl=../openssl-0.9.8e --with-cc-opt="-m64 -I/usr/local/include -I/usr/local/ssl/include" --with-ld-opt="-L/lib/64 -L/usr/sfw/lib/64 -R/usr/sfw/lib/64 -R/lib/64 -L/usr/local/ssl/lib -m64 -L/usr/local/lib -R/usr/local/lib" --with-http_flv_module

Postgresql dump SS archive script

Dump, bzip, and upload a postgres database to strongspace. Via Ubernostrum

#!/usr/bin/bash

FILENAME=b_list-`/usr/xpg4/bin/date +%Y%m%d`.sql.bz2
cd /home/myuser/dumps
/opt/local/bin/pg_dump -U db_username db_name | /usr/bin/bzip2 > $FILENAME
/usr/bin/scp $FILENAME me@strongspace:/my/backup/dir/

Install RdbiPgSQL package for R on OS X

Connecting R to Postgres on OS X is a little bit of a hassle given where OS X looks for the libraries to link to.

Assuming you've installed Postgres via MacPorts, add shell variables for your Postgres lib and include directories to ~/.profile

export PG_LIB_DIR=/opt/local/lib/postgresql82
export PG_INCLUDE_DIR=/opt/local/include/postgresql82


Add a link from the OS X SDK directory to /opt

$ sudo ln -s /opt/ /Developer/SDKs/MacOSX10.4u.sdk/opt


Then install RdbiPgSQL as you would normally.

If the install fails because R isn't picking up the PG_LIB_DIR, _INCLUDE_DIR variables, keep a lookout for the lines in the install error output that look like


The downloaded packages are in
	/tmp/RtmpTakYpZ/downloaded_packages


In Terminal, change to this directory, replacing the 'RtmpTakYpZ' string with whatever directory the error output gives. Then run the R install command on the package file:

$ cd /tmp/RtmpTakYpZ/downloaded_packages
$ sudo R CMD INSTALL RdbiPgSQL_1.10.0.tar.gz 




Change OS X font smoothing in one application

E.g, Light font smoothing style in Textmate.

$ defaults write com.macromates.textmate AppleFontSmoothing -int 1

Webdav upload utility

Command line utility to upload files to a webdav server.

Requires net_digest_auth.rb (snippet)

NB: Does not handle MKCOL, so the directory where you place the file must already exist.

Usage

$ ruby upload.rb cert.yml source destination


where cert.yml is a file of the form

username: USERNAME
password: PASSWORD


source is the path to the file to upload

destination is the URL of a directory on a webdav server to upload to.

# upload.rb
# Command line webdav upload script. Based off of 
# http://theexciter.com/articles/bingo

require 'net_digest_auth'
require 'yaml'
require 'uri'

abort("Usage: #{$0} <credentials.yml> <src> <dst> ") unless ARGV.size==3

auth = YAML.load_file(ARGV[0])
username = auth['username']
password = auth['password']

src = ARGV[1]
dst = ARGV[2]

if File.exists?(src)
  url = URI.parse(dst)
  Net::HTTP.start(url.host) do |http|
    res = http.put(url.request_uri, 'hello') # try putting something so
                                             # the server will return a
                                             # www-authenticate header
    req = Net::HTTP::Put.new("#{url.path}#{File.basename(src)}")
    req.digest_auth(username, password, res)
    response = http.request(req, File.open(src).read)
    puts response.code + " " + response.message
  end
else
  puts "No such file #{src.inspect}"
end

Authenticated Digest for Net:HTTPHeader

Allows authenticated requests to be made.

Based off of http://theexciter.com/articles/bingo and updated for Ruby 1.8.6

Use by calling

    req.digest_auth(username, password, res)


on an HTTP request object before asking for a response.

# net_digest_auth.rb
require 'digest/md5'
require 'net/http'

module Net
  module HTTPHeader
    @@nonce_count = -1
    CNONCE = Digest::MD5.new.update("%x" % (Time.now.to_i + rand(65535))).hexdigest
    def digest_auth(user, password, response)
      # based on http://segment7.net/projects/ruby/snippets/digest_auth.rb
      @@nonce_count += 1

      response['www-authenticate'] =~ /^(\w+) (.*)/

      params = {}
      $2.gsub(/(\w+)="(.*?)"/) { params[$1] = $2 }

      a_1 = "#{user}:#{params['realm']}:#{password}"
      a_2 = "#{@method}:#{@path}"
      request_digest = ''
      request_digest << Digest::MD5.new.update(a_1).hexdigest
      request_digest << ':' << params['nonce']
      request_digest << ':' << ('%08x' % @@nonce_count)
      request_digest << ':' << CNONCE
      request_digest << ':' << params['qop']
      request_digest << ':' << Digest::MD5.new.update(a_2).hexdigest

      header = []
      header << "Digest username=\"#{user}\""
      header << "realm=\"#{params['realm']}\""
      
      header << "qop=#{params['qop']}"

      header << "algorithm=MD5"
      header << "uri=\"#{@path}\""
      header << "nonce=\"#{params['nonce']}\""
      header << "nc=#{'%08x' % @@nonce_count}"
      header << "cnonce=\"#{CNONCE}\""
      header << "response=\"#{Digest::MD5.new.update(request_digest).hexdigest}\""

      @header['Authorization'] = header
    end
  end
end