Tiny Deathstars of Foulness

I don’t get to spend that much time reading other sites. But when I do, here are a few pages/people I might check out. I thought this might help the Younglings of the MacAdmin community. If you have a site that you’d like added to the list, let me know. And no, I won’t judge you if you nominate your own site. In fact, I might learn something new! The final list will be stored at :)

July 17th, 2015

Posted In: Uncategorized

Feels gooood


June 7th, 2015

Posted In: Uncategorized

June 1st, 2015

Posted In: Uncategorized

So looking forward to Paul Rudd as an Avenger…

April 13th, 2015

Posted In: Uncategorized

$8,782,571 funded from a $10,000 goal. Sweet.

March 1st, 2015

Posted In: Uncategorized

There are a number of services that rank web sites. I find that I check here and there. So as you employ various techniques to make your site better, you can check back and see the long term impacts of how these efforts impact your ranking.

Screen Shot 2014-12-24 at 9.24.42 PM

You can also see demographics of visitors.

Screen Shot 2014-12-24 at 9.24.53 PM


And you can see geographic data as well.

Screen Shot 2014-12-24 at 9.25.01 PM

There are other better sites, with far more detailed information such as Google Analytics. But a very top-level, upper level view of how your site is performing is something like Nice and simple.

January 1st, 2015

Posted In: Uncategorized

Tags: , , , , ,

When scripting, sanity check logging takes way more time that actions. Before binding to an Active Directory domain, you should verify that your system isn’t currently a member of an Active Directory domain. After binding, you should also check that settings are as expected. Use the get-addomain commandlet to do so:


To be more specific about a given domain:

PS C:\> Get-ADDomain -Identity


December 9th, 2014

Posted In: Uncategorized

December 5th, 2014

Posted In: Uncategorized

The other day, we installed libimobiledevice and used it to view the logs of an iOS device. But you can do much more with the commands that were installed. In fact, if you have a paired device, you can actually use these commands to do some remedial regression testing and other pretty cool things. So this is going to be part two of that article, basically.

First up, make sure the device is paired (note: not all commands require a device to be unlocked). But, all interaction with a device requires the device to be paired. You can use the command line (e.g. if you’re running this on Linux) to view the logs and manage devices, but if you’re not paired using iTunes or another tool, you’ll need to use idevicepair to pair your device, followed by the pair verb (which is very different from the pear verb):

idevicepair pair

You can also unpair using the unpair verb:

idevicepair unpair

The first command we’ll use is idevicedate, which simply returns with the date and time stamp currently on the device:


The response would look similar to the following:

Thu Nov 13 08:58:30 CST 2014

Next, let’s check the apps installed on a device. We can do this with the ideviceinstaller command (also part of the ilibmobiledevice suite of tools). Here, we’ll use the -l option to just list what’s installed:

/usr/local/bin/ideviceinstaller -l

The output would show the app, along with the version of the app at rest on the device: - Pages 1716

To uninstall one of the listed apps, use the –uninstall option:

ideviceinstaller --uninstall com.protogeo.Moves

You can also install apps provided you’ve cached the ipa file (e.g. via iTunes).

ideviceinstaller --install /Users/charlesedge/Music/iTunes/iTunes\ Media/Mobile\ Applications/Box\ 3.3.0.ipa

Which returns the following:

Copying '/Users/charlesedge/Music/iTunes/iTunes Media/Mobile Applications/Box 3.3.0.ipa' to device... DONE.
Installing ''
Install - CreatingStagingDirectory (5%)
Install - ExtractingPackage (15%)
Install - InspectingPackage (20%)
Install - TakingInstallLock (20%)
Install - PreflightingApplication (30%)
Install - VerifyingApplication (40%)
Install - CreatingContainer (50%)
Install - InstallingApplication (60%)
Install - PostflightingApplication (70%)
Install - SandboxingApplication (80%)
Install - GeneratingApplicationMap (90%)
Install - Complete

When run against a device, the app can then open apps provided the AppleID owns the app.

There’s also a command for ideviceprovision, which can be used to view provisioning profiles, when run with the list verb:

/usr/local/bin/ideviceprovision list

The ideviceprovision command can also form the basis of a tool like wirelurker by allowing you to install a provisioning profile

/usr/local/bin/ideviceprovision install angrybirds.mobileprovision

The file would look something like the following:

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “”>
<plist version=”1.0″>
<string>Angry Birds</string>
<string>Angry Birds</string>

You can also remove this, by feeding in the UUID of the provisioning profile (obtained using the list verb but replacing MYUUID from below codeblock):

/usr/local/bin/ideviceprovision remove MYUUID

Note: I’m going to leave my rant about how wirelurker is about as much a security vulnerability as `rm` is due to the fact that it’s how you test the impact of upgrading apps on devices during the development process to another post – where I’ll also beg Apple not to let a little bad press cause them to rip away some of the few deployment and testing tools we actually have for the platform.

Or you could so something more annoying like put a device into recovery mode, so it would need to be plugged into a computer running iTunes and get a new ipsw installed, which is as simple as feeding the udid into ideviceenterrecovery:

/usr/local/bin/ideviceenterrecovery af36e5d7065d4ad666bf047b6e4de26dd144578c

Which brings up an interesting question, how would you get the udid? You can use ideviceinfo:

ActivationState: Activated
ActivationStateAcknowledged: true
BasebandActivationTicketVersion: V2
BasebandCertId: 3554301762
BasebandChipID: 7282913
AKeyStatus: 2
SKeyHash: 7MQEUyvzG4gjjZc7KsNNAVTS8g4=
SKeyStatus: 0
BasebandMasterKeyHash: AEA5CCE143668D0EFB4CE1F2C94C966A6496CZZZ
BasebandSerialNumber: JErUEw==
BasebandStatus: BBInfoAvailable
BasebandVersion: 3.11.00
BluetoothAddress: 90:fd:61:a6:f6:ZZ
BoardId: 0
BrickState: false
BuildVersion: 12B411
CPUArchitecture: arm64
CFBundleVersion: 18.0
IntegratedCircuitCardIdentity: 89148000001085935ZZZ
InternationalMobileSubscriberIdentity: 311480110469ZZZ
MCC: 311
MNC: 480
SIMGID2: //////////8=
CertID: 3554301762
ChipID: 35168
ChipSerialNo: JErUEw==
DeviceClass: iPhone
DeviceColor: #3b3b3c
DeviceName: OK Computer
DieID: 5177734985296
EthernetAddress: 90:fd:61:a6:f6:13
FirmwareVersion: iBoot-2261.3.32
FusingStatus: 3
HardwareModel: N51AP
HardwarePlatform: s5l8960x
HostAttached: true
IntegratedCircuitCardIdentity: 89148000001085935111
InternationalMobileEquipmentIdentity: 352008065544111
InternationalMobileSubscriberIdentity: 311480110469111
MLBSerialNumber: F3Y34040ZEDF7GRA
MobileEquipmentIdentifier: 35200806554111
MobileSubscriberCountryCode: 311
MobileSubscriberNetworkCode: 480
ModelNumber: NE341
auto-boot: dHJ1ZQ==
backlight-level: MTQ0MA==
bootdelay: MA==
PasswordProtected: false
PhoneNumber: (612) 867-5309
PkHash: 09pXQgM5cjY6TJJNOOzO//R5JuGKqjHElfshBbnxZZZ=
ProductType: iPhone7,1
ProductVersion: 8.1
ProductionSOC: true
ProtocolVersion: 2
RegionInfo: LL/A
SBLockdownEverRegisteredKey: true
SIMGID1: ug==
SIMGID2: /w==
SIMStatus: kCTSIMSupportSIMStatusReady
SIMTrayStatus: kCTSIMSupportSIMTrayInsertedWithSIM
SerialNumber: F97N61XZFZZZ
0: 1
TelephonyCapability: true
TimeIntervalSince1970: 1416017216.873442
TimeZone: America/Chicago
TimeZoneOffsetFromUTC: -21600.000000
TrustedHostAttached: true
UniqueChipID: 5177734985296
UniqueDeviceID: af36e5d7065d4ad666bf047b6e4de26dd1445ZZZ
UseRaptorCerts: true
Uses24HourClock: false
WiFiAddress: 90:fd:61:a6:f6:ZZ
WirelessBoardSerialNumber: D81C55315781
kCTPostponementInfoPRIVersion: 0.1.90
kCTPostponementInfoPRLName: 1
kCTPostponementStatus: kCTPostponementStatusActivated

The ideviceinfo output above shows more information that I knew you could actually get about a device previously. You can grep for the UniqueDeviceID and

ideviceinfo | grep UniqueDeviceID | awk '{ print $2}'

This would just return with the UDID. Since that’s blank when there’s no device connected, you can run a loop that waits a few seconds when empty and then uses that UDID as a $1 in some script. Of course, it’s much easier to use a command they built for this called idevice_id:

idevice_id -l

Next, you can use idevicediagnostics to obtain some information about the current state of the device:

idevicediagnostics diagnostics All -u af36e5d7065d4ad666bf047b6e4de26dd1445789

Which has an output similar to the following:

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “”>
<plist version=”1.0″>

Or query the IOreg of the device:

idevicediagnostics ioreg IODeviceTree -u af36e5d7065d4ad666bf047b6e4de26dd1445789

The output is way too long to paste in here, but interesting (kinda’). The idevicediagnostics command can also do some basic tasks such as restart, sleep and shutdown (each sent as a verb without a required UDID):

idevicediagnostics restart

The crash reports on a device (which include reports for uninstalled apps, forensically providing a glimpse into what apps were removed from a device and when) can all be extracted from a paired device as well, using idevicecrashreport:

idevicecrashreport -e /test

You can then view the logs or grep through them for specific pieces of information:

cat /Test/Baseband/log-bb-2014-08-06-stats.plist

The last command we’re going to cover in this article is idevicebackup2, used to backup devices. Here, we’re going to feed it the udid (which I’m lazily using the idevice_id command from earlier in backticks to grab the udid and backing up into that /test directory.

idevicebackup2 -u `idevice_id -l` backup /test

Here, we’ve backed up whatever device is plugged in, to the /test directory. Subsequent backups will be incrementals.

November 17th, 2014

Posted In: Uncategorized

Rake is basically make for Ruby. I recently needed to update rake for something I was working on. After doing so, I tried to update some stuff in Profile Manager and it seemed to work on the outside, but a lot of stuff in Yosemite and Yosemite Server rely on rake so be careful when doing this kind of thing. So, to update to the latest version of rake, use the gem command along with the install verb and then rake as the gem being updated:

sudo gem update rake

This is an interactive command line environment so you’ll be asked a few questions in order to update the gem. Once complete, you’re running (at the time of this writing) 10.3.2. Run the list verb to see what version of each local gem you are running:

sudo gem list

Because running a newer version of rake can conflict with some built-in OS X stuff, you might find a desire to go back. At the time I’m writing this article, 0.9.6 is the latest and greatest version of rake that OS X uses. We can remove the existing rake using uninstall:

sudo gem uninstall rake

Then we can install a specific version using the install verb, followed by the gem and then the version:

sudo gem install rake 9.6

For a full guide of the gem verbs (or commands) see

November 15th, 2014

Posted In: Uncategorized

Next Page »