TweetFollow Us on Twitter

Backups on a Budget

Volume Number: 23 (2007)
Issue Number: 08
Column Tag: Programming

Backups on a Budget

Build your own backup utility with AppleScript Studio

by José R.C. Cruz

Introduction

Today, we will look into three backup tools that ship with Mac OS X. We will learn how to use these tools through the Terminal window. We will then use AppleScript studio to give one of these tools a user-friendly interface.

Backups, A Quick Primer

The reason for backups

The value of a computer lies not in its hardware or software features. It lies in the data stored on its hard drive, data that are critical to a user's daily activities. Some examples of critical data include active files such as documents, and web pages. Others include static ones such as fonts, plug-ins, and preferences files.

The potential for data loss is a harsh reality in any computing situation. Losing some, if not all, of these files can be disruptive and costly in terms of time and money. If the affected volume is largely intact, users can use specialized software to try to recover the lost files. But this type of recovery becomes ineffective when the volume itself is lost or destroyed. A more effective solution is to use a backup method.

Types of backups

The basic idea of a backup is to maintain copies of critical data from the source media. These copies are stored in a separate backup volume. That volume is then moved to a secure site after the backup. In the event of data loss, the backup media is retrieved from its site. Copies of affected data are then transferred from the volume back onto the target.

Backup systems fall into two categories. The first category groups these systems in terms of how the data is stored. The following are three basic types of systems in this category.

a. unstructured – An unstructured backup (Figure 1) stores the data as a simple collection. It does not organize the data in any meaningful form. It also does not keep track of which data was revised or removed in the computer later on. Instead, users have to do the extra steps needed to manage the backed up data.


Figure 1. An unstructured backup.

b. full+incremental – In a full+incremental backup (Figure 2), the first backup consists of all the data chosen by the user. This is also known as a full store. Then later backups consist only of data that were either revised or removed. All affected data are stored in a special store known as an incremental. The backup process then places each incremental in front of the full store. Restoring the latest data set consists of two steps. First, the process restores the full store back onto the computer. It then updates the restored data with each incremental, starting from the oldest to the newest.


Figure 2. A full+incremental backup.

c. mirror+incremental – The mirror+incremental works in the same fashion as the full+incremental. But they differ| in how they manage their incrementals. The mirror+incremental (Figure 3) updates its full store with the latest data revisions. It moves older revisions of the data into an incremental. It also takes the same approach for those data that were deleted. Then, it places each incremental after the full store. Now, restoring the latest data state is a simple process. All that is required is to copy the full store back onto the computer.


Figure 3. A mirror+incremental backup.

The second category groups backup systems in terms of the type of data being backed up. Again, there are three basic types in this category.

a. file-directory copy – The backup store consists of files and directories from the target (Figure 4). Most backup systems use native system calls to copy the data onto the backup volume. Some use their own routines to create the copies.


Figure 4. A file-directory copy backup.

b. filesystem dump – The backup store consists of the filesystem data of the target (Figure 5). This data can either be the entire filesystem or just the parts that have changed. Some backup systems use native system calls to copy the filesystem data onto the backup volume. Some use specialized tools, others a server process.


Figure 5. A filesystem dump backup.

c. block-level incremental – The backup store consists of the actual drive blocks from the target (Figure 6). Backup systems use low-level drivers to copy the blocks containing critical data onto the backup volume. This method requires close integration between the backup system and the target.


Figure 6. A block+incremental backup.

The Backup Tools

Mac OS X comes with a number of shell tools that can be used to create backups. Readers need only to start a Terminal session in order to use these tools. So, let's take a look at three of these tools.

The dump and restore tools

The dump tool creates a backup of the target filesystem. This tool examines the target media and decides which filesystem structures should be backed up. The tool is located in the /sbin directory, and it is available to all users.

The basic syntax of the dump tool is as follows.

dump –backup_level -f backup_media target_data

The tool supports other command options as well. To view these options, type info dump at the Terminal prompt.

The backup_level option sets the type of backup to be done. To do a full backup, set this option to 0. To do an incremental backup, set it to a value in the range of 1 to 9. If this option is not set, the tool will assume a value of 1.

The backup_media parameter sets the location of the backup volume. The location can be a device node, a separate file, or stdout. For example, if the backup volume is /dev/disk5, then pass the node as follows.

   dump -f /dev/disk5 target_data

Finally, the target_data parameter sets the location of the data on the target volume. This can be either a directory or the entire volume itself.

The opposite of the dump tool is the restore tool. This tool retrieves the backed up filesystem data and puts it back onto the target volume. It is also located in the /sbin directory, and available to all users.

The basic syntax for the restore tool is shown below.

restore <-r | -t> -f backup_media

The -r option restores the filesystem data from backup_media onto the current directory. The -t option lists the files contained in the backup. The tool supports other options as well. To view these options, type info restore at the Terminal prompt.

The dump and restore tools do have one shortcoming: they lack support for the HFS+ filesystem. Any attempts to backup an HFS+ volume will generate the following error message.

   DUMP: bad sblock magic number

Nevertheless, these same tools will work if the target volume is formatted as UFS.

The tar tool

An alternative to the dump and restore tools is the tar tool. The basic syntax of the tool is shown below.

   tar backup_options --file=backup_media target_data

Once again, the backup_media parameter sets the location of the backup volume. It can either be a device node or an actual file. The target_data parameter sets the location of the data on the target volume. It can either be a file, a list of files or a directory.

The backup_options parameters control the backup and recovery process. It can consist of one or more command options. The tar tool supports a wide range of command options. However, we will focus only on those options that are relevant to the topic.

Assume that we want to back up our web pages in the directory Sites, which is located in our home directory. To create a basic full backup, type the following statement at the Terminal prompt.

   tar --create --verify --label=full_backup_200704 ¬
            --file=/Volumes/Backup/foobar.tar Sites/*

The tool first creates the backup store, foobar.tar, on the Backup volume. Next, it adds each web page to the store, and verifies that the page is added correctly. Then, the tool assigns the volume label full_backup_200704 to the backup store. This label helps identify this backup from other backups on the same volume.

To list the contents of foobar.tar, use the --list command option.

   tar --list --file=/Volumes/Backup/foobar.tar 

To remove a file from foobar.tar, e.g. Sites/styles/foobar.css, use the --delete option.

   tar --delete --file=/Volumes/Backup/foobar.tar Sites/styles/foobar.css

To retrieve a file from foobar.tar, e.g. Sites/pages/links.htm, use the --get option.

   tar --get --file=/Volumes/Backup/foobar.tar Sites/pages/links.htm

To create a full+incremental backup, the tar tool needs to use a different set of command options. First, create a full backup with the following statement.

tar --create --file=/Volumes/Backup/foobar200704a.tar ¬ --listed-incremental=/Volumes/Backup/log/backup.log Sites/*

The tar tool creates the backup store foobar200704a.tar in /Volumes/Backup. Next, it creates a backup.log file in the directory /Volumes/Backup/log. But make sure to create the log directory before using the above statement. The tool itself will not create the log subdirectory; instead, it will generate an error if that directory is absent.

Now, assume that we made changes to the foobar.html and foobar.css files. To create an incremental backup, type the following statement at the Terminal prompt.

   tar --create --file=/Volumes/Backup/foobar200704b.tar ¬
      --listed-incremental=/Volumes/Backup/log/backup.log Sites/foo/*

The tar tool now creates a second backup store named foobar200704b.tar. Next, it copies the two changed files, foobar.html and foobar.css, into this store, ignoring the other unchanged files. Finally, the tool updates the backup.log file with the new tracking information.

The df tool

The df tool plays a special part in the backup and restore process. The tool displays a list of mounted volumes that can be access from the command-line. It also displays the amount of space available on those volumes. The tool also displays the device nodes assigned to each volume.

The basic syntax of the tool is df display_options, where display_options is one or more command options. To view a list of these options, type info df at the Terminal prompt.

Using the tool is quite straightforward. For instance, to display a list of all mounted volumes, type df at the Terminal prompt. The tool will display a list similar to that shown by Listing 1.

Listing 1. Sample listing of the df tool.

Filesystem     512-blocks   Used          Avail     Capacity   Mounted on
/dev/disk0s3   31195136     15484680      15398512   50%       /
devfs          202          202            0         100%      /dev
fdesc          2            2              0         100%      /dev
<volfs>  1024         1024           0         100%      /.vol
/dev/disk0s5   8126464      4511032        3615432   56%       /Volumes/Backups
/dev/disk0s9   10223616     2551800        7671816   25%       /Volumes/Projects
/dev/disk0s11  3932160      2822352        1109808   72%       /Volumes/Darwin
/dev/disk0s17  47742000     27840584       19901416  58%       /Volumes/Users
automount -nsl [199]0              0         0   100%  /Network

To display only those volumes that are mounted locally, type df –l at the prompt. The output list will now resemble that shown by Listing 2.

Listing 2. Sample listing of df -l.

Filesystem   512-blocks   Used          Avail     Capacity   Mounted on
/dev/disk0s3   31195136    15484680     15398512    50%      /
/dev/disk0s5   8126464     4511032      3615432     56%      /Volumes/Backups
/dev/disk0s9   10223616    2551800      7671816     25%      /Volumes/Projects
/dev/disk0s11  3932160     2822352      1109808     72%      /Volumes/Darwin
/dev/disk0s17  47742000    27840584     19901416    58%     /Volumes/Users

To display the volume capacities using the K, M, G notations, type df -l –h at the prompt. The output will now change to the one shown by Listing 3.

Listing 3. Sample listing of df -l -h.

Filesystem      Size   Used  Avail Capacity  Mounted on
/dev/disk0s3     15G   7.4G   7.3G    50%    /
/dev/disk0s5    3.9G   2.2G   1.7G    56%    /Volumes/Backups
/dev/disk0s9    4.9G   1.2G   3.7G    25%    /Volumes/Projects
/dev/disk0s11   1.9G   1.3G   542M    72%    /Volumes/Darwin
/dev/disk0s17    23G    13G   9.5G    58%    /Volumes/Users

The Backup Utility

We will now use AppleScript Studio to give a graphical interface to the df and tar tools. We will also write a number of scripts to manage the backup and restore process. Most Mac OS X users prefer the comfort and convenience of a user-friendly interface. They find that a graphical interface is much easier to use and remember than a line of command options.

To keep things simple, the utility will only do a full backup. It will store the backed up data in a single tar file named backup.tar. Users can add files, but not directories, to the backup process. Users can also add aliases but the utility will not backup these types of files. Instead, it will backup the actual files referred to by the aliases.

Also, for reasons of length, this article will show only the principal scripts used by the utility. Readers can see the rest of the scripts by downloading the Xcode project, Conserve, from the MacTech website: ftp://ftp.mactech.com/src

The user-interface layout

Our backup utility has a single window, which then contains three tab panel views. The first panel view is the Volumes panel (Figure 7). This panel displays a list of mounted local volumes using the df tool. Selecting a volume enables the Next button. Also, the state of the checkbox Restore data from the volume will decide which panel view will be displayed next.


Figure 7. The Volumes panel view.

Suppose that the checkbox is left unchecked. Then the next panel view to be displayed is the Backup panel (Figure 8). To add file entries to the table, click on the upper right button marked with a <+>. To delete an entry, select the entry and click on the button marked with a <->. To clear all the entries, click on button marked with a <0>. The Backup button (lower right) is enabled only when there is at least one entry on the table; otherwise, it remains disabled.


Figure 8. The Backup panel view.

Now suppose that same checkbox is checked. This time the next panel view to be displayed is the Restore panel (Figure 9). This panel shows all the files contained in the backup.tar file. Selecting one or more entries will enable the Restore button.


Figure 9. The Restore panel view.

Retrieving a list of volumes

Listing 4 shows the getVolumes handler. This method first retrieves a path to the temporary directory in the user's home directory. It then executes the command statement df -l and stores the result in the temporary file vol_list. Also, the contents of the file should resemble that shown in Listing 2.

Listing 4. The getVolumes handler (Conserve.applescript).

to getVolumes()
   local tCMD, tTmp
   
   -- retrieve a path to the temporary folder
   set tTmp to path to temporary items from user domain as string
   set tTmp to POSIX path of tTmp
   
   -- set the temporary file
   set tTmp to tTmp & "vol_list"
   
   -- prepare the script statement
   set tCMD to "df -l > " & tTmp
   
   -- execute the script statement
   do shell script tCMD with altering line endings
   
   -- return the path to the temporary file
   return (tTmp)
end getVolumes

The next step is to extract the device node and volume path from each line of text in the vol_list file. The getVolumeNode handler (Listing 5) extracts the device node of each mounted volume. The getVolumePath handler (Error! Reference source not found. Listing 6) extracts the volume path for that same volume. Both handlers use similar parsing techniques to extract their data. They differ only in the direction taken by each technique.

Listing 5. The getVolumeNode handler (Conserve.applescript).

to getVolumeNode from theDat
   local tVol, tLen, tPos
   local tChr
   
   try
      -- initialize the following locals
      set tVol to ""
      set tLen to length of theDat
      
      repeat with tPos from 1 to tLen
         set tChr to character tPos of theDat
         if (tChr is equal to " ") then
            exit repeat
         else
            set tVol to tVol & tChr
         end if -- (tChr is equal to " ")
      end repeat -- with tPos from 1 to tLen
      
      -- return the string results
      return (tVol)
   on error tErr
      -- return the default string
      return ("")
   end try
end getVolumeNode -- from theDat

Listing 6. The getVolumePath handler (Conserve.applescript).

to getVolumePath from theDat
   local tVol, tLen, tPos
   local tChr, tEnd
   
   try
      -- initialize the following locals
      set tVol to ""
      set tLen to length of theDat
      
      repeat with tPos from tLen to 1 by -1
         set tChr to character tPos of theDat
         if (tChr is equal to " ") then
            exit repeat
         else
            set tVol to (tChr & tVol) as string
         end if -- (tChr is equal to " ")
      end repeat -- with tPos from 1 to tLen
      
      -- test the extracted string
      set tChr to character 1 of tVol
      if (tChr is equal to "/") then
         -- return the string results
         return (tVol)
      else
         -- return a null string
         return ("")
      end if -- (tChr is equal to "/")
      
   on error tErr
      -- return the default string
      return ("")
   end try
end getVolumePath -- from theDat

Performing the backup process

Through the Backup panel (Figure 8), users select the files they want to add to the backup store. Once done, they then click on the Backup button to start the process. This button invokes the saveButton method shown in Listing 7. It also passes the volume path to the selected backup volume as the input argument.

First, the method constructs the path to the backup.tar file. Next, it prepares a date/time stamp, which will serve as the volume label. Then the method sets the following command statement.

tar --file=<path to the backup.tar file> --label=<date/time stamp>

When done, the method starts parsing the file paths that are stored in the list property pData. For the first file path, it executes the following tar statement.

tar --file=<path to the backup.tar file> --label=<date/time stamp> ¬
      --create --verify <target file path>

For the rest of the file paths, it executes a different tar statement.

tar --file=<path to the backup.tar file> --label=<date/time stamp> ¬
    --append <target file path>

Once the method finishes the backup process, it displays a modal dialog to inform the users of its success.

Listing 7. The saveBackup handler (Backup.applescript).

to saveBackup into theVol
   local tVol, tTag, tClk, tTar
   local tBck, tItm, tPth, tNew
   
   -- parameter check
   if (theVol is not equal to null) then
      -- prepare the backup tar file
      set tVol to theVol & "/backup.tar"
      
      -- prepare the time tag
      set tClk to current date
      set tTag to (year of tClk as integer) as string
      set tTag to tTag & (month of tClk as integer) as string
      set tTag to tTag & (day of tClk as integer) as string
      set tTag to tTag & (time of tClk as integer) as string
         
      -- prepare the shell command
      set tTar to "tar --file=" & tVol
      set tTar to tTar & " --label=" & tTag
      
      -- start backing up the files
      set tNew to true
      repeat with tItm in pData
         -- retrieve a path to the file
         set tPth to fpth of tItm
         
         -- is this a new backup?
         if (tNew) then
            -- backup:file:create
            set tNew to false
            set tBck to tTar & " --create --verify "
            set tBck to tBck & tPth
         else
            -- backup:file:update
            set tBck to tTar & " --append "
            set tBck to tBck & tPth
         end if -- (tNew)
         
         -- execute the script
         try
            do shell script tBck
         on error tErr
            log tErr
         end try
      end repeat -- with tItm in pData
      
      -- tell the user that the backup is successful
      display dialog "Backup is successful" buttons {"OK"} ¬
            default button "OK" attached to window "demo"
   end if -- (theVol is not equal to null)
end saveBackup -- into theVol

Performing the recovery process

To perform the recovery process, users first select the files they wanted from the Restore panel (Figure 9). Then they click on the Restore button to start the process. The button invokes the restoreFiles handler shown in Listing 8. It then passes the path to the backup volume as the input argument.

The restoreFiles method first prompts users to select a destination for the restored files. Then it prepares the following command line statement.

   cd <path to the recovery directory>; tar --extract ¬
      --file=<path to the backup.tar file>

Next, the method retrieves the list of files selected from the Restore panel. It then parses through each file, and updates the command line statement as follows.

   cd <path to the recovery directory>; tar --extract ¬
         --file=<path to the backup.tar file> <file to be recovered>

The method then uses the do shell script command to execute the above statement. Once the entire recovery process is finished, the method displays a modal dialog to inform users of its success.

Listing 8. The restoreFiles method (Restore.applescript).

to restoreFiles from theVol
   local tDst, tPth, tSel, tRow
   local tBsh, tTar, t
   
   if (theVol is equal to null) then
      return (false)
   else
      -- prompt the user for a destination volume
      try
         choose folder with prompt "Restore the backed up files into this directory "
         set tDst to result as string
         set tDst to the POSIX path of tDst
      on error tErr
         return (false)
      end try
      
      -- initialize the tar command
      set tTar to "tar --extract --file=" & theVol
      set tTar to tTar & "/backup.tar "
      
      -- initialize the shell command
      set tDst to "cd " & tDst & "; "
      set tDst to tDst & tTar
      
      -- retrieve the selected rows
      set tSel to selected rows of pTable
      if (length of tSel > 0) then
         repeat with tRow in tSel
            -- retrieve the file path
            set tPth to item tRow of pData
            set tPth to fpth of tPth
            
            -- extract the file
            set tBsh to tDst & tPth
            
            try
               do shell script tBsh
            on error tErr
               log tErr
            end try
         end repeat -- with tRow in tSel
         
         -- tell the user that restoration is successful
         display dialog "Restoration is successful" buttons {"OK"} ¬
               default button "OK" attached to window "demo"
      end if -- (length of tSel > 0)
   end if -- (theVol is equal to null)
end restoreFiles -- from theVol

Final Thoughts

Mac OS X already comes with a number of tools for backing up critical files. You can access these tools through the Terminal window, or through AppleScript. You can also use AppleScript Studio to give these tools a nice user-friendly interface.

Backups are an important part of any computing process. They are an effective solution against data loss. Keep in mind, however, that backups are only effective if you do them periodically. Skipping a scheduled backup is tantamount to adding a crack in the proverbial armor. Perhaps this is why Mac OS X 10.5 comes with a continuous backup system known as Time Machine.

Bibliography and References

Free Software Foundation. "Perform Backups and Restoring Files". GNU Tar 1.16.1 (2006 Dec 7). Copyright 1992-2006. Free Software Foundation, Inc. Online: http://www.gnu.org/software/tar/manual/tar.html.

Wikipedia. Backup (2007 Apr 12). Copyright 2007. Wikipedia Foundation, Inc. Online: http://en.wikipedia.org/wiki/Backup.

Wiebe, James. "Types of Backup Systems". Backups for Everyone. Copyright 2007. WiebeTech LLC. Online: http://www.wiebetech.com/whitepapers.php.


JC is a freelance engineering writer who lives happily in North Vancouver, British Columbia. He divides his time between writing technical articles, and teaching origami at his district's public library. He can be reached at anarakisware@icmail.net.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Ableton Live 9.7.5 - Record music using...
Ableton Live lets you create and record music on your Mac. Use digital instruments, pre-recorded sounds, and sampled loops to arrange, produce, and perform your music like never before. Ableton Live... Read more
Maintenance 2.3.5 - System maintenance u...
Maintenance is a system maintenance and cleaning utility. It allows you to run miscellaneous tasks of system maintenance: Check the status of the hard disk Repair permissions Run periodic scripts... Read more
OnyX 3.3.8 - Maintenance and optimizatio...
OnyX is a multifunction utility that you can use to verify the startup disk and the structure of its system files, to run miscellaneous maintenance and cleaning tasks, to configure parameters in the... Read more
Merlin Project 4.3.1 - $289.00
Merlin Project is the leading professional project management software for OS X. If you plan complex projects on your Mac, you won’t get far with a simple list of tasks. Good planning raises... Read more
WhatsApp 0.2.6426 - Desktop client for W...
WhatsApp is the desktop client for WhatsApp Messenger, a cross-platform mobile messaging app which allows you to exchange messages without having to pay for SMS. WhatsApp Messenger is available for... Read more
DiskCatalogMaker 7.2.5 - Catalog your di...
DiskCatalogMaker is a simple disk management tool which catalogs disks. Simple, light-weight, and fast Finder-like intuitive look and feel Super-fast search algorithm Can compress catalog data for... Read more
BBEdit 12.0.1 - Powerful text and HTML e...
BBEdit is the leading professional HTML and text editor for the Mac. Specifically crafted in response to the needs of Web authors and software developers, this award-winning product provides a... Read more
Hazel 4.2.2 - Create rules for organizin...
Hazel is your personal housekeeper, organizing and cleaning folders based on rules you define. Hazel can also manage your trash and uninstall your applications. Organize your files using a familiar... Read more
Hopper Disassembler 4.3.3- - Binary disa...
Hopper Disassembler is a binary disassembler, decompiler, and debugger for 32- and 64-bit executables. It will let you disassemble any binary you want, and provide you all the information about its... Read more
Adobe InCopy CC 2018 13.0.0.123 - Create...
InCopy CC 2018 is available as part of Adobe Creative Cloud for as little as $19.99/month (or $9.99/month if you're a previous InCopy customer). Adobe InCopy CC 2018, ideal for large team projects... Read more

Guns Royale guide - beginner tips and tr...
If you've been itching to find a mobile battle royale game like Player Unknown's Battlegrounds, you're finally in luck. Guns Royale is a new survival shooter that takes all of the things you love about good ol' PUBG and puts it in a tidy mobile... | Read more »
What we know about Animal Crossing on mo...
At last, we'll be receiving some news about the mobile version of Animal Crossing in a special Nintendo Director at11 PM on October 24. There's been little word on the game since it was first announced, having been met with a series of delays.... | Read more »
Darts of Fury guide - how to rise in the...
Darts of Fury is a new, immensely absorbing darts game from indie studio Yakuto. It's darts in its purest form, but collectible darts and other upgrades give this game an addictive edge that's hard to shake. As your progress out of the beginner... | Read more »
ICEY (Games)
ICEY 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: ICEY is a 2D side-scrolling action game. As you follow the narrator's omnipresent voice, you will see through ICEY's eyes and learn the... | Read more »
The best new games we played this week -...
We've made it, folks. Another weekend is upon us. It's time to sit back and relax with the best new releases of the week. Puzzles, strategy RPGs, and arcade games abound this week. There's a lot of quality stuff to unpack this week, so let's hop... | Read more »
Wheels of Aurelia (Games)
Wheels of Aurelia 1.0.1 Device: iOS Universal Category: Games Price: $3.99, Version: 1.0.1 (iTunes) Description: | Read more »
Halcyon 6: Starbase Commander guide - ti...
Halcyon 6 is a well-loved indie RPG with stellar tactical combat and some pretty good writing, too. It's now landed on the App Store, so mobile fans, if you're itching for a good intergalactic adventure, here's your game. Being a strategy RPG, the... | Read more »
Game of Thrones: Conquest guide - how to...
Fans of base building games might be excited to know that yet another entry in the genre has materialized - Game of Thrones: Conquest. Yes, you can now join the many kingdoms of the famed book series, or create your own, as you try to conquer... | Read more »
Halcyon 6: Starbase Commander (Games)
Halcyon 6: Starbase Commander 1.4.2.0 Device: iOS Universal Category: Games Price: $6.99, Version: 1.4.2.0 (iTunes) Description: An epic space strategy RPG with base building, deep tactical combat, crew management, alien diplomacy,... | Read more »
Legacy of Discord celebrates its 1 year...
It’s been a thrilling first year for fans of Legacy of Discord, the stunning PvP dungeon-crawling ARPG from YOOZOO Games, and now it’s time to celebrate the game’s first anniversary. The developers are amping up the festivities with some exciting... | Read more »

Price Scanner via MacPrices.net

27″ 3.4GHz iMac on sale for $1699, save $100
Amazon has the 27″ 3.4GHz iMac (MNE92LL/A) on sale today for $1699 including free shipping. Their price is $100 off MSRP, and it’s the lowest price available for this model (except for Apple’s $1529... Read more
Clearance 2016 15″ MacBook Pros available for...
B&H Photo has leftover 2016 15″ MacBook Pros available for up to $700 off original MSRP. Shipping is free, and B&H charges NY & NJ sales tax only: – 15″ 2.7GHz Touch Bar MacBook Pro Space... Read more
Save $100 on 13″ MacBook Airs, prices start a...
Adorama has 2017 13″ MacBook Airs on sale today for $100 off MSRP including free shipping. Adorama charges NY & NJ sales tax only: – 13″ 1.8GHz/128GB MacBook Air (MQD32LL/A): $899, $100 off MSRP... Read more
1.4GHz Mac mini available for $399, $100 off...
TigerDirect has the 1.4GHz Mac mini on sale today for $399 including free shipping. Their price is $100 off MSRP, and it’s the lowest price available for this model. Although currently out of stock,... Read more
21″ 2.3GHz iMac on sale for $999, save $100
MacMall has the 21″ 2.3GHz iMac (MMQA2LL/A) on sale today for $999 including free shipping. Their price is $100 off MSRP, and it’s the lowest price available for this model. Read more
12″ iPad Pros on sale for $50 off MSRP, no ta...
Adorama has 12″ iPad Pros on sale today for $50 off MSRP. Shipping is free, and Adorama charges sales tax in NY & NJ only: – 12″ 64GB iPad Pro: $749, save $50 – 12″ 256GB iPad Pro: $899, save $50... Read more
9″ iPads on sale for $30 off, starting at $29...
MacMall has 9″ iPads on sale for $30 off including free shipping: – 9″ 32GB iPad: $299 – 9″ 128GB iPad: $399 Read more
Apple restocks full line of refurbished 13″ M...
Apple has restocked a full line of Apple Certified Refurbished 2017 13″ MacBook Pros for $200-$300 off MSRP. A standard Apple one-year warranty is included with each MacBook, and shipping is free.... Read more
13″ 3.1GHz/256GB MacBook Pro on sale for $167...
Amazon has the 2017 13″ 3.1GHz/256GB Space Gray MacBook Pro on sale today for $121 off MSRP including free shipping: – 13″ 3.1GHz/256GB Space Gray MacBook Pro (MPXV2LL/A): $1678 $121 off MSRP Keep an... Read more
13″ MacBook Pros on sale for up to $120 off M...
B&H Photo has 2017 13″ MacBook Pros in stock today and on sale for up to $120 off MSRP, each including free shipping plus NY & NJ sales tax only: – 13-inch 2.3GHz/128GB Space Gray MacBook... Read more

Jobs Board

*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
Project Engineer, *Apple* Education Profess...
Project Engineer, Apple Education Professional Services Job Number: 113143353New York City, New York, United StatesPosted: Oct. 17, 2017Weekly Hours: 40.00 Job Read more
Commerce Software Engineer, *Apple* Media P...
Commerce Software Engineer, Apple Media Products Job Number: 113092072New York City, New York, United StatesPosted: Oct. 19, 2017Weekly Hours: 40.00 Job Summary With Read more
Engineering Manager, *Apple* Retail Enginee...
# Engineering Manager, Apple Retail Engineering Job Number: 58139948 Santa Clara Valley, California, United States Posted: 20-Oct-2017 Weekly Hours: 40.00 **Job Read more
*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.