Fix hackage url
[darcs-mirror-arbtt.git] / doc / arbtt.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook EBNF Module V1.1CR1//EN"
3                "http://www.oasis-open.org/docbook/xml/ebnf/1.1CR1/dbebnf.dtd">
4 <!--
5 <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
6   "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" []>
7 -->
8 <article>
9 <articleinfo>
10   <title>arbtt – The Automatic Rule-Base Time Tracker</title>
11   <authorgroup>
12     <author>
13       <firstname>Joachim</firstname>
14       <surname>Breitner</surname>
15       <contrib>Main author of arbtt</contrib>
16       <email>mail@joachim-breitner.de</email>
17     </author>
18     <author id="sergey">
19       <firstname>Sergey</firstname>
20       <surname>Astanin</surname>
21       <contrib>Contributor</contrib>
22       <email>s.astanin@gmail.com</email>
23     </author>
24     <author id="martin">
25       <firstname>Martin</firstname>
26       <surname>Kiefel</surname>
27       <contrib>Contributor</contrib>
28       <email>mk@nopw.de</email>
29     </author>
30     <author id="muharem">
31       <firstname>Muharem</firstname>
32       <surname>Hrnjadovic</surname>
33       <contrib>Contributor</contrib>
34       <email>muharem@linux.com</email>
35     </author>
36   </authorgroup>
37 </articleinfo>
38 <abstract>
39   <para>
40     arbtt is a background daemon that stores which windows are open, which one
41     has the focus and how long since your last action (and possibly more sources
42     later), and stores this. It is also a program that will, based on
43     expressive rules you specify, derive what you were doing, and what for.
44
45     <warning><para>The log file might contain very sensitive private data. Make sure
46
47     you understand the consequences of a full-time logger and be careful with this
48     data.</para></warning>
49   </para>
50 </abstract>
51
52 <sect1 id="installation">
53   <title>Installation</title>
54   <sect2>
55     <title>Building with <command>cabal-install</command></title>
56     <para>
57     arbtt comes in the form of a Cabalized<footnote><para>Cabal is the common software
58     packaging for Haskell programs and libraries, see <ulink
59     url="http://www.haskell.org/cabal/"/>.</para></footnote> package, and is
60     available from hackage. The easiest way of obtaining and installing arbtt is
61     via <command>cabal-install</command>. If you have
62     <command>cabal-install</command> available, just run
63     <screen>$ cabal install arbtt</screen>
64     to download, build and install arbtt.
65     </para>
66   </sect2>
67
68   <sect2>
69     <title>Building without <command>cabal-install</command></title>
70     <para>
71     You can fetch the latest arbtt source tarball from hackage, at
72     <ulink url="http://hackage.haskell.org/package/arbtt"/>. Extract the tarball
73     and run the following commands to build and install the arbtt binaries:
74     <screen>$ runhaskell Setup.hs configure
75 $ runhaskell Setup.hs build
76 $ runhaskell Setup.hs install</screen>
77     </para>
78   </sect2>
79
80   <sect2>
81     <title>Setting up the capture program</title>
82     <para>
83     To have arbtt gather useful data, you need to make sure that
84     <command>arbtt-capture</command> is started with your X session. If you use
85     GNOME or KDE, you can copy the file
86     <filename>arbtt-capture.desktop</filename> to
87     <filename>~/.config/autostart/</filename>. You might need to put the full
88     path to <command>arbtt-capture</command> in the Exec line there, if you did
89     not do a system wide installation.
90     </para>
91     <para>
92     By default, <command>arbtt-capture</command> will save one data sample per
93     minute. If you want to change that, you can pass <option>--sample-rate
94     <replaceable>RATE</replaceable></option> to <command>arbtt-capture</command>, where
95     <replaceable>RATE</replaceable> specifies the sample rate in seconds.
96     </para>
97   </sect2>
98
99   <sect2>
100     <title>Building the documentation</title>
101     <para>
102     Obviously, you can already read the documentation. If you still want to
103     build it yourself, enter the directory <filename>doc/</filename> and run
104     <command>make</command> for the documentation in HTML and PDF format. 
105     </para>
106   </sect2>
107
108
109   <sect2>
110     <title>Development version</title>
111     <para>
112       If you want to try the latest unreleased state of the code, or want to
113       contribute to arbtt, you can fetch the code with
114       <screen>darcs get <ulink url="http://darcs.nomeata.de/arbtt"/></screen>
115     </para>
116   </sect2>
117
118 </sect1>
119
120 <sect1 id="configuration">
121   <title>Configuring the arbtt categorizer (<command>arbtt-stats</command>)</title>
122   <para>
123   Once <command>arbtt-capture</command> is running, it will record data without
124   any configuration. And only to analyze the recorded data, one needs to
125   configure the categorizer. Everytime the categorizer
126   (<command>arbtt-stats</command>) runs, it applies categorization rules to all
127   recorded data and tags it accordingly.  Thus, if you improve your
128   categorization rules later, they will apply also to all previous data
129   samples!
130   </para>
131
132   <sect2>
133   <title>Configuration example</title>
134   <para>
135   The configuration file needs to be placed in
136   <filename>~/.arbtt/categorize.cfg</filename>. An
137   example is included in the source distribution, and it is reproduced here:
138   see <xref linkend="catex"/>.
139   It should be more enlightening than a formal description.
140   </para>
141
142   <example id="catex">
143   <title><filename>categorize.cfg</filename></title>
144     <programlisting><xi:include  href="../categorize.cfg"  parse="text"  
145       xmlns:xi="http://www.w3.org/2001/XInclude" /></programlisting>
146   </example>
147   </sect2>
148
149   <sect2>
150     <title>The semantics (informal)</title>
151     <para>
152       A data sample consists of the time of recording, the time passed since the
153       user’s last action and the list of windows. For each window this
154       information is available:
155       <itemizedlist>
156         <listitem><simpara>the window title</simpara></listitem>
157         <listitem><simpara>the program name</simpara></listitem>
158         <listitem><simpara>whether the window was the active window</simpara></listitem>
159       </itemizedlist>
160       Based on this information and on the rules in
161       <filename>categorize.cfg</filename>, the categorizer
162       (<command>arbtt-stats</command>) assigns <emphasis>tags</emphasis> to
163       each sample.
164     </para>
165
166     <para>
167       A simple rule consists of a condition followed by an arrow
168       (<literal>==></literal>) and a tag expression
169       (<literal>tag</literal> keyword followed by tag name).
170       The rule ends with a coma (<literal>,</literal>).
171     </para>
172
173     <para>
174       The keyword <literal>tag</literal>, usually preceded with a condition,
175       assigns a <emphasis>tag</emphasis> to the sample; <literal>tag</literal>
176       keyword is followed by a tag name (any sequence of alphanumeric symbols,
177       underscores and hyphens). If tag name contains a colon
178       (<literal>:</literal>), the first part of the name before the colon, is
179       considered to be tag <emphasis>category</emphasis>.
180     </para>
181
182     <para>
183       For example, this rule
184       <programlisting>month $date == 1 ==> tag month:January,</programlisting>
185       if it succeeds, assigns a the tag <literal>January</literal> in the
186       category <literal>month</literal>.
187     </para>
188
189     <para>If the tag has a <emphasis>category</emphasis>, it will only be
190       assigned if no other tag of that category has been assigned. This means
191       that for each sample and each category, there can be at most only one tag
192       in that category. Tags can contain references to group matches in the
193       regular expressions used in conditions (<literal>$1</literal>,
194       <literal>$2</literal>)...). Tags can also reference some
195       variables such as window title (<literal>$current.title</literal>) or
196       program name (<literal>$current.program</literal>).
197     </para>
198
199     <para>
200       The variable <literal>$idle</literal> contains the idle time of the user,
201       measured in seconds. Usually, it is used to assign the tag
202       <literal>inactive</literal>, which is handled specially by
203       <command>arbtt-stats</command>, as can be seen in <xref linkend="catex"/>.
204     </para>
205
206     <para>
207       When applying the rules, the categorizer has a notion of
208       the <emphasis>window in scope</emphasis>, and the variables
209       <literal>$title</literal>, <literal>$program</literal> and
210       <literal>$active</literal> always refer to the window in scope.
211       By default, there is no window is in scope. Condition should be prefixed
212       with either <literal>current window</literal> or <literal>any
213       window</literal>, to define scope of these variables.
214     </para>
215
216     <para>
217       For <literal>current window</literal>, the currently active window is in
218       scope. If there is no such window, the condition is false.
219     </para>
220     
221     <para>
222       For <literal>any window</literal>, the condition is applied to each
223       window, in turn, and if any of the windows matches, the result is true. If
224       more than one window matches it is not defined from which match the
225       variables <literal>$1</literal>... are taken from (see more about regular
226       expressions below).
227     </para>
228
229     <para>
230       The variable <literal>$time</literal> refers to the time-of-day of the
231       sample (i.e. the time since 00:00 that day, local time), while
232       <literal>$sampleage</literal> refers to the
233       time span from when the sample was recored until now, the time of
234       evaluating the statistics. The latter variable is especially useful when
235       passed to the <option>--filter</option> option of
236       <command>arbtt-stats</command>. They can be compared with expressions 
237       like "hh:mm", for example
238       <programlisting>$time >=  8:00 &amp;&amp; $time &lt; 12:00 ==> tag time-of-day:morning</programlisting>
239     </para>
240
241     <para>
242       The variable <literal>$date</literal> referes to the date and time of the
243       recorded sample. It can be compared with date literals in the form
244       YYYY-MM-DD (which stand for midnight, so <programlisting>$date ==
245       2001-01-01</programlisting> will not do what you want, but
246       <programlisting>$date >= 2001-01-01 &amp;&amp; $date &lt;= 2001-01-02</programlisting>
247       would).  All dates are evaluated in local time.
248     </para>
249     <para>
250       Expression <literal>format $date</literal> evaluates to a string with
251       a date formatted according to ISO 8601, i.e. like "YYYY-MM-DD". The 19th
252       of March 2010 is formatted as "2010-03-19". Formatted date can be compared
253       to strings. Formatted dates may be useful to tag particular date ranges. But
254       also note that this is a rather expensive operation that can slow down your
255       data processing.
256     </para>
257     <para>
258       Expression <literal>month $date</literal> evaluates to an integer, from 1
259       to 12, corresponding to the month number. Expression <literal>year
260       $date</literal> evaluates to an integer which is a year number.
261       Expression <literal>day of month $date</literal> evaluates to an integer,
262       from 1 to 31, corresponding to the day of month.
263       Expression <literal>day of week $date</literal> evaluates to an integer,
264       from 1 to 7, corresponding to the day of week, Monday is 1, Sunday is 7.
265       These expressions can be compared to integers.
266     </para>
267
268     <para>
269       Expressions can be compared to literal values with <literal>==</literal>
270       (equal), <literal>/=</literal> (not equal), <literal>&lt;</literal>,
271       <literal>&lt;=</literal>, <literal>&gt;=</literal>,
272       <literal>&gt;</literal> operators. String expressions
273       (<literal>$program</literal>, <literal>$title</literal>) can be matched
274       against regular expressions with <literal>=~</literal> operator. With these
275       operatorions, the right hand side can be a comma-separated list of
276       literals enclosed in square brackets (<literal>[</literal>
277       <emphasis>...</emphasis>, <emphasis>...</emphasis>, <literal>]</literal>), which
278       succeeds if any of them succeeds.
279     </para>
280
281     <para>Regular expressions are written either between slashes
282        (<literal>/</literal> regular expression <literal>/</literal>),
283        or after a letter <literal>m</literal> followed by any symbol
284        (<literal>m</literal> <emphasis>c</emphasis> regular expression <emphasis>c</emphasis>, where <emphasis>c</emphasis> is any symbol).
285        The second appearance of that symbol ends the expression.
286        You can find both variants in <xref linkend="catex"/>.
287     </para>
288
289     <para>Complex conditions may be constructed from the simpler ones,
290       using Boolean AND (<literal>&amp;&amp;</literal>), OR
291       (<literal>||</literal>), and NOT (<literal>!</literal>) functions and
292       parentheses.
293     </para>
294
295   </sect2>
296
297   <sect2>
298     <title>The syntax</title>
299     <para>
300     <filename>categorize.cfg</filename> is a plain text file.
301     Whitespace is insignificant and Haskell-style comments are allowed.
302     A formal grammar is provided in <xref linkend="grammar"/>.
303     </para>
304
305     <figure id="grammar">
306         <title>The formal grammar of <filename>categorize.cfg</filename></title>
307         <productionset>
308           <production id="g-rules">
309             <lhs>Rules</lhs>
310             <rhs>
311               [ <nonterminal def="#g-aliasspec"/> ]
312               <nonterminal def="#g-rule"/> ( (<quote>,</quote>
313               <nonterminal def="#g-rule"/>)* | ( <quote>;</quote>
314               <nonterminal def="#g-rule"/>)* )
315             </rhs>
316           </production>
317
318           <production id="g-aliasspec">
319             <lhs>AliasSpec</lhs>
320             <rhs><quote>aliases</quote> <quote>(</quote> <nonterminal
321               def="#g-alias"/> (<quote>,</quote> <nonterminal def="#g-alias"/>)*
322               <quote>)</quote> </rhs>
323           </production>
324
325           <production id="g-alias">
326             <lhs>Alias</lhs>
327             <rhs>Literal <quote>-&gt;</quote> Literal</rhs>
328           </production>
329
330           <production id="g-rule">
331             <lhs>Rule</lhs>
332             <rhs><quote>{</quote> <nonterminal def="#g-rules"/>
333                  <quote>}</quote>
334             </rhs>
335             <rhs>
336               <nonterminal def="#g-cond"/> <quote>==&gt;</quote> 
337               <nonterminal def="#g-rule"/> | <quote>if</quote>
338               <nonterminal def="#g-cond"/> <quote>then</quote>
339               <nonterminal def="#g-rule"/> <quote>else</quote>
340               <nonterminal def="#g-rule"/>
341             </rhs>
342             <rhs>
343               <quote>tag</quote> <nonterminal def="#g-tag"/>
344             </rhs>
345           </production>
346
347           <production id="g-cond">
348             <lhs>Cond</lhs>
349             <rhs><quote>(</quote> <nonterminal def="#g-cond"/>
350                  <quote>)</quote>
351             </rhs>
352             <rhs><quote>!</quote> <nonterminal def="#g-cond"/> |
353                  <nonterminal def="#g-cond"/> <quote>&amp;&amp;</quote>
354                  <nonterminal def="#g-cond"/> |
355                  <nonterminal def="#g-cond"/> <quote>||</quote> <nonterminal
356                  def="#g-cond"/>
357             </rhs>
358             <rhs> <quote>$active</quote> </rhs>
359             <rhs> <nonterminal def="#g-string"/> <nonterminal def="#g-cmpop"/>
360                  <nonterminal def="#g-string"/> </rhs>
361             <rhs> <nonterminal def="#g-string"/> <nonterminal def="#g-cmpop"/>
362                  <quote>[</quote> <nonterminal def="#g-listofstring"/> 
363                  <quote>]</quote>
364                  </rhs> 
365             <rhs> <nonterminal def="#g-string"/> <quote>=~</quote>
366                  <nonterminal def="#g-regex"/></rhs>
367             <rhs> <nonterminal def="#g-string"/> <quote>=~</quote>
368                  <quote>[</quote> <nonterminal def="#g-listofregex"/> 
369                  <quote>]</quote>
370                  </rhs>
371             <rhs> <nonterminal def="#g-number"/> <nonterminal def="#g-cmpop"/>
372                  <nonterminal def="#g-number"/> </rhs>
373             <rhs> <nonterminal def="#g-timediff"/> <nonterminal def="#g-cmpop"/>
374                  <nonterminal def="#g-timediff"/> </rhs>
375             <rhs> <quote>current window</quote> <nonterminal def="#g-cond"/> </rhs>
376             <rhs> <quote>any window</quote> <nonterminal def="#g-cond"/> </rhs>
377           </production>
378
379           <production id="g-string">
380             <lhs>String</lhs>
381             <rhs> <quote>$title</quote> </rhs>
382             <rhs> <quote>$program</quote> </rhs>
383             <rhs> <quote>format</quote> <nonterminal def="#g-date" /> </rhs>
384             <rhs> <quote>"</quote> string literal <quote>"</quote> </rhs>
385           </production>
386
387           <production id="g-listofstring">
388             <lhs>ListOfString</lhs>
389             <rhs> <quote>"</quote> string literal <quote>"</quote> </rhs>
390             <rhs> <quote>"</quote> string literal <quote>"</quote> , <nonterminal def="#g-listofstring"/> </rhs>
391           </production>
392
393           <production id="g-number">
394             <lhs>Number</lhs>
395             <rhs> <quote>$idle</quote> </rhs>
396             <rhs> <quote>day of week</quote> <nonterminal def="#g-date" /> </rhs>
397             <rhs> <quote>day of month</quote> <nonterminal def="#g-date" /> </rhs>
398             <rhs> <quote>month</quote> <nonterminal def="#g-date" /> </rhs>
399             <rhs> <quote>year</quote> <nonterminal def="#g-date" /> </rhs>
400             <rhs> number literal </rhs>
401           </production>
402
403           <production id="g-date">
404             <lhs>Date</lhs>
405             <rhs> <quote>$date</quote> </rhs>
406             <!-- <rhs> <quote>$now</quote> </rhs> -->
407           </production>
408
409           <production id="g-timediff">
410             <lhs>TimeDiff</lhs>
411             <rhs> <quote>$time</quote> </rhs>
412             <rhs> <quote>$sampleage</quote> </rhs>
413             <!-- <rhs> <nonterminal def="#g-date"/> <quote>-</quote> <nonterminal def="#g-date"/></rhs> -->
414             <rhs>[ Digit ] Digit <quote>:</quote> Digit Digit</rhs>
415           </production>
416
417           <production id="g-tag">
418             <lhs>Tag</lhs>
419             <rhs> [ Literal <quote>:</quote> ] Literal </rhs>
420           </production>
421
422           <production id="g-regex">
423             <lhs>RegEx</lhs>
424             <rhs>  <quote>/</quote> Literal <quote>/</quote> |
425               <quote>m</quote> <replaceable>c</replaceable> Literal
426               <replaceable>c</replaceable><lineannotation>Where
427               <replaceable>c</replaceable> can be any
428               character.</lineannotation> </rhs>
429           </production>
430
431           <production id="g-listofregex">
432             <lhs>ListOfRegex</lhs>
433             <rhs> <quote>"</quote> <nonterminal def="#g-regex"/> <quote>"</quote> </rhs>
434             <rhs> <quote>"</quote> <nonterminal def="#g-regex"/> <quote>"</quote> , <nonterminal def="#g-listofregex"/> </rhs>
435           </production>
436
437           <production id="g-cmpop">
438             <lhs>CmpOp</lhs>
439             <rhs><quote>&lt;=</quote> | <quote>&lt;</quote> | <quote>==</quote>
440             | <quote>&gt;</quote> | <quote>&gt;=</quote></rhs>
441           </production>
442
443         </productionset>
444       </figure>
445       <para>
446         A <literal>String</literal> refers to a double-quoted string of
447         characters, while a <literal>Literal</literal> is not quoted.
448         <nonterminal def="#g-tag">Tags</nonterminal> may only consist of
449         letters, dashes and underscores, or variable interpolations. A Tag maybe
450         be optionally prepended with a category, separated by a colon. The
451         category itself follows he same lexical rules as the tag. A variable
452         interpolation can be one of the following:
453         <variablelist>
454           <varlistentry>
455             <term><literal>$1</literal>, <literal>$2</literal>,...</term>
456             <listitem><simpara> will be replaced by the respective group in the last
457               successfully applied regular expression in the conditions enclosing the
458               current rule.
459             </simpara></listitem>
460           </varlistentry>
461           <varlistentry>
462             <term><literal>$current.title</literal></term>
463             <term><literal>$current.program</literal></term>
464             <listitem><simpara> will be replaced by title the currently active
465               window, resp. by the name of the currently active program.
466               If no window happens to be active, this tag will be ignored.
467             </simpara></listitem>
468           </varlistentry>
469         </variablelist>
470       </para>
471
472       <para>
473         A regular expression is, like in perl, either enclosed in forward
474         slashes or, alternatively, in any character of your choice with an
475         <literal>m</literal> (for <quote>match</quote>) in front. This is handy if you need
476         to use regular expressions that match directory names. Otherwise, the
477         syntax of the regular expressions is that of perl-compatible regular
478         expressions.
479       </para>
480   </sect2>
481   
482 </sect1>
483
484 <sect1 id="references">
485   <title>Program references</title>
486   <para>arbtt consists of a few command line tools, the most important one is
487   <command>arbtt-stats</command>. This overview is followed by their manual
488   pages.
489   </para>
490   
491   <!-- <sect2>
492     <title>Generating statistics</title> -->
493     <para>To generate statistics about the data that
494     <command>arbtt-capture</command> has gathered, use the program
495     <command>arbtt-stats</command>. A detailed description of the possible
496     options is given in <xref linkend="arbtt-stats"/>.</para>
497   <!--
498   </sect2>
499
500   <sect2>
501     <title>Gathering data</title>
502   -->
503     <para>The collection of data is done by <command>arbtt-capture</command>.
504     Usually, you only set it up once to run automatically, as described in <xref
505     linkend="installation"/>, and do not have to
506     worry about it again. Its command line reference is given in <xref
507     linkend="arbtt-capture"/>.</para>
508   <!--
509   </sect2>
510
511   <sect2>
512     <title>Dumping data</title>
513   -->
514     <para>Because the data log file is binary, a tool names
515     <command>arbtt-dump</command> can bee used to dump the data in
516     textual form. Its command line reference is given in <xref
517     linkend="arbtt-dump"/>.</para>
518
519     <para>If <command>arbtt-capture</command> crashes it might be that the log
520     file is not readable any more. In some cases, this can be fixed using the
521     (relatively raw) <command>arbtt-recover</command> tool. Its command line
522     reference is given in <xref linkend="arbtt-recover"/>.</para>
523   <!--
524   </sect2>
525   -->
526
527
528   <refentry id="arbtt-stats">
529     <refmeta>
530       <refentrytitle>arbtt-stats</refentrytitle>
531       <manvolnum>1</manvolnum>
532       <refmiscinfo class="source">arbtt manual</refmiscinfo>
533     </refmeta>
534
535     <refnamediv>
536       <refname>arbtt-stats</refname>
537       <refpurpose>generate statistics from the arbtt data samples</refpurpose>
538     </refnamediv>
539   
540     <refsynopsisdiv>
541       <cmdsynopsis>
542         <command>arbtt-stats</command>
543         <arg rep="repeat">OPTION</arg>
544       </cmdsynopsis>
545     </refsynopsisdiv>
546
547     <refsect1><title>Description</title>
548       <para>
549       <command>arbtt-stats</command> reads the samples that were recorded so far
550       by <command>arbtt-capture</command> from the log file, filters them
551       according to the users specifications and generates one or more reports
552       from the data.
553       </para>
554       <para>
555       When run without any options, <option>--total-time</option> is assumed.
556       </para>
557       <para>
558       The order in which filters (<option>--exclude</option>,
559       <option>--only</option>, <option>--also-inactive</option> and
560       <option>--filter</option>) and reports are passed to the program is
561       irrelevant: All filters given on the command line are active for all
562       reports.
563       </para>
564     </refsect1>
565
566     <refsect1><title>Options</title>
567       <variablelist>
568         <varlistentry>
569           <term><option>-h</option></term>
570           <term><option>-?</option></term>
571           <term><option>--help</option></term>
572           <listitem><simpara>shows a short summary of the available
573           options, and exists.</simpara></listitem>
574         </varlistentry>
575         <varlistentry>
576         <term><option>-V</option></term>
577         <term><option>--version</option></term>
578         <listitem><simpara>shows the version number, and exists.</simpara></listitem>
579         </varlistentry>
580         <varlistentry>
581         <term><option>--logfile</option> <replaceable>FILE</replaceable></term>
582         <listitem><simpara>logfile to use instead of <filename>~/.arbtt/capture.log</filename></simpara></listitem>
583         </varlistentry>
584         <varlistentry>
585         <term><option>--categorizefile</option></term>
586         <listitem><simpara>categorize file to use instead of <filename>~/.arbtt/categorize.cfg</filename></simpara></listitem>
587         </varlistentry>
588       </variablelist>
589       <refsect2><title>Filtering options</title>
590         <variablelist>
591           <varlistentry>
592             <term><option>-x</option> <replaceable>TAG</replaceable></term>
593             <term><option>--exclude</option> <replaceable>TAG</replaceable></term>
594             <listitem><simpara>Ignore any data samples that have
595             been assigned this tag or category. To distinguish tags and categories, the latter have to be
596             entered followed by a colon. Can be given more than once.</simpara></listitem>
597           </varlistentry>
598           <varlistentry>
599             <term><option>-o</option> <replaceable>TAG</replaceable></term>
600             <term><option>--only</option> <replaceable>TAB</replaceable></term>
601             <listitem><simpara>Ignore any data samples that have
602             not been assigned this tag. To distinguish tags and categories, the latter have to be
603             entered followed by a colon. Can be given more than once.</simpara></listitem>
604           </varlistentry>
605           <varlistentry>
606             <term><option>--also-inactive</option></term>
607             <listitem><simpara>by default, <command>arbtt-stats</command> ignores
608             any samples which have been assigned the tag
609             <literal>inactive</literal>. This flag disables this behaviour.</simpara></listitem>
610           </varlistentry>
611           <varlistentry>
612             <term><option>-f</option> <replaceable>CONDITION</replaceable></term>
613             <term><option>--filter</option> <replaceable>CONDITION</replaceable></term>
614             <listitem><simpara>Only consider samples matching
615             the given condition, which follows the same syntax as in
616             <filename>categorize.cfg</filename> (Nonterminal <nonterminal def="#g-cond"/> in
617             <phrase condition="html"><xref linkend="grammar"/></phrase><phrase condition="man">the formal grammar specification found in the user guide</phrase>).</simpara></listitem>
618           </varlistentry>
619         </variablelist>
620       </refsect2>
621       <refsect2><title>Report options</title>
622         <variablelist>
623           <varlistentry>
624             <term><option>-m</option> <replaceable>PERCENTAGE</replaceable></term>
625             <term><option>--min-percentage</option> <replaceable>PERCENTAGE</replaceable></term>
626             <listitem><para>
627               Ignore tags whose percentage is less than the value specified
628               here. Default percentage: 1%.
629             </para></listitem>
630           </varlistentry>
631           <varlistentry>
632             <term><option>--output-exclude</option> <replaceable>TAG</replaceable></term>
633             <listitem><para>
634               Skip this tag or category when printing statistics. Only affects
635               the reports <option>--total-time</option> and
636               <option>--category</option>. To distinguish tags and categories,
637               the latter have to be entered followed by a colon. Can be given
638               more than once.
639             </para></listitem>
640           </varlistentry>
641           <varlistentry>
642             <term><option>--output-only</option> <replaceable>TAG</replaceable></term>
643             <listitem><para>
644               Prints statistics only for the specified tag or category. Only
645               affects the reports <option>--total-time</option> and
646               <option>--category</option>. To distinguish tags and categories,
647               the latter have to be entered followed by a colon. Can be given
648               more than once.
649             </para></listitem>
650           </varlistentry>
651           <varlistentry>
652             <term><option>--output-format</option> <replaceable>FORMAT</replaceable></term>
653             <listitem><para>
654               Specify the report output format, may be one of: text, csv
655               (comma-separated values), tsv (TAB-separated values).
656               Default format: text.
657             </para></listitem>
658           </varlistentry>
659         </variablelist>
660       </refsect2>
661       <refsect2><title>Reports</title>
662         <variablelist>
663           <varlistentry>
664             <term><option>-i</option></term>
665             <term><option>--information</option></term>
666             <listitem><para>
667               Various bits of information about the recorded data, such as total
668               time recorded, number of records etc. In this report, <quote>time
669               recorded</quote> is the sum of <emphasis>all</emphasis>
670               samples, including inactive and those that are disabled by the
671               filter, while <quote>time selected</quote> is the sum of the
672               samples that are matched by the given filters.
673             </para></listitem>
674           </varlistentry>
675           <varlistentry>
676             <term><option>-t</option></term>
677             <term><option>--total-time</option></term>
678             <listitem><para>For all tags, print the part of the selected time
679             with this tag applied to, both as an absolute value and a percentage
680             of the selected time.
681             </para></listitem>
682           </varlistentry>
683           <varlistentry>
684             <term><option>-c</option> <replaceable>CATEGORY</replaceable></term>
685             <term><option>--category</option> <replaceable>CATEGORY</replaceable></term>
686             <listitem><para>For the given category, give the textual equivalent
687             of a pie chart: For each possible value of the category, including
688             one for <quote>no tag of this category present</quote>, give the absolute time and
689             fraction. Entries which are not displayed because of the option
690             <option>--min-percentage</option> are aggregated.</para></listitem>
691           </varlistentry>
692           <varlistentry>
693             <term><option>--each-category</option></term>
694             <listitem><para>This is just a shortcut for a series of
695             <option>--category</option> options, one for each category found in
696             the data.
697             </para></listitem>
698           </varlistentry>
699           <varlistentry>
700             <term><option>--intervals</option> [<replaceable>TAG</replaceable>|<replaceable>CATEGORY</replaceable>:] </term>
701             <listitem><para>This report lists all periods of consecutive time
702             intervals where the given tag has been applied to, or where the
703             given category has the same value.
704             </para>
705             
706             <para>To distinguish tags and categories, the latter have to be
707             entered followed by a colon.</para>
708             
709             <para>This report will give wrong results if an activity has been
710             carried out at the end of a session and right at the beginning, as
711             the intermediate time is thought to be part of the interval.
712             Inactive times while <command>arbtt-capture</command> is running
713             will separate the results as expected.</para>
714             
715             </listitem>
716           </varlistentry>
717         </variablelist>
718       </refsect2>
719     </refsect1>
720
721     <refsect1><title>Examples</title>
722       <para>Some useful examples of what you can do with
723       <command>arbtt-stats</command> are provided here:</para>
724       <screen># Only consider the time when I was programming in Haskell 
725 arbtt-stats -o Editing-Haskell
726
727 # Tell me what evolution folders I spend my time in when I actually do
728 # work with e-Mail
729 arbtt-stats -o Program:evolution -c Evo-Folder
730
731 # Generate statistics about the last hour
732 arbtt-stats -f '$sampleage &lt; 1:00'</screen>
733     </refsect1>
734
735     <refsect1><title>Files</title>
736       <variablelist>
737         <varlistentry>
738           <term><filename>~/.arbtt/capture.log</filename></term>
739           <listitem><para>binary file, storing the arbtt data samples</para></listitem>
740         </varlistentry>
741         <varlistentry>
742           <term><filename>~/.arbtt/categorize.cfg</filename></term>
743           <listitem><para>specification of the arbtt categorizer syntax. A
744           detailed description is given in <xref linkend="configuration"/></para></listitem>
745         </varlistentry>
746       </variablelist>
747     </refsect1>
748
749     <refsect1><title>See also</title>
750       <para>See the arbtt manual for more information and the <ulink
751       url="http://hackage.haskell.org/package/arbtt">arbtt hackage page</ulink> for
752       newer versions of arbtt.</para>
753     </refsect1>
754   </refentry>
755   
756   <refentry id="arbtt-capture">
757     <refmeta>
758       <refentrytitle>arbtt-capture</refentrytitle>
759       <manvolnum>1</manvolnum>
760       <refmiscinfo class="source">arbtt manual</refmiscinfo>
761     </refmeta>
762
763     <refnamediv>
764       <refname>arbtt-capture</refname>
765       <refpurpose>collect data samples for arbtt</refpurpose>
766     </refnamediv>
767   
768     <refsynopsisdiv>
769       <cmdsynopsis>
770         <command>arbtt-capture</command>
771         <arg rep="repeat">OPTION</arg>
772       </cmdsynopsis>
773     </refsynopsisdiv>
774
775     <refsect1><title>Description</title>
776       <para>
777       <command>arbtt-capture</command> runs continuously and saves at the given
778       sample rate, usually once per minute, the collected data to
779       <filename>~/.arbtt/capture.log</filename>. 
780       </para>
781     </refsect1>
782
783     <refsect1><title>Options</title>
784       <variablelist>
785         <varlistentry>
786           <term><option>-h</option></term>
787           <term><option>-?</option></term>
788           <term><option>--help</option></term>
789           <listitem><simpara>shows a short summary of the available
790           options, and exists.</simpara></listitem>
791         </varlistentry>
792         <varlistentry>
793         <term><option>-V</option></term>
794         <term><option>--version</option></term>
795         <listitem><simpara>shows the version number, and exists.</simpara></listitem>
796         </varlistentry>
797         <varlistentry>
798         <term><option>-r</option> <replaceable>RATE</replaceable></term>
799         <term><option>--sample-rate</option> <replaceable>RATE</replaceable></term>
800         <listitem><simpara>sets the sample rate in seconds (default: 60)</simpara></listitem>
801         </varlistentry>
802         <varlistentry>
803         <term><option>-f</option> <replaceable>FILE</replaceable></term>
804         <term><option>--logfile</option> <replaceable>FILE</replaceable></term>
805         <listitem><simpara>logfile to use instead of <filename>~/.arbtt/capture.log</filename></simpara></listitem>
806         </varlistentry>
807       </variablelist>
808     </refsect1>
809     <refsect1><title>Files</title>
810       <variablelist>
811         <varlistentry>
812           <term><filename>~/.arbtt/capture.log</filename></term>
813           <listitem><para>binary file, storing the arbtt data samples</para></listitem>
814         </varlistentry>
815       </variablelist>
816     </refsect1>
817
818
819     <refsect1><title>See also</title>
820       <para>See the arbtt manual for more information and the <ulink
821       url="http://hackage.haskell.org/package/arbtt">arbtt hackage page</ulink> for
822       newer versions of arbtt.</para>
823     </refsect1>
824   </refentry>
825
826   <refentry id="arbtt-dump">
827     <refmeta>
828       <refentrytitle>arbtt-dump</refentrytitle>
829       <manvolnum>1</manvolnum>
830       <refmiscinfo class="source">arbtt manual</refmiscinfo>
831     </refmeta>
832
833     <refnamediv>
834       <refname>arbtt-dump</refname>
835       <refpurpose>dumps arbtt data samples</refpurpose>
836     </refnamediv>
837   
838     <refsynopsisdiv>
839       <cmdsynopsis>
840         <command>arbtt-dump</command>
841         <arg rep="repeat">OPTION</arg>
842       </cmdsynopsis>
843     </refsynopsisdiv>
844
845     <refsect1><title>Description</title>
846       <para>
847       <command>arbtt-dump</command> reads the data samples recorded by <xref
848       linkend="arbtt-capture"/> and writes them so the standard output in an
849       ascii based format.
850       </para>
851     </refsect1>
852
853     <refsect1><title>Options</title>
854       <variablelist>
855         <varlistentry>
856           <term><option>-h</option></term>
857           <term><option>-?</option></term>
858           <term><option>--help</option></term>
859           <listitem><simpara>shows a short summary of the available
860           options, and exists.</simpara></listitem>
861         </varlistentry>
862         <varlistentry>
863         <term><option>-V</option></term>
864         <term><option>--version</option></term>
865         <listitem><simpara>shows the version number, and exists.</simpara></listitem>
866         </varlistentry>
867         <varlistentry>
868         <term><option>-f</option> <replaceable>FILE</replaceable></term>
869         <term><option>--logfile</option> <replaceable>FILE</replaceable></term>
870         <listitem><simpara>logfile to use instead of <filename>~/.arbtt/capture.log</filename></simpara></listitem>
871         </varlistentry>
872       </variablelist>
873     </refsect1>
874     <refsect1><title>Files</title>
875       <variablelist>
876         <varlistentry>
877           <term><filename>~/.arbtt/capture.log</filename></term>
878           <listitem><para>binary file, storing the arbtt data samples</para></listitem>
879         </varlistentry>
880       </variablelist>
881     </refsect1>
882
883     <refsect1><title>See also</title>
884       <para>See the arbtt manual for more information and the <ulink
885       url="http://hackage.haskell.org/package/arbtt">arbtt hackage page</ulink> for
886       newer versions of arbtt.</para>
887     </refsect1>
888   </refentry>
889
890   <refentry>
891     <refnamediv>
892       <refname>arbtt-import</refname>
893       <refpurpose>imports dumped arbtt data samples</refpurpose>
894     </refnamediv>
895   
896     <refsynopsisdiv>
897       <cmdsynopsis>
898         <command>arbtt-import</command>
899         <arg rep="repeat">OPTION</arg>
900       </cmdsynopsis>
901     </refsynopsisdiv>
902
903     <refsect1><title>Description</title>
904       <para>
905       <command>arbtt-import</command> expects the output of
906       <command>arbtt-dump</command> on the standard input and saves them as the
907       logfile or the specified file.
908       </para>
909       <para>
910       This program would completely override the existing file, therefore it
911       will refuse to work if the log file already exists. If you want to
912       overwrite a file, please delete it before running
913       <command>arbtt-import</command>.
914       </para>
915     </refsect1>
916
917     <refsect1><title>Options</title>
918       <variablelist>
919         <varlistentry>
920           <term><option>-h</option></term>
921           <term><option>-?</option></term>
922           <term><option>--help</option></term>
923           <listitem><simpara>shows a short summary of the available
924           options, and exists.</simpara></listitem>
925         </varlistentry>
926         <varlistentry>
927         <term><option>-V</option></term>
928         <term><option>--version</option></term>
929         <listitem><simpara>shows the version number, and exists.</simpara></listitem>
930         </varlistentry>
931         <varlistentry>
932         <term><option>-f</option> <replaceable>FILE</replaceable></term>
933         <term><option>--logfile</option> <replaceable>FILE</replaceable></term>
934         <listitem><simpara>logfile to use instead of <filename>~/.arbtt/capture.log</filename></simpara></listitem>
935         </varlistentry>
936       </variablelist>
937     </refsect1>
938     <refsect1><title>Files</title>
939       <variablelist>
940         <varlistentry>
941           <term><filename>~/.arbtt/capture.log</filename></term>
942           <listitem><para>binary file, storing the arbtt data samples</para></listitem>
943         </varlistentry>
944       </variablelist>
945     </refsect1>
946
947     <refsect1><title>See also</title>
948       <para>See the arbtt manual for more information and the <ulink
949       url="http://hackage.haskell.org/package/arbtt">arbtt hackage page</ulink> for
950       newer versions of arbtt.</para>
951     </refsect1>
952   </refentry>
953
954   <refentry id="arbtt-recover">
955     <refmeta>
956       <refentrytitle>arbtt-recover</refentrytitle>
957       <manvolnum>1</manvolnum>
958       <refmiscinfo class="source">arbtt manual</refmiscinfo>
959     </refmeta>
960
961     <refnamediv>
962       <refname>arbtt-recover</refname>
963       <refpurpose>tries to recover a broken arbtt data log</refpurpose>
964     </refnamediv>
965   
966     <refsynopsisdiv>
967       <cmdsynopsis>
968         <command>arbtt-recover</command>
969         <arg rep="repeat">OPTION</arg>
970       </cmdsynopsis>
971     </refsynopsisdiv>
972
973     <refsect1><title>Description</title>
974       <para>
975       <command>arbtt-recover</command> tries to readsthe data samples recorded
976       by <xref linkend="arbtt-capture"/>, skipping over possible broken entries. A fixed log file is written to <file>~/.arbtt/capture.log.recovered</file>. If the recovery was successful, you should stop <command>arbtt-capture</command> and move the file to <file>~/.arbtt/capture.log</file>.
977       </para>
978       <para>
979       As a sid effect, <command>arbtt-recover</command> applies the log compression method implemented in version 0.4.5 to the samples created by an earlier version. If you have a large logfile written by older versions, running <command>arbtt-recover</command> is recommended.
980       </para>
981     </refsect1>
982
983     <refsect1><title>Options</title>
984       <variablelist>
985         <varlistentry>
986           <term><option>-h</option></term>
987           <term><option>-?</option></term>
988           <term><option>--help</option></term>
989           <listitem><simpara>shows a short summary of the available
990           options, and exists.</simpara></listitem>
991         </varlistentry>
992         <varlistentry>
993         <term><option>-V</option></term>
994         <term><option>--version</option></term>
995         <listitem><simpara>shows the version number, and exists.</simpara></listitem>
996         </varlistentry>
997         <varlistentry>
998         <term><option>-i</option></term>
999         <term><option>--infile</option></term>
1000         <listitem><simpara>logfile to use instead of <filename>~/.arbtt/capture.log</filename></simpara></listitem>
1001         </varlistentry>
1002         <varlistentry>
1003         <term><option>-o</option></term>
1004         <term><option>--outfile</option></term>
1005         <listitem><simpara>where to save the recovered file, instead of <filename>~/.arbtt/capture.log</filename></simpara></listitem>
1006         </varlistentry>
1007       </variablelist>
1008     </refsect1>
1009     <refsect1><title>Files</title>
1010       <variablelist>
1011         <varlistentry>
1012           <term><filename>~/.arbtt/capture.log</filename></term>
1013           <listitem><para>binary file, storing the arbtt data samples</para></listitem>
1014         </varlistentry>
1015         <varlistentry>
1016           <term><filename>~/.arbtt/capture.log.recovered</filename></term>
1017           <listitem><para>binary file, storing the fixed arbtt data samples</para></listitem>
1018         </varlistentry>
1019       </variablelist>
1020     </refsect1>
1021
1022     <refsect1><title>See also</title>
1023       <para>See the arbtt manual for more information and the <ulink
1024       url="http://hackage.haskell.org/package/arbtt">arbtt hackage page</ulink> for
1025       newer versions of arbtt.</para>
1026     </refsect1>
1027   </refentry>
1028 </sect1>
1029
1030 <sect1 id="troubleshooting">
1031   <title>Troubleshooting</title>
1032   <sect2>
1033     <title>arbtt and xmonad</title>
1034     <para>
1035       If you are using the <ulink url="http://xmonad.org">xmonad</ulink> window manager and arbtt does ont record any windows, ensure that your xmonad configuration includes the EWMH-Hints extensions in the module <ulink url="http://hackage.haskell.org/packages/archive/xmonad-contrib/latest/doc/html/XMonad-Hooks-EwmhDesktops.html">XMonad.Hooks.EwmhDesktops</ulink>.
1036     </para>
1037   </sect2>
1038 </sect1>
1039
1040 <sect1 id="copyright">
1041   <title>Copyright and Contact</title>
1042   <para>
1043   arbtt is Copyright © 2009-2010 Joachim Breitner
1044   </para>
1045
1046   <para>
1047     arbtt does not have a bug tracker yet. If you have bug reports, suggestions
1048     or questions, please send an email to the arbtt mailing list at <ulink url="mailto:arbtt@lists.nomeata.de">arbtt@lists.nomeata.de</ulink>, which you can subscribe at <ulink url="http://lists.nomeata.de/mailman/listinfo/arbtt">http://lists.nomeata.de/mailman/listinfo/arbtt</ulink>.
1049   </para>
1050
1051   <sect2>
1052     <title>arbtt License</title>
1053     <para>
1054     <literallayout>
1055 This program is free software; you can redistribute it and/or modify
1056 it under the terms of the GNU General Public License as published by
1057 the Free Software Foundation; either version 2 of the License, or
1058 (at your option) any later version.
1059
1060 This program is distributed in the hope that it will be useful,
1061 but WITHOUT ANY WARRANTY; without even the implied warranty of
1062 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1063 GNU General Public License for more details.
1064
1065 You should have received a copy of the GNU General Public License
1066 along with this program; if not, write to the Free Software
1067 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1068     </literallayout>
1069     </para>
1070   </sect2>
1071 </sect1>
1072
1073 <sect1 id="release-notes">
1074   <title>Release Notes</title>
1075   <para>
1076   The version history with changes relevant for the user are documented here.
1077   </para>
1078   
1079   <sect2>
1080     <title>Version 0.7</title>
1081     <itemizedlist>
1082       <listitem>
1083         <para>Make sure that the log file is only readable by the current user. Thanks to Joey Hess for pointing that out.</para>
1084       </listitem>
1085       <listitem>
1086         <para>Show a progress bar in <command>arbtt-stats</command>.</para>
1087       </listitem>
1088       <listitem>
1089         <para>GHC-7.6 compatibility, thanks to Isaac Dupree.</para>
1090       </listitem>
1091     </itemizedlist>
1092   </sect2>
1093
1094   <sect2>
1095     <title>Version 0.6.4.1</title>
1096     <itemizedlist>
1097       <listitem>
1098         <para>
1099         Added missing module to the packages.
1100         </para>
1101       </listitem>
1102     </itemizedlist>
1103   </sect2>
1104
1105   <sect2>
1106     <title>Version 0.6.4</title>
1107     <itemizedlist>
1108       <listitem>
1109         <para>Massive memory footprint reduction, due to processing the data in one run. See <ulink url="http://www.joachim-breitner.de/blog/archives/560-The-might-applicative-left-fold.html">my blog post for technical information</ulink>.</para>
1110       </listitem>
1111     </itemizedlist>
1112   </sect2>
1113
1114   <sect2>
1115     <title>Version 0.6.3</title>
1116     <itemizedlist>
1117       <listitem>
1118         <para>Performance improvements.</para>
1119       </listitem>
1120       <listitem>
1121         <para>Support comparing a string to a list of strings, or matching it against a list ofregular expressions.</para>
1122       </listitem>
1123     </itemizedlist>
1124   </sect2>
1125
1126   <sect2>
1127     <title>Version 0.6.2</title>
1128     <itemizedlist>
1129       <listitem>
1130         <para>Add a warning whtn the system locale is not supported.</para>
1131       </listitem>
1132       <listitem>
1133         <para>Allwo RTS options to be passed to the arbtt binaries.</para>
1134       </listitem>
1135       <listitem>
1136         <para>GHC 7.4 compatibility.</para>
1137       </listitem>
1138     </itemizedlist>
1139   </sect2>
1140
1141   <sect2>
1142     <title>Version 0.6.1</title>
1143     <itemizedlist>
1144       <listitem>
1145         <para>Performance improvements.</para>
1146       </listitem>
1147     </itemizedlist>
1148   </sect2>
1149
1150   <sect2>
1151     <title>Version 0.6</title>
1152     <itemizedlist>
1153       <listitem>
1154         <para>The command <command>arbtt-capture</command> now supports the
1155         <option>--logfile</option>.
1156         </para>
1157       </listitem>
1158       <listitem>
1159         <para>New report “intervals”, available using <command>arbtt-stats</command> <option>--intervals</option>.
1160         </para>
1161       </listitem>
1162       <listitem>
1163         <para>The paramters <option>--exclude</option> and
1164         <option>--include</option> of <command>arbtt-stats</command> can match
1165         categories as well as tags.
1166         </para>
1167       </listitem>
1168       <listitem>
1169         <para>Bugfix: Numbers in tag names are no longer replaced by an underscore.</para>
1170       </listitem>
1171       <listitem>
1172         <para>New paramters <option>--output-exclude</option> and
1173         <option>--output-include</option> of <command>arbtt-stats</command>.
1174         </para>
1175       </listitem>
1176     </itemizedlist>
1177   </sect2>
1178
1179   <sect2>
1180     <title>Version 0.5 (The ZuriHac-Release)</title>
1181     <itemizedlist>
1182       <listitem>
1183         <para>New command <command>arbtt-import</command>, which imports the output from <command>arbtt-dump</command>.
1184         </para>
1185       </listitem>
1186       <listitem>
1187         <para>The command <command>arbtt-stats</command> now supports the
1188         <option>--logfile</option> and <option>--categorizefile</option> as well.
1189         (<xref linkend="martin"/>)
1190         </para>
1191       </listitem>
1192       <listitem>
1193         <para>
1194           The command <command>arbtt-stats</command> now supports the csv
1195           (comma-separated values) and tsv (TAB-separated values) report output
1196           formats in addition to text.
1197           (<xref linkend="muharem"/>)
1198         </para>
1199       </listitem>
1200       <listitem>
1201         <para>
1202           Unicode is handled correctly in regular expressions.
1203         </para>
1204       </listitem>
1205       <listitem>
1206         <para>
1207           Improved date-handling functions for <filename>categorize.cfg</filename>.
1208           (<xref linkend="sergey"/>)
1209         </para>
1210       </listitem>
1211     </itemizedlist>
1212   </sect2>
1213
1214   <sect2>
1215     <title>Version 0.4.5.1</title>
1216     <itemizedlist>
1217       <listitem>
1218         <para>Bugfix: Added missing modules to the cabal file.
1219         </para>
1220       </listitem>
1221     </itemizedlist>
1222   </sect2>
1223
1224   <sect2>
1225     <title>Version 0.4.5</title>
1226     <itemizedlist>
1227       <listitem>
1228         <para>Implement a custom compression method greatly reduce the file size of the log file. Run <command>arbtt-capture</command> to compress the previous samples as well.
1229         </para>
1230       </listitem>
1231     </itemizedlist>
1232   </sect2>
1233
1234   <sect2>
1235     <title>Version 0.4.4</title>
1236     <itemizedlist>
1237       <listitem>
1238         <para>Bugfix: Correctly parse a tag name containing a colon when passed to <command>arbtt-stats</command> <option>--exclude</option>.</para>
1239       </listitem>
1240       <listitem>
1241         <para>Bugfix: Only warn once when the <token>_NET_CLIENT_LIST</token> X property is not set for the root window.</para>
1242       </listitem>
1243     </itemizedlist>
1244   </sect2>
1245
1246
1247   <sect2>
1248     <title>Version 0.4.3</title>
1249     <itemizedlist>
1250       <listitem>
1251         <para>Use fetchName from xmonad instead of xFetchName, as it works with unicode characters in window titles.</para>
1252       </listitem>
1253     </itemizedlist>
1254   </sect2>
1255
1256   <sect2>
1257     <title>Version 0.4.2</title>
1258     <itemizedlist>
1259       <listitem>
1260         <para>Implement option <option>--logfile</option> to
1261         <command>arbtt-dump</command>.</para>
1262       </listitem>
1263       <listitem>
1264         <para>New command <command>arbtt-recover</command> to rescue data from
1265         a proken data log file.</para>
1266       </listitem>
1267       <listitem>
1268         <para>Actually include this documentation in the released tarball.</para>
1269       </listitem>
1270     </itemizedlist>
1271   </sect2>
1272
1273   <sect2>
1274     <title>Version 0.4.1</title>
1275     <itemizedlist>
1276       <listitem>
1277         <para>Write this documentation</para>
1278       </listitem>
1279       <listitem>
1280         <para>Drop dependency on setlocale: Copy the SetLocale module.</para>
1281       </listitem>
1282       <listitem>
1283         <para>Drop dependency on tabular: Implement custom table rendering code.</para>
1284       </listitem>
1285       <listitem>
1286         <para>In the absence of _NET_CLIENT_LIST, look for application windows as children of the root windows. This should work for users of window managers like i3 without EWHM support.</para>
1287       </listitem>
1288     </itemizedlist>
1289   </sect2>
1290
1291   <sect2>
1292     <title>Version 0.4</title>
1293     <itemizedlist>
1294       <listitem>
1295         <para>Implement option <option>--each-categories</option> to
1296         <command>arbtt-stats</command></para>
1297       </listitem>
1298       <listitem>
1299         <para>Eliminate one possible cause for crashes of
1300         <command>arbtt-capture</command>.</para>
1301       </listitem>
1302     </itemizedlist>
1303   </sect2>
1304
1305   <sect2>
1306     <title>Version 0.3.0</title>
1307     <itemizedlist>
1308       <listitem>
1309         <para>Switch to binary log file format, for greatly increased speed</para>
1310       </listitem>
1311       <listitem>
1312         <para><command>arbtt-capture</command> will automatically detect and
1313         convert log files in the old format.</para>
1314       </listitem>
1315     </itemizedlist>
1316   </sect2>
1317
1318   <sect2>
1319     <title>Version 0.2.0</title>
1320     <itemizedlist>
1321       <listitem>
1322         <para>Add option <option>--filter</option> to
1323         <command>arbtt-stats</command></para>
1324       </listitem>
1325       <listitem>
1326         <para>Add option <option>--sample-rate</option> to
1327         <command>arbtt-capture</command></para>
1328       </listitem>
1329       <listitem>
1330         <para>Introduce time-base variables <literal>$time</literal> and
1331         <literal>$sampleage</literal></para>
1332       </listitem>
1333     </itemizedlist>
1334   </sect2>
1335
1336   <sect2>
1337     <title>Version 0.1.5</title>
1338     <itemizedlist>
1339       <listitem>
1340         <para>Use <function>setlocale</function> to get umlauts in window titles correctly</para>
1341       </listitem>
1342     </itemizedlist>
1343   </sect2>
1344
1345   <sect2>
1346     <title>Version 0.1.4</title>
1347     <itemizedlist>
1348       <listitem>
1349         <para>Be smarter when figuring out what window is active. Thanks to CJ
1350         van den Berg for investigating the issue.</para>
1351       </listitem>
1352     </itemizedlist>
1353   </sect2>
1354
1355   <sect2>
1356     <title>Version 0.1.3</title>
1357     <itemizedlist>
1358       <listitem><para>Read <literal>_NET_CLIENT_LIST</literal> for the list of
1359       applications, for compatibility with window managers such as metacity</para></listitem>
1360     </itemizedlist>
1361   </sect2>
1362
1363   <sect2>
1364     <title>Version 0.1.2</title>
1365     <itemizedlist>
1366       <listitem><para>Off-By-Ten error in the time display</para></listitem>
1367       <listitem><para>Correctly show total number of records in
1368       <option>--information</option></para></listitem>
1369     </itemizedlist>
1370   </sect2>
1371
1372   <sect2>
1373     <title>Version 0.1.1</title>
1374     <para>
1375     Rename files to allow building on MacOS.
1376     </para>
1377   </sect2>
1378
1379   <sect2>
1380     <title>Version 0.1</title>
1381     <para>
1382     Initial release of arbtt
1383     </para>
1384   </sect2>
1385 </sect1>
1386
1387 </article>