Our Meeho!™ Blog brings you general news, tech stuff, tips, inspiration and more in relation to the Meeho!™ platform.

Sign up now for free!

Archive for the ‘Mac OS X’ category

» Unix: master your job control

Posted by Anders Østergaard Jensen on 4/28 2010 at 2:52 PM

I spend a lot of my time in front of my laptop in the terminal. When Terminal.app finally was equipped with tabbed terminals, it suddenly became a lot easier to execute several processes within the same window without reaching out for the mouse. But, drawing on the Unix tradition of Mac OS X, there exists a simpler and faster alternative for switching between applications with the keyboard.

Every basic Unix shell provides a concept called job control which allows for switching back and forth between your applications simultaneously from within a single shell session. This text based multitasking functionality was implemented way back before Microsoft developed the Program Manager for Windows 3.x, and it certainly demonstrates why Unix was invented inherently as a multiuser, multitasking system. Let’s take a quick tour of the basics of job control using my favourite shell zsh (bash might apply as well, but the syntax for C derivatives might be different):

1. Start a zsh session and open a text file with your favourite $EDITOR, e.g. vim:
meeho:[aj] % vim doc1.txt
2. Now vim opens up the file doc1.txt. Now, say you want to briefly look for other files containing a specific pattern without exiting vim or opening a new terminal — what is the trick? Easy as pie: press control-Z, and your current process is put to the background of your shell:
[1]  + 22023 suspended  vim doc1.txt
meeho:[aj] %
[1]  + 22023 suspended  vim doc1.txt
meeho:[aj] %
3. Now you can grep for the relevant content and finally return to your vim session:
meeho:[aj] %  grep -ir ‘important pattern’ *
meeho:[aj] %  fg
4. Now, you are back in vim. ‘fg’ simply means ‘foreground’ and pushes your recently ‘backgrounded’ process of yours into the foreground of the shell session. Now, what if you want to background more than one process in the same shell session? Easy, control-Z out of the shell, open a new vim instance (vim doc2.txt) and background that process with control-Z as well. Now you can list the available jobs with the zsh built-in ‘jobs’ command:
meeho:[aj] % jobs
[1]  - suspended  vim doc1.txt
[2]  + suspended  vim doc2.txt
5. Finally, you can now swap back and forth between the applications using %<ID> (ID being the number in the squared brackets, e.g. %1 for ‘vim doc1.txt’ and %2 for ‘vim doc2.txt’):
meeho:[aj] % %1
The syntax for job control varies a bit from shell to shell, but the concept is basically the same. It is particularly useful if you are working on a remote machine through a slow network SSH connection, or if you simply have no graphical environment (e.g. X11) available.
There are, however, alternatives to the simple, but elegant Unix job control: GNU Screen is one of them. In terms of multitasking it is much more powerful, since it allows you to shuffle back and forth between several terminal sessions (thus, Screen is described as a terminal multiplexer rather than a single shell process). Some people even describe it as a window manager for the console, and it is truly powerful. But for now, I will save that walkthrough for next time.

1. Start a zsh session and open a text file with your favourite $EDITOR, e.g. vim (or the standard editor, ed):

meeho:[aj] % vim doc1.txt

2. Now vim opens up the file doc1.txt. Now, say you want to briefly look for other files containing a specific pattern without exiting vim or opening a new terminal — what is the trick? Easy as pie: press control-Z, and your current process is suspended to the background of your shell (process suspension also implies that the process execution is paused):

[1]  + 22023 suspended  vim doc1.txt
meeho:[aj] %

3. Now you can grep for the relevant content and finally return to your vim session:

meeho:[aj] %  grep -ir 'important pattern' *
meeho:[aj] %  fg

4. Now, you are back in vim. ‘fg’ simply means ‘foreground’ and pushes your recently ‘backgrounded’ process of yours into the foreground of the shell session. Now, what if you want to background more than one process in the same shell session? Easy, control-Z out of the shell, open a new vim instance (vim doc2.txt) and background that process with control-Z as well. Now you can list the available jobs with the zsh built-in ‘jobs’ command:

meeho:[aj] % jobs
[1]  - suspended  vim doc1.txt
[2]  + suspended  vim doc2.txt

5. Finally, you can now swap back and forth between the applications using %<ID> (ID being the number in the squared brackets, e.g. %1 for ‘vim doc1.txt’ and %2 for ‘vim doc2.txt’):

meeho:[aj] % %1

The syntax for job control varies a bit from shell to shell, but the concept is basically the same. It is particularly useful if you are working on a remote machine through a slow network SSH connection, or if you simply have no graphical environment (e.g. X11) available.

There are, however, alternatives to the simple, but elegant Unix job control: GNU Screen is one of them. In terms of multitasking it is much more powerful, since it allows you to shuffle back and forth between several terminal sessions (thus, Screen is described as a terminal multiplexer rather than a single shell process). Some people even describe it as a window manager for the console, and it is truly powerful. But for now, I will save that walkthrough for next time.

» scp – copy a file via SSH from a remote server to your computer

Posted by Kasper Tidemann on 3/17 2010 at 9:13 AM

If you have SSH access to a UNIX/Linux based system somewhere and want to copy a file located on the server to your computer via SSH, you can use the scp command found in most UNIX/Linux systems, including Mac OS X.

Say you want to copy a file from the remote server to your own computer, a file called my_file.txt. In this case, you would issue the following command in your terminal:

scp your_login@addres.of.remote.server:my_file.txt .

This makes your computer connect to the server with the login you provide, and copy the my_file.txt file to the directory you are currently working (using the exact same file name locally on your computer, that’s why there is a dot in the end of the command).

» Time Zone Conversion with java.util.Date

Posted by Anders Østergaard Jensen on 3/9 2010 at 3:54 AM

When building global web sites it is often necessary to display timestamps within the user’s own time zone. Ruby on Rails contains built-in functionality for this, whereas Java requires a more manual approach. In the following I will describe how such time zone conversion (and mapping) is easily implemented in Java.

The following method creates a time zone conversion from a standard java.util.Date (which defaults to the machine’s local time zone) to a specific time zone:

public static String formatDanishDate(Date d, String tz) {
DateFormat fmt = new SimpleDateFormat(”d/MM/yyyy ‘kl.’ HH:mm Z”);
TimeZone zone = getTimeZone(tz);
fmt.setTimeZone(zone);
return fmt.format(d);
}
public static String formatUSDate(Date d, String tz) {
DateFormat fmt = new SimpleDateFormat(”EEE, d/MM/yyyy ‘at’ KK:mm a Z”);
TimeZone zone = getTimeZone(tz);
logger.error(”+++ Chosen tz was: ” + zone.getDisplayName());
fmt.setTimeZone(zone);
logger.error(”LOL FORMAT: ” + fmt.format(d));
return fmt.format(d);
}
public static String formatUSDate(Date d, String tz) {

    DateFormat fmt = new SimpleDateFormat("EEE, d/MM/yyyy 'at' KK:mm a Z");

    TimeZone zone = getTimeZone(tz);

    fmt.setTimeZone(zone);

    return fmt.format(d);

  }

The above method depends on the following support function that searches through the Java library of supported time zones (with lower case matching).  If no match is found, getDefault() is returned. According to the SDK Javadoc, the default time zone depends on your system locale (if you are in Copenhagen, the standard time zone will be Europe/Copenhagen).

  public static TimeZone getTimeZone(String tz) {

    TimeZone retVal;

    for (String id: TimeZone.getAvailableIDs()) {

      if (id.toLowerCase().contains(tz.toLowerCase())) {

        retVal = TimeZone.getTimeZone(id);

        return retVal;

      }

    }

    return TimeZone.getDefault();

  }

Using the lowercase match search is especially useful if you are using time zones across different applications or frameworks with the same database. Fx. Ruby on Rails only stores the selected session time zone with the last identifier (e.g. ‘Copenhagen’ rather than ‘Europe/Copenhagen’), which makes it impossible to implement a one-to-one mapping between the two environments. Using getTimeZone(”Sydney”) or getTimeZone(”Copenhagen”) will thus return the Java time zone “Australia/Sydney” and ”Europe/Copenhagen” respectively.

Finally, the SimpleDateFormat lets you format the now converted Date representation to a localized format. Thus, the user can now also choose from different date formats in your application. This Javadoc link clarifies the different formatting options. For instance, a proper date representation for the Danish calendar would be:

DateFormat fmt = new SimpleDateFormat("d/MM/yyyy 'kl.' HH:mm Z");

Please let us know if you have further efficient methods for time zone conversion in Java and across different platforms.

» How to fix the problem of USB keys working on Windows 7 but not on Mac OS X and vice versa

Posted by Kasper Tidemann on 3/8 2010 at 7:23 AM

If you’re running both Mac OS X and Windows 7, you might have encountered the problem of your USB key(s) either working on the Mac OS X or the Windows 7, and not on both of them.

Following the below guide will fix the problem:

Step 1) Partition the USB key using Disk Utility on Mac OS X. Make a single partition using the format “free space” and the partition scheme “Master Boot Record” (under Options).

Step 2) Insert the USB key in the Windows 7 machine. This will result in Windows 7 telling you that the key needs to be formatted. Ignore this message for now, and access Control Panel -> System and Security -> Create and format hard disk partitions (under Administrative Tools). Now, the Disk Management window should show up.

Step 3) You should be able to see the USB key here, possibly with the text being lined through. Right-click on the USB key tab and choose “New Simple Volume…”. Then, choose to use the entire disk, choose FAT32, choose to use the standard allocation size and then, choose an appropriate name for the USB key.

Now, all you need to do is finish the actual formatting and the USB key should work both on Mac OS X and Windows 7.