[ del.icio.us poetry ]

http://www.notableapp.com/plans

Max

$119/month

Great for teams within large companies.

  • Up to 50 users
  • 50 GB storage
  • Unlimited Sets
  • Unlimited Workspaces
  • iPhone App
  • Private URLs
  • Enhanced Security

Sign Up »

Premium

$69/month

Best for consultants and corporate teams.

  • Up to 25 users
  • 25 GB storage
  • Unlimited Sets
  • Unlimited Workspaces
  • iPhone App
  • Private URLs
  • Enhanced Security

Sign Up »

Plus

$44/month

Most Popular Plan.

  • Up to 10 users
  • 10 GB storage
  • Unlimited Sets
  • Unlimited Workspaces
  • iPhone App
  • Private URLs
  • Enhanced Security

Sign Up »

Basic

$24/month

Best bet for any
freelancer.

  • Up to 5 users
  • 5 GB storage
  • Unlimited Sets
  • Unlimited Workspaces
  • iPhone App
  • Private URLs
  • Enhanced Security

Sign Up »

Personal

Free!

Getting started is a breeze!

  • Up to 3 users
  • 3 GB storage
  • Unlimited Sets
  • iPhone App

Sign Up »

Made by ZURB

Notable is made by ZURB, an interaction design and strategy company located in Campbell, California. We've put over 10 years of experience building web products, services and websites into this product. Learn more »

Need some help?

Read our FAQs for quick answers or contact us. You can also follow our updates on Twitter.

Subscribe to ZURBnews

Get our monthly newsletter, ZURBnews.

http://code.google.com/p/canto-js/
My favorites | Sign in
Logo
                
Activity: Medium
Code license:
MIT License
Labels:
JavaScript, Canvas, HTML5
Feeds:
Project feeds

canto.js is a small JavaScript library that improves the HTML5 Canvas drawing API to support features such as:

  • method chaining
  • relative coordinates
  • polylines
  • SVG path commands
  • turtle graphics
  • easier specification of drawing attributes








Powered by Google Project Hosting
http://forums.macrumors.com/showthread.php?t=871308
http://blog.notdot.net/2010/07/Damn-Cool-Algorithms-Levenshtein-Automata

Damn Cool Algorithms: Levenshtein Automata

In a previous Damn Cool Algorithms post, I talked about BK-trees, a clever indexing structure that makes it possible to search for fuzzy matches on a text string based on Levenshtein distance - or any other metric that obeys the triangle inequality. Today, I'm going to describe an alternative approach, which makes it possible to do fuzzy text search in a regular index: Levenshtein automata.

Introduction

The basic insight behind Levenshtein automata is that it's possible to construct a Finite state automaton that recognizes exactly the set of strings within a given Levenshtein distance of a target word. We can then feed in any word, and the automaton will accept or reject it based on whether the Levenshtein distance to the target word is at most the distance specified when we constructed the automaton. Further, due to the nature of FSAs, it will do so in O(n) time with the length of the string being tested. Compare this to the standard Dynamic Programming Levenshtein algorithm, which takes O(mn) time, where m and n are the lengths of the two input words! It's thus immediately apparrent that Levenshtein automaton provide, at a minimum, a faster way for us to check many words against a single target word and maximum distance - not a bad improvement to start with!

Of course, if that were the only benefit of Levenshtein automata, this would be a short article. There's much more to come, but first let's see what a Levenshtein automaton looks like, and how we can build one.

Construction and evaluation

The diagram on the right shows the NFA for a Levenshtein automaton for the word 'food', with maximum edit distance 2. As you can see, it's very regular, and the construction is fairly straightforward. The start state is in the lower left. States are named using a ne style notation, where n is the number of characters consumed so far, and e is the number of errors. Horizontal transitions represent unmodified characters, vertical transitions represent insertions, and the two types of diagonal transitions represent substitutions (the ones marked with a *) and deletions, respectively.

Let's see how we can construct an NFA such as this given an input word and a maximum edit distance. I won't include the source for the NFA class here, since it's fairly standard; for gory details, see the Gist. Here's the relevant function in Python:

def levenshtein_automata(term, k):
  nfa = NFA((0, 0))
  for i, c in enumerate(term):
    for e in range(k + 1):
      # Correct character
      nfa.add_transition((i, e), c, (i + 1, e))
      if e < k:
        # Deletion
        nfa.add_transition((i, e), NFA.ANY, (i, e + 1))
        # Insertion
        nfa.add_transition((i, e), NFA.EPSILON, (i + 1, e + 1))
        # Substitution
        nfa.add_transition((i, e), NFA.ANY, (i + 1, e + 1))
  for e in range(k + 1):
    if e < k:
      nfa.add_transition((len(term), e), NFA.ANY, (len(term), e + 1))
    nfa.add_final_state((len(term), e))
  return nfa

This should be easy to follow; we're basically constructing the transitions you see in the diagram in the most straightforward manner possible, as well as denoting the correct set of final states. State labels are tuples, rather than strings, with the tuples using the same notation we described above.

Because this is an NFA, there can be multiple active states. Between them, these represent the possible interpretations of the string processed so far. For example, consider the active states after consuming the characters 'f' and 'x':

This indicates there are several possible variations that are consistent with the first two characters 'f' and 'x': A single substitution, as in 'fxod', a single insertion, as in 'fxood', two insertions, as in 'fxfood', or a substitution and a deletion, as in 'fxd'. Also included are several redundant hypotheses, such as a deletion and an insertion, also resulting in 'fxod'. As more characters are processed, some of these possibilities will be eliminated, while other new ones will be introduced. If, after consuming all the characters in the word, an accepting (bolded) state is in the set of current states, there's a way to convert the input word into the target word with two or fewer changes, and we know we can accept the word as valid.

Actually evaluating an NFA directly tends to be fairly computationally expensive, due to the presence of multiple active states, and epsilon transitions (that is, transitions that require no input symbol), so the standard practice is to first convert the NFA to a DFA using powerset construction. Using this algorithm, a DFA is constructed in which each state corresponds to a set of active states in the original NFA. We won't go into detail about powerset construction here, since it's tangential to the main topic. Here's an example of a DFA corresponding to the NFA for the input word 'food' with one allowable error:

Note that we depicted a DFA for one error, as the DFA corresponding to our NFA above is a bit too complex to fit comfortably in a blog post! The DFA above will accept exactly the words that have an edit distance to the word 'food' of 1 or less. Try it out: pick any word, and trace its path through the DFA. If you end up in a bolded state, the word is valid.

I won't include the source for powerset construction here; it's also in the gist for those who care.

Briefly returning to the issue of runtime efficiency, you may be wondering how efficient Levenshtein DFA construction is. We can construct the NFA in O(kn) time, where k is the edit distance and n is the length of the target word. Conversion to a DFA has a worst case of O(2n) time - which leads to a pretty extreme worst-case of O(2kn) runtime! Not all is doom and gloom, though, for two reasons: First of all, Levenshtein automata won't come anywhere near the 2n worst-case for DFA construction*. Second, some very clever computer scientists have come up with algorithms to construct the DFA directly in O(n) time, [SCHULZ2002FAST] and even a method to skip the DFA construction entirely and use a table-based evaluation method!

Indexing

Now that we've established that it's possible to construct Levenshtein automata, and demonstrated how they work, let's take a look at how we can use them to search an index for fuzzy matches efficiently. The first insight, and the approach many papers [SCHULZ2002FAST] [MIHOV2004FAST] take is to observe that a dictionary - that is, the set of records you want to search - can itself be represented as a DFA. In fact, they're frequently stored as a Trie or a DAWG, both of which can be viewed as special cases of DFAs. Given that both the dictionary and the criteria (the Levenshtein automata) are represented as DFAs, it's then possible to efficiently intersect the two DFAs to find exactly the words in the dictionary that match our criteria, using a very simple procedure that looks something like this:

def intersect(dfa1, dfa2):
  stack = [("", dfa1.start_state, dfa2.start_state)]
  while stack:
    s, state1, state2 = stack.pop()
    for edge in set(dfa1.edges(state1)).intersect(dfa2.edges(state2)):
      state1 = dfa1.next(state1, edge)
      state2 = dfa2.next(state2, edge)
      if state1 and state2:
        s = s + edge
        stack.append((s, state1, state2))
        if dfa1.is_final(state1) and dfa2.is_final(state2):
          yield s

That is, we traverse both DFAs in lockstep, only following edges that both DFAs have in common, and keeping track of the path we've followed so far. Any time both DFAs are in a final state, that word is in the output set, so we output it.

This is all very well if your index is stored as a DFA (or a trie or DAWG), but many indexes aren't: if they're in-memory, they're probably in a sorted list, and if they're on disk, they're probably in a BTree or similar structure. Is there a way we can modify this scheme to work with these sort of indexes, and still provide a speedup on brute-force approaches? It turns out that there is.

The critical insight here is that with our criteria expressed as a DFA, we can, given an input string that doesn't match, find the next string (lexicographically speaking) that does. Intuitively, this is fairly easy to do: we evaluate the input string against the DFA until we cannot proceed further - for example, because there's no valid transition for the next character. Then, we repeatedly follow the edge that has the lexicographically smallest label until we reach a final state. Two special cases apply here: First, on the first transition, we need to follow the lexicographically smallest label greater than character that had no valid transition in the preliminary step. Second, if we reach a state with no valid outwards edge, we should backtrack to the previous state, and try again. This is pretty much the 'wall following' maze solving algorithm, as applied to a DFA.

For an example of this, take a look at the DFA for food(1), above, and consider the input word 'foogle'. We consume the first four characters fine, leaving us in state 3141. The only out edge from here is 'd', while the next character is 'l', so we backtrack one step to the previous state, 21303141. From here, our next character is 'g', and there's an out-edge for 'f', so we take that edge, leaving us in an accepting state (the same state as previously, in fact, but with a different path to it) with the output string 'fooh' - the lexicographically next string in the DFA after 'foogle'.

Here's the Python code for it, as a method on the DFA class. As previously, I haven't included boilerplate for the DFA, which is all here.

  def next_valid_string(self, input):
    state = self.start_state
    stack = []
    
    # Evaluate the DFA as far as possible
    for i, x in enumerate(input):
      stack.append((input[:i], state, x))
      state = self.next_state(state, x)
      if not state: break
    else:
      stack.append((input[:i+1], state, None))

    if self.is_final(state):
      # Input word is already valid
      return input
    
    # Perform a 'wall following' search for the lexicographically smallest
    # accepting state.
    while stack:
      path, state, x = stack.pop()
      x = self.find_next_edge(state, x)
      if x:
        path += x
        state = self.next_state(state, x)
        if self.is_final(state):
          return path
        stack.append((path, state, None))
    return None

In the first part of the function, we evaluate the DFA in the normal fashion, keeping a stack of visited states, along with the path so far and the edge we intend to attempt to follow out of them. Then, assuming we didn't find an exact match, we perform the backtracking search we described above, attempting to find the smallest set of transitions we can follow to come to an accepting state. For some caveats about the generality of this function, read on...

Also needed is the utility function find_next_edge, which finds the lexicographically smallest outwards edge from a state that's greater than some given input:

  def find_next_edge(self, s, x):
    if x is None:
      x = u'\0'
    else:
      x = unichr(ord(x) + 1)
    state_transitions = self.transitions.get(s, {})
    if x in state_transitions or s in self.defaults:
      return x
    labels = sorted(state_transitions.keys())
    pos = bisect.bisect_left(labels, x)
    if pos < len(labels):
      return labels[pos]
    return None

With some preprocessing, this could be made substantially more efficient - for example, by pregenerating a mapping from each character to the first outgoing edge greater than it, rather than using binary search to find it in many cases. I once again leave such optimizations as an exercise for the reader.

Now that we have this procedure, we can finally describe how to search the index with it. The algorithm is surprisingly simple:

  1. Obtain the first element from your index - or alternately, a string you know to be less than any valid string in your index - and call it the 'current' string.
  2. Feed the current string into the 'DFA successor' algorithm we outlined above, obtaining the 'next' string.
  3. If the next string is equal to the current string, you have found a match - output it, fetch the next element from the index as the current string, and repeat from step 2.
  4. If the next string is not equal to the current string, search your index for the first string greater than or equal to the next string. Make this the new current string, and repeat from step 2.

And once again, here's the implementation of this procedure in Python:

def find_all_matches(word, k, lookup_func):
  """Uses lookup_func to find all words within levenshtein distance k of word.
  
  Args:
    word: The word to look up
    k: Maximum edit distance
    lookup_func: A single argument function that returns the first word in the
      database that is greater than or equal to the input argument.
  Yields:
    Every matching word within levenshtein distance k from the database.
  """
  lev = levenshtein_automata(word, k).to_dfa()
  match = lev.next_valid_string(u'\0')
  while match:
    next = lookup_func(match)
    if not next:
      return
    if match == next:
      yield match
      next = next + u'\0'
    match = lev.next_valid_string(next)

One way of looking at this algorithm is to think of both the Levenshtein DFA and the index as sorted lists, and the procedure above to be similar to App Engine's "zigzag merge join" strategy. We repeatedly look up a string on one side, and use that to jump to the appropriate place on the other side. If there's no matching entry, we use the result of the lookup to jump ahead on the first side, and so forth. The result is that we skip over large numbers of non-matching index entries, as well as large numbers of non-matching Levenshtein strings, saving us the effort of exhaustively enumerating either of them. Hopefully it's apparrent from the description that this procedure has the potential to avoid the need to evaluate either all of the index entries, or all of the candidate Levenshtein strings.

As a side note, it's not true that for all DFAs it's possible to find a lexicographically minimal successor to any string. For example, consider the successor to the string 'a' in the DFA that recognizes the pattern 'a+b'. The answer is that there isn't one: it would have to consist of an infinite number of 'a' characters followed by a single 'b' character! It's possible to make a fairly simple modification to the procedure outlined above such that it returns a string that's guaranteed to be a prefix of the next string recognized by the DFA, which is sufficient for our purposes. Since Levenshtein DFAs are always finite, though, and thus always have a finite length successor (except for the last string, naturally), we leave such an extension as an exercise for the reader. There are potentially interesting applications one could put this approach to, such as indexed regular expression search, which would require this modification.

Testing

First, let's see this in action. We'll define a simple Matcher class, which provides an implementation of the lookup_func required by our find_all_matches function:

class Matcher(object):
  def __init__(self, l):
    self.l = l
    self.probes = 0

  def __call__(self, w):
    self.probes += 1
    pos = bisect.bisect_left(self.l, w)
    if pos < len(self.l):
      return self.l[pos]
    else:
      return None

Note that the only reason we implemented a callable class here is because we want to extract some metrics - specifically, the number of probes made - from the procedure; normally a regular or nested function would be perfectly sufficient. Now, we need a sample dataset. Let's load the web2 dictionary for that:

>>> words = [x.strip().lower().decode('utf-8') for x in open('/usr/share/dict/web2')]
>>> words.sort()
>>> len(words)
234936

We could also use a couple of subsets for testing how things change with scale:

>>> words10 = [x for x in words if random.random() <= 0.1]
>>> words100 = [x for x in words if random.random() <= 0.01]

And here it is in action:

>>> m = Matcher(words)
>>> list(automata.find_all_matches('nice', 1, m))
[u'anice', u'bice', u'dice', u'fice', u'ice', u'mice', u'nace', u'nice', u'niche', u'nick', u'nide', u'niece', u'nife', u'nile', u'nine', u'niue', u'pice', u'rice', u'sice', u'tice', u'unice', u'vice', u'wice']
>>> len(_)
23
>>> m.probes
142

Working perfectly! Finding the 23 fuzzy matches for 'nice' in the dictionary of nearly 235,000 words required 142 probes. Note that if we assume an alphabet of 26 characters, there are 4+26*4+26*5=238 strings within levenshtein distance 1 of 'nice', so we've made a reasonable saving over exhaustively testing all of them. With larger alphabets, longer strings, or larger edit distances, this saving should be more pronounced. It may be instructive to see how the number of probes varies as a function of word length and dictionary size, by testing it with a variety of inputs:

String lengthMax stringsSmall dictMed dictFull dict
17947 (59%)54 (68%)81 (100%)
213281 (61%)103 (78%)129 (97%)
318594 (50%)120 (64%)147 (79%)
423894 (39%)123 (51%)155 (65%)
529194 (32%)124 (43%)161 (55%)

In this table, 'max strings' is the total number of strings within edit distance one of the input string, and the values for small, med, and full dict represent the number of probes required to search the three dictionaries (consisting of 1%, 10% and 100% of the web2 dictionary). All the following rows, at least until 10 characters, required a similar number of probes as row 5. The sample input string used consisted of prefixes of the word 'abracadabra'.

Several observations are immediately apparrent:

  1. For very short strings and large dictionaries, the number of probes is not much lower - if at all - than the maximum number of valid strings, so there's little saving.
  2. As the string gets longer, the number of probes required increases significantly slower than the number of potential results, so that at 10 characters, we need only probe 161 of 821 (about 20%) possible results. At commonly encountered word lengths (97% of words in the web2 dictionary are at least 5 characters long), the savings over naively checking every string variation are already significant.
  3. Although the size of the sample dictionaries differs by an order of magnitude, the number of probes required increases only a little each time. This provides encouraging evidence that this will scale well for very large indexes.

It's also instructive to see how this varies for different edit distance thresholds. Here's the same table, for a max edit distance of 2:

String lengthMax stringsSmall dictMed dictFull dict
12054413 (20%)843 (41%)1531 (75%)
210428486 (5%)1226 (12%)2600 (25%)
324420644 (3%)1643 (7%)3229 (13%)
444030646 (1.5%)1676 (4%)3366 (8%)
569258648 (0.9%)1676 (2%)3377 (5%)

This is also promising: with an edit distance of 2, although we're having to do a lot more probes, it's a much smaller percentage of the number of candidate strings. With a word length of 5 and an edit distance of 2, having to do 3377 probes is definitely far preferable to doing 69,258 (one for every matching string) or 234,936 (one for every word in the dictionary)!

As a quick comparison, a straightforward BK-tree implementation with the same dictionary requires examining 5858 nodes for a string length of 5 and an edit distance of 1 (with the same sample string used above), while the same query with an edit distance of 2 required 58,928 nodes to be examined! Admittedly, many of these nodes are likely to be on the same disk page, if structured properly, but there's still a startling difference in the number of lookups.

One final note: The second paper we referenced in this article, [MIHOV2004FAST] describes a very nifty construction: a universal Levenshtein automata. This is a DFA that determines, in linear time, if any pair of words are within a given fixed Levenshtein distance of each other. Adapting the above scheme to this system is, also, left as an exercise for the reader.

The complete source code for this article can be found here.

* Robust proofs of this hypothesis are welcome.

[SCHULZ2002FAST] Fast string correction with Levenshtein automata

[MIHOV2004FAST] Fast approximate search in large dictionaries

Comments

blog comments powered by Disqus
http://jp.techcrunch.com/archives/20100728twitter-crime/
Twitterの上で悪人を見つけるための手がかりとは?–Barracuda Labsが計量的仮説を発表
by Alexia Tsotsis on 2010年7月29日 append.gif

Facebookのアクティブユーザが5億、Twitterのユーザ数が1億、こういう数字をみると、これまでのところ2010年は世界のオンライン人口の節目となる年だ。このような爆発的な伸びには、暗い側面もある。高潮がすべての船を押し上げているが、その中には悪党たちの船もある。

Barracuda Labsの調査報告書(2010年6月のデータ)によると、Twitterの上ではふつうの活動といかがわしい活動の両方が増加している。それは主に、APIが公開されているためと、アカウントの設定が容易なためだ。1日のトゥウィート数は5000万を超え、検索のクェリは1日6億に達する。最近のユーザの活動は、Twitterの全歴史の中で最高に活発だ。Nielsenの報告によると、ユニークビジターの数は昨年比で45%増加した。

以下はBarracudaからの引用だ:

- これまでに10回以上トゥウィートしたことがあり、フォロワーが10人以上いて、10人以上をフォローしている人は、全ユーザのわずかに28.87%である。

- 100人以上をフォローしている人は全ユーザのわずかに10%、およそ半数のユーザが5人未満である。

- Twitterのユーザの半数は1日のトゥウィート数が1回未満、1日に5回以上トゥウィートする人は全ユーザの10%。

- Twitterのアカウントの30%は、まったくトゥウィートしていない。

- Twitterユーザの15.8%が、フォロワーの数ゼロ、2009年には30%だったからほぼ半減したことになる。

- 33%はフォロワー数が10人以上いる。2009年には20%だったから、およそ65%の増。

“Twitterのユーザとまあ呼べる人”は、Barracudaの定義では、これまでに10回以上トゥウィートしたことがあり、フォロワーが10人以上いて、10人以上をフォローしている人だが、この層は2010年1月の21%から6月は29%へと増加した〔上の引用の最初の項目〕。フォロワーがゼロの人は全ユーザの15.8%へ減少、10人以上フォロワーのいる人は33%へと増加した〔上の引用の最後の項目〕。

このように、対話的活動の活発化とともに、いわゆる”Twitter犯罪”も増加している。毎月新たに作られるアカウントのうち、Twitterによって停止させられたものの割合は、2010年2月の1.08%から6月は2.38%に増加した。ただしこれは、単純にTwitterが削除数を増やしただけかもしれない。2010年前半のアカウント停止率は、全アカウントの1.67%だった。

2010年6月の数字は、2010年1月のいわゆる”レッドカーペット”事件のときに近い(@apluskによるセレブいじめ)。このときのアカウント停止率は2.20%だった。一般社会と同じく、人口が過密になると悪事も増えるのだ。

Barracuda Labsによると、不正なアカウントが増加しているときは、[フォロワー数 - フォロー数]や[フォロワー数 / フォロー数]の値の低いアカウントが増えるそうだ。つまり、SPAMのアカウントは誰もフォローしないから…。また、トゥウィート数の急激な増加も、悪質アカウントの増加のサインだ。データによると、トゥウィート数の急増とフォロワー数の低下は、相関している(フォロワー数を増やしたかったら人にうるさがられないようにすること、これが原則だ)。

しかし、一見して健全にトゥウィートしてフォロワーを増やしている人の中に、詐欺師がいることがある。Twitter自身の監視強化によって、不正アカウントの削除数は増えているが、詐欺師のパターンはさっきの[フォロワー数 / フォロー数]率や、[フォロワー数 - フォロー数]差分、そしてトゥウィートの(異様な)頻度によく注意しないと見つからない。Twitterもそのうち、次にあなたのフォロワーになる人が@sexyfreeipodではなくなるためのアカウント監視方法を、きっと編み出すだろう。

[原文へ]
[米TechCrunch最新記事サムネイル集]

(翻訳:iwatani(a.k.a. hiwa))

  • 有頂天Poii
    コミュニケーションの便利性から
    機心が、ますます増える中

    ワームに虫食いになったブレーンに効く
    ワクチンの開発はないのものか(笑)?
blog comments powered by Disqus
  • MediaTemple Logo
  • QuickSprout Logo
  • OpenX Logo
  • Cotendo Logo
http://www.dreig.eu/caparazon/2010/05/11/web-3-0-web-semantica-la-pelicula-traduccion-y-vision-critica/
http://www.thegeekstuff.com/2010/07/three-sysadmin-rules/
http://www.verbalink.com/transcription-rates/

Transcription Rates

1 Speaker
$1.50
2 Speakers
$1.75
3 Speakers
Not Tracked* - $1.75
Tracked** - $2.00
4 Speakers
Not Tracked* - $2.00
Tracked** - $2.50
5+ Speakers
Not Tracked* - $2.50
Tracked** - $3.00
 
Rates can be affected by audio quality variables.
Moderate background noise; soft or muffled voices
$0.25
Significant background noise; voices are very difficult to hear
$0.50
Light to moderate accents***
$0.25
Very pronounced accents***
$0.50
Verbatim transcription+
$0.25
Technical, scientific or medical terminology
$0.25
Time stamps & time codes every 1-5 minutes
$0.25
Digitizing Fee (for tapes, microcassettes, VHS tapes, or any audio source that must be captured in real-time)
$0.25
Special formatting or instructions++
Contact Us!
 

Standard Service (3-5 business days)
No Additional Charge!
Rush Service (1-2 business days)
$0.75
24-hour Service
$1.25
Same Day Service
$1.50
 
* If you do not want individual speakers tracked, we will identify them generically (Male/Female, Moderator/Respondent, Interviewer/Interviewee, etc.)

** We will track individual speakers as Male 1, Male 2, Female 1, Female 2, etc. We can also identify by name or some other term (Interviewer, Interviewee 1, Interviewee 2, etc.).

*** Accents can include U.S. regional dialects as well as foreign and non-American accents.

+Verbatim includes all ums, ahs and stutters.

++We can handle a wide range of requirements, including special layouts, document headings and tags, and some closed captioning XML formats.

Transcription Rates

We've simplified our transcription rates to make it easier than ever.

We still bill strictly per recorded minute of audio. Determine the number of speakers in your audio file. Identify if you have any other variables that may affect your audio (our Account Executives will help you with this if you’re not sure). Choose how quickly you want your transcript back.

GET STARTED NOW
We Know Our Clients.

Thanks again. You folks are great.

BG — Torrance, CA

Your transcripts are excellent, the process is easy, the communication is helpful, and the cost is reasonable. I will definitely recommend you to fellow doctoral students who are working on interview-based research projects.

KJ — Chicago, IL

You folks did a superb job considering the sound quality in various spots. You are definitely my transcription service from now on.

DB — Green Brook, NJ

You guys were great to work with. Excellent communication and prompt service.

EL — Jersey City, NJ

Your service has been awesome. I'll be recommending you to my colleagues.

KE — Levittown, PA

Thanks for the great turn-around on the transcript...You're doing more than a good job of serving your customer.  You're helping to get very important messages out to many others who benefit by receiving them.

JA — Omaha, NE

Many thanks, it is a great comfort to know that you guys are at the end of the internet and have such great turnaround/quality.

KG — Reading, UK

We have been very pleased with the service received from Verbal Ink, and we appreciate your time and efforts.

KJ —Parker, CO
http://storyofstuff.com/
Loading

The Latest

The Story of Cosmetics is here!

 

Story of Cosmetics

 

Have you visited storyofcosmetics.org yet? If not, you should! Learn about how major loopholes in U.S. federal law allow the $50 billion beauty industry to put unlimited amounts of chemicals into personal care products with no required testing, no monitoring of health effects and inadequate labeling requirements—making cosmetics among the least-regulated consumer products on the market. Think twice before putting on that lipstick, you might be putting on lead!

 

Let the Curricula Begin!

The Story of Stuff Project is excited to announce the release of Let There Be…Stuff? – a six-session curriculum that helps Christian teenagers explore the relationship between their consumption, their faith, and the health of the planet.

To celebrate Earth Day, we’re offering this incredible resource for free to the first 1,000 houses of worship or faith leaders who sign up to download it.

 

From the Blog

The Pot Calls the Kettle Black: Cosmetic Industry Responds to The Story of Cosmetics

Surprise, surprise: the big cosmetics companies aren’t such big fans of the Safe Cosmetics Act of 2010—legislation introduced yesterday to more strictly regulate their business—or of our new movie. The Personal Care Products Council went so far as to issue a statement calling The Story of Cosmetics a “repugnant and absurd…shockumentary.” Whoa!

 

[ comment HERE]



Front page of the Los Angeles Times!

 




Annie’s interview with Stephen Colbert!


The Colbert ReportMon - Thurs 11:30pm / 10:30c
Annie Leonard
www.colbertnation.com
Colbert Report Full EpisodesPolitical HumorHealth Care reform

[comment HERE]



 

Live from Twitter

http://www.tophotdeal.com/
http://delicious.com/help/getStarted

Getting Started

 

What is Delicious?

Delicious is a social bookmarking service that allows you to tag, save, manage and share Web pages all in one place. With emphasis on the power of the community, Delicious greatly improves how people discover, remember and share on the Internet.

Things you can do with Delicious

Bookmark any site on the Internet, and get to it from anywhere

Instead of having different bookmarks on every computer, Delicious makes it easy to have a single set of bookmarks kept in sync between all of your computers. Even if you're not on a computer you own, you can still get to your bookmarks on the Delicious website.

Share your bookmarks, and get bookmarks in return

If your friends use Delicious, you can send them interesting bookmarks that they can check out the next time they log in. Of course, they can do the same for you. As you explore the site and find interesting users, you can use our Subscriptions and Network features to keep track of the Delicious tags and users you find most interesting.

Discover the most useful and interesting bookmarks on the web

See what's hot with Delicious users by checking out our popular tags. By looking at popular bookmarks for a tag, you'll be able to discover the most interesting bookmarks on the topics you're most interested in. Browse bookmarks on just about anything from the best programming tips to the most popular travel sites, all in an easy to read format.

Saving a Bookmark

Saving a Bookmark on Delicious is likely to be a little different than what you're used to. Don't worry, we've made the process intuitive and you'll find that tags and notes will make your bookmarks much easier to manage.

Depending on which buttons you've added to your browser, you can click the "Tag" or "Bookmark this on Delicious" button to save a new bookmark. Regardless of the buttons you've chosen, you'll see the following fields.

URL:
The URL field is simply the address of the page you're bookmarking. This should be filled out for you. Only change this if you know what you're doing.
Title:
If you're using one of our bookmarking tools, this will be prefilled with the title of the page you're saving. Feel free to edit this in any way that makes sense to you.
Notes:
Here's where you may want to write some additional info for yourself or to let others know why you bookmarked this page.
Tags:
Enter one or more tags separated by spaces here. They are optional, but we suggest using them, as they make your bookmarks much easier to organize and navigate. For more on tags, read our tags section.
Send:
People and places you want to share your Bookmark with. This could be the social network Twitter, an email address, or a Delicious user
Message:
A message that will appear with your Tweet, Email, or Delicious message. Limited to 116 characters.
Save Dialog

Once a bookmark is saved, this is how it looks in Delicious:

Getting Around

We've organized the site into three main sections: Bookmarks, People and Tags. When you are logged in, these menus give you quick access to your Bookmarks, Network and Tags pages.

Our search allows you to not only search your own bookmarks, but virtually any context in Delicious. For example, you can now search a bundle, a tag, your Network, or another person's bookmarks from our handy search box in the header.

On most pages, our submenus allow you to quickly view Bookmarks, Network, Tags or Subscriptions for yourself or anyone else. Create a public profile, including a display name, to change how you appear in Delicious to others.

Use our Tag Bar to quickly navigate your bookmarks by using tags and tag combinations. Just start typing - autocomplete will help you find the tag you want. You can also sort your bookmarks in a variety of ways to make your browsing easier.

On the right side of the screen, our sidebars help you navigate tags and people quickly and easily.

Try it out!

The best way to learn how to use Delicious is to use Delicious. We designed it to be fun and easy to use, and we hope you find that to be the case. If you need help with anything, check out our help pages or contact us.

http://sc.replays.net/

Ǽ -

ʱޱϢ

Ǽ - Ƶ

STXʦ2010 ڶ: Samsung vs eSTRO(4)
STXʦ2010 ڶ: Samsung vs eSTRO(4)
STXʦ2010 ڶ: Samsung vs eSTRO(4)
KoreaAir OSL2010 S2 16ǿһ(4)
KoreaAir OSL2010 S2 16ǿһ(4)
KoreaAir OSL2010 S2 16ǿһ(4)
WCG2010йܾǼС: Legend vs Jifeng(...
WCG2010йܾǼС: Legend vs Jifeng(...
WCG2010йܾǼС: Legend vs Jifeng(2)
WCG2010йܾǼС: RoshGoOn vs Jayst...
WCG2010йܾǼС: RoshGoOn vs Jayst...
WCG2010йܾǼС: RoshGoOn vs Jaystar(3)
WCG2010йܾǼС: Ly vs Kurafi(3)
WCG2010йܾǼС: Ly vs Kurafi(3)
WCG2010йܾǼС: Ly vs Kurafi(3)
ڶCzyǼʸA(5)
ڶCzyǼʸA(5)
ڶCzyǼʸA(5)
΢DZ 16ǿڶ: HS81 vs FRDSƵ(3)
΢DZ 16ǿڶ: HS81 vs FRDSƵ(3)
΢DZ 16ǿڶ: HS81 vs FRDSƵ(3)
΢DZ 16ǿڶ: GP vs NTƵ(4)
΢DZ 16ǿڶ: GP vs NTƵ(4)
΢DZ 16ǿڶ: GP vs NTƵ(4)
ShowMetheMSL128: Mindһӽ vs Calm
ShowMetheMSL128: Mindһӽ vs Calm
ShowMetheMSL128: Mindһӽ vs Calm
ShowMetheMSL127: Muchһӽ vs AnyTimeJa...
ShowMetheMSL127: Muchһӽ vs AnyTimeJa...
ShowMetheMSL127: Muchһӽ vs AnyTimeJangbi
 

Ǽ - ͼƬר

 
http://ergaramonven.blog.com/

Friday, July 30, 2010

Nightlights Background in Ultramarine Blue by BackgroundsEtc

Watch this:

webtreats posted a photo:

Download our free Nightlights wallpaper backgrounds in high quality, 1440px by 900px and comes in 120 different colors and styles. View the full set here:
backgrounds.mysitemyway.com/free-nightlights-stock-backgr…Nightlights Background in Ultramarine Blue by BackgroundsEtc

Posted by ergaramonven in 05:14:06 | Permalink | No Comments »

Tuesday, July 27, 2010

Finding The Best in Life

Standing on the 2nd floor. Joe and Edmond are over for a short visit. Squeezing my fists as tight as I can. How many birds in the hand are worth one in the bush?

Posted by ergaramonven in 05:29:28 | Permalink | No Comments »

Monday, July 26, 2010

NXT Wall-e Transformable

Check this out:
Lego NXT wall-e transformable fully self controlled, it uses Lego Mindstorms programming environment. The video shows the transformation which is quite similar to the original wall-e. It is or all I know the first in Lego build look-alike which is capable to transform automated. For more information sites.google.com For questions, comments email at nxtwallet@gmail.com .NXT Wall-e Transformable

Posted by ergaramonven in 16:01:21 | Permalink | No Comments »

On the web today:

$description1$
And this:
$description2$
As well as:
$description3$ original. qaroinkzsus blog

Posted by ergaramonven in 15:13:18 | Permalink | No Comments »

Tools could have been stolen from Bridgnorth area

Found this today: Tools could have been stolen from Bridgnorth area

Posted by ergaramonven in 08:00:05 | Permalink | No Comments »

Don’t forget about the comic books at Comic-Con

Did you see this?:

Timea Bacsinszky – books place in final. Second seed Timea Bacsinszky is through to her second WTA Tour final after coming from a set down to beat Yvonne Meusberger 1-6 6-4 6-3 in the semi-finals of the Nurnberger Gastenladies in Bad Gastein.
And this:
Yes, comic books are still a part of Comic-Con. Although film, TV, and games are garnering more and more attention each year, visitors who attend Comic-Con to meet their favorite comic book and graphic novel creators are usually never disappointed.
As well as:
Earlier this week Amazon.com announced that for the last three months their sales of e-books outnumbered hardcover books. Contributor: Joseph Langeneckert Published: Jul 25, 2010 original. Blog for doonwexeeeq

Posted by ergaramonven in 02:35:07 | Permalink | No Comments »

Smart design for new spy HQ

Cool site of the day:

Three design/build teams vying for the aquatic center project in Bolivar made presentations to the Bolivar Board of Aldermen Thursday, July 15. The aldermen voted to proceed with contract negotiations with the team led by Wirt-Flavin Construction. original. Visit grutgruooey

Posted by ergaramonven in 01:19:03 | Permalink | No Comments »

Sunday, July 25, 2010

Call for rethink of priests’ celibacy

From todays web browsing:

This page is best viewed in an up-to-date web browser with style sheets (CSS) enabled. While you will be able to view the content of this page in your current browser, you will not be able to get the full visual experience.
And this:
The ratings agency Fitch has warned a double-dip contraction could be on the way for Dubai’s housing market.
As well as:
A group of women in Italy, who claim to have had relationships with Catholic priests, have asked Pope Benedict to rethink the church’s policy of celibacy. original. Blog for ergaramonven

Posted by ergaramonven in 19:00:20 | Permalink | No Comments »

FPS Terminator 2010 – PC Gameplay HD


This video is from the Alpha version of the game! Don’t forget to subscribe for upcoming videos! Released: 2010 Genre: Action (Shooter) / 3D / 1st Person (FPS) Developer: UDK Publisher: The Original StudiosFPS Terminator 2010 – PC Gameplay HD

Posted by ergaramonven in 10:22:10 | Permalink | No Comments »

Power Integrations releases energy-efficient standby power supply reference designs using new TOPSwitch-JX

What Ive read today:

Idea Integration is pleased to announce its participation in the Microsoft Upstream Reference Architecture Initiative , which will provide energy companies with the basic framework for building effective IT systems while leveraging the expertise of various technology firms in an effort to optimize the IT components of upstream exploration, drilling, production, and financial management.
And this:
Power Integrations has published two standby power supply reference designs using its recently announced TOPSwitch-JX IC product family. TOPSwitch-JX devices feature multi-mode control, minimizing power wasted in standby and delivering maximum efficiency over a wide range of operating loads.
As well as:
Wipro’s x73 Manager USB Reference System was recently awarded Global Certification by Continua Health Alliance, a non-profit, collaborative industry organisation dedicated to defining technology standards specifically for healthcare solutions. original. certcunud

Posted by ergaramonven in 04:00:06 | Permalink | No Comments »
http://www.mkodo.com/

mkodo, the definitive mobile platform

Main

Our latest news

888 launch Mobile Sportsbook

mkodo build Mobile Sportsbook and webapp for 888Sport on Portal Builder

Blue Square Sportsbook on iPad

Blue Sq build iPad webapp using mkodo

Sky Bet & mkodo launch Ad2Bet

Live Odds in-App enhancing speed-to-bet

Our work

  • Cartoon Network Logo
  • Ideal Home Logo
  • Zingy Logo
  • Northumberland County Council Logo

  • Cheetahmail Logo
  • Game Show Network Logo

  • Creation Logo
  • Freemans Logo
  • Grolsch Logo
  • Telescope Logo
http://www.wplover.com/lab/theme-development-checklist

Want this for your own site?

1. Development & Coding

Header

  • Check for proper DOCTYPE
  • Is there a wp_head() call?
  • <html> tag should include language_attributes()
  • Is there a feed autodiscovery link?
  • Are you fetching the title and description using bloginfo()?

Footer

  • Is there a wp_footer() call?

Error Handling

  • Do you have a 404 page?
  • Is your search page helpful? (Navigate to http://yoursite.com?s=TestSearchOut to test)

Syntax & File Handling

→ svn

  • If you're using svn, are your files set eol-style:native?
    find . -name \*.php -exec svn propset svn:eol-style native {} \;
    find . -name \*.css -exec svn propset svn:eol-style native {} \;

→ JavaScript

  • Is JavaScript CDATA encoded?
    <script type="text/javascript">
    /* <![CDATA[ */
    // content of your Javascript goes here
    /* ]]> */
    </script>
  • Are you using wp_enqueue_script?

2. Formatting, Function, and Logic

  • Are posts in the right order (front page and archive pages)?
  • Are the correct number of posts showing (as set in reading settings)?
  • Are sticky posts styled and functioning correctly?
  • Does the theme have pages tabs in the header? If so, do they overflow or have problems with child pages?

Navigation

  • Do front, archive, and single pages paginate correctly? Do they show the correct number of posts?
  • Posts, pages, and index should include wp_link_pages

Widgets

  • Is the theme widgetized as fully as possible?
  • Does the theme require custom widgets?
  • Do the current widgets look correct?
  • Are standard widgets setup? Should they be?
  • Do any standard widgets need to be overridden?

Pages

  • Are comments enabled for pages?

Posts

  • Does the page function correctly when logged in as an administrator compared to a normal user? (Example: do "Edit post" links work).
  • Are the date and time format options are respected (unless it's important to the design)?
  • Stylings: Tables
  • Stylings: Captions
  • Stylings: Unordered lists
  • Stylings: Ordered lists
  • Stylings: Blockquotes a) Make sure quotes are indented and display correctly.
  • Stylings: Blockquotes b) If the theme uses a background image or quote symbol, make sure it looks ok on both short and long quotes.

Multiple Page Posts

  • Are Page links displayed and formatted appropriately?
  • Do Page links work?

The <!--more --> tag

  • Does the part of the post before the more tag display on archive / front pages?
  • Does the full post appear on the permalink page?

Enclosures

  • Do links for enclosures work properly?

Video

  • Do embeded videos look correct?
  • Make sure they don't overlap or push the sidebars down (YouTube videos can be resized with a filter in functions.php, see Fjords theme for an example)

Images

  • Check a post with a picture floated right, left, is there enough space around it? Refer to Using Images: Styling Images in WordPress
  • Check a post with a picture that is far too big for the content column, does it break the layout? (Perhaps use overflow: hidden;)
  • Is $content_width set?
  • Does the gallery shortcode display properly?

Gravatars

  • Are gravatar calls working properly?

Categories

  • Does Category links work?
  • Are Categories displayed OK on front page and permalink page?
  • Are nested Categories handled elegantly?

Tags

  • Does Tag links work?
  • Are Tags displayed OK on front page and permalink page?
  • Are Tags and Tag links shown in each post?

Comments

  • Are comments displayed correctly?
  • Are blockquotes and any applicable HTML styled appropriately?
  • Are author comments highlighted differently?
  • Are user avatars displayed correctly?

→ No comments

  • Are no comments shown?
  • Is the comment display form replaced with a "Comments Off" message or similar?

→ Disabled Comments

  • Are previous comments still visible?
  • Is the comment display form replaced with a "Comments Off" message or similar?

→ Trackbacks

  • Are all trackbacks shown correctly without overlap?

→ Comment Form

  • Does comment input form look OK when logged out?
  • Does comment input form look OK when logged in?
  • Do comments have Edit links when logged in as blog administrator?
  • Is comment HTML displayed correctly, especially unordered lists and blockquotes?

3. Theme Unit Tests

Download and import the test data here: WordPress.org Dummy Content. The following tests are to be done on Posts with similar titles.

Posts

→ Future Post

  • This post should not show anywhere. It's in the future.

→ Layout Test

  • Is the Post showing a "read more" link?
  • Is the layout correct on every part of the post?

→ Simple Gallery Test

  • Does the gallery look correct?
  • Does it look good on front, archive, and single pages?

→ Category Name Clash

  • The post should be in category Foo Parent / Foo A - not in Foo A (no parent).

→ Test with Enclosures

  • Do the links work?

→ Block quotes

  • Are the quotes indented and displayed correctly?
  • If the theme uses a background image or quote symbol, does it look OK on both short and long quotes?
  • Likewise for the short and long quotes in comments

→ Many Categories

  • Do Category links work?
  • Are Categories displayed OK on front page and permalink page?

→ Many Tags

  • Do Tag links work?
  • Are Tags displayed OK on front page and permalink page?

→ Tags A and C / Tags B and C / Tags A and B / Tag C / Tag B / Tag A / Tags A, B, C

  • Are Tags and tag links shown in each post?
  • Do tag pages work and display the correct posts regardless of privacy settings?

→ Raw HTML code

  • Is all markup displayed appropiately?
  • Are H1 to H6 consistent?
  • Do tables and lists look ok?

→ Simple markup test

  • Is all markup displayed appropiately?
  • Does text alignment work?
  • Does image alignment work?
  • Block elements should remain blocks, not display:inline (and vice versa)
  • Blockquotes should be indented or otherwise distinct from paragraph text.
  • Are nested lists indented correctly?

→ Embedded Video

  • Does embedded video work?
  • Make sure they don't overlap or push the sidebars down (YouTube videos can be resized with a filter in functions.php, see Fjords theme for an example)

→ Contributor post, approved

  • Is the correct author name displayed?

→ Embedded Video

  • Does embedded video work?
  • Make sure they don't overlap or push the sidebars down (YouTube videos can be resized with a filter in functions.php, see Fjords theme for an example)

→ One comment

  • Is comment displayed correctly?
  • Does comment input form look OK when logged out?
  • Does comment input form look OK when logged in?
  • Do comments have Edit links when logged in as blog administrator?
  • Is comment HTML displayed correctly, especially unordered lists and blockquotes?

→ No comments

  • Are no comments shown?
  • Is the comment display form replaced with a "Comments Off" message or similar?

→ Many Trackbacks

  • Are all trackbacks shown correctly without overlap?

→ One Trackback

  • Is trackback shown correctly without overlapping anything else?

→ Comment test

  • Are comments displayed correctly?
  • Is author comment highlighted differently?
  • Are user avatars displayed correctly?

→ A post with multiple pages

  • Are page links displayed and formatted appropriately?
  • Do Page links work?
  • Does each page looks OK?

→ An article with a More tag

  • Is "more" link shown on non-permalink pages?
  • Is full post shown on permalink page?

→ Cat C / Cat B / Cat A / Cats A and C / Cats B and C / Cats A and B / Cats A, B, C

  • Are Categories and category links shown in each post?
  • Do category pages work and display the correct posts regardless of privacy settings?

→ This post has no body

  • Post should display fine regardless.

→ http://yoursite.com/2007/09/04/14/ ("This post has no title")

  • There should be a clickable permalink on http://yoursite.com/page/3/
  • Does the Post still display fine?

→ Protected: Test with secret password and excerpt / Protected: Test with secret password

  • Password input form should display OK.
  • Post should be displayed when the password is entered ("secret").
  • Password entry should work both from the permalink page and the list page http://yourblog.com/page/3/

→ Image align test

  • Images should be aligned left and right without overlap.
  • Images shouldn't have a border unless it's part of the design.

→ Test with thumbnails

  • Thumbnails should look ok and not overlap.
  • Thumbnails shouldn't have a border unless it's part of the design.

→ Test with wide image resized

  • Image should display OK.
  • Image shouldn't overlap sidebars.

→ Test with wide image

  • Image should display OK.
  • No border unless it's part of the design.
  • Sidebar overlap should be handled appropriately (scrolling or overflow: hidden).
  • Sidebar must not be pushed to the bottom of the page on either the list view or permalink view.

→ Test with image

  • Image should display OK.
  • No border unless it's part of the design.

→ Post with categories

  • Categories should display OK.

→ GMT+10 test post / GMT test post / GMT-6 test post / Article in the distant past

  • Timestamps should be correct.
  • Date/Time format options should be respected.

→ Draft Post

  • Should not be visible, since it is in draft mode.

→ Draft post with file attached

  • Should not be visible, since it is in draft mode.
  • Image should be attached.

→ Contributor post, pending approval

  • Should not be visible.
  • Should say: This post is awaiting review, or similar.

Pages

→ About / Lorem Ipsum

  • Long and short pages - check that they display OK.
  • Comments should be enabled on both.
  • Tags and Categories should not be displayed - make sure there isn't a left-over placeholder for them.

→ Page with comments

  • Comments should be enabled.
  • Comments should be displayed correctly (see notes above about author comment and avatars).

→ Page with comments disabled

  • Comments should be disabled.
  • There should not be a "comments disabled" message.
  • This is a very short page, check that the layout is OK.

→ Parent page / Child page 1 / Child page 2

  • Optional bonus points for displaying the parent and/or child when viewing each of these.
http://thepioneerwoman.com/cooking/2010/07/blueberry-crumb-cake/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+pwcooks+%28The+Pioneer+Woman+Cooks%21%29&utm_content=Google+Reader
http://razorjack.net/quicksand/

Quicksand

Reorder and filter items with a nice shuffling animation.

  • Activity Monitor 348 KB
  • Address Book1904 KB
  • Finder 1337 KB
  • Front Row 401 KB
  • Google Pokémon 12875 KB
  • iCal 5273 KB
  • iChat 5437 KB
  • Interface Builder 2764 KB
  • iTuna 17612 KB
  • Keychain Access 972 KB
  • Network Utility 245 KB
  • Sync 3788 KB
  • TextEdit 1669 KB

Demo seems sluggish? Disable CSS3 scaling and try again.

Isn’t it cool? Now, choose your fighter:

http://www.fubiz.net/2010/06/02/willy-verginer/
http://customtoronto.ca/

Custom Toronto - We Customize Promotional Products for You! Your logo on hundreds of products shipped in less than 15 business days!*

Hover to pause
About us

Custom Toronto is a promotional products company specializing in customized promotional items. Featuring Custom Tote bags, Pens , key chains and much, much more. Perfect, for Tradeshows, Corporate gifts and Conferences. As promotional items experts we stand behind our quality products and services. Let us help you with your company logo merchandise needs. Give us a call or drop us an email!

Customer Testimonials

  • Wow! I'm impressed - I was really concerned about my artwork as all I had was a bad scan of it. Your artwork department worked wonders and my custom pens look great! I give them away as corporate gifts for my business and always get complements, Thanks again!Tracy L.- North York
  • Custom Toronto made it really easy to order our eco friendly custom tote bags! From design to delivery, you guys walked me though each step and kept me informed of my order. Thanks again - and you'll hear from us next year for sure!Tom C. - Scarborough
  • I've dealt with other promotional companies before and your customer service is the best! Emails were answered within an hour and notification and communication were always right on. Not to mention the custom mugs came on time and look great, thanks!David I. - Markham
  • This was my first promotional product order and you guys really walked me though the process and made it easy. All I really had to do was send you guys my artwork! The email response was almost instant, thanks again - it was a great experience. Shawn R. - Mississauga
  • Customer service is the best of any company I’ve dealed with, you guys are always quick to respond and go the extra mile to help a customer out. The custom tote bags came out great and everybody at the tradeshow loved them! I've gladly referred many folks to you guys as well.Michelle L. - Toronto
  • The premium custom metal pens are great! I give them to our business clients, and always receive compliments on them. Many clients tell me it’s now their favorite everyday pen- which, as you can guess I just thrilled about. Thanks guys!Dominqie F. - Toronto

For Advertising

Promotional Products are the best way to advertise! A recent study released in November 2008 showed that advertising specialties beat out all forms of TV, radio and print as the most cost-effective method of advertising. The study showed that 84% of people interviewed who had received a promotional product remembered the name of the advertiser’s item. 42% of the respondents had a more favorable impression of the advertiser after receiving the item. The majority (62%) of the respondents had done business with the advertiser after receiving a promotional item from them. Click Here to read the study (PDF)

Servicing all of Onario

We service all of Ontario, including, but not limited to the following cities - if in doubt drop us an email or give us a call!

  • Toronto
  • Scarborough
  • North York
  • Thornhill
  • Mississauga
  • Markham
  • Richmond Hill
  • Newmarket
  • Vaughan
  • Concord
  • Brampton
  • Etobicoke
  • Oakville
  • Burlington
  • Hamilton
  • Guelph
  • Cambridge
  • Kitchener
  • Waterloo
  • Brantford
  • Woodstock
  • Stratford
  • Flamborough
  • London
  • St. Catharines
  • Niagara Falls
  • Welland
  • Fort Erie
  • Orangeville
  • Aurora
  • Owen Sound
  • Collingwood
  • Wasaga Beach
  • Sauble Beach
  • Barrie
  • Pickering
  • Ajax
  • Whitby
  • Oshawa
  • Belleville
  • Quinte West
  • Price Edward
  • Peterborough
  • Kingston
  • Sarnia
  • Ottawa

http://www.sitemaps.org/protocol.php

Sitemaps XML format

Jump to:
XML tag definitions
Entity escaping
Using Sitemap index files
Other Sitemap formats
Sitemap file location
Validating your Sitemap
Extending the Sitemaps protocol
Informing search engine crawlers

This document describes the XML schema for the Sitemap protocol.

The Sitemap protocol format consists of XML tags. All data values in a Sitemap must be entity-escaped. The file itself must be UTF-8 encoded.

The Sitemap must:

  • Begin with an opening <urlset> tag and end with a closing </urlset> tag.
  • Specify the namespace (protocol standard) within the <urlset> tag.
  • Include a <url> entry for each URL, as a parent XML tag.
  • Include a <loc> child entry for each <url> parent tag.

All other tags are optional. Support for these optional tags may vary among search engines. Refer to each search engine's documentation for details.

Also, all URLs in a Sitemap must be from a single host, such as www.example.com or store.example.com. For further details, refer the Sitemap file location

Sample XML Sitemap

The following example shows a Sitemap that contains just one URL and uses all optional tags. The optional tags are in italics.

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <url>
      <loc>http://www.example.com/</loc>
      <lastmod>2005-01-01</lastmod>
      <changefreq>monthly</changefreq>
      <priority>0.8</priority>
   </url>
</urlset> 

Also see our example with multiple URLs.

XML tag definitions

The available XML tags are described below.

Attribute Description
<urlset> required

Encapsulates the file and references the current protocol standard.

<url> required

Parent tag for each URL entry. The remaining tags are children of this tag.

<loc> required

URL of the page. This URL must begin with the protocol (such as http) and end with a trailing slash, if your web server requires it. This value must be less than 2,048 characters.

<lastmod> optional

The date of last modification of the file. This date should be in W3C Datetime format. This format allows you to omit the time portion, if desired, and use YYYY-MM-DD.

Note that this tag is separate from the If-Modified-Since (304) header the server can return, and search engines may use the information from both sources differently.

<changefreq> optional

How frequently the page is likely to change. This value provides general information to search engines and may not correlate exactly to how often they crawl the page. Valid values are:

  • always
  • hourly
  • daily
  • weekly
  • monthly
  • yearly
  • never

The value "always" should be used to describe documents that change each time they are accessed. The value "never" should be used to describe archived URLs.

Please note that the value of this tag is considered a hint and not a command. Even though search engine crawlers may consider this information when making decisions, they may crawl pages marked "hourly" less frequently than that, and they may crawl pages marked "yearly" more frequently than that. Crawlers may periodically crawl pages marked "never" so that they can handle unexpected changes to those pages.

<priority> optional

The priority of this URL relative to other URLs on your site. Valid values range from 0.0 to 1.0. This value does not affect how your pages are compared to pages on other sites—it only lets the search engines know which pages you deem most important for the crawlers.

The default priority of a page is 0.5.

Please note that the priority you assign to a page is not likely to influence the position of your URLs in a search engine's result pages. Search engines may use this information when selecting between URLs on the same site, so you can use this tag to increase the likelihood that your most important pages are present in a search index.

Also, please note that assigning a high priority to all of the URLs on your site is not likely to help you. Since the priority is relative, it is only used to select between URLs on your site.

Back to top

Entity escaping

Your Sitemap file must be UTF-8 encoded (you can generally do this when you save the file). As with all XML files, any data values (including URLs) must use entity escape codes for the characters listed in the table below.

Character Escape Code
Ampersand & &amp;
Single Quote ' &apos;
Double Quote " &quot;
Greater Than > &gt;
Less Than < &lt;

In addition, all URLs (including the URL of your Sitemap) must be URL-escaped and encoded for readability by the web server on which they are located. However, if you are using any sort of script, tool, or log file to generate your URLs (anything except typing them in by hand), this is usually already done for you. Please check to make sure that your URLs follow the RFC-3986 standard for URIs, the RFC-3987 standard for IRIs, and the XML standard.

Below is an example of a URL that uses a non-ASCII character (ü), as well as a character that requires entity escaping (&):

http://www.example.com/ümlat.php&q=name

Below is that same URL, ISO-8859-1 encoded (for hosting on a server that uses that encoding) and URL escaped:

http://www.example.com/%FCmlat.php&q=name

Below is that same URL, UTF-8 encoded (for hosting on a server that uses that encoding) and URL escaped:

http://www.example.com/%C3%BCmlat.php&q=name

Below is that same URL, but also entity escaped:

http://www.example.com/%C3%BCmlat.php&amp;q=name

Sample XML Sitemap

The following example shows a Sitemap in XML format. The Sitemap in the example contains a small number of URLs, each using a different set of optional parameters.

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <url>
      <loc>http://www.example.com/</loc>
      <lastmod>2005-01-01</lastmod>
      <changefreq>monthly</changefreq>
      <priority>0.8</priority>
   </url>
   <url>
      <loc>http://www.example.com/catalog?item=12&amp;desc=vacation_hawaii</loc>
      <changefreq>weekly</changefreq>
   </url>
   <url>
      <loc>http://www.example.com/catalog?item=73&amp;desc=vacation_new_zealand</loc>
      <lastmod>2004-12-23</lastmod>
      <changefreq>weekly</changefreq>
   </url>
   <url>
      <loc>http://www.example.com/catalog?item=74&amp;desc=vacation_newfoundland</loc>
      <lastmod>2004-12-23T18:00:15+00:00</lastmod>
      <priority>0.3</priority>
   </url>
   <url>
      <loc>http://www.example.com/catalog?item=83&amp;desc=vacation_usa</loc>
      <lastmod>2004-11-23</lastmod>
   </url>
</urlset>

Back to top

Using Sitemap index files (to group multiple sitemap files)

You can provide multiple Sitemap files, but each Sitemap file that you provide must have no more than 50,000 URLs and must be no larger than 10MB (10,485,760 bytes). If you would like, you may compress your Sitemap files using gzip to reduce your bandwidth requirement; however the sitemap file once uncompressed must be no larger than 10MB. If you want to list more than 50,000 URLs, you must create multiple Sitemap files.

If you do provide multiple Sitemaps, you should then list each Sitemap file in a Sitemap index file. Sitemap index files may not list more than 50,000 Sitemaps and must be no larger than 10MB (10,485,760 bytes) and can be compressed. You can have more than one Sitemap index file. The XML format of a Sitemap index file is very similar to the XML format of a Sitemap file.

The Sitemap index file must:

  • Begin with an opening <sitemapindex> tag and end with a closing </sitemapindex> tag.
  • Include a <sitemap> entry for each Sitemap as a parent XML tag.
  • Include a <loc> child entry for each <sitemap> parent tag.

The optional <lastmod> tag is also available for Sitemap index files.

Note: A Sitemap index file can only specify Sitemaps that are found on the same site as the Sitemap index file. For example, http://www.yoursite.com/sitemap_index.xml can include Sitemaps on http://www.yoursite.com but not on http://www.example.com or http://yourhost.yoursite.com. As with Sitemaps, your Sitemap index file must be UTF-8 encoded.

Sample XML Sitemap Index

The following example shows a Sitemap index that lists two Sitemaps:

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <sitemap>
      <loc>http://www.example.com/sitemap1.xml.gz</loc>
      <lastmod>2004-10-01T18:23:17+00:00</lastmod>
   </sitemap>
   <sitemap>
      <loc>http://www.example.com/sitemap2.xml.gz</loc>
      <lastmod>2005-01-01</lastmod>
   </sitemap>
</sitemapindex>

Note: Sitemap URLs, like all values in your XML files, must be entity escaped.

Sitemap Index XML Tag Definitions

Attribute Description
<sitemapindex> required Encapsulates information about all of the Sitemaps in the file.
<sitemap> required Encapsulates information about an individual Sitemap.
<loc> required

Identifies the location of the Sitemap.

This location can be a Sitemap, an Atom file, RSS file or a simple text file.

<lastmod> optional

Identifies the time that the corresponding Sitemap file was modified. It does not correspond to the time that any of the pages listed in that Sitemap were changed. The value for the lastmod tag should be in W3C Datetime format.

By providing the last modification timestamp, you enable search engine crawlers to retrieve only a subset of the Sitemaps in the index i.e. a crawler may only retrieve Sitemaps that were modified since a certain date. This incremental Sitemap fetching mechanism allows for the rapid discovery of new URLs on very large sites.

Back to top

Other Sitemap formats

The Sitemap protocol enables you to provide details about your pages to search engines, and we encourage its use since you can provide additional information about site pages beyond just the URLs. However, in addition to the XML protocol, we support RSS feeds and text files, which provide more limited information.

Syndication feed

You can provide an RSS (Real Simple Syndication) 2.0 or Atom 0.3 or 1.0 feed. Generally, you would use this format only if your site already has a syndication feed. Note that this method may not let search engines know about all the URLs in your site, since the feed may only provide information on recent URLs, although search engines can still use that information to find out about other pages on your site during their normal crawling processes by following links inside pages in the feed. Make sure that the feed is located in the highest-level directory you want search engines to crawl. Search engines extract the information from the feed as follows:

  • <link> field - indicates the URL
  • modified date field (the <pubDate> field for RSS feeds and the <modified> date for Atom feeds) - indicates when each URL was last modified. Use of the modified date field is optional.

Text file

You can provide a simple text file that contains one URL per line. The text file must follow these guidelines:

  • The text file must have one URL per line. The URLs cannot contain embedded new lines.
  • You must fully specify URLs, including the http.
  • Each text file can contain a maximum of 50,000 URLs and must be no larger than 10MB (10,485,760 bytes). If you site includes more than 50,000 URLs, you can separate the list into multiple text files and add each one separately.
  • The text file must use UTF-8 encoding. You can specify this when you save the file (for instance, in Notepad, this is listed in the Encoding menu of the Save As dialog box).
  • The text file should contain no information other than the list of URLs.
  • The text file should contain no header or footer information.
  • If you would like, you may compress your Sitemap text file using gzip to reduce your bandwidth requirement.
  • You can name the text file anything you wish. Please check to make sure that your URLs follow the RFC-3986 standard for URIs, the RFC-3987 standard for IRIs
  • You should upload the text file to the highest-level directory you want search engines to crawl and make sure that you don't list URLs in the text file that are located in a higher-level directory.

Sample text file entries are shown below.

http://www.example.com/catalog?item=1

http://www.example.com/catalog?item=11

Back to top

Sitemap file location

The location of a Sitemap file determines the set of URLs that can be included in that Sitemap. A Sitemap file located at http://example.com/catalog/sitemap.xml can include any URLs starting with http://example.com/catalog/ but can not include URLs starting with http://example.com/images/.

If you have the permission to change http://example.org/path/sitemap.xml, it is assumed that you also have permission to provide information for URLs with the prefix http://example.org/path/. Examples of URLs considered valid in http://example.com/catalog/sitemap.xml include:

http://example.com/catalog/show?item=23
http://example.com/catalog/show?item=233&user=3453

URLs not considered valid in http://example.com/catalog/sitemap.xml include:

http://example.com/image/show?item=23
http://example.com/image/show?item=233&user=3453
https://example.com/catalog/page1.php

Note that this means that all URLs listed in the Sitemap must use the same protocol (http, in this example) and reside on the same host as the Sitemap. For instance, if the Sitemap is located at http://www.example.com/sitemap.xml, it can't include URLs from http://subdomain.example.com.

URLs that are not considered valid are dropped from further consideration. It is strongly recommended that you place your Sitemap at the root directory of your web server. For example, if your web server is at example.com, then your Sitemap index file would be at http://example.com/sitemap.xml. In certain cases, you may need to produce different Sitemaps for different paths (e.g., if security permissions in your organization compartmentalize write access to different directories).

If you submit a Sitemap using a path with a port number, you must include that port number as part of the path in each URL listed in the Sitemap file. For instance, if your Sitemap is located at http://www.example.com:100/sitemap.xml, then each URL listed in the Sitemap must begin with http://www.example.com:100.

Sitemaps & Cross Submits

To submit Sitemaps for multiple hosts from a single host, you need to "prove" ownership of the host(s) for which URLs are being submitted in a Sitemap. Here's an example. Let's say that you want to submit Sitemaps for 3 hosts:

www.host1.com with Sitemap file sitemap-host1.xml
www.host2.com with Sitemap file sitemap-host2.xml
www.host3.com with Sitemap file sitemap-host3.xml

Moreover, you want to place all three Sitemaps on a single host: www.sitemaphost.com. So the Sitemap URLs will be:

http://www.sitemaphost.com/sitemap-host1.xml
http://www.sitemaphost.com/sitemap-host2.xml
http://www.sitemaphost.com/sitemap-host3.xml

By default, this will result in a "cross submission" error since you are trying to submit URLs for www.host1.com through a Sitemap that is hosted on www.sitemaphost.com (and same for the other two hosts). One way to avoid the error is to prove that you own (i.e. have the authority to modify files) www.host1.com. You can do this by modifying the robots.txt file on www.host1.com to point to the Sitemap on www.sitemaphost.com.

In this example, the robots.txt file at http://www.host1.com/robots.txt would contain the line "Sitemap: http://www.sitemaphost.com/sitemap-host1.xml". By modifying the robots.txt file on www.host1.com and having it point to the Sitemap on www.sitemaphost.com, you have implicitly proven that you own www.host1.com. In other words, whoever controls the robots.txt file on www.host1.com trusts the Sitemap at http://www.sitemaphost.com/sitemap-host1.xml to contain URLs for www.host1.com. The same process can be repeated for the other two hosts.

Now you can submit the Sitemaps on www.sitemaphost.com.

When a particular host's robots.txt, say http://www.host1.com/robots.txt, points to a Sitemap or a Sitemap index on another host; it is expected that for each of the target Sitemaps, such as http://www.sitemaphost.com/sitemap-host1.xml, all the URLs belong to the host pointing to it. This is because, as noted earlier, a Sitemap is expected to have URLs from a single host only.

Back to top

Validating your Sitemap

The following XML schemas define the elements and attributes that can appear in your Sitemap file. You can download this schema from the links below:

For Sitemaps: http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd
For Sitemap index files: http://www.sitemaps.org/schemas/sitemap/0.9/siteindex.xsd

There are a number of tools available to help you validate the structure of your Sitemap based on this schema. You can find a list of XML-related tools at each of the following locations:

http://www.w3.org/XML/Schema#Tools
http://www.xml.com/pub/a/2000/12/13/schematools.html

In order to validate your Sitemap or Sitemap index file against a schema, the XML file will need additional headers as shown below.

Sitemap:

<?xml version='1.0' encoding='UTF-8'?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
         xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <url>
      ...
   </url>
</urlset>

Sitemap index file:

<?xml version='1.0' encoding='UTF-8'?>
<sitemapindex xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/siteindex.xsd"
         xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <sitemap>
      ...
   </sitemap>
</sitemapindex>

Back to top

Extending the Sitemaps protocol

You can extend the Sitemaps protocol using your own namespace. Simply specify this namespace in the root element. For example:

<?xml version='1.0' encoding='UTF-8'?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
         xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
         xmlns:example="http://www.example.com/schemas/example_schema"> <!-- namespace extension -->
   <url>
      <example:example_tag>
         ...
      </example:example_tag>
      ...
   </url>
</urlset>

Back to top

Informing search engine crawlers

Once you have created the Sitemap file and placed it on your webserver, you need to inform the search engines that support this protocol of its location. You can do this by:

The search engines can then retrieve your Sitemap and make the URLs available to their crawlers.

Submitting your Sitemap via the search engine's submission interface

To submit your Sitemap directly to a search engine, which will enable you to receive status information and any processing errors, refer to each search engine's documentation.

Specifying the Sitemap location in your robots.txt file

You can specify the location of the Sitemap using a robots.txt file. To do this, simply add the following line including the full URL to the sitemap:

Sitemap: http://www.example.com/sitemap.xml

This directive is independent of the user-agent line, so it doesn't matter where you place it in your file. If you have a Sitemap index file, you can include the location of just that file. You don't need to list each individual Sitemap listed in the index file.

You can specify more than one Sitemap file per robots.txt file.

Sitemap: http://www.example.com/sitemap-host1.xml
Sitemap: http://www.example.com/sitemap-host2.xml

Submitting your Sitemap via an HTTP request

To submit your Sitemap using an HTTP request (replace <searchengine_URL> with the URL provided by the search engine), issue your request to the following URL:

<searchengine_URL>/ping?sitemap=sitemap_url

For example, if your Sitemap is located at http://www.example.com/sitemap.gz, your URL will become:

<searchengine_URL>/ping?sitemap=http://www.example.com/sitemap.gz

URL encode everything after the /ping?sitemap=:

<searchengine_URL>/ping?sitemap=http%3A%2F%2Fwww.yoursite.com%2Fsitemap.gz

You can issue the HTTP request using wget, curl, or another mechanism of your choosing. A successful request will return an HTTP 200 response code; if you receive a different response, you should resubmit your request. The HTTP 200 response code only indicates that the search engine has received your Sitemap, not that the Sitemap itself or the URLs contained in it were valid. An easy way to do this is to set up an automated job to generate and submit Sitemaps on a regular basis.
Note: If you are providing a Sitemap index file, you only need to issue one HTTP request that includes the location of the Sitemap index file; you do not need to issue individual requests for each Sitemap listed in the index.

Back to top

Excluding content

The Sitemaps protocol enables you to let search engines know what content you would like indexed. To tell search engines the content you don't want indexed, use a robots.txt file or robots meta tag. See robotstxt.org for more information on how to exclude content from search engines.

 

Back to top

Last Updated: 27 February 2008

http://www.thriftyfun.com/tf35516793.tip.html
http://www.sysadminday.com/

July 30, 2010 (Last Friday Of July)
11th
Annual
System Administrator Appreciation Day

A sysadmin unpacked the server for this website from its box, installed an operating system, patched it for security, made sure the power and air conditioning was working in the server room, monitored it for stability, set up the software, and kept backups in case anything went wrong. All to serve this webpage.

A sysadmin installed the routers, laid the cables, configured the networks, set up the firewalls, and watched and guided the traffic for each hop of the network that runs over copper, fiber optic glass, and even the air itself to bring the Internet to your computer. All to make sure the webpage found its way from the server to your computer.

Ted In Wires
Fig. 1 Ted.

A sysadmin makes sure your network connection is safe, secure, open, and working. A sysadmin makes sure your computer is working in a healthy way on a healthy network. A sysadmin takes backups to guard against disaster both human and otherwise, holds the gates against security threats and crackers, and keeps the printers going no matter how many copies of the tax code someone from Accounting prints out.

 

A sysadmin worries about spam, viruses, spyware, but also power outages, fires and floods.

When the email server goes down at 2 AM on a Sunday, your sysadmin is paged, wakes up, and goes to work.

A sysadmin is a professional, who plans, worries, hacks, fixes, pushes, advocates, protects and creates good computer networks, to get you your data, to help you do work -- to bring the potential of computing ever closer to reality.

So if you can read this, thank your sysadmin -- and know he or she is only one of dozens or possibly hundreds whose work brings you the email from your aunt on the West Coast, the instant message from your son at college, the free phone call from the friend in Australia, and this webpage.

Show your appreciation

Friday, July 30, 2010, is the 11th annual System Administrator Appreciation Day. On this special international day, give your System Administrator something that shows that you truly appreciate their hard work and dedication. (All day Friday, 24 hours, your own local time-zone).

Let's face it, System Administrators get no respect 364 days a year. This is the day that all fellow System Administrators across the globe, will be showered with expensive sports cars and large piles of cash in appreciation of their diligent work. But seriously, we are asking for a nice token gift and some public acknowledgement. It's the least you could do.

Consider all the daunting tasks and long hours (weekends too.) Let's be honest, sometimes we don't know our System Administrators as well as they know us. Remember this is one day to recognize your System Administrator for their workplace contributions and to promote professional excellence. Thank them for all the things they do for you and your business.

Help Spread the word

These icons link to social bookmarking sites where readers can share and discover new web pages. Please click on your favorites and help spread the news about System Administrator Appreciation Day.


 
http://ant.apache.org/manual/using.html

Using Ant

Writing a Simple Buildfile

Ant's buildfiles are written in XML. Each buildfile contains one project and at least one (default) target. Targets contain task elements. Each task element of the buildfile can have an id attribute and can later be referred to by the value supplied to this. The value has to be unique. (For additional information, see the Tasks section below.)

Projects

A project has three attributes:

Attribute Description Required
name the name of the project. No
default the default target to use when no target is supplied. No; however, since Ant 1.6.0, every project includes an implicit target that contains any and all top-level tasks and/or types. This target will always be executed as part of the project's initialization, even when Ant is run with the -projecthelp option.
basedir the base directory from which all path calculations are done. This attribute might be overridden by setting the "basedir" property beforehand. When this is done, it must be omitted in the project tag. If neither the attribute nor the property have been set, the parent directory of the buildfile will be used. No

Optionally, a description for the project can be provided as a top-level <description> element (see the description type).

Each project defines one or more targets. A target is a set of tasks you want to be executed. When starting Ant, you can select which target(s) you want to have executed. When no target is given, the project's default is used.

Targets

A target can depend on other targets. You might have a target for compiling, for example, and a target for creating a distributable. You can only build a distributable when you have compiled first, so the distribute target depends on the compile target. Ant resolves these dependencies.

It should be noted, however, that Ant's depends attribute only specifies the order in which targets should be executed - it does not affect whether the target that specifies the dependency(s) gets executed if the dependent target(s) did not (need to) run.

More information can be found in the dedicated manual page.

Tasks

A task is a piece of code that can be executed.

A task can have multiple attributes (or arguments, if you prefer). The value of an attribute might contain references to a property. These references will be resolved before the task is executed.

Tasks have a common structure:

<name attribute1="value1" attribute2="value2" ... />

where name is the name of the task, attributeN is the attribute name, and valueN is the value for this attribute.

There is a set of built-in tasks, but it is also very easy to write your own.

All tasks share a task name attribute. The value of this attribute will be used in the logging messages generated by Ant.

Tasks can be assigned an id attribute:
<taskname id="taskID" ... />
where taskname is the name of the task, and taskID is a unique identifier for this task. You can refer to the corresponding task object in scripts or other tasks via this name. For example, in scripts you could do:
<script ... >
  task1.setFoo("bar");
</script>
to set the foo attribute of this particular task instance. In another task (written in Java), you can access the instance via project.getReference("task1").

Note1: If "task1" has not been run yet, then it has not been configured (ie., no attributes have been set), and if it is going to be configured later, anything you've done to the instance may be overwritten.

Note2: Future versions of Ant will most likely not be backward-compatible with this behaviour, since there will likely be no task instances at all, only proxies.

Properties

Properties are an important way to customize a build process or to just provide shortcuts for strings that are used repeatedly inside a build file.

In its most simple form properties are defined in the build file (for example by the property task) or might be set outside Ant. A property has a name and a value; the name is case-sensitive. Properties may be used in the value of task attributes or in the nested text of tasks that support them. This is done by placing the property name between "${" and "}" in the attribute value. For example, if there is a "builddir" property with the value "build", then this could be used in an attribute like this: ${builddir}/classes. This is resolved at run-time as build/classes.

With Ant 1.8.0 property expansion has become much more powerful than simple key value pairs, more details can be found in the concepts section of this manual.

Example Buildfile

<project name="MyProject" default="dist" basedir=".">
    <description>
        simple example build file
    </description>
  <!-- set global properties for this build -->
  <property name="src" location="src"/>
  <property name="build" location="build"/>
  <property name="dist"  location="dist"/>

  <target name="init">
    <!-- Create the time stamp -->
    <tstamp/>
    <!-- Create the build directory structure used by compile -->
    <mkdir dir="${build}"/>
  </target>

  <target name="compile" depends="init"
        description="compile the source " >
    <!-- Compile the java code from ${src} into ${build} -->
    <javac srcdir="${src}" destdir="${build}"/>
  </target>

  <target name="dist" depends="compile"
        description="generate the distribution" >
    <!-- Create the distribution directory -->
    <mkdir dir="${dist}/lib"/>

    <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
    <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
  </target>

  <target name="clean"
        description="clean up" >
    <!-- Delete the ${build} and ${dist} directory trees -->
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
  </target>
</project>

Notice that we are declaring properties outside any target. As of Ant 1.6 all tasks can be declared outside targets (earlier version only allowed <property>,<typedef> and <taskdef>). When you do this they are evaluated before any targets are executed. Some tasks will generate build failures if they are used outside of targets as they may cause infinite loops otherwise (<antcall> for example).

We have given some targets descriptions; this causes the projecthelp invocation option to list them as public targets with the descriptions; the other target is internal and not listed.

Finally, for this target to work the source in the src subdirectory should be stored in a directory tree which matches the package names. Check the <javac> task for details.

Token Filters

A project can have a set of tokens that might be automatically expanded if found when a file is copied, when the filtering-copy behavior is selected in the tasks that support this. These might be set in the buildfile by the filter task.

Since this can potentially be a very harmful behavior, the tokens in the files must be of the form @token@, where token is the token name that is set in the <filter> task. This token syntax matches the syntax of other build systems that perform such filtering and remains sufficiently orthogonal to most programming and scripting languages, as well as with documentation systems.

Note: If a token with the format @token@ is found in a file, but no filter is associated with that token, no changes take place; therefore, no escaping method is available - but as long as you choose appropriate names for your tokens, this should not cause problems.

Warning: If you copy binary files with filtering turned on, you can corrupt the files. This feature should be used with text files only.

Path-like Structures

You can specify PATH- and CLASSPATH-type references using both ":" and ";" as separator characters. Ant will convert the separator to the correct character of the current operating system.

Wherever path-like values need to be specified, a nested element can be used. This takes the general form of:

    <classpath>
      <pathelement path="${classpath}"/>
      <pathelement location="lib/helper.jar"/>
    </classpath>

The location attribute specifies a single file or directory relative to the project's base directory (or an absolute filename), while the path attribute accepts colon- or semicolon-separated lists of locations. The path attribute is intended to be used with predefined paths - in any other case, multiple elements with location attributes should be preferred.

Since Ant 1.8.2 the location attribute can also contain a wildcard in its last path component (i.e. it can end in a "*") in order to support wildcard CLASSPATHs introduced with Java6. Ant will not expand or evaluate the wildcards and the resulting path may not work as anything else but a CLASSPATH - or even as a CLASSPATH for a Java VM prior to Java6.

As a shortcut, the <classpath> tag supports path and location attributes of its own, so:

    <classpath>
      <pathelement path="${classpath}"/>
    </classpath>

can be abbreviated to:

    <classpath path="${classpath}"/>

In addition, one or more Resource Collections can be specified as nested elements (these must consist of file-type resources only). Additionally, it should be noted that although resource collections are processed in the order encountered, certain resource collection types such as fileset, dirset and files are undefined in terms of order.

    <classpath>
      <pathelement path="${classpath}"/>
      <fileset dir="lib">
        <include name="**/*.jar"/>
      </fileset>
      <pathelement location="classes"/>
      <dirset dir="${build.dir}">
        <include name="apps/**/classes"/>
        <exclude name="apps/**/*Test*"/>
      </dirset>
      <filelist refid="third-party_jars"/>
    </classpath>

This builds a path that holds the value of ${classpath}, followed by all jar files in the lib directory, the classes directory, all directories named classes under the apps subdirectory of ${build.dir}, except those that have the text Test in their name, and the files specified in the referenced FileList.

If you want to use the same path-like structure for several tasks, you can define them with a <path> element at the same level as targets, and reference them via their id attribute--see References for an example.

By default a path like structure will re-evaluate all nested resource collections whenever it is used, which may lead to unnecessary re-scanning of the filesystem. Since Ant 1.8.0 path has an optional cache attribute, if it is set to true, the path instance will only scan its nested resource collections once and assume it doesn't change during the build anymore (the default for cache still is false). Even if you are using the path only in a single task it may improve overall performance to set cache to true if you are using complex nested constructs.

A path-like structure can include a reference to another path-like structure (a path being itself a resource collection) via nested <path> elements:

    <path id="base.path">
      <pathelement path="${classpath}"/>
      <fileset dir="lib">
        <include name="**/*.jar"/>
      </fileset>
      <pathelement location="classes"/>
    </path>

    <path id="tests.path" cache="true">
      <path refid="base.path"/>
      <pathelement location="testclasses"/>
    </path>
The shortcuts previously mentioned for <classpath> are also valid for <path>.For example:
    <path id="base.path">
      <pathelement path="${classpath}"/>
    </path>
can be written as:
    <path id="base.path" path="${classpath}"/>

Path Shortcut

In Ant 1.6 a shortcut for converting paths to OS specific strings in properties has been added. One can use the expression ${toString:pathreference} to convert a path element reference to a string that can be used for a path argument. For example:

  <path id="lib.path.ref">
    <fileset dir="lib" includes="*.jar"/>
  </path>
  <javac srcdir="src" destdir="classes">
    <compilerarg arg="-Xbootclasspath/p:${toString:lib.path.ref}"/>
  </javac>

Command-line Arguments

Several tasks take arguments that will be passed to another process on the command line. To make it easier to specify arguments that contain space characters, nested arg elements can be used.

Attribute Description Required
value a single command-line argument; can contain space characters. Exactly one of these.
file The name of a file as a single command-line argument; will be replaced with the absolute filename of the file.
path A string that will be treated as a path-like string as a single command-line argument; you can use ; or : as path separators and Ant will convert it to the platform's local conventions.
pathref Reference to a path defined elsewhere. Ant will convert it to the platform's local conventions.
line a space-delimited list of command-line arguments.
prefix A fixed string to be placed in front of the argument. In the case of a line broken into parts, it will be placed in front of every part. Since Ant 1.8. No
suffix A fixed string to be placed immediately after the argument. In the case of a line broken into parts, it will be placed after every part. Since Ant 1.8. No

It is highly recommended to avoid the line version when possible. Ant will try to split the command line in a way similar to what a (Unix) shell would do, but may create something that is very different from what you expect under some circumstances.

Examples

  <arg value="-l -a"/>

is a single command-line argument containing a space character, not separate commands "-l" and "-a".

  <arg line="-l -a"/>

This is a command line with two separate arguments, "-l" and "-a".

  <arg path="/dir;/dir2:\dir3"/>

is a single command-line argument with the value \dir;\dir2;\dir3 on DOS-based systems and /dir:/dir2:/dir3 on Unix-like systems.

References

Any project element can be assigned an identifier using its id attribute. In most cases the element can subsequently be referenced by specifying the refid attribute on an element of the same type. This can be useful if you are going to replicate the same snippet of XML over and over again--using a <classpath> structure more than once, for example.

The following example:

<project ... >
  <target ... >
    <rmic ...>
      <classpath>
        <pathelement location="lib/"/>
        <pathelement path="${java.class.path}/"/>
        <pathelement path="${additional.path}"/>
      </classpath>
    </rmic>
  </target>

  <target ... >
    <javac ...>
      <classpath>
        <pathelement location="lib/"/>
        <pathelement path="${java.class.path}/"/>
        <pathelement path="${additional.path}"/>
      </classpath>
    </javac>
  </target>
</project>

could be rewritten as:

<project ... >
  <path id="project.class.path">
    <pathelement location="lib/"/>
    <pathelement path="${java.class.path}/"/>
    <pathelement path="${additional.path}"/>
  </path>

  <target ... >
    <rmic ...>
      <classpath refid="project.class.path"/>
    </rmic>
  </target>

  <target ... >
    <javac ...>
      <classpath refid="project.class.path"/>
    </javac>
  </target>
</project>

All tasks that use nested elements for PatternSets, FileSets, ZipFileSets or path-like structures accept references to these structures as shown in the examples. Using refid on a task will ordinarily have the same effect (referencing a task already declared), but the user should be aware that the interpretation of this attribute is dependent on the implementation of the element upon which it is specified. Some tasks (the property task is a handy example) deliberately assign a different meaning to refid.

Use of external tasks

Ant supports a plugin mechanism for using third party tasks. For using them you have to do two steps:
  1. place their implementation somewhere where Ant can find them
  2. declare them.
Don't add anything to the CLASSPATH environment variable - this is often the reason for very obscure errors. Use Ant's own mechanisms for adding libraries: For the declaration there are several ways: If you need a special function, you should
  1. have a look at this manual, because Ant provides lot of tasks
  2. have a look at the external task page in the manual (or better online)
  3. have a look at the external task wiki page
  4. ask on the Ant user list
  5. implement (and share) your own
http://www.shorouknews.com/

اجعل الشروق صفحتك الرئيسية| الجمعة 30 يوليو 2010 مـ - 18 شعبان 1431 هـ | RSS

تضارب إعلامي في التصريحات حول أزمة مطرانية مغاغة ومحافظ المنيا

تضارب إعلامي في التصريحات حول أزمة مطرانية مغاغة ومحافظ المنيا

 حالة من التضارب تسود الأوساط القبطية لاختلاف التصريحات والتقارير الصحفية التي نشرت، اليوم الخميس، حول أزمة مطرانيه مطاي، والقائمة بين الأنبا أغاثون المزيد

أهم الأخبار

سياسة المزيد

اقتصاد المزيد

رياضة المزيد

حوادث وقضايا المزيد

فنون المزيد

ناس و حياة المزيد

ثقافة المزيد

منتدى الشروق

بتحب فين في مصر؟ تعليقات: 41

 مركب في النيل، بحر أسكندرية، الأقصر وأسوان معابد وآثار.. مصر كلها أماكن متميزة، شارك برأيك عن أكثر الأماكن تميزا والتي ترى أنها تصلح لزيارة أو رحلة جماعية تقضى فيها أفضل الأوقات: ما الذي يعجبك فيها؟

شارك برأيك!

بتحب إيه في مصر؟ تعليقات: 337

 بعيدا عن دوامات السياسة، ما هو أكثر شيء يعجبك في مصر!!؟ ما هي الأماكن التي ترتبط في ذهنك بروعة وجمال هذا البلد؟ أي الأماكن تفضل أن تقضي بها أجازة الصيف؟

شارك برأيك!

بتحب مين في مصر؟ تعليقات: 1534

 شارك بوابة الشروق في اختيار أكثر 30 شخصية تتمتع بشعبية في مصر حاليا، مهما اختلفت توجهاتهم، وأيا كانت أرائهم، الأهم أن يكونوا شاركوا في تطور هذا الوطن..

شارك برأيك!

شارك برأيك

ما هو سبب الاحتقان الطائفي في مصر؟




شارك النتائج
http://www.stylish-style.com/csstec/ultimate/fix-foot.html
http://www.infoq.com/articles/soa-strategy-spline-tactics
http://www.developeranalytics.com/
Interested in the hottest upcoming social media applications?
Find them before they get big.
Who is making the most money right now?
It's -not- who you may think.
How is your competition really doing?
Check their stats and revenue potential.
Want to acquire an application?
Is it about to go big or just fall apart?

Learn more »
Pieces of Flair
Mafia Wars
Movies
Sticky Notes
Facebook
400 million
US
MySpace
114 million
US
hi5
70 million
South America
Bebo
40 million
UK
August 2008: The Facebook Apps Making More Than Yours: Which, How Much, and Why
1
51,203,660 DAU
2
49,192,520 DAU
3
10,996,069 DAU
4
9,576,222 DAU