Category Archives: Apple

Step-to-step guide for using JSVC with Java applications on Mac OS X

In our team, we have a lot of Java standalone applications which should be run as daemon on Unix/Linux system, and we found JSVC is the best choice for us to wrap Java programs to daemons. This article records the steps on how to install JSVC executable on Mac OS X, which is my development environment.

Versions used in this article:

  • Mac OS X: Version 10.6.7
  • JDK: 1.6.0_24

Download JSVC source package
First of all, we need to download JSVC source package from this URL: http://commons.apache.org/daemon/download_daemon.cgi, for example, I downloaded commons-daemon-1.0.5-src.tar.gz file.

Build JSVC executable
Unzip the source package and build JSVC executable.

tar zxvf commons-daemon-1.0.5-src.tar.gz
cd commons-daemon-1.0.5-src/src/native/unix

Before building the JSVC executable, please make sure you have set JAVA_HOME variable correctly.

A quick read of the INSTALL.txt document indicates that to build an OS X Universal Binary a couple of environment variables need to be set prior to configuring make.

Two flags are important and we need to set at first.

export CFLAGS="-arch i386"  // (or  "-arch x86_64", depends on your machine arch)
export LDFLAGS="-arch i386" // (or  "-arch x86_64", depends on your machine arch)

Please make sure it’s correct according to your OS arch, otherwise, you may encounter issues like this: https://discussions.apple.com/thread/2643549?threadID=2643549&tstart=90

10/11/2010 21:55:25 193 jsvc error: Cannot dynamically link to /Library/Java/Ho\
me/../Libraries/libclient.dylib
10/11/2010 21:55:25 193 jsvc error: dlopen(/Library/Java/Home/../Libraries/libc\
lient.dylib, 10): no suitable image found. Did find:
/Library/Java/Home/../Libraries/libclient.dylib: mach-o, but wrong arch\
itecture
10/11/2010 21:55:25 192 jsvc error: Service exit with a return value of 1

After that, we can configure and make the JSVC executable now.

sh support/buildconf.sh
./configure
make clean
make

Eventually, move the “jsvc” to another folder and add that folder on PATH environment variable. Now, we can use this command in script which will launch Java application as daemon.

Please make sure to add commons-daemon-x.jar into classpath, otherwise, we would see this error:

Cannot find daemon loader org/apache/commons/daemon/support/DaemonLoader
Service exit with a return value of 1

For more information on how to use jsvc command, please refer to http://commons.apache.org/daemon/jsvc.html

Quick Start for Developing and Running Hadoop Jobs on Mac OS X 10.6 (Single-Node Cluster)

These instructions are for installing and running Hadoop on a OS X single node cluster (MacPro).

Step 1: Creating a designated hadoop user on your system

This isn’t entirely necessary, but it’s a good idea for security reasons. To add a user, go to:

System Preferences > Accounts

Click the “+” button near the bottom of the account list. You may need to unlock this ability by hitting the lock icon at the bottom corner and entering the admin username and password.

When the New account window comes out enter a name, as short name and a password. I entered the following:

Name: hadoop
Short name: Hadoop
Password: MyPassword (well you get the idea)

Once you are done, hit “create account”. Now, log in as the hadoop user. You are ready to set up everything!

Step 2: Install/Configure Preliminary Software

Before installing Hadoop, there are a couple things that you need make sure you have on your system.

  1. Java, and the latest version of the JDK
  2. SSH

Because OS X is awesome, you actually don’t have to install these things. However, you will have to enable and update what you have. Let’s start with Java:

Updating Java

Open up the Terminal application. If it’s not already on your dock, you can access it through

Applications > Utilities > Terminal

Next check to see the version of Java that’s currently available on the system:

~$ java -version
java version “1.6.0_24″
Java(TM) SE Runtime Environment (build 1.6.0_24-b07-334-10M3326)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02-334, mixed mode)

You may want to update this to the latest Java, which is available as an update for OS X. For example, you can download it here: http://support.apple.com/kb/DL1360.

After you download and install the update, you are going to need to configure Java on your system so the default points to this new update. Go to:

Applications > Utilities > Java > Java Preferences

Under “Java Version” hit the radio button next to “Java SE 6″ Down by “Java Application Runtime Settings” change the order so Java SE 6 (64 bit) is first, followed by Java SE 5 (64 bit) and so on. Hit “Save” and close this window.

Now, when you go to the terminal, and type in “java -version” you should get the following:

~$ java -version
java version “1.6.0_24″
Java(TM) SE Runtime Environment (build 1.6.0_24-b07-334-10M3326)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02-334, mixed mode)

and for “javac -version”:

~$ javac -version
javac 1.6.0_24

SSH: Setting up Remote Desktop and Enabling Self-Login

SSH also comes installed on your Mac. However, you need to enable access to your own machine (so hadoop doesn’t ask you for a password at inconvenient times). To do this, go to

System Preferences > Sharing (under Internet & Network)

Under the list of services, check “Remote Login”. For extra security, you can hit the radio button for “Only these Users” and select hadoop

Now, we’re going to configure things so we can log into localhost without being asked for a password. Type the following into the terminal:

$:~ ssh-keygen -t rsa -P “”
$:~ cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

Now try:

$:~ ssh localhost

You should be able to log in without a problem. You are now ready to install Hadoop. Let’s go to step 3!

Step 3: Downloading and Installing Hadoop

So this actually involves a few smaller steps:

  1. Downloading and Unpacking Hadoop
  2. Configuring Hadoop

After we finish these, you should be ready to go! So let’s get started:

Downloading and Unpacking Hadoop

Download Hadoop. Make sure you download the latest version (As of this post, Hadoop 0.21 is the latest version). We call our generic version of hadoop hadoop-* in this tutorial.

Unpack the hadoop-*.tar.gz in the directory of your choice. I placed mine in ~/apps/hadoop-*. You may also want to set ownership permissions for the directory:

$:~ tar -xzvf hadoop-*.tar.gz
$:~ chown -R hadoop hadoop-*

Configuring Hadoop

There are two files that we want to modify when we configure Hadoop. The first is conf/hadoop-env.sh . Open this in your favorite text editor and do the following:

  • - Uncomment the export JAVA_HOME line and set it to /Library/Java/Home
  • - Uncomment the export HADOOP_HEAPSIZE line and keep it at 2000

You may want to change other settings as well, but I chose to leave the rest of hadoop-env.sh the same. Here is an idea of what part of mine looks like:

# Set Hadoop-specific environment variables here.

# The only required environment variable is JAVA_HOME. All others are
# optional. When running a distributed configuration it is best to
# set JAVA_HOME in this file, so that it is correctly defined on
# remote nodes.

# The java implementation to use. Required.
export JAVA_HOME=/Library/Java/Home

# Extra Java CLASSPATH elements. Optional.
# export HADOOP_CLASSPATH=

# The maximum amount of heap to use, in MB. Default is 1000.
export HADOOP_HEAPSIZE=2000

The next part that we need to set up are several configuration files core-site.xml, hdfs-site.xml, mapred-site.xml. Earlier (before Hadoop 0.21) all these settings were in a single file hadoop-site.xml.

The most important parts to set here are hadoop.tmp.dir (which should be set to the directory of your choice) and to add mapred.tasktracker.maximum property to the file. This will effectively set the maximum number of tasks that can simulataneously run by a task tracker. You should also set dfs.replication ‘s value to one.

Following configuration files are to be created in <hadoop_directory>/conf folder

hdfs-site.xml

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/Users/jiakuanwang/apps/hadoop-0.21.0/temp</value>
        <description>A base for other temporary directories.</description>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
        <description>Default block replication.
        The actual number of replications can be specified when the file is created.
        The default is used if replication is not specified in create time.
        </description>
    </property>
</configuration>

core-site.xml

<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://localhost:9000</value>
        <description>The name of the default file system. A URI whose
        scheme and authority determine the FileSystem implementation. The
        uri's scheme determines the config property (fs.SCHEME.impl) naming
        the FileSystem implementation class. The uri's authority is used to
        determine the host, port, etc. for a filesystem.</description>
    </property>
</configuration>

mapred-site.xml

<configuration>
    <property>
        <name>mapred.jobtracker.address</name>
        <value>localhost:9001</value>
        <description>The host and port that the MapReduce job tracker runs
        at. If "local", then jobs are run in-process as a single map
        and reduce task.
        </description>
    </property>
    <property>
        <name>mapred.tasktracker.map.tasks.maximum</name>
        <value>4</value>
    </property>
    <property>
        <name>mapred.tasktracker.reduce.tasks.maximum</name>
        <value>2</value>
    </property>
</configuration>

Now to our next step!

Step 4: Formatting and Running Hadoop

This step involves formatting the namenode and testing our system. First of all, we need to set environment variables for Hadoop in ~/.profile file:

# Set Hadoop environment variables
export HADOOP_HOME=/Users/jiakuanwang/apps/hadoop
export PATH=$HADOOP_HOME/bin:$PATH

Use the following command to format file system (new in 0.21.0):

$ hdfs namenode -format

This will give you output along the lines of

$ hdfs namenode -format
11/05/02 11:13:07 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/127.0.0.1
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 0.21.0
STARTUP_MSG: classpath = …
STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.21 -r 985326; compiled by ‘tomwhite’ on Tue Aug 17 01:02:28 EDT 2010
************************************************************/
11/05/02 11:13:07 INFO namenode.FSNamesystem: defaultReplication = 1
11/05/02 11:13:07 INFO namenode.FSNamesystem: maxReplication = 512
11/05/02 11:13:07 INFO namenode.FSNamesystem: minReplication = 1
11/05/02 11:13:07 INFO namenode.FSNamesystem: maxReplicationStreams = 2
11/05/02 11:13:07 INFO namenode.FSNamesystem: shouldCheckForEnoughRacks = false
11/05/02 11:13:08 INFO security.Groups: Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping; cacheTimeout=300000
11/05/02 11:13:08 INFO namenode.FSNamesystem: fsOwner=jiakuanwang
11/05/02 11:13:08 INFO namenode.FSNamesystem: supergroup=supergroup
11/05/02 11:13:08 INFO namenode.FSNamesystem: isPermissionEnabled=true
11/05/02 11:13:08 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
11/05/02 11:13:08 INFO common.Storage: Image file of size 117 saved in 0 seconds.
11/05/02 11:13:08 INFO common.Storage: Storage directory /Users/jiakuanwang/apps/hadoop-0.21.0/temp/dfs/name has been successfully formatted.
11/05/02 11:13:08 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/127.0.0.1
************************************************************/

Once this is done, we are ready to test our program.

Running Hadoop with Example

Start Hadoop FDS and MapReduce

First, start up the DFS. This will start up a TaskTracker, JobTracker, and DataNode on the machine.

$ start-dfs.sh
starting namenode, logging to /Users/jiakuanwang/apps/hadoop/bin/../logs/hadoop-jiakuanwang-namenode-localhost.out
localhost: starting datanode, logging to /Users/jiakuanwang/apps/hadoop/bin/../logs/hadoop-jiakuanwang-datanode-localhost.out
localhost: starting secondarynamenode, logging to /Users/jiakuanwang/apps/hadoop/bin/../logs/hadoop-jiakuanwang-secondarynamenode-localhost.out

And then start MapReduce:

$ start-mapred.sh
starting jobtracker, logging to /Users/jiakuanwang/apps/hadoop/bin/../logs/hadoop-jiakuanwang-jobtracker-localhost.out
localhost: starting tasktracker, logging to /Users/jiakuanwang/apps/hadoop/bin/../logs/hadoop-jiakuanwang-tasktracker-localhost.out

We can use JPS command to check the running process:

$ jps
17321 Jps
17239 TaskTracker
16996 DataNode
5362
16919 NameNode
17074 SecondaryNameNode
17161 JobTracker

And use the following command to check Hadoop status:

$ hdfs dfsadmin -report

Run WorkCount Program

As input for our test, we are going to create two text file locally

echo "Hello world Bye world" > ~/workspace/hadoop-example/input/file1
echo "hello hadoop bye hadoop" > ~/workspace/hadoop-example/input/file2

Create a folder in DFS:

hadoop fs -mkdir /tmp/input

And then copy the files up to our DFS.

hadoop fs -put ~/workspace/hadoop-example/input/* /tmp/input
# List files in DFS
hadoop fs -ls /tmp/input

Now, it’s time to run the WordCount program:

$ hadoop jar ~/apps/hadoop/hadoop-mapred-examples-0.21.0.jar wordcount /tmp/input /output
11/05/02 13:51:26 INFO security.Groups: Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping; cacheTimeout=300000
11/05/02 13:51:26 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
11/05/02 13:51:26 WARN conf.Configuration: mapred.task.id is deprecated. Instead, use mapreduce.task.attempt.id
11/05/02 13:51:26 WARN mapreduce.JobSubmitter: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
11/05/02 13:51:27 INFO input.FileInputFormat: Total input paths to process : 2
11/05/02 13:51:27 WARN conf.Configuration: mapred.map.tasks is deprecated. Instead, use mapreduce.job.maps
11/05/02 13:51:27 INFO mapreduce.JobSubmitter: number of splits:2
11/05/02 13:51:27 INFO mapreduce.JobSubmitter: adding the following namenodes' delegation tokens:null
11/05/02 13:51:27 WARN security.TokenCache: Overwriting existing token storage with # keys=0
11/05/02 13:51:27 INFO mapreduce.Job: Running job: job_local_0001
11/05/02 13:51:27 INFO mapred.LocalJobRunner: Waiting for map tasks
11/05/02 13:51:27 INFO mapred.LocalJobRunner: Starting task: attempt_local_0001_m_000000_0
11/05/02 13:51:27 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
11/05/02 13:51:27 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
11/05/02 13:51:27 INFO mapred.MapTask: soft limit at 83886080
11/05/02 13:51:27 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
11/05/02 13:51:27 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
11/05/02 13:51:27 INFO mapred.LocalJobRunner:
11/05/02 13:51:27 INFO mapred.MapTask: Starting flush of map output
11/05/02 13:51:27 INFO mapred.MapTask: Spilling map output
11/05/02 13:51:27 INFO mapred.MapTask: bufstart = 0; bufend = 40; bufvoid = 104857600
11/05/02 13:51:27 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26214384(104857536); length = 13/6553600
11/05/02 13:51:27 INFO mapred.MapTask: Finished spill 0
11/05/02 13:51:27 INFO mapred.Task: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting
11/05/02 13:51:27 INFO mapred.LocalJobRunner: map > sort
11/05/02 13:51:28 INFO mapred.Task: Task 'attempt_local_0001_m_000000_0' done.
11/05/02 13:51:28 INFO mapred.LocalJobRunner: Finishing task: attempt_local_0001_m_000000_0
11/05/02 13:51:28 INFO mapred.LocalJobRunner: Starting task: attempt_local_0001_m_000001_0
11/05/02 13:51:28 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
11/05/02 13:51:28 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
11/05/02 13:51:28 INFO mapred.MapTask: soft limit at 83886080
11/05/02 13:51:28 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
11/05/02 13:51:28 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
11/05/02 13:51:28 INFO mapred.LocalJobRunner:
11/05/02 13:51:28 INFO mapred.MapTask: Starting flush of map output
11/05/02 13:51:28 INFO mapred.MapTask: Spilling map output
11/05/02 13:51:28 INFO mapred.MapTask: bufstart = 0; bufend = 38; bufvoid = 104857600
11/05/02 13:51:28 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26214384(104857536); length = 13/6553600
11/05/02 13:51:28 INFO mapred.MapTask: Finished spill 0
11/05/02 13:51:28 INFO mapred.Task: Task:attempt_local_0001_m_000001_0 is done. And is in the process of commiting
11/05/02 13:51:28 INFO mapred.LocalJobRunner: map > sort
11/05/02 13:51:28 INFO mapred.Task: Task 'attempt_local_0001_m_000001_0' done.
11/05/02 13:51:28 INFO mapred.LocalJobRunner: Finishing task: attempt_local_0001_m_000001_0
11/05/02 13:51:28 INFO mapred.LocalJobRunner: Map task executor complete.
11/05/02 13:51:28 INFO mapred.Merger: Merging 2 sorted segments
11/05/02 13:51:28 INFO mapred.Merger: Down to the last merge-pass, with 2 segments left of total size: 61 bytes
11/05/02 13:51:28 INFO mapred.LocalJobRunner:
11/05/02 13:51:28 WARN conf.Configuration: mapred.skip.on is deprecated. Instead, use mapreduce.job.skiprecords
11/05/02 13:51:28 INFO mapred.Task: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting
11/05/02 13:51:28 INFO mapred.LocalJobRunner:
11/05/02 13:51:28 INFO mapred.Task: Task attempt_local_0001_r_000000_0 is allowed to commit now
11/05/02 13:51:28 INFO output.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to /output
11/05/02 13:51:28 INFO mapred.LocalJobRunner: reduce > sort
11/05/02 13:51:28 INFO mapred.Task: Task 'attempt_local_0001_r_000000_0' done.
11/05/02 13:51:28 INFO mapreduce.Job:  map 100% reduce 100%
11/05/02 13:51:28 INFO mapreduce.Job: Job complete: job_local_0001
11/05/02 13:51:28 INFO mapreduce.Job: Counters: 20
	FileInputFormatCounters
		BYTES_READ=46
	FileSystemCounters
		FILE_BYTES_READ=757532
		FILE_BYTES_WRITTEN=1036089
		HDFS_BYTES_READ=116
		HDFS_BYTES_WRITTEN=45
	Map-Reduce Framework
		Combine input records=8
		Combine output records=6
		Failed Shuffles=0
		GC time elapsed (ms)=19
		Map input records=2
		Map output bytes=78
		Map output records=8
		Merged Map outputs=0
		Reduce input groups=6
		Reduce input records=6
		Reduce output records=6
		Reduce shuffle bytes=0
		Shuffled Maps =0
		Spilled Records=12
		SPLIT_RAW_BYTES=204

After the job is finished, we can check the output folder:

$ hadoop fs -ls /output
11/05/02 13:56:48 INFO security.Groups: Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping; cacheTimeout=300000
11/05/02 13:56:48 WARN conf.Configuration: mapred.task.id is deprecated. Instead, use mapreduce.task.attempt.id
Found 2 items
-rw-r--r--   1 jiakuanwang supergroup          0 2011-05-02 13:51 /output/_SUCCESS
-rw-r--r--   1 jiakuanwang supergroup         45 2011-05-02 13:51 /output/part-r-00000

And check the result file:

$ hadoop fs -cat /output/part-r-00000
11/05/02 13:58:01 INFO security.Groups: Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping; cacheTimeout=300000
11/05/02 13:58:01 WARN conf.Configuration: mapred.task.id is deprecated. Instead, use mapreduce.task.attempt.id
Bye	1
Hello	1
bye	1
hadoop	2
hello	1
world	2

That’s all for this quick start for developing and running Hadoop jobs on Mac. You can go further from here, good luck!

How to synchronize iPhone/ipad notes

If you are one of those folks who is disappointed that you cannot sync the notes on your iPhone to your PC thanks to the current limitation of the iPhone’s Notes application, then you have come to the right place.

The iPhone is spectacular in many aspects. You can’t imagine anything better for playing music, video, browsing web on a phone or personal device. Despite all that excitement, it needs work in certain applications. One of them is iPhone notes, that enables you to jot down pieces of information. iPhone notes is very handy to use, easily accessible, gives a list of your notes and a nice full screen when you edit it.

But one thing what it does not offer is synching your notes with a PC, so it is not a dependable source of keeping information. If your phone crashes for any reason, all your notes information is lost. Moreover, you can not transfer you notes from desktop to iPhone!! The application also does not give you a way to sort, categorize, or search. As notes pile up, it’ll be difficult to find the information you need quickly.

There are several applications with which you can easily synch your notes, we will look into a few of them

1. Using Contacts:

It is one of the simplest and fastest workaround I have encountered. You would know that each contact has a notes field. So all you need to do is create a fake contact and paste any info you like in the notes field for that contact in Address Book. That way after a sync you will have all that information on your PC. You can use your contact notes offline and synchronize them whenever you like.

2. Using Email Drafts:

It is the same as the first workaround. Just, access your mailbox, compose a new mail, paste any info you like in the notes field and save it as a draft. Very simple indeed. Now you notes will be synchronized next time you sync your mails.

Idea: Establish an email account used only for Notes.

3. iphonenotes:

Note: For Mac OS X only and requires a Jail Broken phone.
This is a great application for Mac OS users for synching their notes. I assure you that you will love using it. You just need to install a binary on your Mac machine and connect your iPhone and PC to the same network, rest is done by iphonenotes.

iPhone Notes is a universal Mac binary (meaning it will work with both PPC and Intel Mac versions) that allows you to easily backup your iPhone’s notes on your computer. It also allows you to view the notes, edit (change,add and remove them), and then save them back to your iPhone.

You can find out more about the program on its official website

4. Noter:

Noter is a online based application that allows you to use an advanced notes program both online and offline. Here is a brief snapshot of how it works. You sign up for a Noter account, then log in to Noter by pointing your mobile Safari browser to noter.dbelement.com. Load the Noter client onto your iPhone – allowing them to make/edit notes at will. The finished notes can by synchronized to the server, which can in turn be synchronized to other users’ Noter clients. It’s a great tool to manage your notes easily.

Noter application can be used for offline use too. Once it’s loaded, notes can be added quickly. This gives a faster speed of entry. It also has a pretty cool search option.

You can find out more about the program on its official website

5. EverNote:

Evernote lets you remember anything that you want using your iPhone. You can jot down stuff that you need to take for vacation, save lovely pictures when you’re out with friends, or capture an interesting quote from a conversation. You name it and Evernote is there to organize that information for you and more importantly the information is easily accessible and searchable at any time, the only two things that are missing in iPhone Notes application.EverNote is a wonderful application for collecting, storing, and organizing practically any kind of information you can throw at it. You can store text notes, snapshot notes and voice notes. The snapshot and voice note are very handy when you do not want to type lengthy note using iPhone’s virtual keyboard. Your note is automatically uploaded to your Evernote server via WiFi or 3G/EDGE. So, you can refer them back whenever you need.

To get started, you need to sign up an account. The service is free and upgradable to a premium account with larger upload allowance. You will first need to get EverNote from iTunes app store (link given below). The user interface is quite simple and intutive.

It has an excellent search function (can supposedly find words in pictures too), and can be used on a variety of platforms. You can also organize notes into notebooks. Notes can be tagged with arbitrary text. They can also be organized with a “Saved Search” based on either a query or a tag.

Getting back to syncing, the Evernote desktop client syncs with the servers every hour by default. But it can be set to sync every 30, 15, or 5 minutes, or even manually if you so desire. If you create a new note but need to run out the door and have that note accessible while mobile (more on that in a minute), simply hit the sync button and you’re good to go.

You can find out more about the program on its official website

Thats’ all I could compile up. If you are using or know something better, please let me know. Enjoy!!