Tag Archives: OS X

Mac OS X

Mac OS X Command Line: Start a process and pick it up later

I can’t believe I’ve only just discovered the gnu screen command. You want to kick off a long running command line process and come back to it later? Like so:

  • Open a Terminal window
  • Type screen
  • Type ls -R /
  • Quit Terminal, and hum to yourself for a few seconds
  • Open a new Terminal window and type screen -R

Now that’s what I call magic.

It survives logouts and is of course an essential for working with remote or cloud machines over ssh; when your network connection fails you can log back in and carry on. man screen will tell you more, although so will https://www.bing.com/search?q=linux+screen

Command line concatenate PDFs on OS X

A great post at http://gotofritz.net/blog/howto/joining-pdf-files-in-os-x-from-the-command-line/ which does what it says on the tin.

He explains how to link to a python script included in OS X since some years ago so as to make concatenating PDFs as easy as typing

pdfconcat -o output.pdf *.pdf

The heavy lifting is all done with calls to OS X Quartz.CoreGraphics module so this isn’t going to work on other platforms, but for the curious it demonstrates how easily you can do such stuff on OS X.

#! /usr/bin/python
#
# join
#   Joing pages from a a collection of PDF files into a single PDF file.
#
#   join [--output <file>] [--shuffle] [--verbose]"
#
#   Parameter:
#
#   --shuffle
#	Take a page from each PDF input file in turn before taking another from each file.
#	If this option is not specified then all of the pages from a PDF file are appended
#	to the output PDF file before the next input PDF file is processed.
#
#   --verbose
#   Write information about the doings of this tool to stderr.
#
import sys
import os
import getopt
import tempfile
import shutil
from CoreFoundation import *
from Quartz.CoreGraphics import *

verbose = False

def createPDFDocumentWithPath(path):
	global verbose
	if verbose:
		print "Creating PDF document from file %s" % (path)
	return CGPDFDocumentCreateWithURL(CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, path, len(path), False))

def writePageFromDoc(writeContext, doc, pageNum):

	global verbose
	page = CGPDFDocumentGetPage(doc, pageNum)
	if page:
		mediaBox = CGPDFPageGetBoxRect(page, kCGPDFMediaBox)
		if CGRectIsEmpty(mediaBox):
			mediaBox = None
			
		CGContextBeginPage(writeContext, mediaBox)
		CGContextDrawPDFPage(writeContext, page)
		CGContextEndPage(writeContext)
		if verbose:
			print "Copied page %d from %s" % (pageNum, doc)

def shufflePages(writeContext, docs, maxPages):
	
	for pageNum in xrange(1, maxPages + 1):
		for doc in docs:
			writePageFromDoc(writeContext, doc, pageNum)
				
def append(writeContext, docs, maxPages):

	for doc in docs:
		for pageNum in xrange(1, maxPages + 1) :
			writePageFromDoc(writeContext, doc, pageNum)

def main(argv):

	global verbose

	# The PDF context we will draw into to create a new PDF
	writeContext = None

	# If True then generate more verbose information
	source = None
	shuffle = False
	
	# Parse the command line options
	try:
		options, args = getopt.getopt(argv, "o:sv", ["output=", "shuffle", "verbose"])

	except getopt.GetoptError:
		usage()
		sys.exit(2)

	for option, arg in options:

		if option in ("-o", "--output") :
			if verbose:
				print "Setting %s as the destination." % (arg)
			writeContext = CGPDFContextCreateWithURL(CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, arg, len(arg), False), None, None)

		elif option in ("-s", "--shuffle") :
			if verbose :
				print "Shuffle pages to the output file."
			shuffle = True

		elif option in ("-v", "--verbose") :
			print "Verbose mode enabled."
			verbose = True

		else :
			print "Unknown argument: %s" % (option)
	
	if writeContext:
		# create PDFDocuments for all of the files.
		docs = map(createPDFDocumentWithPath, args)
		
		# find the maximum number of pages.
		maxPages = 0
		for doc in docs:
			if CGPDFDocumentGetNumberOfPages(doc) > maxPages:
				maxPages = CGPDFDocumentGetNumberOfPages(doc)
	
		if shuffle:
			shufflePages(writeContext, docs, maxPages)
		else:
			append(writeContext, docs, maxPages)
		
		CGPDFContextClose(writeContext)
		del writeContext
		#CGContextRelease(writeContext)
    
def usage():
	print "Usage: join [--output <file>] [--shuffle] [--verbose]"

if __name__ == "__main__":
	main(sys.argv[1:])

Compile & Build Mono on Mac OS X

In spite of what you might still read on http://www.mono-project.com/, mono source moved to github.com/mono/mono. To build and compile on the mac however the simplest instructions are still the “One Stop Shop Build Script” at the bottom of http://www.mono-project.com/Compiling_Mono_on_OSX. They worked for me first time although I hit a couple of issues:

  1. Having a space in the path to where I built it broke the build script
  2. Fetching the mono repo from git failed several times. This may – or may not – be related to the OS X 10.9 Mavericks / Versions issue noted at http://www.git-tower.com/blog/make-git-rebase-safe-on-osx/ but I’ve had no further problems since following their instruction to
    git config --global core.trustctime false

New Microsoft Remote Desktop client for Mac

Remote desktop for Mac is old, and can’t always connect. It can’t connect to Windows 8.1 for instance. I keep getting the “Remote desktop connection cannot verify the identity of the computer that you want to connect to”, even though I tell it to connect anyway.

If like me your first reaction to “it doesn’t work” was to try the “Check for Upgrades” menu item then you’ll want to know that _that_ doesn’t work either.

Instead, go straight to the App store and install it from there. The spiffy new version is a great new app and works just fine.

BootCamp Drivers direct download for Windows 7 and 8

Updated April 2014

Apple have at long last provided not only direct download links for Windows drivers, but also tables of which link you need for each model/year. If you can work out which model of apple you have, you can now get the direct download link from the apple site.

How to find the correct BootCamp direct download link for your Mac model

  • Go to this page: http://support.apple.com/kb/HT5634
  • About half way down the page, find the heading “Boot Camp requirements by Mac model
  • Under that, find the heading for your Mac model. There are headings for MacBook Pro, MacBook Air, MacBook, iMac, Mac mini and Mac Pro.
  • Each heading hides a table by model & year vs. windows version. There are direct download links for Windows 8 and Windows 7, for 32-bit and 64-bit.
  • Choose your download. Done.

How do I work out which Mac model I have?

  • The same page has instructions. With pictures!

I downloaded. Now what?

  • Each download link includes instructions

But I’m in Windows already, and I can’t open this .pkg file download Apple has just given me

Then you want this page: www.cafe-encounter.net/p860/opening-a-bootcamp-driver-download-on-windows-7-or-8-with-7-zip

Only 64-bit drivers are listed but I want 32-bit drivers. Or vice versa

You’re stepping into the realm of the unsupported, so you’re at your own risk here. What you can try is: get the download you think you want; open it with 7-zip; Now instead of running the installer, open the Folder that contains the individual driver installers. Run each of those. If it doesn’t work, you can uninstall from the Windows Control Panel and try again with the drivers Apple said you should use.

My model isn’t listed on that Apple page

Ah. Thats sad. You may be looking for the impossible. Your last hope is probably to try this page on older Mac models http://www.cafe-encounter.net/p682/download-bootcamp-drivers For models older than that, you’re in the era before BootCamp downloads, and you probably need an OS X Leopard or earlier install CD.