Full Code of philovivero/distribution for AI

master 50d6fe2f089c cached
26 files
219.9 KB
85.0k tokens
14 symbols
1 requests
Download .txt
Showing preview only (230K chars total). Download the full file or copy to clipboard to get everything.
Repository: philovivero/distribution
Branch: master
Commit: 50d6fe2f089c
Files: 26
Total size: 219.9 KB

Directory structure:
gitextract_1pfsqkt6/

├── .flake8
├── LICENSE.md
├── README.md
├── VERSION
├── distribution
├── distribution.py
├── distributionrc
└── tests/
    ├── runTests.sh
    ├── stderr.01.expected.txt
    ├── stderr.02.expected.txt
    ├── stderr.03.expected.txt
    ├── stderr.04.expected.txt
    ├── stderr.05.expected.txt
    ├── stderr.06.expected.txt
    ├── stderr.07.expected.txt
    ├── stdin.01.txt
    ├── stdin.02.txt
    ├── stdin.03.txt
    ├── stdin.04.txt
    ├── stdout.01.expected.txt
    ├── stdout.02.expected.txt
    ├── stdout.03.expected.txt
    ├── stdout.04.expected.txt
    ├── stdout.05.expected.txt
    ├── stdout.06.expected.txt
    └── stdout.07.expected.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .flake8
================================================
[flake8]
ignore = E501, W503


================================================
FILE: LICENSE.md
================================================
GNU GENERAL PUBLIC LICENSE
==========================

Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc.  
51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA

Everyone is permitted to copy and distribute verbatim copies of this license
document, but changing it is not allowed.

Preamble
========

The licenses for most software are designed to take away your freedom to share
and change it. By contrast, the GNU General Public License is intended to
guarantee your freedom to share and change free software--to make sure the
software is free for all its users. This General Public License applies to most
of the Free Software Foundation's software and to any other program whose
authors commit to using it. (Some other Free Software Foundation software is
covered by the GNU Lesser General Public License instead.) You can apply it to
your programs, too.

When we speak of free software, we are referring to freedom, not price. Our
General Public Licenses are designed to make sure that you have the freedom to
distribute copies of free software (and charge for this service if you wish),
that you receive source code or can get it if you want it, that you can change
the software or use pieces of it in new free programs; and that you know you
can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny
you these rights or to ask you to surrender the rights. These restrictions
translate to certain responsibilities for you if you distribute copies of the
software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for
a fee, you must give the recipients all the rights that you have. You must make
sure that they, too, receive or can get the source code. And you must show them
these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2)
offer you this license which gives you legal permission to copy, distribute
and/or modify the software.

Also, for each author's protection and ours, we want to make certain that
everyone understands that there is no warranty for this free software. If the
software is modified by someone else and passed on, we want its recipients to
know that what they have is not the original, so that any problems introduced
by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish
to avoid the danger that redistributors of a free program will individually
obtain patent licenses, in effect making the program proprietary. To prevent
this, we have made it clear that any patent must be licensed for everyone's
free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification
follow.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
===============================================================

0. This License applies to any program or other work which contains a notice
placed by the copyright holder saying it may be distributed under the terms of
this General Public License. The "Program", below, refers to any such program
or work, and a "work based on the Program" means either the Program or any
derivative work under copyright law: that is to say, a work containing the
Program or a portion of it, either verbatim or with modifications and/or
translated into another language. (Hereinafter, translation is included without
limitation in the term "modification".) Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not covered by
this License; they are outside its scope. The act of running the Program is not
restricted, and the output from the Program is covered only if its contents
constitute a work based on the Program (independent of having been made by
running the Program). Whether that is true depends on what the Program does.

1. You may copy and distribute verbatim copies of the Program's source code as
you receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice and
disclaimer of warranty; keep intact all the notices that refer to this License
and to the absence of any warranty; and give any other recipients of the
Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may
at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Program or any portion of it, thus
forming a work based on the Program, and copy and distribute such modifications
or work under the terms of Section 1 above, provided that you also meet all of
these conditions:

a) You must cause the modified files to carry prominent notices stating that
you changed the files and the date of any change.

b) You must cause any work that you distribute or publish, that in whole or in
part contains or is derived from the Program or any part thereof, to be
licensed as a whole at no charge to all third parties under the terms of this
License.

c) If the modified program normally reads commands interactively when run, you
must cause it, when started running for such interactive use in the most
ordinary way, to print or display an announcement including an appropriate
copyright notice and a notice that there is no warranty (or else, saying that
you provide a warranty) and that users may redistribute the program under these
conditions, and telling the user how to view a copy of this License.
(Exception: if the Program itself is interactive but does not normally print
such an announcement, your work based on the Program is not required to print
an announcement.)

These requirements apply to the modified work as a whole. If identifiable
sections of that work are not derived from the Program, and can be reasonably
considered independent and separate works in themselves, then this License, and
its terms, do not apply to those sections when you distribute them as separate
works. But when you distribute the same sections as part of a whole which is a
work based on the Program, the distribution of the whole must be on the terms
of this License, whose permissions for other licensees extend to the entire
whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your
rights to work written entirely by you; rather, the intent is to exercise the
right to control the distribution of derivative or collective works based on
the Program.

In addition, mere aggregation of another work not based on the Program with the
Program (or with a work based on the Program) on a volume of a storage or
distribution medium does not bring the other work under the scope of this
License.

3. You may copy and distribute the Program (or a work based on it, under
Section 2) in object code or executable form under the terms of Sections 1 and
2 above provided that you also do one of the following:

a) Accompany it with the complete corresponding machine-readable source code,
which must be distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,

b) Accompany it with a written offer, valid for at least three years, to give
any third party, for a charge no more than your cost of physically performing
source distribution, a complete machine-readable copy of the corresponding
source code, to be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange; or,

c) Accompany it with the information you received as to the offer to distribute
corresponding source code. (This alternative is allowed only for noncommercial
distribution and only if you received the program in object code or executable
form with such an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for making
modifications to it. For an executable work, complete source code means all the
source code for all modules it contains, plus any associated interface
definition files, plus the scripts used to control compilation and installation
of the executable. However, as a special exception, the source code distributed
need not include anything that is normally distributed (in either source or
binary form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component itself
accompanies the executable.

If distribution of executable or object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the source
code from the same place counts as distribution of the source code, even though
third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as
expressly provided under this License. Any attempt otherwise to copy, modify,
sublicense or distribute the Program is void, and will automatically terminate
your rights under this License. However, parties who have received copies, or
rights, from you under this License will not have their licenses terminated so
long as such parties remain in full compliance.

5. You are not required to accept this License, since you have not signed it.
However, nothing else grants you permission to modify or distribute the Program
or its derivative works. These actions are prohibited by law if you do not
accept this License. Therefore, by modifying or distributing the Program (or
any work based on the Program), you indicate your acceptance of this License to
do so, and all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

6. Each time you redistribute the Program (or any work based on the Program),
the recipient automatically receives a license from the original licensor to
copy, distribute or modify the Program subject to these terms and conditions.
You may not impose any further restrictions on the recipients' exercise of the
rights granted herein. You are not responsible for enforcing compliance by
third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues), conditions
are imposed on you (whether by court order, agreement or otherwise) that
contradict the conditions of this License, they do not excuse you from the
conditions of this License. If you cannot distribute so as to satisfy
simultaneously your obligations under this License and any other pertinent
obligations, then as a consequence you may not distribute the Program at all.
For example, if a patent license would not permit royalty-free redistribution
of the Program by all those who receive copies directly or indirectly through
you, then the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply and
the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or
other property right claims or to contest validity of any such claims; this
section has the sole purpose of protecting the integrity of the free software
distribution system, which is implemented by public license practices. Many
people have made generous contributions to the wide range of software
distributed through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing to
distribute software through any other system and a licensee cannot impose that
choice.

This section is intended to make thoroughly clear what is believed to be a
consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain
countries either by patents or by copyrighted interfaces, the original
copyright holder who places the Program under this License may add an explicit
geographical distribution limitation excluding those countries, so that
distribution is permitted only in or among countries not thus excluded. In such
case, this License incorporates the limitation as if written in the body of
this License.

9. The Free Software Foundation may publish revised and/or new versions of the
General Public License from time to time. Such new versions will be similar in
spirit to the present version, but may differ in detail to address new problems
or concerns.

Each version is given a distinguishing version number. If the Program specifies
a version number of this License which applies to it and "any later version",
you have the option of following the terms and conditions either of that
version or of any later version published by the Free Software Foundation. If
the Program does not specify a version number of this License, you may choose
any version ever published by the Free Software Foundation.

10. If you wish to incorporate parts of the Program into other free programs
whose distribution conditions are different, write to the author to ask for
permission. For software which is copyrighted by the Free Software Foundation,
write to the Free Software Foundation; we sometimes make exceptions for this.
Our decision will be guided by the two goals of preserving the free status of
all derivatives of our free software and of promoting the sharing and reuse of
software generally.

NO WARRANTY
===========

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU
ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS
===========================



================================================
FILE: README.md
================================================
New Canonical Source
====================

I have taken employment such that it is difficult for me to be the owner of this project.
I have transferred control to [the excellent engineer wizzat](https://github.com/wizzat/distribution).
Please contribute any PRs, issues, etc to that project rather than this one. Thank you,
and it's been good serving you these past years.

distribution
============

Short, simple, direct scripts for creating character-based graphs in a
command terminal. Status: stable. Features added very rarely.

![diagram](https://raw.github.com/philovivero/distribution/master/screenshot.png?raw=true)


Purpose
=======

To generate graphs directly in the (ASCII-based) terminal. Most common use-case:
if you type `long | list | of | commands | sort | uniq -c | sort -rn` in the terminal,
then you could replace the final `| sort | uniq -c | sort -rn` with `| distribution` and
very likely be happier with what you see.

The tool is mis-named. It was originally for generating histograms (a distribution
of the frequency of input tokens) but it has since been expanded to generate
time-series graphs (or, in fact, graphs with any arbitrary "x-axis") as well.

At first, there will be only two scripts, the originals written in Perl and
Python by Tim Ellis. Any other versions people are willing to create will be placed
here. The next likely candidate language is C++.

There are a few typical use cases for graphs in a terminal as we'll lay out here:

## Tokenize and Graph

A stream of ASCII bytes, tokenize it, tally the matching tokens, and graph
the result. For this example, assume "file" is a list of words with one word
per line, so passing it to "xargs" makes it all-one-line.

```
$ cat file | xargs #put all words on one line
this is an arbitrary stream of tokens. this will be graphed with tokens pulled out. this is the first use case.
$ cat file | xargs | distribution --tokenize=word --match=word --size=small -v
tokens/lines examined: 25
 tokens/lines matched: 21
       histogram keys: 17
              runtime: 8.00ms
      Key|Ct (Pct)    Histogram
     this|3 (14.29%) -----------------------------------------------------------------------o
       is|2  (9.52%) ---------------------------------------o
   tokens|2  (9.52%) ---------------------------------------o
  graphed|1  (4.76%) -------o
     will|1  (4.76%) -------o
```

## Aggregate and Graph

An already-tokenised input, one-per-line, tally and graph them.

```
$ cat file | distribution -s=small -v
tokens/lines examined: 21
 tokens/lines matched: 21
       histogram keys: 18
              runtime: 14.00ms
      Key|Ct (Pct)    Histogram
     this|3 (14.29%) -----------------------------------------------------------------------o
       is|2  (9.52%) ---------------------------------------o
  graphed|1  (4.76%) -------o
       be|1  (4.76%) -------o
```

## Graph Already-Aggregated/Counted Tokens

A list of tallies + tokens, one-per-line. Create a graph with labels. This matches
the typical output of several Unix commands such as "du."

```
$ du -s /etc/*/ 2>/dev/null | distribution -g -v
tokens/lines examined: 107
 tokens/lines matched: 5,176
       histogram keys: 107
              runtime: 2.00ms
                    Key|Ct  (Pct)    Histogram
              /etc/ssl/|920 (17.77%) -------------------------------------------
           /etc/init.d/|396  (7.65%) -------------------
              /etc/apt/|284  (5.49%) -------------
   /etc/nagios-plugins/|224  (4.33%) -----------
              /etc/cis/|188  (3.63%) ---------
           /etc/nagios/|180  (3.48%) ---------
            /etc/fonts/|172  (3.32%) --------
              /etc/ssh/|172  (3.32%) --------
          /etc/default/|164  (3.17%) --------
    /etc/console-setup/|132  (2.55%) -------
```

## Graph a List of Integers

A list of tallies only. Create a graph without labels. This is typical if you just
have a stream of numbers and wonder what they look like. The `--numonly` switch is
used to toggle this behaviour.

There is a different project: https://github.com/holman/spark that will produce
simpler, more-compact graphs. By contrast, this project will produce rather
lengthy and verbose graphs with far more resolution, which you may prefer.


Features
========

   0. Configurable colourised output.
   1. rcfile for your own preferred default commandline options.
   2. Full Perl tokenising and regexp matching.
   3. Partial-width Unicode characters for high-resolution charts.
   4. Configurable chart sizes including "fill up my whole screen."


Installation
============

If you use homebrew, `brew install distribution` should do the trick, although
if you already have Perl or Python installed, you can simply download the file
and put it into your path.

To put the script into your homedir on the machine you plan to run the script:

```
$ wget https://raw.githubusercontent.com/philovivero/distribution/master/distribution.py
$ sudo mv distribution.py /usr/local/bin/distribution
$ alias worddist="distribution -t=word"
```

It is fine to place the script anywhere in your `$PATH`. The worddist alias is
useful for asking the script to tokenize the input for you eg `ls -alR | worddist`.


Options
=======

```
  --keys=K       periodically prune hash to K keys (default 5000)
  --char=C       character(s) to use for histogram character, some substitutions follow:
        pl       Use 1/3-width unicode partial lines to simulate 3x actual terminal width
        pb       Use 1/8-width unicode partial blocks to simulate 8x actual terminal width
        ba       (▬) Bar
        bl       (Ξ) Building
        em       (—) Emdash
        me       (⋯) Mid-Elipses
        di       (♦) Diamond
        dt       (•) Dot
        sq       (□) Square
  --color        colourise the output
  --graph[=G]    input is already key/value pairs. vk is default:
        kv       input is ordered key then value
        vk       input is ordered value then key
  --height=N     height of histogram, headers non-inclusive, overrides --size
  --help         get help
  --logarithmic  logarithmic graph
  --match=RE     only match lines (or tokens) that match this regexp, some substitutions follow:
        word     ^[A-Z,a-z]+$ - tokens/lines must be entirely alphabetic
        num      ^\d+$        - tokens/lines must be entirely numeric
  --numonly[=N]  input is numerics, simply graph values without labels
        actual   input is just values (default - abs, absolute are synonymous to actual)
        diff     input monotonically-increasing, graph differences (of 2nd and later values)
  --palette=P    comma-separated list of ANSI colour values for portions of the output
                 in this order: regular, key, count, percent, graph. implies --color.
  --rcfile=F     use this rcfile instead of $HOME/.distributionrc - must be first argument!
  --size=S       size of histogram, can abbreviate to single character, overridden by --width/--height
        small    40x10
        medium   80x20
        large    120x30
        full     terminal width x terminal height (approximately)
  --tokenize=RE  split input on regexp RE and make histogram of all resulting tokens
        word     [^\w] - split on non-word characters like colons, brackets, commas, etc
        white    \s    - split on whitespace
  --width=N      width of the histogram report, N characters, overrides --size
  --verbose      be verbose
```


Syslog Analysis Example
=======================

You can grab out parts of your syslog ask the script to tokenize on non-word
delimiters, then only match words. The verbosity gives you some stats as it
works and right before it prints the histogram.

```
$ zcat /var/log/syslog*gz \
    | awk '{print $5" "$6}' \
    | distribution --tokenize=word --match=word --height=10 --verbose --char=o
tokens/lines examined: 16,645    
 tokens/lines matched: 5,843
       histogram keys: 92
              runtime: 10.75ms
Val       |Ct (Pct)      Histogram
ntop      |1818 (31.11%) ooooooooooooooooooooooooooooooooooooooooooooooooooooooo
WARNING   |1619 (27.71%) ooooooooooooooooooooooooooooooooooooooooooooooooo
kernel    |1146 (19.61%) ooooooooooooooooooooooooooooooooooo
CRON      |153 (2.62%)   ooooo
root      |147 (2.52%)   ooooo
message   |99 (1.69%)    ooo
last      |99 (1.69%)    ooo
ntpd      |99 (1.69%)    ooo
dhclient  |88 (1.51%)    ooo
THREADMGMT|52 (0.89%)    oo
```


Process List Example
====================

You can start thinking of normal commands in new ways. For example, you can take
your "ps ax" output, get just the command portion, and do a word-analysis on it.
You might find some words are rather interesting. In this case, it appears Chrome
is doing some sort of A/B testing and their commandline exposes that.

```
$ ps axww \
    | cut -c 28- \
    | distribution --tokenize=word --match=word --char='|' --width=90 --height=25
Val                     |Ct (Pct)    Histogram
usr                     |100 (6.17%) |||||||||||||||||||||||||||||||||||||||||||||||||||||
lib                     |73 (4.51%)  ||||||||||||||||||||||||||||||||||||||
browser                 |38 (2.35%)  ||||||||||||||||||||
chromium                |38 (2.35%)  ||||||||||||||||||||
P                       |32 (1.98%)  |||||||||||||||||
daemon                  |31 (1.91%)  |||||||||||||||||
sbin                    |26 (1.60%)  ||||||||||||||
gnome                   |23 (1.42%)  ||||||||||||
bin                     |22 (1.36%)  ||||||||||||
kworker                 |21 (1.30%)  |||||||||||
type                    |19 (1.17%)  ||||||||||
gvfs                    |17 (1.05%)  |||||||||
no                      |17 (1.05%)  |||||||||
en                      |16 (0.99%)  |||||||||
indicator               |15 (0.93%)  ||||||||
channel                 |14 (0.86%)  ||||||||
bash                    |14 (0.86%)  ||||||||
US                      |14 (0.86%)  ||||||||
lang                    |14 (0.86%)  ||||||||
force                   |12 (0.74%)  |||||||
pluto                   |12 (0.74%)  |||||||
ProxyConnectionImpact   |12 (0.74%)  |||||||
HiddenExperimentB       |12 (0.74%)  |||||||
ConnectBackupJobsEnabled|12 (0.74%)  |||||||
session                 |12 (0.74%)  |||||||
```


Graphing Pre-Tallied Tokens Example
===================================

Sometimes the output you have is already some keys with their counts. For
example the output of "du" or "command | uniq -c". In these cases, use the
--graph (-g) option, which skips the parsing and tokenizing of the input.

Further, you can use very short versions of the options in case you don't like
typing a lot. The default character is "+" because it creates a type of grid
system which makes it easy for the eye to trace right/left or up/down.

```
$ sudo du -sb /etc/* | distribution -w=90 -h=15 -g
Val                   |Ct (Pct)         Histogram
/etc/mateconf         |7780758 (44.60%) +++++++++++++++++++++++++++++++++++++++++++++++++
/etc/brltty           |3143272 (18.02%) ++++++++++++++++++++
/etc/apparmor.d       |1597915 (9.16%)  ++++++++++
/etc/bash_completion.d|597836 (3.43%)   ++++
/etc/mono             |535352 (3.07%)   ++++
/etc/ssl              |465414 (2.67%)   +++
/etc/ardour2          |362303 (2.08%)   +++
/etc/X11              |226309 (1.30%)   ++
/etc/ImageMagick      |202358 (1.16%)   ++
/etc/init.d           |143281 (0.82%)   +
/etc/ssh              |138042 (0.79%)   +
/etc/fonts            |119862 (0.69%)   +
/etc/sound            |112051 (0.64%)   +
/etc/xdg              |111971 (0.64%)   +
/etc/java-7-openjdk   |100414 (0.58%)   +
```


Keys in Natural Order Examples
==============================

The output is separated between STDOUT and STDERR so you can sort the resulting
histogram by values. This is useful for time series or other cases where the
keys you're graphing are in some natural order. Note how the "-v" output still
appears at the top.

```
$ cat NotServingRegionException-DateHour.txt \
    | distribution -v \
    | sort -n
tokens/lines examined: 1,414,196    
 tokens/lines matched: 1,414,196
       histogram keys: 453
              runtime: 1279.30ms
Val             |Ct (Pct)      Histogram
   2012-07-13 03|38360 (2.71%) ++++++++++++++++++++++++
   2012-07-28 21|18293 (1.29%) ++++++++++++
   2012-07-28 23|20748 (1.47%) +++++++++++++
   2012-07-29 06|15692 (1.11%) ++++++++++
   2012-07-29 07|30432 (2.15%) +++++++++++++++++++
   2012-07-29 08|76943 (5.44%) ++++++++++++++++++++++++++++++++++++++++++++++++
   2012-07-29 09|54955 (3.89%) ++++++++++++++++++++++++++++++++++
   2012-07-30 05|15652 (1.11%) ++++++++++
   2012-07-30 09|40102 (2.84%) +++++++++++++++++++++++++
   2012-07-30 10|21718 (1.54%) ++++++++++++++
   2012-07-30 16|16041 (1.13%) ++++++++++
   2012-08-01 09|22740 (1.61%) ++++++++++++++
   2012-08-02 04|31851 (2.25%) ++++++++++++++++++++
   2012-08-02 06|28748 (2.03%) ++++++++++++++++++
   2012-08-02 07|18062 (1.28%) ++++++++++++
   2012-08-02 20|23519 (1.66%) +++++++++++++++
   2012-08-03 03|21587 (1.53%) ++++++++++++++
   2012-08-03 08|33409 (2.36%) +++++++++++++++++++++
   2012-08-03 10|15854 (1.12%) ++++++++++
   2012-08-03 15|29828 (2.11%) +++++++++++++++++++
   2012-08-03 16|20478 (1.45%) +++++++++++++
   2012-08-03 17|39758 (2.81%) +++++++++++++++++++++++++
   2012-08-03 18|19514 (1.38%) ++++++++++++
   2012-08-03 19|18353 (1.30%) ++++++++++++
   2012-08-03 22|18726 (1.32%) ++++++++++++
__________________

$ cat /usr/share/dict/words \
    | awk '{print length($1)}' \
    | distribution -c=: -w=90 -h=16 \
    | sort -n
Val|Ct (Pct)       Histogram
2 |182 (0.18%)    :
3 |845 (0.85%)    ::::
4 |3346 (3.37%)   ::::::::::::::::
5 |6788 (6.84%)   :::::::::::::::::::::::::::::::
6 |11278 (11.37%) ::::::::::::::::::::::::::::::::::::::::::::::::::::
7 |14787 (14.91%) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
8 |15674 (15.81%) ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
9 |14262 (14.38%) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
10|11546 (11.64%) :::::::::::::::::::::::::::::::::::::::::::::::::::::
11|8415 (8.49%)   :::::::::::::::::::::::::::::::::::::::
12|5508 (5.55%)   :::::::::::::::::::::::::
13|3236 (3.26%)   :::::::::::::::
14|1679 (1.69%)   ::::::::
15|893 (0.90%)    :::::
16|382 (0.39%)    ::
17|176 (0.18%)    :
```


MySQL Slow Query Log Analysis Examples
======================================

You can sometimes gain interesting insights just by measuring the size of files
on your filesystem. Someone had captured slow-query-logs for every hour for
most of a day. Assuming they all compressed the same (a proper analysis would
be on uncompressed files - uncompressing them would have caused server impact -
this is good enough for illustration's sake), we can determine how much slow
query traffic appeared during a given hour of the day.

Something happened around 8am but otherwise the server seems to follow a normal
sinusoidal pattern. But note because we're only analysing the file size, it
could be that 8am had the same number of slow queries, but that the queries
themselves were larger in byte-count. Or that the queries didn't compress as
well.

Also note that we aren't seeing every histogram entry here. Always take care to
remember the tool is hiding low-frequency data from you unless you ask it to
draw uncommonly-tall histograms.

```
$ du -sb mysql-slow.log.*.gz | ~/distribution -g | sort -n
Val                 |Ct (Pct)         Histogram
mysql-slow.log.01.gz|1426694 (5.38%)  ++++++++++++++++++++
mysql-slow.log.02.gz|1499467 (5.65%)  +++++++++++++++++++++
mysql-slow.log.03.gz|1840727 (6.94%)  ++++++++++++++++++++++++++
mysql-slow.log.04.gz|1570131 (5.92%)  ++++++++++++++++++++++
mysql-slow.log.05.gz|1439021 (5.42%)  ++++++++++++++++++++
mysql-slow.log.07.gz|859939 (3.24%)   ++++++++++++
mysql-slow.log.08.gz|2976177 (11.21%) ++++++++++++++++++++++++++++++++++++++++++
mysql-slow.log.09.gz|792269 (2.99%)   +++++++++++
mysql-slow.log.11.gz|722148 (2.72%)   ++++++++++
mysql-slow.log.12.gz|825731 (3.11%)   ++++++++++++
mysql-slow.log.14.gz|1476023 (5.56%)  +++++++++++++++++++++
mysql-slow.log.15.gz|2087129 (7.86%)  +++++++++++++++++++++++++++++
mysql-slow.log.16.gz|1905867 (7.18%)  +++++++++++++++++++++++++++
mysql-slow.log.19.gz|1314297 (4.95%)  +++++++++++++++++++
mysql-slow.log.20.gz|802212 (3.02%)   ++++++++++++
```

A more-proper analysis on another set of slow logs involved actually getting
the time the query ran, pulling out the date/hour portion of the timestamp, and
graphing the result.

At first blush, it might appear someone had captured logs for various hours of
one day and at 10am for several days in a row. However, note that the Pct
column shows this is only about 20% of all data, which we can also conclude
because there are 964 histogram entries, of which we're only seeing a couple
dozen. This means something happened on July 31st that caused slow queries all
day, and then 10am is a time of day when slow queries tend to happen. To test
this theory, we might re-run this with a "--height=600" (or even 900) to see
nearly all the entries to get a more precise idea of what's going on.

```
$ zcat mysql-slow.log.*.gz \
    | fgrep Time: \
    | cut -c 9-17 \
    | ~/distribution --width=90 --verbose \
    | sort -n
tokens/lines examined: 30,027    
 tokens/lines matched: 30,027
       histogram keys: 964
              runtime: 1224.58ms
Val      |Ct (Pct)    Histogram
120731 03|274 (0.91%) ++++++++++++++++++++++++++++++++++
120731 04|210 (0.70%) ++++++++++++++++++++++++++
120731 07|208 (0.69%) ++++++++++++++++++++++++++
120731 08|271 (0.90%) +++++++++++++++++++++++++++++++++
120731 09|403 (1.34%) +++++++++++++++++++++++++++++++++++++++++++++++++
120731 10|556 (1.85%) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
120731 11|421 (1.40%) +++++++++++++++++++++++++++++++++++++++++++++++++++
120731 12|293 (0.98%) ++++++++++++++++++++++++++++++++++++
120731 13|327 (1.09%) ++++++++++++++++++++++++++++++++++++++++
120731 14|318 (1.06%) +++++++++++++++++++++++++++++++++++++++
120731 15|446 (1.49%) ++++++++++++++++++++++++++++++++++++++++++++++++++++++
120731 16|397 (1.32%) ++++++++++++++++++++++++++++++++++++++++++++++++
120731 17|228 (0.76%) ++++++++++++++++++++++++++++
120801 10|515 (1.72%) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
120803 10|223 (0.74%) +++++++++++++++++++++++++++
120809 10|215 (0.72%) ++++++++++++++++++++++++++
120810 10|210 (0.70%) ++++++++++++++++++++++++++
120814 10|193 (0.64%) ++++++++++++++++++++++++
120815 10|205 (0.68%) +++++++++++++++++++++++++
120816 10|207 (0.69%) +++++++++++++++++++++++++
120817 10|226 (0.75%) ++++++++++++++++++++++++++++
120819 10|197 (0.66%) ++++++++++++++++++++++++
```

A typical problem for MySQL administrators is figuring out how many slow queries
are taking how long. The slow query log can be quite verbose. Analysing it in a
visual nature can help. For example, there is a line that looks like this in the
slow query log:

```
 # Query_time: 5.260353  Lock_time: 0.000052  Rows_sent: 0  Rows_examined: 2414  Rows_affected: 1108  Rows_read: 2
```

It might be useful to see how many queries ran for how long in increments of
tenths of seconds. You can grab that third field and get tenth-second
precision with a simple awk command, then graph the result.

It seems interesting that there are spikes at 3.2, 3.5, 4, 4.3, 4.5 seconds.
One hypothesis might be that those are individual queries, each warranting its
own analysis.

```
$ head -90000 mysql-slow.log.20120710 \
    | fgrep Query_time: \
    | awk '{print int($3 * 10)/10}' \
    | ~/distribution --verbose --height=30 --char='|o' \
    | sort -n
tokens/lines examined: 12,269    
 tokens/lines matched: 12,269
       histogram keys: 481
              runtime: 12.53ms
Val|Ct (Pct)     Histogram
0  |1090 (8.88%) ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||o
2  |1018 (8.30%) |||||||||||||||||||||||||||||||||||||||||||||||||||||||||o
2.1|949 (7.73%)  |||||||||||||||||||||||||||||||||||||||||||||||||||||o
2.2|653 (5.32%)  |||||||||||||||||||||||||||||||||||||o
2.3|552 (4.50%)  |||||||||||||||||||||||||||||||o
2.4|554 (4.52%)  |||||||||||||||||||||||||||||||o
2.5|473 (3.86%)  ||||||||||||||||||||||||||o
2.6|423 (3.45%)  ||||||||||||||||||||||||o
2.7|394 (3.21%)  ||||||||||||||||||||||o
2.8|278 (2.27%)  |||||||||||||||o
2.9|189 (1.54%)  ||||||||||o
3  |173 (1.41%)  |||||||||o
3.1|193 (1.57%)  ||||||||||o
3.2|200 (1.63%)  |||||||||||o
3.3|138 (1.12%)  |||||||o
3.4|176 (1.43%)  ||||||||||o
3.5|213 (1.74%)  ||||||||||||o
3.6|157 (1.28%)  ||||||||o
3.7|134 (1.09%)  |||||||o
3.8|121 (0.99%)  ||||||o
3.9|96 (0.78%)   |||||o
4  |110 (0.90%)  ||||||o
4.1|80 (0.65%)   ||||o
4.2|84 (0.68%)   ||||o
4.3|90 (0.73%)   |||||o
4.4|76 (0.62%)   ||||o
4.5|93 (0.76%)   |||||o
4.6|79 (0.64%)   ||||o
4.7|71 (0.58%)   ||||o
5.1|70 (0.57%)   |||o
```


Apache Logs Analysis Example
============================

Even if you know sed/awk/grep, the built-in tokenizing/matching can be less
verbose. Say you want to look at all the URLs in your Apache logs. People will
be doing GET /a/b/c /a/c/f q/r/s q/n/p. A and Q are the most common, so you can
tokenize on / and the latter parts of the URL will be buried, statistically.

By tokenizing and matching using the script, you may also find unexpected
common portions of the URL that don't show up in the prefix.

```
$ zcat access.log*gz \
    | awk '{print $7}' \
    | distribution -t=/ -h=15
Val            |Ct (Pct)      Histogram
Art            |1839 (16.58%) +++++++++++++++++++++++++++++++++++++++++++++++++
Rendered       |1596 (14.39%) ++++++++++++++++++++++++++++++++++++++++++
Blender        |1499 (13.52%) ++++++++++++++++++++++++++++++++++++++++
AznRigging     |760 (6.85%)   ++++++++++++++++++++
Music          |457 (4.12%)   ++++++++++++
Ringtones      |388 (3.50%)   +++++++++++
CuteStance     |280 (2.52%)   ++++++++
Traditional    |197 (1.78%)   ++++++
Technology     |171 (1.54%)   +++++
CreativeExhaust|134 (1.21%)   ++++
Fractals       |127 (1.15%)   ++++
robots.txt     |125 (1.13%)   ++++
RingtoneEP1.mp3|125 (1.13%)   ++++
Poetry         |108 (0.97%)   +++
RingtoneEP2.mp3|95 (0.86%)    +++
```

Here we had pulled apart our access logs and put them in TSV format for input
into Hive. The user agent string was in the 13th position. I wanted to just get an
overall idea of what sort of user agents were coming to the site. I'm using the
minimal argument size and my favorite "character" combo of "|o". I find it interesting
that there were only 474 unique word-based tokens in the input. Also, it's clear
that a large percentage of the visitors come with mobile devices now.

```
$ zcat weblog-2014-05.tsv.gz \
  | awk -F '\t' '{print $13}' \
  | distribution -t=word -m=word -c='|o' -s=m -v
tokens/lines examined: 28,062,913    
 tokens/lines matched: 11,507,407
       histogram keys: 474
              runtime: 15659.97ms
Val        |Ct (Pct)       Histogram
Mozilla    |912852 (7.93%) ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||o
like       |722945 (6.28%) |||||||||||||||||||||||||||||||||||||||||||||||||||||||||o
OS         |611503 (5.31%) ||||||||||||||||||||||||||||||||||||||||||||||||o
AppleWebKit|605618 (5.26%) |||||||||||||||||||||||||||||||||||||||||||||||o
Gecko      |535620 (4.65%) ||||||||||||||||||||||||||||||||||||||||||o
Windows    |484056 (4.21%) ||||||||||||||||||||||||||||||||||||||o
NT         |483085 (4.20%) ||||||||||||||||||||||||||||||||||||||o
KHTML      |356730 (3.10%) ||||||||||||||||||||||||||||o
Safari     |355400 (3.09%) ||||||||||||||||||||||||||||o
X          |347033 (3.02%) |||||||||||||||||||||||||||o
Mac        |344205 (2.99%) |||||||||||||||||||||||||||o
appversion |300816 (2.61%) |||||||||||||||||||||||o
Type       |299085 (2.60%) |||||||||||||||||||||||o
Connection |299085 (2.60%) |||||||||||||||||||||||o
Mobile     |282759 (2.46%) ||||||||||||||||||||||o
CPU        |266837 (2.32%) |||||||||||||||||||||o
NET        |247418 (2.15%) |||||||||||||||||||o
CLR        |247418 (2.15%) |||||||||||||||||||o
Aspect     |242566 (2.11%) |||||||||||||||||||o
Ratio      |242566 (2.11%) |||||||||||||||||||o
```

And here we had a list of referrers in "referrer [count]" format. They were done one per day, but I wanted a count for January through September, so I used a shell glob to specify all those files for my 'cat'. Distribution will notice that it's getting the same key as previously and just add the new value, so the key "x1" can come in many times and we'll get the aggregate in the output. The referrers have been anonymized here since they are very specific to the company.

```
$ cat referrers-20140* | distribution -v -g=kv -s=m
tokens/lines examined: 133,564    
 tokens/lines matched: 31,498,986
       histogram keys: 14,882
              runtime: 453.45ms
Val    |Ct (Pct)          Histogram
x1     |24313595 (77.19%) ++++++++++++++++++++++++++++++++++++++++++++++++++++
x2     |3430278 (10.89%)  ++++++++
x3     |1049996 (3.33%)   +++
x4     |210083 (0.67%)    +
x5     |179554 (0.57%)    +
x6     |163158 (0.52%)    +
x7     |129997 (0.41%)    +
x8     |122725 (0.39%)    +
x9     |120487 (0.38%)    +
xa     |109085 (0.35%)    +
xb     |99956 (0.32%)     +
xc     |92208 (0.29%)     +
xd     |90017 (0.29%)     +
xe     |79416 (0.25%)     +
xf     |70094 (0.22%)     +
xg     |58089 (0.18%)     +
xh     |52349 (0.17%)     +
xi     |37002 (0.12%)     +
xj     |36651 (0.12%)     +
xk     |32860 (0.10%)     +
```

This seems a really good time to use the --logarithmic option, since that top referrer
is causing a loss of resolution on the following ones! I'll re-run this for one month.

```
$ cat referrers-201402* | distribution -v -g=kv -s=m -l
tokens/lines examined: 23,517    
 tokens/lines matched: 5,908,765 
       histogram keys: 5,888
              runtime: 78.28ms
Val  |Ct (Pct)         Histogram
x1   |4471708 (75.68%) +++++++++++++++++++++++++++++++++++++++++++++++++++++
x2   |670703 (11.35%)  ++++++++++++++++++++++++++++++++++++++++++++++
x3   |203489 (3.44%)   ++++++++++++++++++++++++++++++++++++++++++
x4   |43751 (0.74%)    +++++++++++++++++++++++++++++++++++++
x5   |36211 (0.61%)    ++++++++++++++++++++++++++++++++++++
x6   |34589 (0.59%)    ++++++++++++++++++++++++++++++++++++
x7   |31279 (0.53%)    ++++++++++++++++++++++++++++++++++++
x8   |29596 (0.50%)    +++++++++++++++++++++++++++++++++++
x9   |23125 (0.39%)    +++++++++++++++++++++++++++++++++++
xa   |21429 (0.36%)    ++++++++++++++++++++++++++++++++++
xb   |19670 (0.33%)    ++++++++++++++++++++++++++++++++++
xc   |19057 (0.32%)    ++++++++++++++++++++++++++++++++++
xd   |18945 (0.32%)    ++++++++++++++++++++++++++++++++++
xe   |18936 (0.32%)    ++++++++++++++++++++++++++++++++++
xf   |16015 (0.27%)    +++++++++++++++++++++++++++++++++
xg   |13115 (0.22%)    +++++++++++++++++++++++++++++++++
xh   |12067 (0.20%)    ++++++++++++++++++++++++++++++++
xi   |8485 (0.14%)     +++++++++++++++++++++++++++++++
xj   |7694 (0.13%)     +++++++++++++++++++++++++++++++
xk   |7199 (0.12%)     +++++++++++++++++++++++++++++++
```

Graphing a Series of Numbers Example
====================================

Suppose you just have a list of integers you want to graph. For example, you've
captured a "show global status" for every second for 5 minutes, and you want to
grep out just one stat for the five-minute sample and graph it.

Or, slightly more-difficult, you want to pull out the series of numbers and
only graph the difference between each pair (as in a monotonically-increasing
counter). The ```--numonly=``` option takes care of both these cases. This option
will override any "height" and simply graph all the numbers, since there's no
frequency to dictate which values are more important to graph than others.

Therefore there's a lot of output, which is snipped in the example output that
follows. The "val" column is simply an ascending list of integers, so you can
tell where output was snipped by the jumps in those values.

```
$ grep ^Innodb_data_reads globalStatus*.txt \
    | awk '{print $2}' \
    | distribution --numonly=mon --char='|+'
Val|Ct (Pct)     Histogram
1  |0 (0.00%)    +
91 |15 (0.05%)   +
92 |14 (0.04%)   +
93 |30 (0.10%)   |+
94 |11 (0.03%)   +
95 |922 (2.93%)  |||||||||||||||||||||||||||||||||||||||||||||||||||||||||+
96 |372 (1.18%)  |||||||||||||||||||||||+
97 |44 (0.14%)   ||+
98 |37 (0.12%)   ||+
99 |110 (0.35%)  ||||||+
100|18 (0.06%)   |+
101|12 (0.04%)   +
102|19 (0.06%)   |+
103|164 (0.52%)  ||||||||||+
200|62 (0.20%)   |||+
201|372 (1.18%)  |||||||||||||||||||||||+
202|228 (0.72%)  ||||||||||||||+
203|43 (0.14%)   ||+
204|917 (2.91%)  ||||||||||||||||||||||||||||||||||||||||||||||||||||||||+
205|64 (0.20%)   |||+
206|178 (0.57%)  |||||||||||+
207|90 (0.29%)   |||||+
208|90 (0.29%)   |||||+
209|101 (0.32%)  ||||||+
453|0 (0.00%)    +
454|0 (0.00%)    +
```

The Python version eschews the header and superfluous "key" as the Perl version
will probably also soon do:

```
$ cat ~/tmp/numberSeries.txt | xargs
01 05 06 09 12 22 28 32 34 30 37 44 48 54 63 70 78 82 85 88 89 89 90 92 95
$ cat ~/tmp/numberSeries.txt \
    | ~/Dev/distribution/distribution.py --numonly -c='|o' -s=s
   5  (0.39%) ||o
   6  (0.47%) ||o
   9  (0.70%) ||||o
  12  (0.94%) |||||o
  22  (1.71%) ||||||||||o
  28  (2.18%) |||||||||||||o
  32  (2.49%) |||||||||||||||o
  34  (2.65%) ||||||||||||||||o
  30  (2.34%) ||||||||||||||o
  37  (2.88%) |||||||||||||||||o
  44  (3.43%) ||||||||||||||||||||o
  48  (3.74%) ||||||||||||||||||||||o
  54  (4.21%) |||||||||||||||||||||||||o
  63  (4.91%) |||||||||||||||||||||||||||||o
  70  (5.46%) |||||||||||||||||||||||||||||||||o
  78  (6.08%) ||||||||||||||||||||||||||||||||||||o
  82  (6.39%) ||||||||||||||||||||||||||||||||||||||o
  85  (6.63%) ||||||||||||||||||||||||||||||||||||||||o
  88  (6.86%) |||||||||||||||||||||||||||||||||||||||||o
  89  (6.94%) ||||||||||||||||||||||||||||||||||||||||||o
  89  (6.94%) ||||||||||||||||||||||||||||||||||||||||||o
  90  (7.01%) ||||||||||||||||||||||||||||||||||||||||||o
  92  (7.17%) |||||||||||||||||||||||||||||||||||||||||||o
  95  (7.40%) |||||||||||||||||||||||||||||||||||||||||||||o
$ cat ~/tmp/numberSeries.txt \
	| ~/Dev/distribution/distribution.py --numonly=diff -c='|o' -s=s
   4  (4.26%) ||||||||||||||||||o
   1  (1.06%) ||||o
   3  (3.19%) |||||||||||||o
   3  (3.19%) |||||||||||||o
  10 (10.64%) |||||||||||||||||||||||||||||||||||||||||||||o
   6  (6.38%) |||||||||||||||||||||||||||o
   4  (4.26%) ||||||||||||||||||o
   2  (2.13%) |||||||||o
  -4 (-4.26%) o
   7  (7.45%) |||||||||||||||||||||||||||||||o
   7  (7.45%) |||||||||||||||||||||||||||||||o
   4  (4.26%) ||||||||||||||||||o
   6  (6.38%) |||||||||||||||||||||||||||o
   9  (9.57%) ||||||||||||||||||||||||||||||||||||||||o
   7  (7.45%) |||||||||||||||||||||||||||||||o
   8  (8.51%) ||||||||||||||||||||||||||||||||||||o
   4  (4.26%) ||||||||||||||||||o
   3  (3.19%) |||||||||||||o
   3  (3.19%) |||||||||||||o
   1  (1.06%) ||||o
   0  (0.00%) o
   1  (1.06%) ||||o
   2  (2.13%) |||||||||o
   3  (3.19%) |||||||||||||o
```

HDFS DU Example
===============

HDFS files are often rather large, so I first change the numeric file size to
megabytes by dividing by 1048576. I must also change it to an int value, since
distribution doesn't currently deal with non-integer counts.

Also, we are pre-parsing the du output to give us only the megabytes count and
the final entry in the filename. `awk -F /` supports that.

```
$ hdfs dfs -du /apps/hive/warehouse/aedb/hitcounts_byday/cookie_type=shopper \
    | awk -F / '{print int($1/1048576) " " $8}' \
    | distribution -g -c='-~' --height=20 \
    | sort
          Key|Ct      (Pct)   Histogram
dt=2014-11-15|3265438 (2.53%) ----------------------------------------------~
dt=2014-11-16|3241614 (2.51%) ----------------------------------------------~
dt=2014-11-20|2964636 (2.29%) ------------------------------------------~
dt=2014-11-21|3049912 (2.36%) -------------------------------------------~
dt=2014-11-22|3292621 (2.55%) -----------------------------------------------~
dt=2014-11-23|3319538 (2.57%) -----------------------------------------------~
dt=2014-11-24|3070654 (2.38%) -------------------------------------------~
dt=2014-11-25|3086090 (2.39%) --------------------------------------------~
dt=2014-11-27|3113888 (2.41%) --------------------------------------------~
dt=2014-11-28|3124426 (2.42%) --------------------------------------------~
dt=2014-11-29|3431859 (2.66%) -------------------------------------------------~
dt=2014-11-30|3391117 (2.62%) ------------------------------------------------~
dt=2014-12-01|3167744 (2.45%) ---------------------------------------------~
dt=2014-12-02|3134248 (2.43%) --------------------------------------------~
dt=2014-12-03|3023733 (2.34%) -------------------------------------------~
dt=2014-12-04|3022274 (2.34%) -------------------------------------------~
dt=2014-12-05|3040776 (2.35%) -------------------------------------------~
dt=2014-12-06|3054159 (2.36%) -------------------------------------------~
dt=2014-12-09|3065252 (2.37%) -------------------------------------------~
dt=2014-12-10|3316703 (2.57%) -----------------------------------------------~
```

Running Tests
=============

The `tests` directory contains sample input and output files, as well as a
script to verify expected output based on the sample inputs. To use it, first
export an environment variable called `distribution` that points to the
location of your distribution executable. The script must be run from the `tests`
directory. For example, the following will run tests against the Perl script
and then against the Python script:

    cd tests/
	distribution=../distribution ./runTests.sh
	distribution=../distribution.py ./runTests.sh

The `runTests.sh` script takes one optional argument, `-v`. This enables
verbose mode, which prints out any differences in the stderr of the test runs,
for comparing diagnostic info.

To-Do List
==========

New features are unlikely to be added, as the existing functionality is already
arguably a superset of what's necessary. Still, there are some things that need
to be done.

 * No Time::HiRes Perl module? Don't die. Much harder than it should be.
   Negated by next to-do.
 * Get scripts into package managers.


Porting
=======

Perl and Python are fairly common, but I'm not sure 100% of systems out there
have them. A C/C++ port would be most welcome.

If you write a port, send me a pull request so I can include it in this repo.

Port requirements: from the user's point of view, it's the exact same script.
They pass in the same options in the same way, and get the same output,
byte-for-byte if possible. This means you'll need (Perl) regexp support in your
language of choice. Also a hash map structure makes the implementation simple,
but more-efficient methods are welcome.

I imagine, in order of nice-to-haveness:

 * C or C++
 * Go
 * Lisp
 * Ocaml
 * Java
 * Ruby

 List of known ports
 -------------------
 1. [go-distribution](https://github.com/bradfordboyle/go-distribution)


Authors
=======

 * Tim Ellis
 * Philo Vivero
 * Taylor Stearns


================================================
FILE: VERSION
================================================
1.2.2


================================================
FILE: distribution
================================================
#!/usr/bin/env perl

# vim: set noexpandtab sw=4 ts=4:
# --
# A recent battle with vim and a Go program finally settled this for me.
# Tabs for indent, spaces for formatting. If you change your shiftwidth and
# tabstop to different values and your code looks ugly, say aloud: tabs
# for indent, spaces for formatting.

# distribution - creates histograms based on input
#
# Version 1.0
#
# Written by Tim Ellis of Fifth Sigma, Inc.
# Copyright (c) 2012-2014 by Tim Ellis
# Released under the terms of GNU GPLv2:
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, visit http://www.gnu.org/licenses/gpl-2.0.html in your
# web browser.
#
# If you're still living in the 1800's, you can instead write to:
#
# Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.

use warnings;
use strict;

# Time::HiRes will be used if found, to provide more precise timings
# with --verbose.
BEGIN {
    eval { require Time::HiRes; Time::HiRes->import('time'); 1; };
}

# for determining how long this program ran
my $startTime = time() * 1000;

# defaults - overridden first by distributionrc then by commandline options
my $size = '';
my $width = 80;
my $height = 15;
my $widthArg = 0;
my $heightArg = 0;
my $logarithmic = 0;
# every keyPruneInterval keys, prune the hash to maxKeys top keys
my $keyPruneInterval = 1500000;
my $maxKeys = 5000;
my $numOnly = '';
my $histogramChar = "-";
my $unicode = 0;
my $tokenize = 0;
# by default, everything matches (nothing is stripped out)
my $matchRegexp = ".";
# status and summary statistics
my $verbose = 0;
# how often to give status if verbose
my $statInterval = 1.0;
my $numPrunes = 0;
# whether or not to parse input into bins (if data is pre-summarised and we're
# just presenting results)
my $graphValues = "";

# variables to support colourised output
my $colourisedOutput = 0;
my $colourPalette = '0,0,32,35,34';
my $regularColour = "";
my $keyColour = "";
my $ctColour = "";
my $pctColour = "";
my $graphColour = "";

# we'll re-use inLine at various times for reading files
my $inLine;

# if they want an rcfile, must be first arg
my $rcFile = $ENV{"HOME"} . "/.distributionrc";
if (@ARGV && $ARGV[0] =~ /^-+r(cfile)*=(.+)$/) { $rcFile = $2; }

# read in rcfile if it exists - it'll just be args
if (open (IFILE, "< $rcFile")) {
	while ($inLine = <IFILE>) {
		chomp ($inLine);
		# must put args from rcfile at start so options passed on the
		# commandline will override them
		unshift (@ARGV, $inLine);
	}
}

# process input arguments -- any arguments that aren't known switches are stuck
# onto @extraArgs - note that you can have one or two dashes before the option,
# and only need the first character. also options that take values and switches
# can be overloaded, so -c=o -c means use the o character and colourise the
# output. this can be confusing.
my @extraArgs;
foreach my $arg (@ARGV) {
	if ($arg =~ /^-+h(elp)*$/)               { doArgs(); exit 0; }
	elsif ($arg =~ /^-+w(idth)*=(.+)$/)      { $widthArg = $2; }
	elsif ($arg =~ /^-+h(eight)*=(.+)$/)     { $heightArg = $2; }
	elsif ($arg =~ /^-+k(eys)*=(.+)$/)       { $maxKeys = $2; }
	# --char takes option...
	elsif ($arg =~ /^-+c(har)*=(.+)$/)       { $histogramChar = $2; }
	# ...--color doesn't.
	elsif ($arg =~ /^-+c(olor)*$/)           { $colourisedOutput = 1; }
	# can pass --graph without option, will default to value/key ordering
	# since Unix prefers that for piping-to-sort reasons
	elsif ($arg =~ /^-+g(raph)*=(.+)$/)      { $graphValues = $2; }
	elsif ($arg =~ /^-+g(raph)*$/)           { $graphValues = 'vk'; }
	elsif ($arg =~ /^-+l(ogarithmic)*$/)     { $logarithmic = 2; }
	# can pass --numonly without option
	elsif ($arg =~ /^-+n(umonly)$/)          { $numOnly = 'abs'; }
	elsif ($arg =~ /^-+n(umonly)*=(.+)$/)    { $numOnly = $2; }
	# palette is a comma-separated list of ANSI colour values
	elsif ($arg =~ /^-+p(alette)*=(.+)$/)    { $colourPalette = $2; $colourisedOutput = 1; }
	# size has somewhat complex override semantics including some
	# non-obvious ones like if passing --numonly for example
	elsif ($arg =~ /^-+s(ize)*=(.+)$/)       { $size = $2; }
	# tokenize the input based on Perl regexp
	elsif ($arg =~ /^-+t(okenize)*=(.+)$/)   { $tokenize = $2; }
	# match tokens based on Perl regexp
	elsif ($arg =~ /^-+m(atch)*=(.+)$/)      { $matchRegexp = $2; }
	elsif ($arg =~ /^-+v(erbose)*$/)         { $verbose = 1; }
	else { push (@extraArgs, $arg); }
}

# variables to support colourised output
if ($colourisedOutput) {
	# input should be comma-separated list of numerals
	my @cp = split (',', $colourPalette);
	# add ANSI colour commands around the values - final looks like ^[[32m
	for (my $i=0; $i < scalar @cp; $i++) {
		$cp[$i] = chr(27) . '[' . $cp[$i] . 'm';
	}
	($regularColour, $keyColour, $ctColour, $pctColour, $graphColour) = @cp;
}

# for advanced graphing
my $verticalBlocks =   ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"]; # for future?
my $partialBlocks =    ["▏", "▎", "▍", "▌", "▋", "▊", "▉", "█"]; # char=pb
my $partialCircles =   ["◖", "●"]; # char=pc
my $partialLines =     ["╸", "╾", "━"]; # char=pl

# some useful substitutions for prettiness
if ($histogramChar eq "ba") { $unicode = 1; $histogramChar = "▬"; }
elsif ($histogramChar eq "bl") { $unicode = 1; $histogramChar = "Ξ"; }
elsif ($histogramChar eq "em") { $unicode = 1; $histogramChar = "—"; }
elsif ($histogramChar eq "me") { $unicode = 1; $histogramChar = "⋯"; }
elsif ($histogramChar eq "di") { $unicode = 1; $histogramChar = "♦"; }
elsif ($histogramChar eq "dt") { $unicode = 1; $histogramChar = "•"; }
elsif ($histogramChar eq "sq") { $unicode = 1; $histogramChar = "□"; }

# high-bit set means we're not in ASCIIland anymore
if (ord (substr ($histogramChar, 0, 1)) >= 128) { $unicode = 1; }

# sub-full character width graphing systems
my $charWidth = 1;
my $graphChars = undef;
if ($histogramChar eq "pb") {
	$charWidth = 0.125;
	$graphChars = $partialBlocks;
} elsif ($histogramChar eq "pl") {
	$charWidth = 0.3334;
	$graphChars = $partialLines;
}

# some useful regexp replacements
if ($matchRegexp eq 'word') { $matchRegexp = '^[A-Z,a-z]+$'; }
elsif ($matchRegexp eq 'num')  { $matchRegexp = '^\d+$'; }
if ($tokenize eq 'word')    { $tokenize = '[^\w]'; }
elsif ($tokenize eq 'white')   { $tokenize = '\s'; }

# set the heigh/width of the histogram based on size input,
# this is the lowest level of height/width priority
if ($size =~ /^f/) {
	$width = int (`tput cols` * 0.99);
	if ($width < 80) { $width = 80; }
	$height = int (`tput lines` - 3);
	if ($verbose) { $height -= 4; }
	if ($height < 20) { $height = 20; }
} elsif ($size =~ /^s/) {
	$width = 60;
	$height = 10;
} elsif ($size =~ /^m/) {
	$width = 100;
	$height = 20;
} elsif ($size =~ /^l/) {
	$width = 140;
	$height = 35;
}

# if they passed in --width or --height, they probably meant it moreso than
# defaults or the --size parameter - so code this last
if ($widthArg) { $width = $widthArg; }
if ($heightArg) { $height = $heightArg; }

# maxKeys should be at least a few thousand greater than height to reduce odds
# of throwing away high-count values that appear sparingly in the data
if ($maxKeys < $height + 3000) {
	$maxKeys = $height + 3000;
	print STDERR "Updated maxKeys to $maxKeys (height + 3000)\n";
}

my $nextStat = time() + $statInterval;
my $valuesDict;
my $totalValues = 0;
my $totalObjects = 0;
my $graphVal = 0;
my $maxVal = 0;

# build the dict/map/hash of input values in one of the three modes of operation
if ($numOnly) {
	readNumerics();
} elsif ($graphValues) {
	readPretalliedTokens();
} else {
	readLinesBuildHash();
}

# see if there was input
checkValuesObjects();

my $totalKeys;
my @sortedKeys;

# if we're just graphing a bunch of numbers, no need to sort
# the values dict/map/hash
if ($numOnly) {
	# here we sort on KEYS not VALUES like other cases
	@sortedKeys = sortKeysByKey();

	# we graph everything we're given - throw away nothing! this overrides
        # --height or --size options! it is the highest priority height directive
	$height = $totalObjects;
} else {
	# build the sorted dict/map/hash
	@sortedKeys = sortKeysByValueFrequency();
	$maxVal = $valuesDict->{$sortedKeys[0]};
}

# if there aren't height # of distinct values, choose the number
# of values so the loop later on doesn't have to check for special
# cases
$totalKeys = scalar @sortedKeys;
if ($totalKeys < $height) { $height = $totalKeys; }

# for logarithmic graphs
my $maxLog = 0;
if ($logarithmic) {
	$maxLog = log($maxVal);
}

my $i;
my $j;
my $keyText;
my $ctText;
my $pctText;
my $preBarLen;
my $barWidth;
my $maxPreBarLen = 0;
my $maxKeyLen = 0;

# here is the complex part - read it carefully
for ($i = 0; $i < $height; $i++) {
	# print the i'th most-common key
	$keyText->[$i] = $sortedKeys[$i];

	# how many times this key occurred in the input
	my $count = $valuesDict->{$sortedKeys[$i]};

	# determine the bar width based on key occurence
	if ($logarithmic) {
		if ($count > 0) {
			$barWidth->[$i] = log($count) / $maxLog;
		} else {
			$barWidth->[$i] = 0;
		}
	} else {
		$barWidth->[$i] = $count / $maxVal;
	}

	# determine the percent of key frequency
	my $percentile = $count / $totalValues * 100;

	# graph axis labels, really
	$ctText->[$i] = sprintf ("%d", $count);
	$pctText->[$i] = sprintf ("(%3.02f%%)", $percentile);
	$preBarLen = length ($ctText->[$i]) + length ($pctText->[$i]);

	# determine the longest key name and longest count/percent text for
	# aligning the output
	if ($preBarLen > $maxPreBarLen) { $maxPreBarLen = $preBarLen; }
	if (length ($sortedKeys[$i]) > $maxKeyLen) { $maxKeyLen = length ($sortedKeys[$i]); }
}

my $endTime = time() * 1000;
my $totalMillis = sprintf ("%.2f", ($endTime - $startTime));

# TODO: Collect stats on histogram keys, like how many times maxKeys was
# reached and pruned, and present them here. For now that seems complicated
# for the end-user, so I'll wait until there's a feature request
if ($verbose) {
	print STDERR "tokens/lines examined: " . addCommas($totalObjects) . "    \n";
	print STDERR " tokens/lines matched: " . addCommas($totalValues) . "\n";
	print STDERR "       histogram keys: " . addCommas($totalKeys) . "\n";
	print STDERR "              runtime: " . addCommas($totalMillis) . "ms\n";
}

# almost done now!
outputGraph();

exit 0;

# --------------------------------------------------------------------------- #
#                                 subroutines
# --------------------------------------------------------------------------- #

# get the keys ordered - we'll only print the most common keys
sub sortKeysByValueFrequency {
	# sort first by the value of a key, then by the key itself in case of a tie.
	# this allows us to create deterministic sorts when we have multiple entries
	# in our histogram with the same frequency. particularly important given that
	# perl intentionally randomizes the order of dictionary keys, so not even a
	# stable sort would save us.
	my @sortedKeys = reverse sort { int($valuesDict->{$a}) <=> int($valuesDict->{$b}) || $a cmp $b } keys %{$valuesDict};
	return @sortedKeys;
}

# keep only the most maxKeys keys
sub pruneKeys {
	my $newDict;
	my $numKeysTransferred = 0;
	foreach my $key (&sortKeysByValueFrequency) {
		$newDict->{$key} = $valuesDict->{$key};
		$numKeysTransferred++;
		last if ($numKeysTransferred > $maxKeys);
	}
	$valuesDict = $newDict;
	$numPrunes++;
}

# get the keys ordered simply by key
sub sortKeysByKey {
	my @sortedKeys = sort { int($a) <=> int($b) } keys %{$valuesDict};
	return @sortedKeys;
}

# here we just pull in a stream of numerics and graph them, optionally graphing
# the difference between each pair of values
sub readNumerics {
	# monotonically-increasing pairs, must have at least one value
	my $lastVal = undef;

	while ($inLine = <STDIN>) {
		chomp ($inLine);
		if ($numOnly =~ /^m/i || $numOnly =~ /^d/i) {
			if (defined $lastVal) {
				$graphVal = $inLine - $lastVal;
				$totalValues += $graphVal;
				$totalObjects++;
			}
			$lastVal = $inLine;
		} else {
			$graphVal= $inLine;
			$totalValues += $inLine;
			$totalObjects++;
		}

		if ($graphVal > $maxVal) { $maxVal = $graphVal; }

		# we just build a list where the keys are line num and values are the
		# value
		if ($totalObjects > 0) {
			$valuesDict->{$totalObjects} = $graphVal;
		}
	}
}

# read in lines and build dict/map/hash object from it
sub readLinesBuildHash {
	my $pruneObjects = 0;
	while ($inLine = <STDIN>) {
		chomp($inLine);
		if ($tokenize) {
			# in this case we break the line into tokens and tally them
			foreach my $lineToken (split (/$tokenize/, $inLine)) {
				$totalObjects++;
				if ($lineToken =~ /$matchRegexp/) {
					$valuesDict->{$lineToken}++;
					$totalValues++;
					$pruneObjects++;
				}
			}
		} else {
			# in this case the entire line is the token to be tallied
			$totalObjects++;
			if ($inLine =~ /$matchRegexp/) {
				$valuesDict->{$inLine}++;
				$totalValues++;
				$pruneObjects++;
			}
		}
		if ($verbose && time() > $nextStat) {
			print STDERR "tokens/lines examined: " . addCommas($totalObjects) . "... ; hash prunes: $numPrunes" . chr(13);
			$nextStat = time() + $statInterval;
		}
		if ($pruneObjects >= $keyPruneInterval) {
			pruneKeys();
			$pruneObjects = 0;
		}
	}
}

# here is the case where we don't need to put the input into bins and tally -
# the data is pre-tallied for us
sub readPretalliedTokens {
	while ($inLine = <STDIN>) {
		chomp ($inLine);
		if ($graphValues eq 'vk') {
			if ($inLine =~ /^\s*(\d+)\s+(.+)$/) {
				$valuesDict->{$2} += $1;
				$totalValues += $1;
				if ($1 > $maxVal) { $maxVal = $1; }
				$totalObjects++;
			} else {
				print STDERR " E Input malformed+discarded (perhaps pass -g=kv?): $inLine\n";
			}
		} elsif ($graphValues eq 'kv') {
			if ($inLine =~ /^(.+?)\s+(\d+)$/) {
				$valuesDict->{$1} += $2;
				$totalValues += $2;
				if ($2 > $maxVal) { $maxVal = $2; }
				$totalObjects++;
			} else {
				print STDERR " E Input malformed+discarded (perhaps pass -g=vk?): $inLine\n";
			}
		}
	}
}

# see if there was input
sub checkValuesObjects {
	# the input may be empty. or we may have been too strict on the
	# matching regexp passed in. either way, we were left with nothing.
	if ($totalValues == 0) {
		if ($totalObjects > 0) {
			print STDERR "All input filtered! ";
		} else {
			print STDERR "No input! ";
		}
		print STDERR "No histogram for you. Sorry?\n";
		exit 255;
	}
}

# make a number filled with commas - humans hate to see a number like
# 18008675309. is that 180M or 1.8B? look again. 18B.
sub addCommas {
	my $theNumber = shift;
	$theNumber = reverse $theNumber;
	$theNumber =~ s<(\d\d\d)(?=\d)(?!\d*\.)><$1,>g;
	return reverse $theNumber;
}

# the following arrays, hashes, variables must be correct for this to work
# keyText->[]  - list of the keys
# pctText->[]  - list of the percents
# ctText->[]   - list of the counts
# barWidth->[] - list of the widths of the bars
sub outputGraph {
	# print a header with alignment from key names
	for ($j = 4; $j <= $maxKeyLen; $j++) { print STDERR " "; }
	print STDERR "Key";
	print STDERR "|Ct (Pct)";
	for ($j = 7; $j <= $maxPreBarLen; $j++) { print STDERR " "; }
	print STDERR "Histogram";

	# get ready for the output, but sorting gets hosed if we print the
	# colour code before the key, so put it on the line before
	print STDERR "$keyColour\n";

	# amount of other output reduces possible size of bar - alas
	my $maxBarWidth = $width - $maxPreBarLen - $maxKeyLen - 4;

	for ($i = 0; $i < $height; $i++) {
		# first the key that we aggregated
		for ($j = length ($keyText->[$i]); $j < $maxKeyLen; $j++) { print " "; }
		print $keyText->[$i];
		print $regularColour;
		# alignment
		# separater between keys and count/pct
		print "|";
		print $ctColour;
		print $ctText->[$i] . " ";
		print $pctColour;
		print $pctText->[$i];

		# spaces 'til time to print the bar
		for ($j = length ($ctText->[$i]) + length ($pctText->[$i]); $j <= $maxPreBarLen; $j++) { print " "; }

		print $graphColour;
		for ($j = 0; $j < int ($barWidth->[$i] * $maxBarWidth); $j++) {
			if ($charWidth < 1) {
				# print out maximum-width character (always last in array)
				print $graphChars->[scalar @$graphChars - 1];
			} else {
				# we're printing regular non-unicode characters
				if (length ($histogramChar) > 1 && !$unicode) {
					# but still we have >1 byte! so print initial byte
					# for all but the last character (printed outside loop)
					print substr ($histogramChar, 0, 1);
				} else {
					print $histogramChar;
				}
			}
		}

		# print one too many bar characters so we always see something
		if ($charWidth < 1) {
			# if we have partial-width characters, get higher resolution
			my $remainder = ($barWidth->[$i] * $maxBarWidth) - int ($barWidth->[$i] * $maxBarWidth);
			my $whichChar = int ($remainder / $charWidth);
			if ($barWidth->[$i] * $maxBarWidth > $charWidth) {
				# we have more than charWidth remainder, so print out a
				# remainder portion
				print $graphChars->[$whichChar];
			} else {
				# we had minimum remainder, so print minimum-width
				# character just print the minimum-width portion
				print $graphChars->[0];
			}
		} else {
			# we're printing regular non-unicode characters
			if (length ($histogramChar) > 1 && !$unicode) {
				# but still we have >1 byte! so print final byte of input string
				print substr ($histogramChar, -1, 1);
			} else {
				print $histogramChar;
			}
		}

		# FIXME: even with all these colour-printing antics, still one key will
		# be printed with the wrong colour on sorted output most of the time,
		# but i have no idea how to fix this other than to implement sorting of
		# the output within the script itself.
		if ($i == $height - 1) {
			# put the terminal back into a normal-colour mode on last entry
			print "$regularColour\n";
		} else {
			# we do these antics of printing $keyColour on the line before
			# the key so that piping output to sort will work
			print "$keyColour\n";
		}
	}
}

# usage
sub doArgs {
	print "\n";
	print "usage: <commandWithOutput> | $0\n";
	print "         [--rcfile=<rcFile>]\n";
	print "         [--size={sm|med|lg|full} | --width=<width> --height=<height>]\n";
	print "         [--color] [--palette=r,k,c,p,g]\n";
	print "         [--tokenize=<tokenChar>]\n";
	print "         [--graph[=[kv|vk]] [--numonly[=derivative,diff|abs,absolute,actual]]\n";
	print "         [--char=<barChars>|<substitutionString>]\n";
	print "         [--help] [--verbose]\n";
	print "  --keys=K       every $keyPruneInterval values added, prune hash to K keys (default 5000)\n";
	print "  --char=C       character(s) to use for histogram character, some substitutions follow:\n";
	print "        pl       Use 1/3-width unicode partial lines to simulate 3x actual terminal width\n";
	print "        pb       Use 1/8-width unicode partial blocks to simulate 8x actual terminal width\n";
	print "        ba       (▬) Bar\n";
	print "        bl       (Ξ) Building\n";
	print "        em       (—) Emdash\n";
	print "        me       (⋯) Mid-Elipses\n";
	print "        di       (♦) Diamond\n";
	print "        dt       (•) Dot\n";
	print "        sq       (□) Square\n";
	print "  --color        colourise the output\n";
	print "  --graph[=G]    input is already key/value pairs. vk is default:\n";
	print "        kv       input is ordered key then value\n";
	print "        vk       input is ordered value then key\n";
	print "  --height=N     height of histogram, headers non-inclusive, overrides --size\n";
	print "  --help         get help\n";
	print "  --logarithmic  logarithmic graph\n";
	print "  --match=RE     only match lines (or tokens) that match this regexp, some substitutions follow:\n";
	print "        word     ^[A-Z,a-z]+\$ - tokens/lines must be entirely alphabetic\n";
	print "        num      ^\\d+\$        - tokens/lines must be entirely numeric\n";
	print "  --numonly[=N]  input is numerics, simply graph values without labels\n";
	print "        actual   input is just values (default - abs, absolute are synonymous to actual)\n";
	print "        diff     input monotonically-increasing, graph differences (of 2nd and later values)\n";
	print "  --palette=P    comma-separated list of ANSI colour values for portions of the output\n";
	print "                 in this order: regular, key, count, percent, graph. implies --color.\n";
	print "  --rcfile=F     use this rcfile instead of \$HOME/.distributionrc - must be first argument!\n";
	print "  --size=S       size of histogram, can abbreviate to single character, overridden by --width/--height\n";
	print "        small    40x10\n";
	print "        medium   80x20\n";
	print "        large    120x30\n";
	print "        full     terminal width x terminal height (approximately)\n";
	print "  --tokenize=RE  split input on regexp RE and make histogram of all resulting tokens\n";
	print "        word     [^\\w] - split on non-word characters like colons, brackets, commas, etc\n";
	print "        white    \\s    - split on whitespace\n";
	print "  --width=N      width of the histogram report, N characters, overrides --size\n";
	print "  --verbose      be verbose\n";
	print "\n";
	print "You can use single-characters options, like so: -h=25 -w=20 -v. You must still include the =\n";
	print "\n";
	print "Samples:\n";
	print "  du -sb /etc/* | $0 --palette=0,37,34,33,32 --graph\n";
	print "  du -sk /etc/* | awk '{print \$2\" \"\$1}' | $0 --graph=kv\n";
	print "  zcat /var/log/syslog*gz | $0 --char=o --tokenize=white\n";
	print "  zcat /var/log/syslog*gz | awk '{print \$5}'  | $0 --t=word --m-word --h=15 --c=/\n";
	print "  zcat /var/log/syslog*gz | cut -c 1-9        | $0 --width=60 --height=10 --char=em\n";
	print "  find /etc -type f       | cut -c 6-         | $0 --tokenize=/ --w=90 --h=35 --c=dt\n";
	print "  cat /usr/share/dict/words | awk '{print length(\$1)}' | $0 --c=* --w=50 --h=10 | sort -n\n";
	print "\n";
}


================================================
FILE: distribution.py
================================================
#! /usr/bin/env python3

"""
Generate Graphs Directly in the (ASCII- or Unicode-based) Terminal

If you find yourself typing:
  [long | list | of | commands | sort | uniq -c | sort -rn]

Replace:
  [| sort | uniq -c | sort -rn]

With:
  [| distribution]

Then bask in the glory of your new-found data visualization. There are other
use cases as well.
"""

import math
import os
import re
import shutil
import sys
import time
from pathlib import Path


class Histogram:
    """
    Takes the tokenDict built in the InputReader class and goes through it,
    printing a histogram for each of the highest height entries
    """

    def __init__(self):
        pass

    def histogram_bar(self, s, histWidth, maxVal, barVal):
        # given a value and max, return string for histogram bar of the proper
        # number of characters, including unicode partial-width characters
        returnBar = ""

        # first case is partial-width chars
        if s.charWidth < 1:
            zeroChar = s.graphChars[-1]
        elif len(s.histogramChar) > 1 and not s.unicodeMode:
            zeroChar = s.histogramChar[0]
            oneChar = s.histogramChar[1]
        else:
            zeroChar = s.histogramChar
            oneChar = s.histogramChar

        # write out the full-width integer portion of the histogram
        if s.logarithmic:
            maxLog = math.log(maxVal)
            barLog = math.log(barVal) if barVal > 0 else 0
            intWidth = int(barLog / maxLog * histWidth)
            remainderWidth = (barLog / maxLog * histWidth) - intWidth
        else:
            intWidth = int(barVal * 1.0 / maxVal * histWidth)
            remainderWidth = (barVal * 1.0 / maxVal * histWidth) - intWidth

        # write the zeroeth character intWidth times...
        returnBar += zeroChar * intWidth

        # we always have at least one remaining char for histogram - if
        # we have full-width chars, then just print it, otherwise do a
        # calculation of how much remainder we need to print
        #
        # FIXME: The remainder partial char printed does not take into
        # account logarithmic scale (can humans notice?).
        if s.charWidth == 1:
            returnBar += oneChar
        elif s.charWidth < 1:
            # this is high-resolution, so figure out what remainder we
            # have to represent
            if remainderWidth > s.charWidth:
                whichChar = int(remainderWidth / s.charWidth)
                returnBar += s.graphChars[whichChar]

        return returnBar

    def write_hist(self, s, tokenDict):
        maxTokenLen = 0
        outputDict = {}

        numItems = 0
        maxVal = 0
        s.totalValues = int(s.totalValues)

        # given a dict, create a comparison tuple that sorts first by the value of a key,
        # then by the key itself in case of a tie. this allows us to create deterministic sorts
        # when we have multiple entries in our histogram with the same frequency.
        def value_key_compare(dict):
            return lambda key: (dict.get(key), key)

        for k in sorted(tokenDict, key=value_key_compare(tokenDict), reverse=True):
            # can't remember what feature "if k:" adds - i think there's an
            # off-by-one death the script sometimes suffers without it.
            if k:
                outputDict[k] = tokenDict[k]
                if len(str(k)) > maxTokenLen:
                    maxTokenLen = len(str(k))
                if outputDict[k] > maxVal:
                    maxVal = outputDict[k]
                numItems += 1
                if numItems >= s.height:
                    break

        s.endTime = int(time.time() * 1000)
        totalMillis = s.endTime - s.startTime
        if s.verbose:
            sys.stderr.write(f"tokens/lines examined: {s.totalObjects:,d}\n")
            sys.stderr.write(f" tokens/lines matched: {s.totalValues:,d}\n")
            sys.stderr.write(f"       histogram keys: {len(tokenDict):,d}\n")
            sys.stderr.write(f"              runtime: {totalMillis:,.2f}ms\n")

        # the first entry will determine these values
        maxValueWidth = 0
        maxPctWidth = 0
        sortedOutput = sorted(
            outputDict, key=value_key_compare(outputDict), reverse=True
        )
        for i in range(0, len(sortedOutput)):
            k = sortedOutput[i]
            # can't remember what feature "if k:" adds - i think there's an
            # off-by-one death the script sometimes suffers without it.
            if k:
                if maxValueWidth == 0:
                    testString = f"{outputDict[k]}"
                    maxValueWidth = len(testString)
                    testString = f"({outputDict[k] * 1.0 / s.totalValues * 100:2.2f}%)"
                    maxPctWidth = len(testString)

                    # we always output a single histogram char at the end, so
                    # we output one less than actual number here
                    histWidth = (
                        s.width
                        - (maxTokenLen + 1)
                        - (maxValueWidth + 1)
                        - (maxPctWidth + 1)
                        - 1
                    )

                    # output a header
                    sys.stderr.write("Key".rjust(maxTokenLen) + "|")
                    sys.stderr.write("Ct".ljust(maxValueWidth) + " ")
                    sys.stderr.write("(Pct)".ljust(maxPctWidth) + " ")
                    sys.stderr.write("Histogram")

                    # get ready for the output, but sorting gets hosed if we print the
                    # colour code before the key, so put it on the line before
                    sys.stderr.write(s.keyColour)
                    sys.stderr.write("\n")

                sys.stdout.write(str(k).rjust(maxTokenLen))
                sys.stdout.write(s.regularColour)
                sys.stdout.write("|")
                sys.stdout.write(s.ctColour)

                outVal = f"{outputDict[k]}"
                sys.stdout.write(outVal.rjust(maxValueWidth) + " ")

                pct = f"({outputDict[k] * 1.0 / s.totalValues * 100:2.2f}%)"
                sys.stdout.write(s.pctColour)
                sys.stdout.write(pct.rjust(maxPctWidth) + " ")

                sys.stdout.write(s.graphColour)
                sys.stdout.write(
                    self.histogram_bar(s, histWidth, maxVal, outputDict[k])
                )

                if i == len(sortedOutput) - 1:
                    # put the terminal back into a normal-colour mode on last entry
                    sys.stdout.write(s.regularColour)
                else:
                    # we do these antics of printing $keyColour on the line before
                    # the key so that piping output to sort will work
                    sys.stdout.write(s.keyColour)
                sys.stdout.write("\n")


class InputReader:
    """
    Reads stdin, parses it into a dictionary of key and value is number
    of appearances of that key in the input - this will also prune the
    token frequency dict on after a certain number of insertions to
    prevent OOME on large datasets
    """

    def __init__(self):
        self.tokenDict = {}

    def prune_keys(self, s):
        newDict = {}
        numKeysTransferred = 0
        for k in sorted(self.tokenDict, key=self.tokenDict.get, reverse=True):
            if k:
                newDict[k] = self.tokenDict[k]
                numKeysTransferred += 1
                if numKeysTransferred > s.maxKeys:
                    break
        self.tokenDict = newDict
        s.numPrunes += 1

    def tokenize_input(self, s):
        # how to split the input... typically we split on whitespace or
        # word boundaries, but the user can specify any regexp
        if s.tokenize == "white":
            s.tokenize = r"\s+"
        elif s.tokenize == "word":
            s.tokenize = r"\W"

        # how to match (filter) the input... typically we want either
        # all-alpha or all-numeric, but again, user can specify
        if s.matchRegexp == "word":
            s.matchRegexp = r"^[A-Z,a-z]+$"
        elif s.matchRegexp in ["num", "number"]:
            s.matchRegexp = r"^\d+$"

        # docs say these are cached, but i got about 2x speed boost
        # from doing the compile
        pt = re.compile(s.tokenize)
        pm = re.compile(s.matchRegexp)

        nextStat = time.time() + s.statInterval

        pruneObjects = 0
        for line in sys.stdin:
            line = line.rstrip("\n")
            if s.tokenize:
                for token in pt.split(line):
                    # user desires to break line into tokens...
                    s.totalObjects += 1
                    if pm.match(token):
                        s.totalValues += 1
                        pruneObjects += 1
                        if token in self.tokenDict:
                            self.tokenDict[token] += 1
                        else:
                            self.tokenDict[token] = 1
            else:
                # user just wants every line to be a token
                s.totalObjects += 1
                if pm.match(line):
                    s.totalValues += 1
                    pruneObjects += 1
                    if line in self.tokenDict:
                        self.tokenDict[line] += 1
                    else:
                        self.tokenDict[line] = 1

            # prune the hash if it gets too large
            if pruneObjects >= s.keyPruneInterval:
                self.prune_keys(s)
                pruneObjects = 0

            if s.verbose and time.time() > nextStat:
                sys.stderr.write(
                    f"tokens/lines examined: {s.totalObjects:,d} ; hash prunes: {s.numPrunes:,d}..."
                    + chr(13)
                )
                nextStat = time.time() + s.statInterval

    def read_pretallied_tokens(self, s):
        # the input is already just a series of keys with the frequency of the
        # keys precomputed, as in "du -sb" - vk means the number is first, key
        # second. kv means key first, number second
        vk = re.compile(r"^\s*(\d+)\s+(.+)$")
        kv = re.compile(r"^(.+?)\s+(\d+)$")
        if s.graphValues == "vk":
            for line in sys.stdin:
                m = vk.match(line)
                try:
                    if m.group(2) in self.tokenDict:
                        self.tokenDict[m.group(2)] += int(m.group(1))
                    else:
                        self.tokenDict[m.group(2)] = int(m.group(1))
                    s.totalValues += int(m.group(1))
                    s.totalObjects += 1
                except Exception:
                    sys.stderr.write(
                        f" E Input malformed+discarded (perhaps pass -g=kv?): {line}\n"
                    )
        elif s.graphValues == "kv":
            for line in sys.stdin:
                m = kv.match(line)
                try:
                    if m.group(1) in self.tokenDict:
                        self.tokenDict[m.group(1)] += int(m.group(2))
                    else:
                        self.tokenDict[m.group(1)] = int(m.group(2))
                    s.totalValues += int(m.group(2))
                    s.totalObjects += 1
                except Exception:
                    sys.stderr.write(
                        f" E Input malformed+discarded (perhaps pass -g=vk?): {line}\n"
                    )

    def read_numerics(self, s, h):
        # in this special mode, we print out the histogram here instead
        # of later - because it's a far simpler histogram without all the
        # totals, percentages, etc of the real histogram. we're just
        # showing a graph of a series of numbers
        lastVal = 0
        maxVal = 0
        maxWidth = 0
        sumVal = 0
        outList = []
        for line in sys.stdin:
            try:
                line = float(line.rstrip())
            except Exception:
                line = lastVal

            graphVal = 0
            if s.numOnly == "mon":
                if s.totalObjects > 0:
                    graphVal = line - lastVal
                lastVal = line
            else:
                graphVal = line

            if graphVal > maxVal:
                maxVal = graphVal
                maxWidth = len(str(graphVal))

            sumVal += int(graphVal)

            if s.totalObjects > 0:
                outList.append(graphVal)
            s.totalObjects += 1

        # simple graphical output
        for k in outList:
            sys.stdout.write(s.keyColour)
            sys.stdout.write(str(int(k)).rjust(maxWidth))
            pct = f"({float(k) / float(sumVal) * 100:2.2f}%)"
            sys.stdout.write(s.pctColour)
            sys.stdout.write(pct.rjust(9) + " ")
            sys.stdout.write(s.graphColour)
            sys.stdout.write(
                h.histogram_bar(s, s.width - 11 - maxWidth, maxVal, k) + "\n"
            )
            sys.stdout.write(s.regularColour)


class Settings:
    def __init__(self):
        self.totalMillis = 0
        self.startTime = int(time.time() * 1000)
        self.endTime = 0
        self.widthArg = 0
        self.heightArg = 0
        self.width = 80
        self.height = 15
        self.histogramChar = "-"
        self.colourisedOutput = False
        self.logarithmic = False
        self.numOnly = "XXX"
        self.verbose = False
        self.graphValues = ""
        self.size = ""
        self.tokenize = ""
        # by default, everything matches (nothing is stripped out)
        self.matchRegexp = "."
        # how often to give status if verbose
        self.statInterval = 1.0
        self.numPrunes = 0
        # for colourised output
        self.colourPalette = "0,0,32,35,34"
        self.regularColour = ""
        self.keyColour = ""
        self.ctColour = ""
        self.pctColour = ""
        self.graphColour = ""
        # for stats
        self.totalObjects = 0
        self.totalValues = 0
        # every keyPruneInterval keys, prune the hash to maxKeys top keys
        self.keyPruneInterval = 1500000
        self.maxKeys = 5000
        # for advanced graphing
        self.unicodeMode = False
        self.charWidth = 1
        self.graphChars = []
        self.partialBlocks = ["▏", "▎", "▍", "▌", "▋", "▊", "▉", "█"]  # char=pb
        self.partialLines = ["╸", "╾", "━"]  # char=hl

        # rcfile grabbing/parsing if specified
        if len(sys.argv) > 1 and "--rcfile" in sys.argv[1]:
            rcFile = sys.argv[1].split("=")[1]
            rcFile = os.path.expanduser(rcFile)
        else:
            rcFile = os.environ.get("HOME") + "/.distributionrc"

        # parse opts from the rcFile if it exists
        try:
            with open(rcFile) as f:
                rcfileOptList = f.readlines()
                for rcOpt in rcfileOptList:
                    rcOpt = rcOpt.rstrip().split("#")[0]
                    if rcOpt:
                        sys.argv.insert(0, rcOpt)
        except OSError:
            # don't die or in fact do anything if rcfile doesn't exist
            pass

        # manual argument parsing easier than getopts IMO
        for arg in sys.argv:
            if arg in ("-h", "--help"):
                doUsage(self)
                sys.exit(0)
            elif arg in ("-c", "--color", "--colour"):
                self.colourisedOutput = True
            elif arg in ("-g", "--graph"):
                # can pass --graph without option, will default to value/key ordering
                # since Unix prefers that for piping-to-sort reasons
                self.graphValues = "vk"
            elif arg in ("-l", "--logarithmic"):
                self.logarithmic = True
            elif arg in ("-n", "--numonly"):
                self.numOnly = "abs"
            elif arg in ("-v", "--verbose"):
                self.verbose = True
            else:
                argList = arg.split("=", 1)
                if argList[0] in ("-w", "--width"):
                    self.widthArg = int(argList[1])
                elif argList[0] in ("-h", "--height"):
                    self.heightArg = int(argList[1])
                elif argList[0] in ("-k", "--keys"):
                    self.maxKeys = int(argList[1])
                elif argList[0] in ("-c", "--char"):
                    self.histogramChar = argList[1]
                elif argList[0] in ("-g", "--graph"):
                    self.graphValues = argList[1]
                elif argList[0] in ("-n", "--numonly"):
                    self.numOnly = argList[1]
                elif argList[0] in ("-p", "--palette"):
                    self.colourPalette = argList[1]
                    self.colourisedOutput = True
                elif argList[0] in ("-s", "--size"):
                    self.size = argList[1]
                elif argList[0] in ("-t", "--tokenize"):
                    self.tokenize = argList[1]
                elif argList[0] in ("-m", "--match"):
                    self.matchRegexp = argList[1]

        # first, size, which might be further overridden by width/height later
        if self.size in ("full", "fl", "f"):
            # tput will tell us the term width/height even if input is stdin
            self.width, self.height = shutil.get_terminal_size()
            # convert to numerics from string
            self.width = int(self.width)
            self.height = int(self.height) - 3
            # need room for the verbosity output
            if self.verbose:
                self.height -= 4
            # in case tput went all bad, ensure some minimum size
            self.width = max(self.width, 40)
            self.height = max(self.height, 10)
        elif self.size in ("small", "sm", "s"):
            self.width = 60
            self.height = 10
        elif self.size in ("medium", "med", "m"):
            self.width = 100
            self.height = 20
        elif self.size in ("large", "lg", "l"):
            self.width = 140
            self.height = 35

        # synonyms "monotonically-increasing": derivative, difference, delta, increasing
        # so all "d" "i" and "m" words will be graphing those differences
        if self.numOnly[0] in ("d", "i", "m"):
            self.numOnly = "mon"
        # synonyms "actual values": absolute, actual, number, normal, noop,
        # so all "a" and "n" words will graph straight up numbers
        if self.numOnly[0] in ("a", "n"):
            self.numOnly = "abs"

        # override variables if they were explicitly given
        if self.widthArg != 0:
            self.width = self.widthArg
        if self.heightArg != 0:
            self.height = self.heightArg

        # maxKeys should be at least a few thousand greater than height to reduce odds
        # of throwing away high-count values that appear sparingly in the data
        if self.maxKeys < self.height + 3000:
            self.maxKeys = self.height + 3000
            if self.verbose:
                sys.stderr.write(f"Updated maxKeys to {self.maxKeys} (height + 3000)\n")

        # colour palette
        if self.colourisedOutput:
            cl = self.colourPalette.split(",")
            # ANSI color code is ESC+[+NN+m where ESC=chr(27), [ and m are
            # the literal characters, and NN is a two-digit number, typically
            # from 31 to 37 - why is this knowledge still useful in 2014?
            cl = [chr(27) + "[" + e + "m" for e in cl]
            (
                self.regularColour,
                self.keyColour,
                self.ctColour,
                self.pctColour,
                self.graphColour,
            ) = cl

        # some useful ASCII-->utf-8 substitutions
        if self.histogramChar == "ba":
            self.unicodeMode = True
            self.histogramChar = "▬"
        elif self.histogramChar == "bl":
            self.unicodeMode = True
            self.histogramChar = "Ξ"
        elif self.histogramChar == "em":
            self.unicodeMode = True
            self.histogramChar = "—"
        elif self.histogramChar == "me":
            self.unicodeMode = True
            self.histogramChar = "⋯"
        elif self.histogramChar == "di":
            self.unicodeMode = True
            self.histogramChar = "♦"
        elif self.histogramChar == "dt":
            self.unicodeMode = True
            self.histogramChar = "•"
        elif self.histogramChar == "sq":
            self.unicodeMode = True
            self.histogramChar = "□"

        # sub-full character width graphing systems
        if self.histogramChar == "pb":
            self.charWidth = 0.125
            self.graphChars = self.partialBlocks
        elif self.histogramChar == "pl":
            self.charWidth = 0.3334
            self.graphChars = self.partialLines

        # detect whether the user has passed a multibyte unicode character directly as the histogram char
        if ord(self.histogramChar[0]) >= 128:
            self.unicodeMode = True


def doUsage(s):
    print(
        f"""
usage: <commandWithOutput> | {scriptName}
         [--rcfile=<rcFile>]
         [--size={{sm|med|lg|full}} | --width=<width> --height=<height>]
         [--color] [--palette=r,k,c,p,g]
         [--tokenize=<tokenChar>]
         [--graph[=[kv|vk]] [--numonly[=derivative,diff|abs,absolute,actual]]
         [--char=<barChars>|<substitutionString>]
         [--help] [--verbose]
  --keys=K       every {s.keyPruneInterval} values added, prune hash to K keys (default 5000)
  --char=C       character(s) to use for histogram character, some substitutions follow:
        pl       Use 1/3-width unicode partial lines to simulate 3x actual terminal width
        pb       Use 1/8-width unicode partial blocks to simulate 8x actual terminal width
        ba       (▬) Bar
        bl       (Ξ) Building
        em       (—) Emdash
        me       (⋯) Mid-Elipses
        di       (♦) Diamond
        dt       (•) Dot
        sq       (□) Square
  --color        colourise the output
  --graph[=G]    input is already key/value pairs. vk is default:
        kv       input is ordered key then value
        vk       input is ordered value then key
  --height=N     height of histogram, headers non-inclusive, overrides --size
  --help         get help
  --logarithmic  logarithmic graph
  --match=RE     only match lines (or tokens) that match this regexp, some substitutions follow:
        word     ^[A-Z,a-z]+\\$ - tokens/lines must be entirely alphabetic
        num      ^\\d+\\$        - tokens/lines must be entirely numeric
  --numonly[=N]  input is numerics, simply graph values without labels
        actual   input is just values (default - abs, absolute are synonymous to actual)
        diff     input monotonically-increasing, graph differences (of 2nd and later values)
  --palette=P    comma-separated list of ANSI colour values for portions of the output
                 in this order: regular, key, count, percent, graph. implies --color.
  --rcfile=F     use this rcfile instead of ~/.distributionrc - must be first argument!
  --size=S       size of histogram, can abbreviate to single character, overridden by --width/--height
        small    40x10
        medium   80x20
        large    120x30
        full     terminal width x terminal height (approximately)
  --tokenize=RE  split input on regexp RE and make histogram of all resulting tokens
        word     [^\\w] - split on non-word characters like colons, brackets, commas, etc
        white    \\s    - split on whitespace
  --width=N      width of the histogram report, N characters, overrides --size
  --verbose      be verbose

You can use single-characters options, like so: -h=25 -w=20 -v. You must still include the =

Samples:
  du -sb /etc/* | {scriptName} --palette=0,37,34,33,32 --graph
  du -sk /etc/* | awk '{{print $2\" \"$1}}' | {scriptName} --graph=kv
  zcat /var/log/syslog*gz | {scriptName} --char=o --tokenize=white
  zcat /var/log/syslog*gz | awk '{{print $5}}'  | {scriptName} -t=word -m-word -h=15 -c=/
  zcat /var/log/syslog*gz | cut -c 1-9        | {scriptName} -width=60 -height=10 -char=em
  find /etc -type f       | cut -c 6-         | {scriptName} -tokenize=/ -w=90 -h=35 -c=dt
  cat /usr/share/dict/words | awk '{{print length($1)}}' | {scriptName} -c=* -w=50 -h=10 | sort -n
"""
    )


# simple argument parsing and call top-level routines
def main():
    # instantiate our classes
    s = Settings()
    i = InputReader()
    h = Histogram()

    if s.graphValues:
        # user passed g=vk or g=kv
        i.read_pretallied_tokens(s)
    elif s.numOnly != "XXX":
        # s.numOnly was specified by the user
        i.read_numerics(s, h)
        # read_numerics will have output a graph already, so exit
        sys.exit(0)
    else:
        # this is the original behaviour of distribution
        i.tokenize_input(s)

    h.write_hist(s, i.tokenDict)


# what is this magic?
scriptName = str(Path(sys.argv[0]).name)
if __name__ == "__main__":
    main()


================================================
FILE: distributionrc
================================================
# put this file at $HOME/.distributionrc or specify it as --rcfile=<location>
# AS THE FIRST ARGUMENT to the script
#
# options for the distribution program can be specified one per line exactly as
# you'd specify them on the commandline. options in this file are overridden by
# the commandline options passed
#
# do not try to specify the same option twice in this file, you'll probably be
# surprised by the reverse-order of overrides

# obvious options?
--color
#--size=full

# two-char choice
--char=-o

# cool unicode partial-width characters
# --char=pb
# other interesting-but-unusual graph bar choices
#--char=◵
#--char=■
#--char=◣
#--char=░
#--char=▞

# ANSI colour palette, in this order:
# regular, key, count, percent, graph
--palette=0,32,34,35,37



================================================
FILE: tests/runTests.sh
================================================
#!/bin/sh

# make sure env is setup proper
if [ "xxx$distribution" == "xxx" ] ; then
	echo "To run tests, first export distribution=<pathToDistributionToTest>"
	exit 255
fi

getopts "v" verbose

# the tests
echo ""
printf "Running test: 1. "
cat stdin.01.txt | $distribution --rcfile=../distributionrc --graph --height=35 --width=120 --char=dt --color --verbose > stdout.01.actual.txt 2> stderr.01.actual.txt

printf "2. "
cat stdin.02.txt | awk '{print $4" "$5}' | $distribution --rcfile=../distributionrc -s=med --width=110 --tokenize=word --match=word -v -c > stdout.02.actual.txt 2> stderr.02.actual.txt

printf "3. "
grep modem stdin.02.txt | awk '{print $1}' | $distribution --rcfile=../distributionrc --width=110 -h=15 -c='|' -v -c 2> stderr.03.actual.txt | sort > stdout.03.actual.txt

printf "4. "
cat stdin.03.txt | $distribution --rcfile=../distributionrc --size=large --height=8 --width=60 -t=/ --palette=0,31,33,35,37 -c='()' > stdout.04.actual.txt 2> stderr.04.actual.txt

printf "5. "
cat stdin.03.txt | $distribution --rcfile=../distributionrc -c=pc -w=48 --tokenize=word --match=num --size=large --verbose 2> stderr.05.actual.txt | sort -n > stdout.05.actual.txt

printf "6. "
# generate a large list of deterministic but meaningless numbers
(( i=0 )) ; while [[ $i -lt 3141592 ]] ; do
	echo $(( i ^ (i+=17) ))
done | cut -c 2-6 | $distribution --rcfile=../distributionrc --width=124 --height=29 -p=0,32,34,36,31 -c=^ -v > stdout.06.actual.txt 2> stderr.06.actual.txt

printf "7. "
cat stdin.04.txt | awk '{print $8}' | $distribution --rcfile=../distributionrc -s=s -w=90 --char=Ξ > stdout.07.actual.txt 2> stderr.07.actual.txt

echo "done."

# be sure output is proper
err=0
printf "Comparing results: "
for i in 01 02 03 04 05 06 07 ; do
	printf "$i. "
	diff -w stdout.$i.expected.txt stdout.$i.actual.txt
	if [ $? -ne 0 ]; then
		err=1
	fi

	# when in verbose mode, ignore any "runtime lines, since those may differ by
	# milliseconds from machine to machine. Also ignore any lines with "^M" markers,
	# which are line-erase signals used for updating the screen interactively, and
	# thus don't need to be stored or compared.
	if [ "$verbose" = "v" ]; then
		diff -w -I "runtime:" -I "
" stderr.$i.expected.txt stderr.$i.actual.txt
	fi
done

echo "done."

# clean up
rm stdout.*.actual.txt stderr.*.actual.txt

exit $err


================================================
FILE: tests/stderr.01.expected.txt
================================================
tokens/lines examined: 279    
 tokens/lines matched: 17,444,532
       histogram keys: 279
              runtime: 1.52ms
                   Key|Ct (Pct)         Histogram


================================================
FILE: tests/stderr.02.expected.txt
================================================
tokens/lines examined: 5,480    
 tokens/lines matched: 1,104
       histogram keys: 144
              runtime: 6.19ms
         Key|Ct (Pct)     Histogram


================================================
FILE: tests/stderr.03.expected.txt
================================================
tokens/lines examined: 29    
 tokens/lines matched: 29
       histogram keys: 9
              runtime: 0.31ms
       Key|Ct (Pct)   Histogram


================================================
FILE: tests/stderr.04.expected.txt
================================================
      Key|Ct (Pct)     Histogram


================================================
FILE: tests/stderr.05.expected.txt
================================================
tokens/lines examined: 1,942    
 tokens/lines matched: 191
       histogram keys: 11
              runtime: 2.12ms
Key|Ct (Pct)    Histogram


================================================
FILE: tests/stderr.06.expected.txt
================================================
tokens/lines examined: 56,960... ; hash prunes: 0
tokens/lines examined: 113,920... ; hash prunes: 0
tokens/lines examined: 171,773... ; hash prunes: 0
tokens/lines examined: 184,800    
 tokens/lines matched: 184,800
       histogram keys: 68
              runtime: 3,243.41ms
Key|Ct (Pct)       Histogram


================================================
FILE: tests/stderr.07.expected.txt
================================================
 Key|Ct (Pct)     Histogram


================================================
FILE: tests/stdin.01.txt
================================================
27944	/etc/acpi
2981	/etc/adduser.conf
10	/etc/adjtime
15375	/etc/alternatives
395	/etc/anacrontab
1096	/etc/ansible
800	/etc/anthy
95556	/etc/apache2
112	/etc/apg.conf
3397	/etc/apm
16922	/etc/apparmor
1597915	/etc/apparmor.d
2666	/etc/apport
40810	/etc/apt
362303	/etc/ardour2
144	/etc/at.deny
41	/etc/ati
1366	/etc/at-spi2
5791	/etc/avahi
9085	/etc/avserver.conf
2076	/etc/bash.bashrc
58753	/etc/bash_completion
597836	/etc/bash_completion.d
356	/etc/bindresvport.blacklist
321	/etc/blkid.conf
15	/etc/blkid.tab
5306	/etc/bluetooth
7439	/etc/bogofilter.cf
392	/etc/bonobo-activation
33	/etc/brlapi.key
3143272	/etc/brltty
19925	/etc/brltty.conf
1878	/etc/ca-certificates
6961	/etc/ca-certificates.conf
632	/etc/calendar
2301	/etc/chatscripts
509	/etc/checkbox.d
248	/etc/chromium-browser
186	/etc/clutter-imcontext
699	/etc/colord.conf
1122	/etc/compizconfig
161	/etc/ConsoleKit
57645	/etc/console-setup
3300	/etc/corosync
429	/etc/cron.d
30047	/etc/cron.daily
127	/etc/cron.hourly
455	/etc/cron.monthly
722	/etc/crontab
2127	/etc/cron.weekly
67	/etc/crypttab
14653	/etc/cups
8964	/etc/cupshelpers
70918	/etc/dbus-1
3694	/etc/dconf
2969	/etc/debconf.conf
11	/etc/debian_version
32218	/etc/default
604	/etc/deluser.conf
55	/etc/depmod.d
18191	/etc/dhcp
1785	/etc/dhcp3
71	/etc/dictionaries-common
4730	/etc/dkms
352	/etc/doc-base
1308	/etc/dpkg
1616	/etc/emacs
343	/etc/environment
389	/etc/esound
574	/etc/firefox
119862	/etc/fonts
1171	/etc/foomatic
743	/etc/fstab
6	/etc/fstab.d
216	/etc/fuse.conf
3343	/etc/gai.conf
4975	/etc/gconf
59	/etc/gdb
9937	/etc/gdm
10799	/etc/ghostscript
41894	/etc/gimp
8395	/etc/ginn
580	/etc/gnashpluginrc
5767	/etc/gnashrc
690	/etc/gnashthumbnailrc
33126	/etc/gnome
200	/etc/gnome-app-install
25	/etc/gnome-settings-daemon
603	/etc/gnome-vfs-2.0
2550	/etc/gnucash
1741	/etc/groff
977	/etc/group
958	/etc/group-
40058	/etc/grub.d
800	/etc/gshadow
789	/etc/gshadow-
921	/etc/gtk-2.0
1116	/etc/gtk-3.0
2105	/etc/ha.d
4233	/etc/haproxy
6748	/etc/hddtemp.db
4728	/etc/hdparm.conf
92	/etc/host.conf
7	/etc/hostname
271	/etc/hosts
580	/etc/hosts.allow
880	/etc/hosts.deny
900	/etc/hp
163	/etc/icedtea-web
78	/etc/ifplugd
202358	/etc/ImageMagick
58780	/etc/init
143281	/etc/init.d
6610	/etc/initramfs-tools
1721	/etc/inputrc
28	/etc/insserv
839	/etc/insserv.conf
6	/etc/insserv.conf.d
1256	/etc/iproute2
853	/etc/ipsec.conf
20491	/etc/ipsec.d
698	/etc/ipsec.secrets
24	/etc/issue
17	/etc/issue.net
100414	/etc/java-7-openjdk
2838	/etc/kbd
6035	/etc/kernel
91	/etc/kernel-img.conf
1309	/etc/kerneloops.conf
354	/etc/ldap
92934	/etc/ld.so.cache
34	/etc/ld.so.conf
342	/etc/ld.so.conf.d
267	/etc/legal
2695	/etc/libnl-3
6	/etc/libpaper.d
5336	/etc/libreoffice
564	/etc/lightdm
2570	/etc/locale.alias
2819	/etc/localtime
8750	/etc/logcheck
1475	/etc/logd.cf
10551	/etc/login.defs
599	/etc/logrotate.conf
8279	/etc/logrotate.d
6	/etc/lsb-base
3279	/etc/lsb-base-logging.sh
104	/etc/lsb-release
15752	/etc/ltrace.conf
111	/etc/magic
111	/etc/magic.mime
23576	/etc/mailcap
449	/etc/mailcap.order
5173	/etc/manpath.config
416	/etc/matecomponent-activation
7780758	/etc/mateconf
15409	/etc/mate-system-tools
584	/etc/mate-vfs-2.0
10862	/etc/mate-vfs-mime-magic
440	/etc/menu
15646	/etc/menu-methods
23958	/etc/mime.types
956	/etc/mke2fs.conf
11521	/etc/modprobe.d
198	/etc/modules
535352	/etc/mono
13	/etc/motd
13899	/etc/mplayer
887	/etc/mtab
0	/etc/mtab.fuselock
624	/etc/mtools.conf
5181	/etc/mysql
8453	/etc/nanorc
2064	/etc/netscsid.conf
12602	/etc/network
12958	/etc/NetworkManager
91	/etc/networks
739	/etc/newt
513	/etc/nsswitch.conf
689	/etc/obex-data-server
6	/etc/ODBCDataSources
0	/etc/odbc.ini
0	/etc/odbcinst.ini
9012	/etc/openal
90	/etc/OpenCL
10421	/etc/openhpi
15684	/etc/openvpn
6	/etc/opt
552	/etc/pam.conf
24963	/etc/pam.d
7	/etc/papersize
2039	/etc/passwd
2036	/etc/passwd-
1141	/etc/pcmcia
667	/etc/perl
346	/etc/pkcs11
2243	/etc/pm
7649	/etc/pnm2ppa.conf
1084	/etc/polkit-1
350	/etc/popularity-contest.conf
41552	/etc/ppp
22	/etc/printcap
665	/etc/profile
506	/etc/profile.d
2933	/etc/protocols
11511	/etc/pulse
2172	/etc/purple
120	/etc/python
184	/etc/python2.7
4900	/etc/rc0.d
4861	/etc/rc1.d
5288	/etc/rc2.d
5263	/etc/rc3.d
5263	/etc/rc4.d
5263	/etc/rc5.d
4900	/etc/rc6.d
306	/etc/rc.local
608	/etc/rcS.d
1889	/etc/request-key.conf
9102	/etc/resolvconf
60	/etc/resolv.conf
147	/etc/resolv.conf.orig
268	/etc/rmt
887	/etc/rpc
1263	/etc/rsyslog.conf
2677	/etc/rsyslog.d
12559	/etc/samba
71429	/etc/sane.d
3902	/etc/securetty
24629	/etc/security
10333	/etc/sensors3.conf
25	/etc/sensors.d
19281	/etc/services
19266	/etc/sgml
1356	/etc/shadow
1231	/etc/shadow-
73	/etc/shells
12903	/etc/skel
235	/etc/snmp
112051	/etc/sound
53500	/etc/speech-dispatcher
138042	/etc/ssh
465414	/etc/ssl
741	/etc/sudoers
772	/etc/sudoers.d
19	/etc/su-to-rootrc
2112	/etc/sysctl.conf
8215	/etc/sysctl.d
118	/etc/systemd
231	/etc/terminfo
186	/etc/thunderbird
20	/etc/timezone
4680	/etc/timidity
645	/etc/ts.conf
1260	/etc/ucf.conf
3665	/etc/udev
9425	/etc/ufw
326	/etc/updatedb.conf
1141	/etc/update-manager
8396	/etc/update-motd.d
6	/etc/update-notifier
1678	/etc/UPower
572	/etc/usb_modeswitch.conf
6	/etc/usb_modeswitch.d
25081	/etc/vga
2912	/etc/vim
496	/etc/vlc
21837	/etc/vpnc
23	/etc/vtrgb
4496	/etc/wgetrc
4680	/etc/wildmidi
1343	/etc/wodim.conf
31611	/etc/wpa_supplicant
226309	/etc/X11
111971	/etc/xdg
769	/etc/xl2tpd
35802	/etc/xml
326	/etc/xul-ext
349	/etc/zsh_command_not_found


================================================
FILE: tests/stdin.02.txt
================================================
2012-01-01  08:01:52  anacron[14182]: Job `cron.daily'
2012-01-02  08:01:52  anacron[14182]: Normal exit
2012-01-03  08:17:01  CRON[14610]: (root) CMD
2012-01-04  09:07:50  pppd[13041]: Modem hangup
2012-01-05  09:07:50  pppd[13041]: Connect time
2012-01-06  09:07:50  pppd[13041]: Sent 19243191
2012-01-07  09:07:50  modem-manager[1113]: <info> (ttyUSB0)
2012-01-08  09:07:50  modem-manager[1113]: <info> (ttyUSB0)
2012-01-09  09:07:50  modem-manager[1113]: <info> (ttyUSB2)
2012-01-01  09:07:50  modem-manager[1113]: <info> (ttyUSB2)
2012-01-02  09:07:50  kernel: [142597.045021] usb
2012-01-03  09:07:50  kernel: [142597.045214] option:
2012-01-04  09:07:50  kernel: [142597.045492] option1
2012-01-05  09:07:50  kernel: [142597.045525] option
2012-01-06  09:07:50  kernel: [142597.045773] option1
2012-01-07  09:07:50  kernel: [142597.045814] option
2012-01-08  09:07:50  pppd[13041]: Connection terminated.
2012-01-09  09:07:50  modem-manager[1113]: <info> (tty/ttyUSB0):
2012-01-01  09:07:50  kernel: [142597.046728] option1
2012-01-02  09:07:50  kernel: [142597.046777] option
2012-01-03  09:07:50  modem-manager[1113]: <info> Modem
2012-01-04  09:07:50  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-05  09:07:50  NetworkManager[1127]: <warn> Activation
2012-01-06  09:07:50  NetworkManager[1127]: SCPlugin-Ifupdown: devices
2012-01-07  09:07:50  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-08  09:07:50  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-09  09:07:50  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-01  09:07:50  dbus[1092]: [system] Activating
2012-01-02  09:07:50  NetworkManager[1127]: <warn> could
2012-01-03  09:07:50  NetworkManager[1127]: nm_system_iface_flush_routes: assertion
2012-01-04  09:07:50  NetworkManager[1127]: nm_system_iface_flush_addresses: assertion
2012-01-05  09:07:50  dbus[1092]: [system] Successfully
2012-01-06  09:07:50  dnsmasq[13066]: exiting on
2012-01-07  09:07:50  NetworkManager[1127]: <info> DNS:
2012-01-08  09:07:50  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-09  09:07:50  dnsmasq[14766]: started, version
2012-01-01  09:07:50  dnsmasq[14766]: compile time
2012-01-02  09:07:50  dnsmasq[14766]: warning: no
2012-01-03  09:07:50  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-04  09:07:50  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-05  09:07:50  NetworkManager[1127]: <info> Unmanaged
2012-01-06  09:07:50  NetworkManager[1127]: <info> Unmanaged
2012-01-07  09:07:52  pppd[13041]: Exit. 
2012-01-08  09:07:54  NetworkManager[1127]: <info> sleep
2012-01-09  09:07:54  NetworkManager[1127]: <info> sleeping
2012-01-01  09:07:54  NetworkManager[1127]: <info> (eth0):
2012-01-02  09:07:54  NetworkManager[1127]: <info> (eth0):
2012-01-03  09:07:54  NetworkManager[1127]: <info> (eth0):
2012-01-04  09:07:54  NetworkManager[1127]: <info> (eth0):
2012-01-05  09:07:55  anacron[14932]: Anacron 2.3
2012-01-06  09:07:55  anacron[14932]: Normal exit
2012-01-07  09:07:56  NetworkManager[1127]: <info> (wlan0):
2012-01-08  09:07:56  NetworkManager[1127]: <info> (wlan0):
2012-01-09  09:07:56  NetworkManager[1127]: SCPlugin-Ifupdown: devices
2012-01-01  09:07:56  NetworkManager[1127]: <info> radio
2012-01-02  09:07:56  NetworkManager[1127]: <info> WiFi
2012-01-03  09:07:57  kernel: [142603.804145] bcma-pci-bridge
2012-01-04  09:37:34  kernel: [142606.236638] PM:
2012-01-05  09:37:34  kernel: [142606.399207] PM:
2012-01-06  09:37:34  kernel: [142606.399218] Freezing
2012-01-07  09:37:34  kernel: [142606.413472] Freezing
2012-01-08  09:37:34  kernel: [142606.429503] PM:
2012-01-09  09:37:34  kernel: [142606.429522] Suspending
2012-01-01  09:37:34  kernel: [142606.430280] sd
2012-01-02  09:37:34  kernel: [142606.430306] apple-gmux
2012-01-03  09:37:34  kernel: [142606.430367] sd
2012-01-04  09:37:34  kernel: [142606.431471] snd_hda_intel
2012-01-05  09:37:34  kernel: [142606.431474] [fglrx]
2012-01-06  09:37:34  kernel: [142606.431534] pciehp
2012-01-07  09:37:34  kernel: [142606.431537] [fglrx]
2012-01-08  09:37:34  kernel: [142606.469351] uhci_hcd
2012-01-09  09:37:34  kernel: [142606.469376] uhci_hcd
2012-01-01  09:37:34  kernel: [142606.477296] ehci_hcd
2012-01-02  09:37:34  kernel: [142606.493280] ehci_hcd
2012-01-03  09:37:34  kernel: [142606.533344] snd_hda_intel
2012-01-04  09:37:34  kernel: [142606.549221] PM:
2012-01-05  09:37:34  kernel: [142607.070401] PM:
2012-01-06  09:37:34  kernel: [142607.070417] PM:
2012-01-07  09:37:34  kernel: [142607.070424] PM:
2012-01-08  09:37:34  kernel: [142607.070680] ata_piix
2012-01-09  09:37:34  kernel: [142607.084707] PM:
2012-01-01  09:37:34  kernel: [142607.361272] [fglrx]
2012-01-02  09:37:34  kernel: [142607.361274] [fglrx]
2012-01-03  09:37:34  kernel: [142607.361345] PM:
2012-01-04  09:37:34  kernel: [142607.361366] PM:
2012-01-05  09:37:34  kernel: [142607.361418] PM:
2012-01-06  09:37:34  kernel: [142607.361461] PM:
2012-01-07  09:37:34  kernel: [142607.361463] PM:
2012-01-08  09:37:34  kernel: [142607.361901] ehci_hcd
2012-01-09  09:37:34  kernel: [142607.361908] ehci_hcd
2012-01-01  09:37:34  kernel: [142607.376801] ehci_hcd
2012-01-02  09:37:34  kernel: [142607.376807] ehci_hcd
2012-01-03  09:37:34  kernel: [142607.408538] PM:
2012-01-04  09:37:34  kernel: [142607.408793] ACPI:
2012-01-05  09:37:34  kernel: [142607.448529] PM:
2012-01-06  09:37:34  kernel: [142607.448680] Disabling
2012-01-07  09:37:34  kernel: [142607.552327] CPU
2012-01-08  09:37:34  kernel: [142607.656226] CPU
2012-01-09  09:37:34  kernel: [142607.760122] CPU
2012-01-01  09:37:34  kernel: [142607.864015] CPU
2012-01-02  09:37:34  kernel: [142607.967918] CPU
2012-01-03  09:37:34  kernel: [142608.071815] CPU
2012-01-04  09:37:34  kernel: [142608.175716] CPU
2012-01-05  09:37:34  kernel: [142608.176048] Extended
2012-01-06  09:37:34  kernel: [142608.176319] ACPI:
2012-01-07  09:37:34  kernel: [142608.176359] PM:
2012-01-08  09:37:34  kernel: [142608.176667] Extended
2012-01-09  09:37:34  kernel: [142608.176704] Enabling
2012-01-01  09:37:34  kernel: [142608.176802] Booting
2012-01-02  09:37:34  kernel: [142608.176804] smpboot
2012-01-03  09:37:34  kernel: [142608.187115] Initializing
2012-01-04  09:37:34  kernel: [142608.187819] Calibrating
2012-01-05  09:37:34  kernel: [142608.208146] NMI
2012-01-06  09:37:34  kernel: [142608.208802] CPU1
2012-01-07  09:37:34  kernel: [142608.208915] Booting
2012-01-08  09:37:34  kernel: [142608.208916] smpboot
2012-01-09  09:37:34  kernel: [142608.219212] Initializing
2012-01-01  09:37:34  kernel: [142608.219930] Calibrating
2012-01-02  09:37:34  kernel: [142608.240268] NMI
2012-01-03  09:37:34  kernel: [142608.240987] CPU2
2012-01-04  09:37:34  kernel: [142608.241045] Booting
2012-01-05  09:37:34  kernel: [142608.241047] smpboot
2012-01-06  09:37:34  kernel: [142608.251343] Initializing
2012-01-07  09:37:34  kernel: [142608.252061] Calibrating
2012-01-08  09:37:34  kernel: [142608.272427] NMI
2012-01-09  09:37:34  kernel: [142608.273159] CPU3
2012-01-01  09:37:34  kernel: [142608.273233] Booting
2012-01-02  09:37:34  kernel: [142608.273234] smpboot
2012-01-03  09:37:34  kernel: [142608.283529] Initializing
2012-01-04  09:37:34  kernel: [142608.284247] Calibrating
2012-01-05  09:37:34  kernel: [142608.304827] NMI
2012-01-06  09:37:34  kernel: [142608.305639] CPU4
2012-01-07  09:37:34  kernel: [142608.305738] Booting
2012-01-08  09:37:34  kernel: [142608.305739] smpboot
2012-01-09  09:37:34  kernel: [142608.316043] Initializing
2012-01-01  09:37:34  kernel: [142608.316754] Calibrating
2012-01-02  09:37:34  kernel: [142608.337444] NMI
2012-01-03  09:37:34  kernel: [142608.338329] CPU5
2012-01-04  09:37:34  kernel: [142608.338442] Booting
2012-01-05  09:37:34  kernel: [142608.338444] smpboot
2012-01-06  09:37:34  kernel: [142608.348727] Initializing
2012-01-07  09:37:34  kernel: [142608.349456] Calibrating
2012-01-08  09:37:34  kernel: [142608.370266] NMI
2012-01-09  09:37:34  kernel: [142608.371217] CPU6
2012-01-01  09:37:34  kernel: [142608.371481] Booting
2012-01-02  09:37:34  kernel: [142608.371483] smpboot
2012-01-03  09:37:34  kernel: [142608.381765] Initializing
2012-01-04  09:37:34  kernel: [142608.382495] Calibrating
2012-01-05  09:37:34  kernel: [142608.403488] NMI
2012-01-06  09:37:34  kernel: [142608.404562] CPU7
2012-01-07  09:37:34  kernel: [142608.412434] ACPI:
2012-01-08  09:37:34  kernel: [142609.363300] pcieport
2012-01-09  09:37:34  kernel: [142609.363305] pcieport
2012-01-01  09:37:34  kernel: [142609.363307] pcieport
2012-01-02  09:37:34  kernel: [142609.363309] pcieport
2012-01-03  09:37:34  kernel: [142609.363312] pcieport
2012-01-04  09:37:34  kernel: [142609.363315] pcieport
2012-01-05  09:37:34  kernel: [142609.363331] pcieport
2012-01-06  09:37:34  kernel: [142609.363335] pcieport
2012-01-07  09:37:34  kernel: [142609.363337] pcieport
2012-01-08  09:37:34  kernel: [142609.363339] pcieport
2012-01-09  09:37:34  kernel: [142609.363341] pcieport
2012-01-01  09:37:34  kernel: [142609.363344] pcieport
2012-01-02  09:37:34  kernel: [142609.363346] pcieport
2012-01-03  09:37:34  kernel: [142609.363363] mei
2012-01-04  09:37:34  kernel: [142609.363376] mei
2012-01-05  09:37:34  kernel: [142609.363394] uhci_hcd
2012-01-06  09:37:34  kernel: [142609.363404] uhci_hcd
2012-01-07  09:37:34  kernel: [142609.363413] uhci_hcd
2012-01-08  09:37:34  kernel: [142609.363433] ehci_hcd
2012-01-09  09:37:34  kernel: [142609.363448] ehci_hcd
2012-01-01  09:37:34  kernel: [142609.363454] ehci_hcd
2012-01-02  09:37:34  kernel: [142609.363470] ehci_hcd
2012-01-03  09:37:34  kernel: [142609.363474] ehci_hcd
2012-01-04  09:37:34  kernel: [142609.363487] snd_hda_intel
2012-01-05  09:37:34  kernel: [142609.363499] snd_hda_intel
2012-01-06  09:37:34  kernel: [142609.363503] snd_hda_intel
2012-01-07  09:37:34  kernel: [142609.363508] snd_hda_intel
2012-01-08  09:37:34  kernel: [142609.363532] pcieport
2012-01-09  09:37:34  kernel: [142609.363541] pcieport
2012-01-01  09:37:34  kernel: [142609.363545] pcieport
2012-01-02  09:37:34  kernel: [142609.363549] pcieport
2012-01-03  09:37:34  kernel: [142609.363553] pcieport
2012-01-04  09:37:34  kernel: [142609.363559] pcieport
2012-01-05  09:37:34  kernel: [142609.363563] pcieport
2012-01-06  09:37:34  kernel: [142609.363601] pcieport
2012-01-07  09:37:34  kernel: [142609.363610] pcieport
2012-01-08  09:37:34  kernel: [142609.363614] pcieport
2012-01-09  09:37:34  kernel: [142609.363618] pcieport
2012-01-01  09:37:34  kernel: [142609.363622] pcieport
2012-01-02  09:37:34  kernel: [142609.363628] pcieport
2012-01-03  09:37:34  kernel: [142609.363632] pcieport
2012-01-04  09:37:34  kernel: [142609.363671] pcieport
2012-01-05  09:37:34  kernel: [142609.363679] pcieport
2012-01-06  09:37:34  kernel: [142609.363684] pcieport
2012-01-07  09:37:34  kernel: [142609.363691] pcieport
2012-01-08  09:37:34  kernel: [142609.363696] pcieport
2012-01-09  09:37:34  kernel: [142609.363734] pcieport
2012-01-01  09:37:34  kernel: [142609.363743] pcieport
2012-01-02  09:37:34  kernel: [142609.363747] pcieport
2012-01-03  09:37:34  kernel: [142609.363751] pcieport
2012-01-04  09:37:34  kernel: [142609.363755] pcieport
2012-01-05  09:37:34  kernel: [142609.363760] pcieport
2012-01-06  09:37:34  kernel: [142609.363765] pcieport
2012-01-07  09:37:34  kernel: [142609.363796] uhci_hcd
2012-01-08  09:37:34  kernel: [142609.363806] uhci_hcd
2012-01-09  09:37:34  kernel: [142609.363815] uhci_hcd
2012-01-01  09:37:34  kernel: [142609.363834] ehci_hcd
2012-01-02  09:37:34  kernel: [142609.363849] ehci_hcd
2012-01-03  09:37:34  kernel: [142609.363855] ehci_hcd
2012-01-04  09:37:34  kernel: [142609.363869] ehci_hcd
2012-01-05  09:37:34  kernel: [142609.363873] ehci_hcd
2012-01-06  09:37:34  kernel: [142609.363915] ata_piix
2012-01-07  09:37:34  kernel: [142609.363923] ata_piix
2012-01-08  09:37:34  kernel: [142609.363927] ata_piix
2012-01-09  09:37:34  kernel: [142609.363931] ata_piix
2012-01-01  09:37:34  kernel: [142609.363935] ata_piix
2012-01-02  09:37:34  kernel: [142609.363939] ata_piix
2012-01-03  09:37:34  kernel: [142609.363944] ata_piix
2012-01-04  09:37:34  kernel: [142609.363956] pci
2012-01-05  09:37:34  kernel: [142609.363968] pci
2012-01-06  09:37:34  kernel: [142609.363974] pci
2012-01-07  09:37:34  kernel: [142609.363994] fglrx_pci
2012-01-08  09:37:34  kernel: [142609.363999] fglrx_pci
2012-01-09  09:37:34  kernel: [142609.364005] fglrx_pci
2012-01-01  09:37:34  kernel: [142609.364009] fglrx_pci
2012-01-02  09:37:34  kernel: [142609.364013] fglrx_pci
2012-01-03  09:37:34  kernel: [142609.364017] fglrx_pci
2012-01-04  09:37:34  kernel: [142609.364021] fglrx_pci
2012-01-05  09:37:34  kernel: [142609.364056] snd_hda_intel
2012-01-06  09:37:34  kernel: [142609.364069] snd_hda_intel
2012-01-07  09:37:34  kernel: [142609.364072] snd_hda_intel
2012-01-08  09:37:34  kernel: [142609.364077] snd_hda_intel
2012-01-09  09:37:34  kernel: [142609.364165] tg3
2012-01-01  09:37:34  kernel: [142609.364190] tg3
2012-01-02  09:37:34  kernel: [142609.364198] tg3
2012-01-03  09:37:34  kernel: [142609.364204] tg3
2012-01-04  09:37:34  kernel: [142609.364212] tg3
2012-01-05  09:37:34  kernel: [142609.364303] pci
2012-01-06  09:37:34  kernel: [142609.364320] pci
2012-01-07  09:37:34  kernel: [142609.364346] pci
2012-01-08  09:37:34  kernel: [142609.364354] pci
2012-01-09  09:37:34  kernel: [142609.364365] pci
2012-01-01  09:37:34  kernel: [142609.364433] firewire_ohci
2012-01-02  09:37:34  kernel: [142609.364465] firewire_ohci
2012-01-03  09:37:34  kernel: [142609.364473] firewire_ohci
2012-01-04  09:37:34  kernel: [142609.364560] PM:
2012-01-05  09:37:34  kernel: [142609.364660] uhci_hcd
2012-01-06  09:37:34  kernel: [142609.364669] uhci_hcd
2012-01-07  09:37:34  kernel: [142609.364685] mei
2012-01-08  09:37:34  kernel: [142609.364694] ehci_hcd
2012-01-09  09:37:34  kernel: [142609.364697] usb
2012-01-01  09:37:34  kernel: [142609.364699] snd_hda_intel
2012-01-02  09:37:34  kernel: [142609.364705] ehci_hcd
2012-01-03  09:37:34  kernel: [142609.364714] snd_hda_intel
2012-01-04  09:37:34  kernel: [142609.364736] uhci_hcd
2012-01-05  09:37:34  kernel: [142609.364739] ehci_hcd
2012-01-06  09:37:34  kernel: [142609.364744] pciehp
2012-01-07  09:37:34  kernel: [142609.364747] ata_piix
2012-01-08  09:37:34  kernel: [142609.364753] snd_hda_intel
2012-01-09  09:37:34  kernel: [142609.364765] uhci_hcd
2012-01-01  09:37:34  kernel: [142609.364767] ata_piix
2012-01-02  09:37:34  kernel: [142609.364770] ehci_hcd
2012-01-03  09:37:34  kernel: [142609.364775] snd_hda_intel
2012-01-04  09:37:34  kernel: [142609.364817] usb
2012-01-05  09:37:34  kernel: [142609.364871] snd_hda_intel
2012-01-06  09:37:34  kernel: [142609.364910] fglrx_pci
2012-01-07  09:37:34  kernel: [142609.364932] snd_hda_intel
2012-01-08  09:37:34  kernel: [142609.365580] sd
2012-01-09  09:37:34  kernel: [142609.369962] [fglrx]
2012-01-01  09:37:34  kernel: [142609.370140] [fglrx]
2012-01-02  09:37:34  kernel: [142609.414760] [fglrx]
2012-01-03  09:37:34  kernel: [142609.414831] [fglrx]
2012-01-04  09:37:34  kernel: [142609.419272] firewire_ohci
2012-01-05  09:37:34  kernel: [142609.419483] firewire_core:
2012-01-06  09:37:34  kernel: [142609.483100] PM:
2012-01-07  09:37:34  kernel: [142609.483105] PM:
2012-01-08  09:37:34  kernel: [142609.483108] PM:
2012-01-09  09:37:34  kernel: [142609.483113] PM:
2012-01-01  09:37:34  kernel: [142609.483116] PM:
2012-01-02  09:37:34  kernel: [142609.483122] PM:
2012-01-03  09:37:34  kernel: [142609.487587] PM:
2012-01-04  09:37:34  kernel: [142609.487603] PM:
2012-01-05  09:37:34  kernel: [142609.487607] PM:
2012-01-06  09:37:34  kernel: [142609.487611] PM:
2012-01-07  09:37:34  kernel: [142609.487614] PM:
2012-01-08  09:37:34  kernel: [142609.487617] PM:
2012-01-09  09:37:34  kernel: [142609.487648] PM:
2012-01-01  09:37:34  kernel: [142609.487936] PM:
2012-01-02  09:37:34  kernel: [142609.487939] PM:
2012-01-03  09:37:34  kernel: [142609.487942] PM:
2012-01-04  09:37:34  kernel: [142609.487947] PM:
2012-01-05  09:37:34  kernel: [142609.487950] PM:
2012-01-06  09:37:34  kernel: [142609.487953] PM:
2012-01-07  09:37:34  kernel: [142609.515164] PM:
2012-01-08  09:37:34  kernel: [142609.515377] Extended
2012-01-09  09:37:34  kernel: [142609.535655] PM:
2012-01-01  09:37:34  kernel: [142609.535659] PM:
2012-01-02  09:37:34  kernel: [142609.535663] PM:
2012-01-03  09:37:34  kernel: [142609.535667] PM:
2012-01-04  09:37:34  kernel: [142609.535670] PM:
2012-01-05  09:37:34  kernel: [142609.535673] PM:
2012-01-06  09:37:34  kernel: [142609.535675] PM:
2012-01-07  09:37:34  kernel: [142609.535680] PM:
2012-01-08  09:37:34  kernel: [142609.535693] PM:
2012-01-09  09:37:34  kernel: [142609.535695] PM:
2012-01-01  09:37:34  kernel: [142609.535697] PM:
2012-01-02  09:37:34  kernel: [142609.535701] PM:
2012-01-03  09:37:34  kernel: [142609.918715] firewire_core:
2012-01-04  09:37:34  kernel: [142610.709877] ata2.01:
2012-01-05  09:37:34  kernel: [142610.709966] ata1.01:
2012-01-06  09:37:34  kernel: [142610.865813] ata2.00:
2012-01-07  09:37:34  kernel: [142610.865826] ata2.01:
2012-01-08  09:37:34  kernel: [142610.865835] ata2.01:
2012-01-09  09:37:34  kernel: [142610.873997] ata2.00:
2012-01-01  09:37:34  kernel: [142610.889964] ata2.00:
2012-01-02  09:37:34  kernel: [142611.145547] ata1.00:
2012-01-03  09:37:34  kernel: [142611.145558] ata1.01:
2012-01-04  09:37:34  kernel: [142611.153728] ata1.00:
2012-01-05  09:37:34  kernel: [142611.161928] ata1.00:
2012-01-06  09:37:34  kernel: [142611.190133] PM:
2012-01-07  09:37:34  kernel: [142611.190169] PM:
2012-01-08  09:37:34  kernel: [142611.190173] PM:
2012-01-09  09:37:34  kernel: [142611.191213] PM:
2012-01-01  09:37:34  kernel: [142611.191267] PM:
2012-01-02  09:37:34  kernel: [142611.191296] PM:
2012-01-03  09:37:34  kernel: [142611.191297] Restarting
2012-01-04  09:37:34  anacron[15579]: Anacron 2.3
2012-01-05  09:37:34  anacron[15579]: Normal exit
2012-01-06  09:37:34  kernel: [142611.282257] bcma-pci-bridge
2012-01-07  09:37:34  kernel: [142611.282274] bcma-pci-bridge
2012-01-08  09:37:34  kernel: [142611.282356] bcma:
2012-01-09  09:37:34  kernel: [142611.282393] bcma:
2012-01-01  09:37:34  kernel: [142611.282481] bcma:
2012-01-02  09:37:34  kernel: [142611.282678] bcma:
2012-01-03  09:37:34  kernel: [142611.358663] bcma:
2012-01-04  09:37:34  kernel: [142611.360598] cfg80211:
2012-01-05  09:37:34  kernel: [142611.365308] cfg80211:
2012-01-06  09:37:34  kernel: [142611.365310] cfg80211:
2012-01-07  09:37:34  kernel: [142611.365313] cfg80211:
2012-01-08  09:37:34  kernel: [142611.365316] cfg80211:
2012-01-09  09:37:34  kernel: [142611.365318] cfg80211:
2012-01-01  09:37:34  kernel: [142611.365321] cfg80211:
2012-01-02  09:37:34  kernel: [142611.365323] cfg80211:
2012-01-03  09:37:34  kernel: [142611.366185] b43-phy0:
2012-01-04  09:37:34  kernel: [142611.366858] cfg80211:
2012-01-05  09:37:34  kernel: [142611.366860] cfg80211:
2012-01-06  09:37:34  kernel: [142611.366861] cfg80211:
2012-01-07  09:37:34  kernel: [142611.366863] cfg80211:
2012-01-08  09:37:34  kernel: [142611.366865] cfg80211:
2012-01-09  09:37:34  kernel: [142611.366866] cfg80211:
2012-01-01  09:37:34  kernel: [142611.366868] cfg80211:
2012-01-02  09:37:34  kernel: [142611.366870] cfg80211:
2012-01-03  09:37:34  kernel: [142611.366871] cfg80211:
2012-01-04  09:37:34  kernel: [142611.366873] cfg80211:
2012-01-05  09:37:34  kernel: [142611.366874] cfg80211:
2012-01-06  09:37:34  kernel: [142611.366876] cfg80211:
2012-01-07  09:37:34  kernel: [142611.366877] cfg80211:
2012-01-08  09:37:34  kernel: [142611.366879] cfg80211:
2012-01-09  09:37:34  kernel: [142611.366881] cfg80211:
2012-01-01  09:37:34  kernel: [142611.366882] cfg80211:
2012-01-02  09:37:34  kernel: [142611.366884] cfg80211:
2012-01-03  09:37:34  kernel: [142611.366886] cfg80211:
2012-01-04  09:37:34  kernel: [142611.366887] cfg80211:
2012-01-05  09:37:34  kernel: [142611.366889] cfg80211:
2012-01-06  09:37:34  kernel: [142611.366890] cfg80211:
2012-01-07  09:37:34  kernel: [142611.366892] cfg80211:
2012-01-08  09:37:34  kernel: [142611.366893] cfg80211:
2012-01-09  09:37:34  kernel: [142611.366895] cfg80211:
2012-01-01  09:37:34  kernel: [142611.366896] cfg80211:
2012-01-02  09:37:34  kernel: [142611.366898] cfg80211:
2012-01-03  09:37:34  kernel: [142611.366900] cfg80211:
2012-01-04  09:37:34  kernel: [142611.366901] cfg80211:
2012-01-05  09:37:34  kernel: [142611.366998] ieee80211
2012-01-06  09:37:34  kernel: [142611.367354] Broadcom
2012-01-07  09:37:34  NetworkManager[1127]: <info> found
2012-01-08  09:37:34  NetworkManager[1127]: <info> WiFi
2012-01-09  09:37:34  NetworkManager[1127]: SCPlugin-Ifupdown: devices
2012-01-01  09:37:34  NetworkManager[1127]: SCPlugin-Ifupdown: device
2012-01-02  09:37:34  NetworkManager[1127]: <info> (wlan0):
2012-01-03  09:37:34  NetworkManager[1127]: <warn> (wlan0):
2012-01-04  09:37:34  NetworkManager[1127]: <info> (wlan0):
2012-01-05  09:37:34  NetworkManager[1127]: <info> (wlan0):
2012-01-06  09:37:35  NetworkManager[1127]: <info> wake
2012-01-07  09:37:35  NetworkManager[1127]: <info> waking
2012-01-08  09:37:35  NetworkManager[1127]: <info> (eth0):
2012-01-09  09:37:35  NetworkManager[1127]: <info> (eth0):
2012-01-01  09:37:35  NetworkManager[1127]: <info> (eth0):
2012-01-02  09:37:35  kernel: [142611.760464] tg3
2012-01-03  09:37:35  kernel: [142611.760472] tg3
2012-01-04  09:37:35  kernel: [142611.760480] tg3
2012-01-05  09:37:35  kernel: [142611.760487] tg3
2012-01-06  09:37:35  kernel: [142611.760492] tg3
2012-01-07  09:37:35  NetworkManager[1127]: <info> (eth0):
2012-01-08  09:37:35  NetworkManager[1127]: <info> (eth0):
2012-01-09  09:37:35  NetworkManager[1127]: <info> Unmanaged
2012-01-01  09:37:35  NetworkManager[1127]: <info> Unmanaged
2012-01-02  09:37:35  NetworkManager[1127]: <info> (wlan0):
2012-01-03  09:37:35  NetworkManager[1127]: <info> (wlan0):
2012-01-04  09:37:35  NetworkManager[1127]: <info> (wlan0):
2012-01-05  09:37:35  NetworkManager[1127]: <info> (wlan0):
2012-01-06  09:37:35  kernel: [142612.052707] ADDRCONF(NETDEV_UP):
2012-01-07  09:37:35  kernel: [142612.053500] ADDRCONF(NETDEV_UP):
2012-01-08  09:37:36  NetworkManager[1127]: <info> (eth0):
2012-01-09  09:37:36  NetworkManager[1127]: <info> (eth0):
2012-01-01  09:37:36  NetworkManager[1127]: <info> Auto-activating
2012-01-02  09:37:36  NetworkManager[1127]: <info> Activation
2012-01-03  09:37:36  kernel: [142613.615346] tg3
2012-01-04  09:37:36  kernel: [142613.615356] tg3
2012-01-05  09:37:36  NetworkManager[1127]: <info> (eth0):
2012-01-06  09:37:36  kernel: [142613.615363] tg3
2012-01-07  09:37:36  kernel: [142613.615668] ADDRCONF(NETDEV_CHANGE):
2012-01-08  09:37:36  NetworkManager[1127]: <info> Activation
2012-01-09  09:37:36  NetworkManager[1127]: <info> Activation
2012-01-01  09:37:36  NetworkManager[1127]: <info> Activation
2012-01-02  09:37:36  NetworkManager[1127]: <info> Activation
2012-01-03  09:37:36  NetworkManager[1127]: <info> Activation
2012-01-04  09:37:36  NetworkManager[1127]: <info> (eth0):
2012-01-05  09:37:36  NetworkManager[1127]: <info> Activation
2012-01-06  09:37:36  NetworkManager[1127]: <info> Activation
2012-01-07  09:37:36  NetworkManager[1127]: <info> Activation
2012-01-08  09:37:36  NetworkManager[1127]: <info> Activation
2012-01-09  09:37:36  NetworkManager[1127]: <info> (eth0):
2012-01-01  09:37:36  NetworkManager[1127]: <info> Activation
2012-01-02  09:37:36  dhclient: Internet Systems
2012-01-03  09:37:36  dhclient: Copyright 2004-2011
2012-01-04  09:37:36  dhclient: All rights
2012-01-05  09:37:36  dhclient: For info,
2012-01-06  09:37:36  dhclient:  
2012-01-07  09:37:36  NetworkManager[1127]: <info> dhclient
2012-01-08  09:37:36  NetworkManager[1127]: <info> Activation
2012-01-09  09:37:36  NetworkManager[1127]: <info> Activation
2012-01-01  09:37:36  NetworkManager[1127]: <info> (eth0):
2012-01-02  09:37:36  dhclient: Listening on
2012-01-03  09:37:36  dhclient: Sending on
2012-01-04  09:37:36  dhclient: Sending on
2012-01-05  09:37:36  dhclient: DHCPDISCOVER on
2012-01-06  09:37:37  dhclient: DHCPREQUEST of
2012-01-07  09:37:37  dhclient: DHCPOFFER of
2012-01-08  09:37:37  dhclient: DHCPACK of
2012-01-09  09:37:37  dhclient: bound to
2012-01-01  09:37:37  NetworkManager[1127]: <info> (eth0):
2012-01-02  09:37:37  NetworkManager[1127]: <info> address
2012-01-03  09:37:37  NetworkManager[1127]: <info> prefix
2012-01-04  09:37:37  NetworkManager[1127]: <info> gateway
2012-01-05  09:37:37  NetworkManager[1127]: <info> hostname
2012-01-06  09:37:37  NetworkManager[1127]: <info> nameserver
2012-01-07  09:37:37  NetworkManager[1127]: <info> nameserver
2012-01-08  09:37:37  NetworkManager[1127]: <info> Activation
2012-01-09  09:37:37  NetworkManager[1127]: <info> Activation
2012-01-01  09:37:38  dnsmasq[14766]: exiting on
2012-01-02  09:37:38  NetworkManager[1127]: <info> DNS:
2012-01-03  09:37:38  NetworkManager[1127]: <info> (eth0):
2012-01-04  09:37:38  NetworkManager[1127]: <info> (eth0):
2012-01-05  09:37:38  dnsmasq[16068]: started, version
2012-01-06  09:37:38  dnsmasq[16068]: compile time
2012-01-07  09:37:38  dnsmasq[16068]: using nameserver
2012-01-08  09:37:38  dnsmasq[16068]: using nameserver
2012-01-09  09:37:39  NetworkManager[1127]: <info> Policy
2012-01-01  09:37:39  NetworkManager[1127]: <info> Activation
2012-01-02  09:37:39  NetworkManager[1127]: <info> Activation
2012-01-03  09:37:39  dbus[1092]: [system] Activating
2012-01-04  09:37:39  dbus[1092]: [system] Successfully
2012-01-05  09:37:41  gnome-screensaver-dialog: pam_ecryptfs: pam_sm_authenticate:
2012-01-06  09:37:47  kernel: [142623.749159] eth0:
2012-01-07  09:37:47  ntpdate[16132]: step time
2012-01-08  09:37:55  NetworkManager[1127]: <info> (eth0):
2012-01-09  09:37:55  NetworkManager[1127]: <info> Activation
2012-01-01  09:37:55  NetworkManager[1127]: <info> Activation
2012-01-02  09:37:55  NetworkManager[1127]: <info> Activation
2012-01-03  09:38:19  dbus[1092]: [system] Activating
2012-01-04  09:38:19  AptDaemon: INFO: Initializing
2012-01-05  09:38:19  dbus[1092]: [system] Successfully
2012-01-06  09:38:19  AptDaemon.PackageKit: INFO: Initializing
2012-01-07  09:38:19  AptDaemon: INFO: CommitPackages()
2012-01-08  09:38:20  AptDaemon.Trans: INFO: Queuing
2012-01-09  09:38:24  AptDaemon.Worker: INFO: Simulating
2012-01-01  09:38:24  AptDaemon.Worker: INFO: Committing
2012-01-02  09:38:25  AptDaemon.Worker: INFO: Processing
2012-01-03  09:43:30  anacron[16257]: Anacron 2.3
2012-01-04  09:43:30  anacron[16257]: Normal exit
2012-01-05  10:05:34  kernel: [144290.760767] CPU6:
2012-01-06  10:05:34  kernel: [144290.760771] CPU2:
2012-01-07  10:05:34  kernel: [144290.760774] CPU0:
2012-01-08  10:05:34  kernel: [144290.760779] CPU3:
2012-01-09  10:05:34  kernel: [144290.760783] CPU5:
2012-01-01  10:05:34  kernel: [144290.760786] CPU1:
2012-01-02  10:05:34  kernel: [144290.760790] CPU7:
2012-01-03  10:05:34  kernel: [144290.760794] CPU4:
2012-01-04  10:05:34  kernel: [144290.760797] CPU2:
2012-01-05  10:05:34  kernel: [144290.760801] CPU6:
2012-01-06  10:05:34  kernel: [144290.765807] CPU2:
2012-01-07  10:05:34  kernel: [144290.765810] CPU6:
2012-01-08  10:05:34  kernel: [144290.765813] CPU3:
2012-01-09  10:05:34  kernel: [144290.765816] CPU0:
2012-01-01  10:05:34  kernel: [144290.765819] CPU7:
2012-01-02  10:05:34  kernel: [144290.765822] CPU1:
2012-01-03  10:05:34  kernel: [144290.765825] CPU4:
2012-01-04  10:05:34  kernel: [144290.765827] CPU5:
2012-01-05  10:05:34  kernel: [144290.765829] CPU6:
2012-01-06  10:05:34  kernel: [144290.765832] CPU2:
2012-01-07  10:05:39  AptDaemon.Trans: INFO: Cancelling
2012-01-08  10:05:40  AptDaemon.Worker: INFO: Finished
2012-01-09  10:05:54  kernel: [144310.995421] [Hardware
2012-01-01  10:06:40  AptDaemon.PackageKit: INFO: Initializing
2012-01-02  10:06:40  AptDaemon.Worker: INFO: Simulating
2012-01-03  10:06:40  AptDaemon.Worker: INFO: Processing
2012-01-04  10:06:41  AptDaemon.PackageKit: INFO: Get
2012-01-05  10:06:41  AptDaemon.Worker: INFO: Finished
2012-01-06  10:12:33  AptDaemon: INFO: Quitting
2012-01-07  10:12:33  AptDaemon: INFO: Quitting
2012-01-08  10:15:44  kernel: [144899.845423] CPU6:
2012-01-09  10:15:44  kernel: [144899.845427] CPU3:
2012-01-01  10:15:44  kernel: [144899.845432] CPU0:
2012-01-02  10:15:44  kernel: [144899.845436] CPU1:
2012-01-03  10:15:44  kernel: [144899.845439] CPU2:
2012-01-04  10:15:44  kernel: [144899.845442] CPU5:
2012-01-05  10:15:44  kernel: [144899.845445] CPU4:
2012-01-06  10:15:44  kernel: [144899.845449] CPU7:
2012-01-07  10:15:44  kernel: [144899.845452] CPU2:
2012-01-08  10:15:44  kernel: [144899.845455] CPU6:
2012-01-09  10:15:44  kernel: [144899.846383] CPU6:
2012-01-01  10:15:44  kernel: [144899.846385] CPU1:
2012-01-02  10:15:44  kernel: [144899.846388] CPU3:
2012-01-03  10:15:44  kernel: [144899.846390] CPU4:
2012-01-04  10:15:44  kernel: [144899.846393] CPU7:
2012-01-05  10:15:44  kernel: [144899.846395] CPU0:
2012-01-06  10:15:44  kernel: [144899.846397] CPU2:
2012-01-07  10:15:44  kernel: [144899.846399] CPU5:
2012-01-08  10:15:44  kernel: [144899.846402] CPU2:
2012-01-09  10:15:44  kernel: [144899.846404] CPU6:
2012-01-01  10:17:01  CRON[16609]: (root) CMD
2012-01-02  10:17:30  kernel: [145006.236581] [Hardware
2012-01-03  10:32:27  NetworkManager[1127]: <info> (eth0):
2012-01-04  10:32:27  kernel: [145902.179285] tg3
2012-01-05  10:32:31  NetworkManager[1127]: <info> (eth0):
2012-01-06  10:32:31  NetworkManager[1127]: <info> (eth0):
2012-01-07  10:32:32  NetworkManager[1127]: <info> (eth0):
2012-01-08  10:32:32  dnsmasq[16068]: exiting on
2012-01-09  10:32:32  NetworkManager[1127]: <info> DNS:
2012-01-01  10:32:32  NetworkManager[1127]: <info> (eth0):
2012-01-02  10:32:32  dnsmasq[16617]: started, version
2012-01-03  10:32:32  dnsmasq[16617]: compile time
2012-01-04  10:32:32  dnsmasq[16617]: warning: no
2012-01-05  10:32:32  kernel: [145906.703379] ADDRCONF(NETDEV_UP):
2012-01-06  10:32:32  dbus[1092]: [system] Activating
2012-01-07  10:32:32  dbus[1092]: [system] Successfully
2012-01-08  10:32:32  kernel: [145906.924958] CPU0:
2012-01-09  10:32:32  kernel: [145906.924963] CPU3:
2012-01-01  10:32:32  kernel: [145906.924966] CPU4:
2012-01-02  10:32:32  kernel: [145906.924970] CPU5:
2012-01-03  10:32:32  kernel: [145906.924974] CPU1:
2012-01-04  10:32:32  kernel: [145906.924977] CPU7:
2012-01-05  10:32:32  kernel: [145906.924981] CPU2:
2012-01-06  10:32:32  kernel: [145906.924984] CPU6:
2012-01-07  10:32:32  kernel: [145906.924987] CPU2:
2012-01-08  10:32:32  kernel: [145906.924989] CPU6:
2012-01-09  10:32:32  kernel: [145906.925967] CPU4:
2012-01-01  10:32:32  kernel: [145906.925969] CPU6:
2012-01-02  10:32:32  kernel: [145906.925971] CPU2:
2012-01-03  10:32:32  kernel: [145906.925973] CPU3:
2012-01-04  10:32:32  kernel: [145906.925975] CPU5:
2012-01-05  10:32:32  kernel: [145906.925977] CPU1:
2012-01-06  10:32:32  kernel: [145906.925979] CPU0:
2012-01-07  10:32:32  kernel: [145906.925982] CPU7:
2012-01-08  10:32:32  kernel: [145906.925984] CPU6:
2012-01-09  10:32:32  kernel: [145906.925985] CPU2:
2012-01-01  10:33:13  NetworkManager[1127]: <info> (eth0):
2012-01-02  10:33:13  NetworkManager[1127]: <info> (eth0):
2012-01-03  10:33:13  NetworkManager[1127]: <info> Auto-activating
2012-01-04  10:33:13  NetworkManager[1127]: <info> Activation
2012-01-05  10:33:13  NetworkManager[1127]: <info> (eth0):
2012-01-06  10:33:13  kernel: [145947.980648] tg3
2012-01-07  10:33:13  kernel: [145947.980650] tg3
2012-01-08  10:33:13  kernel: [145947.980652] tg3
2012-01-09  10:33:13  kernel: [145947.980737] ADDRCONF(NETDEV_CHANGE):
2012-01-01  10:33:13  NetworkManager[1127]: <info> Activation
2012-01-02  10:33:13  NetworkManager[1127]: <info> Activation
2012-01-03  10:33:13  NetworkManager[1127]: <info> Activation
2012-01-04  10:33:13  NetworkManager[1127]: <info> Activation
2012-01-05  10:33:13  NetworkManager[1127]: <info> Activation
2012-01-06  10:33:13  NetworkManager[1127]: <info> (eth0):
2012-01-07  10:33:13  NetworkManager[1127]: <info> Activation
2012-01-08  10:33:13  NetworkManager[1127]: <info> Activation
2012-01-09  10:33:13  NetworkManager[1127]: <info> Activation
2012-01-01  10:33:13  NetworkManager[1127]: <info> Activation
2012-01-02  10:33:13  NetworkManager[1127]: <info> (eth0):
2012-01-03  10:33:13  NetworkManager[1127]: <info> Activation
2012-01-04  10:33:13  NetworkManager[1127]: <info> dhclient
2012-01-05  10:33:13  NetworkManager[1127]: <info> Activation
2012-01-06  10:33:13  NetworkManager[1127]: <info> Activation
2012-01-07  10:33:13  dhclient: Internet Systems
2012-01-08  10:33:13  dhclient: Copyright 2004-2011
2012-01-09  10:33:13  dhclient: All rights
2012-01-01  10:33:13  dhclient: For info,
2012-01-02  10:33:13  dhclient:  
2012-01-03  10:33:13  NetworkManager[1127]: <info> (eth0):
2012-01-04  10:33:13  dhclient: Listening on
2012-01-05  10:33:13  dhclient: Sending on
2012-01-06  10:33:13  dhclient: Sending on
2012-01-07  10:33:13  dhclient: DHCPREQUEST of
2012-01-08  10:33:13  dhclient: DHCPACK of
2012-01-09  10:33:13  dhclient: bound to
2012-01-01  10:33:13  NetworkManager[1127]: <info> (eth0):
2012-01-02  10:33:13  NetworkManager[1127]: <info> address
2012-01-03  10:33:13  NetworkManager[1127]: <info> prefix
2012-01-04  10:33:13  NetworkManager[1127]: <info> gateway
2012-01-05  10:33:13  NetworkManager[1127]: <info> hostname
2012-01-06  10:33:13  NetworkManager[1127]: <info> nameserver
2012-01-07  10:33:13  NetworkManager[1127]: <info> nameserver
2012-01-08  10:33:13  NetworkManager[1127]: <info> Activation
2012-01-09  10:33:13  NetworkManager[1127]: <info> Activation
2012-01-01  10:33:14  dnsmasq[16617]: exiting on
2012-01-02  10:33:14  NetworkManager[1127]: <info> DNS:
2012-01-03  10:33:14  NetworkManager[1127]: <info> (eth0):
2012-01-04  10:33:14  dnsmasq[16644]: started, version
2012-01-05  10:33:14  dnsmasq[16644]: compile time
2012-01-06  10:33:14  dnsmasq[16644]: using nameserver
2012-01-07  10:33:14  dnsmasq[16644]: using nameserver
2012-01-08  10:33:14  NetworkManager[1127]: <info> (eth0):
2012-01-09  10:33:14  NetworkManager[1127]: <info> Policy
2012-01-01  10:33:14  NetworkManager[1127]: <info> Activation
2012-01-02  10:33:14  dbus[1092]: [system] Activating
2012-01-03  10:33:14  NetworkManager[1127]: <info> Activation
2012-01-04  10:33:14  dbus[1092]: [system] Successfully
2012-01-05  10:33:23  kernel: [145958.164609] eth0:
2012-01-06  10:33:24  ntpdate[16708]: adjust time
2012-01-07  10:33:24  kernel: [145959.395445] [Hardware
2012-01-08  10:33:33  NetworkManager[1127]: <info> (eth0):
2012-01-09  10:33:33  NetworkManager[1127]: <info> Activation
2012-01-01  10:33:33  NetworkManager[1127]: <info> Activation
2012-01-02  10:33:33  NetworkManager[1127]: <info> Activation
2012-01-03  10:43:49  kernel: [146583.435659] CPU2:
2012-01-04  10:43:49  kernel: [146583.435663] CPU6:
2012-01-05  10:43:49  kernel: [146583.435667] CPU7:
2012-01-06  10:43:49  kernel: [146583.435670] CPU3:
2012-01-07  10:43:49  kernel: [146583.435673] CPU4:
2012-01-08  10:43:49  kernel: [146583.435677] CPU0:
2012-01-09  10:43:49  kernel: [146583.435680] CPU6:
2012-01-01  10:43:49  kernel: [146583.435683] CPU2:
2012-01-02  10:43:49  kernel: [146583.435687] CPU5:
2012-01-03  10:43:49  kernel: [146583.435690] CPU1:
2012-01-04  10:43:49  kernel: [146583.436659] CPU6:
2012-01-05  10:43:49  kernel: [146583.436661] CPU2:
2012-01-06  10:43:49  kernel: [146583.436663] CPU4:
2012-01-07  10:43:49  kernel: [146583.436665] CPU3:
2012-01-08  10:43:49  kernel: [146583.436668] CPU7:
2012-01-09  10:43:49  kernel: [146583.436670] CPU0:
2012-01-01  10:43:49  kernel: [146583.436672] CPU2:
2012-01-02  10:43:49  kernel: [146583.436674] CPU6:
2012-01-03  10:43:49  kernel: [146583.436685] CPU1:
2012-01-04  10:43:49  kernel: [146583.436688] CPU5:
2012-01-05  10:45:00  kernel: [146654.791212] [Hardware
2012-01-06  10:58:24  dbus[1092]: [system] Activating
2012-01-07  10:58:24  AptDaemon: INFO: Initializing
2012-01-08  10:58:24  dbus[1092]: [system] Successfully
2012-01-09  10:58:24  AptDaemon.PackageKit: INFO: Initializing
2012-01-01  10:58:24  AptDaemon: INFO: CommitPackages()
2012-01-02  10:58:24  AptDaemon.Trans: INFO: Queuing
2012-01-03  10:58:31  AptDaemon.Worker: INFO: Simulating
2012-01-04  10:58:32  AptDaemon.Worker: INFO: Committing
2012-01-05  10:58:32  AptDaemon.Worker: INFO: Processing
2012-01-06  11:02:06  AptDaemon.Trans: INFO: Cancelling
2012-01-07  11:02:08  AptDaemon.Worker: INFO: Finished
2012-01-08  11:03:09  AptDaemon.PackageKit: INFO: Initializing
2012-01-09  11:03:09  AptDaemon.Worker: INFO: Simulating
2012-01-01  11:03:09  AptDaemon.Worker: INFO: Processing
2012-01-02  11:03:09  AptDaemon.PackageKit: INFO: Get
2012-01-03  11:03:09  AptDaemon.Worker: INFO: Finished
2012-01-04  11:04:55  AptDaemon: INFO: CommitPackages()
2012-01-05  11:04:55  AptDaemon.Trans: INFO: Queuing
2012-01-06  11:05:00  AptDaemon.Worker: INFO: Simulating
2012-01-07  11:05:00  AptDaemon.Worker: INFO: Committing
2012-01-08  11:05:01  AptDaemon.Worker: INFO: Processing
2012-01-09  11:16:31  AptDaemon.Trans: INFO: Cancelling
2012-01-01  11:16:32  AptDaemon.Worker: INFO: Finished
2012-01-02  11:17:01  CRON[16971]: (root) CMD
2012-01-03  11:17:32  AptDaemon.PackageKit: INFO: Initializing
2012-01-04  11:17:32  AptDaemon.Worker: INFO: Simulating
2012-01-05  11:17:32  AptDaemon.Worker: INFO: Processing
2012-01-06  11:17:33  AptDaemon.PackageKit: INFO: Get
2012-01-07  11:17:33  AptDaemon.Worker: INFO: Finished
2012-01-08  11:23:32  AptDaemon: INFO: Quitting
2012-01-09  11:23:32  AptDaemon: INFO: Quitting
2012-01-01  11:25:04  gnome-screensaver-dialog: pam_ecryptfs: pam_sm_authenticate:
2012-01-02  11:25:18  NetworkManager[1127]: <info> sleep
2012-01-03  11:25:18  NetworkManager[1127]: <info> sleeping
2012-01-04  11:25:18  NetworkManager[1127]: <info> (eth0):
2012-01-05  11:25:18  NetworkManager[1127]: <info> (eth0):
2012-01-06  11:25:18  NetworkManager[1127]: <info> (eth0):
2012-01-07  11:25:18  kernel: [149069.922286] tg3
2012-01-08  11:25:18  NetworkManager[1127]: <info> (eth0):
2012-01-09  11:25:18  dnsmasq[16644]: exiting on
2012-01-01  11:25:18  NetworkManager[1127]: <info> DNS:
2012-01-02  11:25:18  NetworkManager[1127]: <info> (eth0):
2012-01-03  11:25:18  NetworkManager[1127]: <info> (eth0):
2012-01-04  11:25:18  dnsmasq[17021]: started, version
2012-01-05  11:25:18  dnsmasq[17021]: compile time
2012-01-06  11:25:18  dnsmasq[17021]: warning: no
2012-01-07  11:25:18  NetworkManager[1127]: <info> (eth0):
2012-01-08  11:25:18  kernel: [149069.943676] ADDRCONF(NETDEV_UP):
2012-01-09  11:25:18  NetworkManager[1127]: <info> (wlan0):
2012-01-01  11:25:18  NetworkManager[1127]: <info> (wlan0):
2012-01-02  11:25:18  dbus[1092]: [system] Activating
2012-01-03  11:25:18  NetworkManager[1127]: <info> (eth0):
2012-01-04  11:25:18  dbus[1092]: [system] Successfully
2012-01-05  11:25:19  anacron[17112]: Anacron 2.3
2012-01-06  11:25:19  anacron[17112]: Normal exit
2012-01-07  11:25:19  NetworkManager[1127]: SCPlugin-Ifupdown: devices
2012-01-08  11:25:19  NetworkManager[1127]: <info> radio
2012-01-09  11:25:19  NetworkManager[1127]: <info> WiFi
2012-01-01  11:25:20  kernel: [149071.669528] bcma-pci-bridge
2012-01-02  11:41:37  kernel: [149074.113021] PM:
2012-01-03  11:41:37  kernel: [149074.258012] PM:
2012-01-04  11:41:37  kernel: [149074.258023] Freezing
2012-01-05  11:41:37  kernel: [149074.274770] Freezing
2012-01-06  11:41:37  kernel: [149074.290744] PM:
2012-01-07  11:41:37  kernel: [149074.290797] Suspending
2012-01-08  11:41:37  kernel: [149074.291460] sd
2012-01-09  11:41:37  kernel: [149074.291526] apple-gmux
2012-01-01  11:41:37  kernel: [149074.291565] sd
2012-01-02  11:41:37  kernel: [149074.292207] snd_hda_intel
2012-01-03  11:41:37  kernel: [149074.292219] [fglrx]
2012-01-04  11:41:37  kernel: [149074.292257] pciehp
2012-01-05  11:41:37  kernel: [149074.292293] [fglrx]
2012-01-06  11:41:37  kernel: [149074.330712] uhci_hcd
2012-01-07  11:41:37  kernel: [149074.330736] uhci_hcd
2012-01-08  11:41:37  kernel: [149074.338654] ehci_hcd
2012-01-09  11:41:37  kernel: [149074.354637] ehci_hcd
2012-01-01  11:41:37  kernel: [149074.394719] snd_hda_intel
2012-01-02  11:41:37  kernel: [149074.410580] PM:
2012-01-03  11:41:37  kernel: [149074.920661] PM:
2012-01-04  11:41:37  kernel: [149074.920679] PM:
2012-01-05  11:41:37  kernel: [149074.920714] PM:
2012-01-06  11:41:37  kernel: [149074.920979] ata_piix
2012-01-07  11:41:37  kernel: [149074.934071] PM:
2012-01-08  11:41:37  kernel: [149075.224839] [fglrx]
2012-01-09  11:41:37  kernel: [149075.224841] [fglrx]
2012-01-01  11:41:37  kernel: [149075.224916] PM:
2012-01-02  11:41:37  kernel: [149075.224964] PM:
2012-01-03  11:41:37  kernel: [149075.225034] PM:
2012-01-04  11:41:37  kernel: [149075.225041] PM:
2012-01-05  11:41:37  kernel: [149075.225044] PM:
2012-01-06  11:41:37  kernel: [149075.225460] ehci_hcd
2012-01-07  11:41:37  kernel: [149075.225467] ehci_hcd
2012-01-08  11:41:37  kernel: [149075.238178] ehci_hcd
2012-01-09  11:41:37  kernel: [149075.238188] ehci_hcd
2012-01-01  11:41:37  kernel: [149075.269910] PM:
2012-01-02  11:41:37  kernel: [149075.270103] ACPI:
2012-01-03  11:41:37  kernel: [149075.309888] PM:
2012-01-04  11:41:37  kernel: [149075.310033] Disabling
2012-01-05  11:41:37  kernel: [149075.413683] CPU
2012-01-06  11:41:37  kernel: [149075.517580] CPU
2012-01-07  11:41:37  kernel: [149075.621476] CPU
2012-01-08  11:41:37  kernel: [149075.725376] CPU
2012-01-09  11:41:37  kernel: [149075.829271] CPU
2012-01-01  11:41:37  kernel: [149075.933171] CPU
2012-01-02  11:41:37  kernel: [149076.037069] CPU
2012-01-03  11:41:37  kernel: [149076.037411] Extended
2012-01-04  11:41:37  kernel: [149076.037683] ACPI:
2012-01-05  11:41:37  kernel: [149076.037723] PM:
2012-01-06  11:41:37  kernel: [149076.038031] Extended
2012-01-07  11:41:37  kernel: [149076.038071] Enabling
2012-01-08  11:41:37  kernel: [149076.038169] Booting
2012-01-09  11:41:37  kernel: [149076.038171] smpboot
2012-01-01  11:41:37  kernel: [149076.048481] Initializing
2012-01-02  11:41:37  kernel: [149076.049185] Calibrating
2012-01-03  11:41:37  kernel: [149076.069509] NMI
2012-01-04  11:41:37  kernel: [149076.070168] CPU1
2012-01-05  11:41:37  kernel: [149076.070245] Booting
2012-01-06  11:41:37  kernel: [149076.070247] smpboot
2012-01-07  11:41:37  kernel: [149076.080542] Initializing
2012-01-08  11:41:37  kernel: [149076.081260] Calibrating
2012-01-09  11:41:37  kernel: [149076.101586] NMI
2012-01-01  11:41:37  kernel: [149076.102306] CPU2
2012-01-02  11:41:37  kernel: [149076.102379] Booting
2012-01-03  11:41:37  kernel: [149076.102381] smpboot
2012-01-04  11:41:37  kernel: [149076.112677] Initializing
2012-01-05  11:41:37  kernel: [149076.113395] Calibrating
2012-01-06  11:41:37  kernel: [149076.133822] NMI
2012-01-07  11:41:37  kernel: [149076.134548] CPU3
2012-01-08  11:41:37  kernel: [149076.134619] Booting
2012-01-09  11:41:37  kernel: [149076.134621] smpboot
2012-01-01  11:41:37  kernel: [149076.144917] Initializing
2012-01-02  11:41:37  kernel: [149076.145634] Calibrating
2012-01-03  11:41:37  kernel: [149076.166190] NMI
2012-01-04  11:41:37  kernel: [149076.166995] CPU4
2012-01-05  11:41:37  kernel: [149076.167157] Booting
2012-01-06  11:41:37  kernel: [149076.167159] smpboot
2012-01-07  11:41:37  kernel: [149076.177441] Initializing
2012-01-08  11:41:37  kernel: [149076.178171] Calibrating
2012-01-09  11:41:37  kernel: [149076.198875] NMI
2012-01-01  11:41:37  kernel: [149076.199832] CPU5
2012-01-02  11:41:37  kernel: [149076.200194] Booting
2012-01-03  11:41:37  kernel: [149076.200196] smpboot
2012-01-04  11:41:37  kernel: [149076.210499] Initializing
2012-01-05  11:41:37  kernel: [149076.211210] Calibrating
2012-01-06  11:41:37  kernel: [149076.232001] NMI
2012-01-07  11:41:37  kernel: [149076.232992] CPU6
2012-01-08  11:41:37  kernel: [149076.233154] Booting
2012-01-09  11:41:37  kernel: [149076.233155] smpboot
2012-01-01  11:41:37  kernel: [149076.243438] Initializing
2012-01-02  11:41:37  kernel: [149076.244168] Calibrating
2012-01-03  11:41:37  kernel: [149076.265066] NMI
2012-01-04  11:41:37  kernel: [149076.266094] CPU7
2012-01-05  11:41:37  kernel: [149076.273980] ACPI:
2012-01-06  11:41:37  kernel: [149077.228656] pcieport
2012-01-07  11:41:37  kernel: [149077.228660] pcieport
2012-01-08  11:41:37  kernel: [149077.228663] pcieport
2012-01-09  11:41:37  kernel: [149077.228665] pcieport
2012-01-01  11:41:37  kernel: [149077.228668] pcieport
2012-01-02  11:41:37  kernel: [149077.228670] pcieport
2012-01-03  11:41:37  kernel: [149077.228687] pcieport
2012-01-04  11:41:37  kernel: [149077.228690] pcieport
2012-01-05  11:41:37  kernel: [149077.228692] pcieport
2012-01-06  11:41:37  kernel: [149077.228695] pcieport
2012-01-07  11:41:37  kernel: [149077.228697] pcieport
2012-01-08  11:41:37  kernel: [149077.228699] pcieport
2012-01-09  11:41:37  kernel: [149077.228702] pcieport
2012-01-01  11:41:37  kernel: [149077.228718] mei
2012-01-02  11:41:37  kernel: [149077.228731] mei
2012-01-03  11:41:37  kernel: [149077.228749] uhci_hcd
2012-01-04  11:41:37  kernel: [149077.228759] uhci_hcd
2012-01-05  11:41:37  kernel: [149077.228768] uhci_hcd
2012-01-06  11:41:37  kernel: [149077.228788] ehci_hcd
2012-01-07  11:41:37  kernel: [149077.228803] ehci_hcd
2012-01-08  11:41:37  kernel: [149077.228809] ehci_hcd
2012-01-09  11:41:37  kernel: [149077.228825] ehci_hcd
2012-01-01  11:41:37  kernel: [149077.228829] ehci_hcd
2012-01-02  11:41:37  kernel: [149077.228842] snd_hda_intel
2012-01-03  11:41:37  kernel: [149077.228854] snd_hda_intel
2012-01-04  11:41:37  kernel: [149077.228857] snd_hda_intel
2012-01-05  11:41:37  kernel: [149077.228862] snd_hda_intel
2012-01-06  11:41:37  kernel: [149077.228886] pcieport
2012-01-07  11:41:37  kernel: [149077.228895] pcieport
2012-01-08  11:41:37  kernel: [149077.228899] pcieport
2012-01-09  11:41:37  kernel: [149077.228903] pcieport
2012-01-01  11:41:37  kernel: [149077.228907] pcieport
2012-01-02  11:41:37  kernel: [149077.228913] pcieport
2012-01-03  11:41:37  kernel: [149077.228918] pcieport
2012-01-04  11:41:37  kernel: [149077.228955] pcieport
2012-01-05  11:41:37  kernel: [149077.228964] pcieport
2012-01-06  11:41:37  kernel: [149077.228968] pcieport
2012-01-07  11:41:37  kernel: [149077.228972] pcieport
2012-01-08  11:41:37  kernel: [149077.228976] pcieport
2012-01-09  11:41:37  kernel: [149077.228982] pcieport
2012-01-01  11:41:37  kernel: [149077.228986] pcieport
2012-01-02  11:41:37  kernel: [149077.229025] pcieport
2012-01-03  11:41:37  kernel: [149077.229034] pcieport
2012-01-04  11:41:37  kernel: [149077.229038] pcieport
2012-01-05  11:41:37  kernel: [149077.229045] pcieport
2012-01-06  11:41:37  kernel: [149077.229050] pcieport
2012-01-07  11:41:37  kernel: [149077.229088] pcieport
2012-01-08  11:41:37  kernel: [149077.229097] pcieport
2012-01-09  11:41:37  kernel: [149077.229101] pcieport
2012-01-01  11:41:37  kernel: [149077.229105] pcieport
2012-01-02  11:41:37  kernel: [149077.229109] pcieport
2012-01-03  11:41:37  kernel: [149077.229115] pcieport
2012-01-04  11:41:37  kernel: [149077.229119] pcieport
2012-01-05  11:41:37  kernel: [149077.229150] uhci_hcd
2012-01-06  11:41:37  kernel: [149077.229160] uhci_hcd
2012-01-07  11:41:37  kernel: [149077.229169] uhci_hcd
2012-01-08  11:41:37  kernel: [149077.229189] ehci_hcd
2012-01-09  11:41:37  kernel: [149077.229203] ehci_hcd
2012-01-01  11:41:37  kernel: [149077.229209] ehci_hcd
2012-01-02  11:41:37  kernel: [149077.229223] ehci_hcd
2012-01-03  11:41:37  kernel: [149077.229227] ehci_hcd
2012-01-04  11:41:37  kernel: [149077.229268] ata_piix
2012-01-05  11:41:37  kernel: [149077.229277] ata_piix
2012-01-06  11:41:37  kernel: [149077.229281] ata_piix
2012-01-07  11:41:37  kernel: [149077.229284] ata_piix
2012-01-08  11:41:37  kernel: [149077.229288] ata_piix
2012-01-09  11:41:37  kernel: [149077.229292] ata_piix
2012-01-01  11:41:37  kernel: [149077.229297] ata_piix
2012-01-02  11:41:37  kernel: [149077.229309] pci
2012-01-03  11:41:37  kernel: [149077.229322] pci
2012-01-04  11:41:37  kernel: [149077.229327] pci
2012-01-05  11:41:37  kernel: [149077.229347] fglrx_pci
2012-01-06  11:41:37  kernel: [149077.229352] fglrx_pci
2012-01-07  11:41:37  kernel: [149077.229358] fglrx_pci
2012-01-08  11:41:37  kernel: [149077.229363] fglrx_pci
2012-01-09  11:41:37  kernel: [149077.229367] fglrx_pci
2012-01-01  11:41:37  kernel: [149077.229370] fglrx_pci
2012-01-02  11:41:37  kernel: [149077.229374] fglrx_pci
2012-01-03  11:41:37  kernel: [149077.229410] snd_hda_intel
2012-01-04  11:41:37  kernel: [149077.229423] snd_hda_intel
2012-01-05  11:41:37  kernel: [149077.229426] snd_hda_intel
2012-01-06  11:41:37  kernel: [149077.229431] snd_hda_intel
2012-01-07  11:41:37  kernel: [149077.229519] tg3
2012-01-08  11:41:37  kernel: [149077.229544] tg3
2012-01-09  11:41:37  kernel: [149077.229552] tg3
2012-01-01  11:41:37  kernel: [149077.229558] tg3
2012-01-02  11:41:37  kernel: [149077.229566] tg3
2012-01-03  11:41:37  kernel: [149077.229659] pci
2012-01-04  11:41:37  kernel: [149077.229698] pci
2012-01-05  11:41:37  kernel: [149077.229707] pci
2012-01-06  11:41:37  kernel: [149077.229719] pci
2012-01-07  11:41:37  kernel: [149077.229788] firewire_ohci
2012-01-08  11:41:37  kernel: [149077.229820] firewire_ohci
2012-01-09  11:41:37  kernel: [149077.229827] firewire_ohci
2012-01-01  11:41:37  kernel: [149077.229916] PM:
2012-01-02  11:41:37  kernel: [149077.229991] uhci_hcd
2012-01-03  11:41:37  kernel: [149077.229999] uhci_hcd
2012-01-04  11:41:37  kernel: [149077.230025] ehci_hcd
2012-01-05  11:41:37  kernel: [149077.230027] usb
2012-01-06  11:41:37  kernel: [149077.230033] mei
2012-01-07  11:41:37  kernel: [149077.230035] ehci_hcd
2012-01-08  11:41:37  kernel: [149077.230043] snd_hda_intel
2012-01-09  11:41:37  kernel: [149077.230049] snd_hda_intel
2012-01-01  11:41:37  kernel: [149077.230072] uhci_hcd
2012-01-02  11:41:37  kernel: [149077.230075] ehci_hcd
2012-01-03  11:41:37  kernel: [149077.230080] pciehp
2012-01-04  11:41:37  kernel: [149077.230087] ata_piix
2012-01-05  11:41:37  kernel: [149077.230090] uhci_hcd
2012-01-06  11:41:37  kernel: [149077.230092] ehci_hcd
2012-01-07  11:41:37  kernel: [149077.230097] ata_piix
2012-01-08  11:41:37  kernel: [149077.230121] snd_hda_intel
2012-01-09  11:41:37  kernel: [149077.230140] usb
2012-01-01  11:41:37  kernel: [149077.230143] snd_hda_intel
2012-01-02  11:41:37  kernel: [149077.230175] snd_hda_intel
2012-01-03  11:41:37  kernel: [149077.230230] fglrx_pci
2012-01-04  11:41:37  kernel: [149077.230268] snd_hda_intel
2012-01-05  11:41:37  kernel: [149077.233469] sd
2012-01-06  11:41:37  kernel: [149077.235355] [fglrx]
2012-01-07  11:41:37  kernel: [149077.235534] [fglrx]
2012-01-08  11:41:37  kernel: [149077.280813] [fglrx]
2012-01-09  11:41:37  kernel: [149077.280889] [fglrx]
2012-01-01  11:41:37  kernel: [149077.284586] firewire_ohci
2012-01-02  11:41:37  kernel: [149077.284829] firewire_core:
2012-01-03  11:41:37  kernel: [149077.348453] PM:
2012-01-04  11:41:37  kernel: [149077.348457] PM:
2012-01-05  11:41:37  kernel: [149077.348460] PM:
2012-01-06  11:41:37  kernel: [149077.348464] PM:
2012-01-07  11:41:37  kernel: [149077.348474] PM:
2012-01-08  11:41:37  kernel: [149077.348477] PM:
2012-01-09  11:41:37  kernel: [149077.353290] PM:
2012-01-01  11:41:37  kernel: [149077.353293] PM:
2012-01-02  11:41:37  kernel: [149077.353307] PM:
2012-01-03  11:41:37  kernel: [149077.353310] PM:
2012-01-04  11:41:37  kernel: [149077.353313] PM:
2012-01-05  11:41:37  kernel: [149077.353316] PM:
2012-01-06  11:41:37  kernel: [149077.353319] PM:
2012-01-07  11:41:37  kernel: [149077.353321] PM:
2012-01-08  11:41:37  kernel: [149077.353324] PM:
2012-01-09  11:41:37  kernel: [149077.353327] PM:
2012-01-01  11:41:37  kernel: [149077.353646] PM:
2012-01-02  11:41:37  kernel: [149077.353650] PM:
2012-01-03  11:41:37  kernel: [149077.353686] PM:
2012-01-04  11:41:37  kernel: [149077.370456] PM:
2012-01-05  11:41:37  kernel: [149077.401047] PM:
2012-01-06  11:41:37  kernel: [149077.401052] PM:
2012-01-07  11:41:37  kernel: [149077.401056] PM:
2012-01-08  11:41:37  kernel: [149077.401059] PM:
2012-01-09  11:41:37  kernel: [149077.401062] PM:
2012-01-01  11:41:37  kernel: [149077.401067] PM:
2012-01-02  11:41:37  kernel: [149077.401069] PM:
2012-01-03  11:41:37  kernel: [149077.401078] PM:
2012-01-04  11:41:37  kernel: [149077.401084] PM:
2012-01-05  11:41:37  kernel: [149077.401087] PM:
2012-01-06  11:41:37  kernel: [149077.401091] PM:
2012-01-07  11:41:37  kernel: [149077.401094] PM:
2012-01-08  11:41:37  kernel: [149077.784066] firewire_core:
2012-01-09  11:41:37  kernel: [149078.575242] ata1.01:
2012-01-01  11:41:37  kernel: [149078.575356] ata2.01:
2012-01-02  11:41:37  kernel: [149078.731176] ata2.00:
2012-01-03  11:41:37  kernel: [149078.731190] ata2.01:
2012-01-04  11:41:37  kernel: [149078.731201] ata2.01:
2012-01-05  11:41:37  kernel: [149078.739345] ata2.00:
2012-01-06  11:41:37  kernel: [149078.755319] ata2.00:
2012-01-07  11:41:37  kernel: [149079.010899] ata1.00:
2012-01-08  11:41:37  kernel: [149079.010911] ata1.01:
2012-01-09  11:41:37  kernel: [149079.019081] ata1.00:
2012-01-01  11:41:37  kernel: [149079.035295] ata1.00:
2012-01-02  11:41:37  kernel: [149079.060709] PM:
2012-01-03  11:41:37  kernel: [149079.060745] PM:
2012-01-04  11:41:37  kernel: [149079.060749] PM:
2012-01-05  11:41:37  kernel: [149079.061816] PM:
2012-01-06  11:41:37  kernel: [149079.061870] PM:
2012-01-07  11:41:37  kernel: [149079.061899] PM:
2012-01-08  11:41:37  kernel: [149079.061900] Restarting
2012-01-09  11:41:37  anacron[17778]: Anacron 2.3
2012-01-01  11:41:37  anacron[17778]: Normal exit
2012-01-02  11:41:37  kernel: [149079.280801] bcma-pci-bridge
2012-01-03  11:41:37  kernel: [149079.280815] bcma-pci-bridge
2012-01-04  11:41:37  kernel: [149079.280867] bcma:
2012-01-05  11:41:37  kernel: [149079.280892] bcma:
2012-01-06  11:41:37  kernel: [149079.280948] bcma:
2012-01-07  11:41:37  kernel: [149079.281076] bcma:
2012-01-08  11:41:37  kernel: [149079.354368] bcma:
2012-01-09  11:41:37  kernel: [149079.357149] cfg80211:
2012-01-01  11:41:37  kernel: [149079.362622] cfg80211:
2012-01-02  11:41:37  kernel: [149079.362625] cfg80211:
2012-01-03  11:41:37  kernel: [149079.362627] cfg80211:
2012-01-04  11:41:37  kernel: [149079.362629] cfg80211:
2012-01-05  11:41:37  kernel: [149079.362630] cfg80211:
2012-01-06  11:41:37  kernel: [149079.362632] cfg80211:
2012-01-07  11:41:37  kernel: [149079.362633] cfg80211:
2012-01-08  11:41:37  kernel: [149079.365442] b43-phy0:
2012-01-09  11:41:37  kernel: [149079.366080] cfg80211:
2012-01-01  11:41:37  kernel: [149079.366083] cfg80211:
2012-01-02  11:41:37  kernel: [149079.366084] cfg80211:
2012-01-03  11:41:37  kernel: [149079.366086] cfg80211:
2012-01-04  11:41:37  kernel: [149079.366087] cfg80211:
2012-01-05  11:41:37  kernel: [149079.366089] cfg80211:
2012-01-06  11:41:37  kernel: [149079.366091] cfg80211:
2012-01-07  11:41:37  kernel: [149079.366092] cfg80211:
2012-01-08  11:41:37  kernel: [149079.366094] cfg80211:
2012-01-09  11:41:37  kernel: [149079.366096] cfg80211:
2012-01-01  11:41:37  kernel: [149079.366097] cfg80211:
2012-01-02  11:41:37  kernel: [149079.366099] cfg80211:
2012-01-03  11:41:37  kernel: [149079.366100] cfg80211:
2012-01-04  11:41:37  kernel: [149079.366102] cfg80211:
2012-01-05  11:41:37  kernel: [149079.366103] cfg80211:
2012-01-06  11:41:37  kernel: [149079.366105] cfg80211:
2012-01-07  11:41:37  kernel: [149079.366107] cfg80211:
2012-01-08  11:41:37  kernel: [149079.366108] cfg80211:
2012-01-09  11:41:37  kernel: [149079.366110] cfg80211:
2012-01-01  11:41:37  kernel: [149079.366111] cfg80211:
2012-01-02  11:41:37  kernel: [149079.366113] cfg80211:
2012-01-03  11:41:37  kernel: [149079.366115] cfg80211:
2012-01-04  11:41:37  kernel: [149079.366116] cfg80211:
2012-01-05  11:41:37  kernel: [149079.366118] cfg80211:
2012-01-06  11:41:37  kernel: [149079.366119] cfg80211:
2012-01-07  11:41:37  kernel: [149079.366121] cfg80211:
2012-01-08  11:41:37  kernel: [149079.366122] cfg80211:
2012-01-09  11:41:37  kernel: [149079.366124] cfg80211:
2012-01-01  11:41:37  kernel: [149079.366216] ieee80211
2012-01-02  11:41:37  kernel: [149079.366616] Broadcom
2012-01-03  11:41:37  NetworkManager[1127]: <info> found
2012-01-04  11:41:37  NetworkManager[1127]: <info> WiFi
2012-01-05  11:41:37  NetworkManager[1127]: SCPlugin-Ifupdown: devices
2012-01-06  11:41:37  NetworkManager[1127]: SCPlugin-Ifupdown: device
2012-01-07  11:41:37  NetworkManager[1127]: <info> (wlan0):
2012-01-08  11:41:37  NetworkManager[1127]: <warn> (wlan0):
2012-01-09  11:41:37  NetworkManager[1127]: <info> (wlan0):
2012-01-01  11:41:37  NetworkManager[1127]: <info> (wlan0):
2012-01-02  11:41:37  pulseaudio[2813]: [pulseaudio] module-console-kit.c:
2012-01-03  11:41:38  NetworkManager[1127]: <info> wake
2012-01-04  11:41:38  NetworkManager[1127]: <info> waking
2012-01-05  11:41:38  NetworkManager[1127]: <info> (eth0):
2012-01-06  11:41:38  NetworkManager[1127]: <info> (eth0):
2012-01-07  11:41:38  NetworkManager[1127]: <info> (eth0):
2012-01-08  11:41:38  kernel: [149079.666712] tg3
2012-01-09  11:41:38  kernel: [149079.666718] tg3
2012-01-01  11:41:38  kernel: [149079.666723] tg3
2012-01-02  11:41:38  kernel: [149079.666727] tg3
2012-01-03  11:41:38  kernel: [149079.666731] tg3
2012-01-04  11:41:39  NetworkManager[1127]: <info> (eth0):
2012-01-05  11:41:39  NetworkManager[1127]: <info> (eth0):
2012-01-06  11:41:39  NetworkManager[1127]: <info> Unmanaged
2012-01-07  11:41:39  NetworkManager[1127]: <info> Unmanaged
2012-01-08  11:41:39  NetworkManager[1127]: <info> (wlan0):
2012-01-09  11:41:39  kernel: [149080.696203] ADDRCONF(NETDEV_UP):
2012-01-01  11:41:39  kernel: [149080.696984] ADDRCONF(NETDEV_UP):
2012-01-02  11:41:39  NetworkManager[1127]: <info> (wlan0):
2012-01-03  11:41:39  NetworkManager[1127]: <info> (wlan0):
2012-01-04  11:41:39  NetworkManager[1127]: <info> (wlan0):
2012-01-05  11:41:51  kernel: [149093.289101] usb
2012-01-06  11:41:51  mtp-probe: checking bus
2012-01-07  11:41:51  mtp-probe: bus: 2,
2012-01-08  11:41:51  kernel: [149093.412961] scsi18
2012-01-09  11:41:51  kernel: [149093.413315] scsi19
2012-01-01  11:41:52  kernel: [149094.415839] scsi
2012-01-02  11:41:52  kernel: [149094.418988] scsi
2012-01-03  11:41:52  kernel: [149094.427538] sr1:
2012-01-04  11:41:52  kernel: [149094.427938] sr
2012-01-05  11:41:52  kernel: [149094.428204] sr
2012-01-06  11:41:52  kernel: [149094.429028] sd
2012-01-07  11:41:52  kernel: [149094.439790] sd
2012-01-08  11:41:53  usb_modeswitch: switching device
2012-01-09  11:41:53  kernel: [149094.623497] usb
2012-01-01  11:41:56  gnome-screensaver-dialog: pam_ecryptfs: pam_sm_authenticate:
2012-01-02  11:41:59  kernel: [149100.961756] usb
2012-01-03  11:41:59  mtp-probe: checking bus
2012-01-04  11:41:59  kernel: [149101.085787] option
2012-01-05  11:41:59  kernel: [149101.086042] usb
2012-01-06  11:41:59  kernel: [149101.086506] option
2012-01-07  11:41:59  kernel: [149101.086813] usb
2012-01-08  11:41:59  kernel: [149101.087252] option
2012-01-09  11:41:59  kernel: [149101.087510] usb
2012-01-01  11:41:59  kernel: [149101.088432] scsi23
2012-01-02  11:41:59  kernel: [149101.090303] scsi24
2012-01-03  11:41:59  mtp-probe: bus: 2,
2012-01-04  11:41:59  modem-manager[1113]: <info> (ttyUSB0)
2012-01-05  11:42:00  kernel: [149102.088636] scsi
2012-01-06  11:42:00  kernel: [149102.094152] scsi
2012-01-07  11:42:00  usb_modeswitch: switched to
2012-01-08  11:42:00  kernel: [149102.103624] sr1:
2012-01-09  11:42:00  kernel: [149102.103784] sr
2012-01-01  11:42:00  kernel: [149102.103864] sr
2012-01-02  11:42:00  kernel: [149102.104437] sd
2012-01-03  11:42:00  kernel: [149102.114620] sd
2012-01-04  11:42:01  usb_modeswitch[18278]: usb_modeswitch: switched
2012-01-05  11:42:01  modem-manager[1113]: <info> (ttyUSB0)
2012-01-06  11:42:01  modem-manager[1113]: <info> (ttyUSB0)
2012-01-07  11:42:01  modem-manager[1113]: <info> (ttyUSB0)
2012-01-08  11:42:01  modem-manager[1113]: <info> (Huawei):
2012-01-09  11:42:02  modem-manager[1113]: <info> (ttyUSB1)
2012-01-01  11:42:02  modem-manager[1113]: <info> (ttyUSB2)
2012-01-02  11:42:06  modem-manager[1113]: <info> (ttyUSB2)
2012-01-03  11:42:06  modem-manager[1113]: <info> (ttyUSB2)
2012-01-04  11:42:06  modem-manager[1113]: <info> (Huawei):
2012-01-05  11:42:06  modem-manager[1113]: <info> (ttyUSB0)
2012-01-06  11:42:06  modem-manager[1113]: <info> (ttyUSB0)
2012-01-07  11:42:09  modem-manager[1113]: <info> (ttyUSB1)
2012-01-08  11:42:09  modem-manager[1113]: <info> (ttyUSB1)
2012-01-09  11:42:09  modem-manager[1113]: <info> (Huawei):
2012-01-01  11:42:09  NetworkManager[1127]: <warn> (ttyUSB0):
2012-01-02  11:42:09  NetworkManager[1127]: <info> WWAN
2012-01-03  11:42:09  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-04  11:42:09  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-05  11:42:09  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-06  11:42:09  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-07  11:42:09  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-08  11:42:09  NetworkManager[1127]: nm_system_iface_flush_routes: assertion
2012-01-09  11:42:09  NetworkManager[1127]: nm_system_iface_flush_addresses: assertion
2012-01-01  11:42:09  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-02  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-03  11:42:13  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-04  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-05  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-06  11:42:13  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-07  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-08  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-09  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-01  11:42:13  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-02  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-03  11:42:13  modem-manager[1113]: <info> (ttyUSB0)
2012-01-04  11:42:13  modem-manager[1113]: <info> Modem
2012-01-05  11:42:13  modem-manager[1113]: <info> (ttyUSB2)
2012-01-06  11:42:13  modem-manager[1113]: <info> (ttyUSB0):
2012-01-07  11:42:13  modem-manager[1113]: <info> Modem
2012-01-08  11:42:13  NetworkManager[1127]: <info> WWAN
2012-01-09  11:42:13  modem-manager[1113]: <info> Modem
2012-01-01  11:42:13  modem-manager[1113]: <info> Modem
2012-01-02  11:42:13  modem-manager[1113]: <info> Modem
2012-01-03  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-04  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-05  11:42:13  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-06  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-07  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-08  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-09  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-01  11:42:13  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-02  11:42:13  NetworkManager[1127]: <info> starting
2012-01-03  11:42:13  NetworkManager[1127]: <info> pppd
2012-01-04  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-05  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-06  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-07  11:42:13  NetworkManager[1127]: <info> Activation
2012-01-08  11:42:13  pppd[18397]: Plugin /usr/lib/pppd/2.4.5/nm-pppd-plugin.so
2012-01-09  11:42:13  pppd[18397]: pppd 2.4.5
2012-01-01  11:42:13  pppd[18397]: Using interface
2012-01-02  11:42:13  pppd[18397]: Connect: ppp0
2012-01-03  11:42:13  NetworkManager[1127]: SCPlugin-Ifupdown: devices
2012-01-04  11:42:13  NetworkManager[1127]: SCPlugin-Ifupdown: device
2012-01-05  11:42:13  pppd[18397]: PAP authentication
2012-01-06  11:42:16  pppd[18397]: Could not
2012-01-07  11:42:16  pppd[18397]: local IP
2012-01-08  11:42:16  pppd[18397]: remote IP
2012-01-09  11:42:16  pppd[18397]: primary DNS
2012-01-01  11:42:16  pppd[18397]: secondary DNS
2012-01-02  11:42:16  NetworkManager[1127]: <info> PPP
2012-01-03  11:42:16  NetworkManager[1127]: <info> Activation
2012-01-04  11:42:16  NetworkManager[1127]: <info> Activation
2012-01-05  11:42:17  dnsmasq[17021]: exiting on
2012-01-06  11:42:17  NetworkManager[1127]: <info> DNS:
2012-01-07  11:42:17  NetworkManager[1127]: <info> (ppp0):
2012-01-08  11:42:17  dnsmasq[18416]: started, version
2012-01-09  11:42:17  dnsmasq[18416]: compile time
2012-01-01  11:42:17  dnsmasq[18416]: using nameserver
2012-01-02  11:42:17  dnsmasq[18416]: using nameserver
2012-01-03  11:42:17  NetworkManager[1127]: <info> (ttyUSB0):
2012-01-04  11:42:17  NetworkManager[1127]: <info> Policy
2012-01-05  11:42:17  NetworkManager[1127]: <info> Activation
2012-01-06  11:42:17  NetworkManager[1127]: <info> Activation
2012-01-07  11:42:17  dbus[1092]: [system] Activating
2012-01-08  11:42:17  dbus[1092]: [system] Successfully
2012-01-09  11:42:28  ntpdate[18478]: step time


================================================
FILE: tests/stdin.03.txt
================================================
/var/log
/var/log/ConsoleKit
/var/log/ConsoleKit/history.1
/var/log/ConsoleKit/history
/var/log/apt
/var/log/apt/term.log
/var/log/apt/term.log.1.gz
/var/log/apt/history.log
/var/log/apt/history.log.1.gz
/var/log/cups
/var/log/cups/error_log
/var/log/cups/page_log
/var/log/cups/access_log.7.gz
/var/log/cups/access_log.6.gz
/var/log/cups/access_log.5.gz
/var/log/cups/access_log.4.gz
/var/log/cups/access_log.3.gz
/var/log/cups/access_log.2.gz
/var/log/cups/access_log
/var/log/cups/access_log.1.gz
/var/log/dist-upgrade
/var/log/fsck
/var/log/fsck/checkfs
/var/log/fsck/checkroot
/var/log/hp
/var/log/lightdm
/var/log/lightdm/lightdm.log
/var/log/lightdm/x-0.log
/var/log/lightdm/x-0-greeter.log.old
/var/log/lightdm/x-1.log
/var/log/lightdm/x-1-greeter.log
/var/log/lightdm/x-0-greeter.log
/var/log/samba
/var/log/speech-dispatcher
/var/log/unattended-upgrades
/var/log/upstart
/var/log/upstart/rsyslog.log.1.gz
/var/log/upstart/ureadahead-other.log.4.gz
/var/log/upstart/network-interface-ppp0.log.6.gz
/var/log/upstart/isc-dhcp-server6.log.3.gz
/var/log/upstart/modemmanager.log.2.gz
/var/log/upstart/procps-virtual-filesystems.log.4.gz
/var/log/upstart/procps-virtual-filesystems.log.3.gz
/var/log/upstart/resolvconf.log.2.gz
/var/log/upstart/mysql.log.5.gz
/var/log/upstart/mysql.log.3.gz
/var/log/upstart/mysql.log.2.gz
/var/log/upstart/cups.log.4.gz
/var/log/upstart/ureadahead-other.log.5.gz
/var/log/upstart/container-detect.log.6.gz
/var/log/upstart/cups.log.1.gz
/var/log/upstart/alsa-restore.log.1.gz
/var/log/upstart/rsyslog.log.3.gz
/var/log/upstart/cryptdisks-enable.log.3.gz
/var/log/upstart/hybrid-gfx.log.2.gz
/var/log/upstart/mysql.log.1.gz
/var/log/upstart/isc-dhcp-server6.log.4.gz
/var/log/upstart/procps-static-network-up.log.4.gz
/var/log/upstart/console-setup.log.3.gz
/var/log/upstart/hybrid-gfx.log.6.gz
/var/log/upstart/rsyslog.log.2.gz
/var/log/upstart/resolvconf.log.1.gz
/var/log/upstart/ureadahead-other.log.3.gz
/var/log/upstart/procps-static-network-up.log.6.gz
/var/log/upstart/rsyslog.log.4.gz
/var/log/upstart/container-detect.log.7.gz
/var/log/upstart/network-interface-wlan0.log.7.gz
/var/log/upstart/container-detect.log.5.gz
/var/log/upstart/container-detect.log.2.gz
/var/log/upstart/isc-dhcp-server6.log.2.gz
/var/log/upstart/cups.log.5.gz
/var/log/upstart/cryptdisks-enable.log.6.gz
/var/log/upstart/hybrid-gfx.log.5.gz
/var/log/upstart/hybrid-gfx.log.4.gz
/var/log/upstart/hybrid-gfx.log.3.gz
/var/log/upstart/isc-dhcp-server6.log.5.gz
/var/log/upstart/network-interface-ppp0.log.4.gz
/var/log/upstart/network-interface-ppp0.log.3.gz
/var/log/upstart/ureadahead.log.7.gz
/var/log/upstart/network-interface-wlan0.log.6.gz
/var/log/upstart/isc-dhcp-server.log.1.gz
/var/log/upstart/container-detect.log.4.gz
/var/log/upstart/container-detect.log.3.gz
/var/log/upstart/network-interface-wlan0.log.5.gz
/var/log/upstart/rsyslog.log.7.gz
/var/log/upstart/modemmanager.log.7.gz
/var/log/upstart/modemmanager.log.6.gz
/var/log/upstart/console-setup.log.6.gz
/var/log/upstart/failsafe-x.log.1.gz
/var/log/upstart/procps-static-network-up.log.3.gz
/var/log/upstart/procps-virtual-filesystems.log.7.gz
/var/log/upstart/rsyslog.log.6.gz
/var/log/upstart/ureadahead-other.log.2.gz
/var/log/upstart/mysql.log.6.gz
/var/log/upstart/mysql.log.4.gz
/var/log/upstart/network-interface-wlan0.log.4.gz
/var/log/upstart/procps-static-network-up.log.5.gz
/var/log/upstart/procps-virtual-filesystems.log.2.gz
/var/log/upstart/ureadahead.log.6.gz
/var/log/upstart/ureadahead.log.3.gz
/var/log/upstart/ureadahead.log.2.gz
/var/log/upstart/ureadahead.log.1.gz
/var/log/upstart/modemmanager.log.5.gz
/var/log/upstart/ureadahead.log.4.gz
/var/log/upstart/modemmanager.log
/var/log/upstart/network-interface-wlan0.log.3.gz
/var/log/upstart/network-interface-wlan0.log.2.gz
/var/log/upstart/modemmanager.log.3.gz
/var/log/upstart/console-setup.log.5.gz
/var/log/upstart/procps-static-network-up.log.7.gz
/var/log/upstart/console-setup.log.2.gz
/var/log/upstart/cryptdisks-enable.log.5.gz
/var/log/upstart/network-interface-tun0.log.5.gz
/var/log/upstart/network-interface-ppp0.log.2.gz
/var/log/upstart/network-interface-tun0.log.3.gz
/var/log/upstart/modemmanager.log.4.gz
/var/log/upstart/cups.log.6.gz
/var/log/upstart/procps-static-network-up.log.2.gz
/var/log/upstart/ureadahead.log.5.gz
/var/log/upstart/mysql.log.7.gz
/var/log/upstart/procps-virtual-filesystems.log.6.gz
/var/log/upstart/procps-virtual-filesystems.log.5.gz
/var/log/upstart/rsyslog.log.5.gz
/var/log/upstart/cryptdisks-enable.log.7.gz
/var/log/upstart/cups.log.3.gz
/var/log/upstart/cups.log.2.gz
/var/log/upstart/network-interface-tun0.log.4.gz
/var/log/upstart/network-interface-tun0.log.1.gz
/var/log/upstart/network-interface-ppp1.log.1.gz
/var/log/upstart/network-interface-tun0.log.2.gz
/var/log/upstart/console-setup.log.4.gz
/var/log/upstart/cryptdisks-enable.log.4.gz
/var/log/upstart/cryptdisks-enable.log.2.gz
/var/log/upstart/hybrid-gfx.log.7.gz
/var/log/upstart/isc-dhcp-server6.log.6.gz
/var/log/upstart/isc-dhcp-server6.log.1.gz
/var/log/upstart/modemmanager.log.1.gz
/var/log/upstart/network-interface-lo.log.2.gz
/var/log/upstart/network-interface-lo.log.1.gz
/var/log/upstart/network-interface-ppp0.log.7.gz
/var/log/upstart/network-interface-ppp0.log.5.gz
/var/log/upstart/network-interface-tun0.log.7.gz
/var/log/upstart/procps-static-network-up.log.1.gz
/var/log/upstart/ureadahead-other.log.6.gz
/var/log/upstart/ureadahead-other.log.1.gz
/var/log/upstart/network-interface-ppp0.log
/var/log/upstart/network-interface-wlan0.log
/var/log/upstart/console-setup.log.7.gz
/var/log/upstart/console-setup.log.1.gz
/var/log/upstart/container-detect.log.1.gz
/var/log/upstart/hybrid-gfx.log.1.gz
/var/log/upstart/network-interface-ppp0.log.1.gz
/var/log/upstart/procps-virtual-filesystems.log.1.gz
/var/log/upstart/network-interface-tun1.log.1.gz
/var/log/upstart/cryptdisks-enable.log.1.gz
/var/log/upstart/isc-dhcp-server6.log.7.gz
/var/log/upstart/network-interface-tun0.log.6.gz
/var/log/upstart/network-interface-wlan0.log.1.gz
/var/log/boot
/var/log/bootstrap.log
/var/log/dmesg
/var/log/faillog
/var/log/fontconfig.log
/var/log/lastlog
/var/log/installer
/var/log/installer/syslog
/var/log/installer/partman
/var/log/installer/version
/var/log/installer/casper.log
/var/log/installer/debug
/var/log/installer/media-info
/var/log/installer/initial-status.gz
/var/log/ufw.log
/var/log/alternatives.log.1
/var/log/mail.log
/var/log/mail.err
/var/log/news
/var/log/news/news.crit
/var/log/news/news.err
/var/log/news/news.notice
/var/log/jockey.log.7.gz
/var/log/pm-powersave.log
/var/log/jockey.log
/var/log/aptitude
/var/log/gdm
/var/log/mysql
/var/log/mysql.err
/var/log/apache2
/var/log/apache2/other_vhosts_access.log
/var/log/apache2/access.log.1
/var/log/apache2/access.log
/var/log/apache2/error.log.2.gz
/var/log/apache2/error.log.1
/var/log/apache2/error.log
/var/log/corosync
/var/log/corosync/.empty
/var/log/pycentral.log
/var/log/dpkg.log.1
/var/log/alternatives.log
/var/log/Xorg.0.log.old
/var/log/pm-suspend.log
/var/log/pm-powersave.log.1
/var/log/Xorg.1.log
/var/log/pm-suspend.log.1
/var/log/auth.log.3.gz
/var/log/kern.log.1
/var/log/kern.log
/var/log/auth.log.1
/var/log/udev
/var/log/apport.log.7.gz
/var/log/apport.log
/var/log/mysql.log.4.gz
/var/log/Xorg.failsafe.log.old
/var/log/Xorg.failsafe.log
/var/log/apport.log.3.gz
/var/log/dmesg.4.gz
/var/log/dmesg.3.gz
/var/log/dmesg.2.gz
/var/log/apport.log.6.gz
/var/log/wtmp.1
/var/log/boot.log
/var/log/wtmp
/var/log/btmp
/var/log/aptitude.1.gz
/var/log/auth.log
/var/log/Xorg.0.log
/var/log/kern.log.2.gz
/var/log/jockey.log.1
/var/log/btmp.1
/var/log/apport.log.4.gz
/var/log/jockey.log.8.gz
/var/log/jockey.log.5.gz
/var/log/auth.log.4.gz
/var/log/apport.log.5.gz
/var/log/kern.log.4.gz
/var/log/kern.log.3.gz
/var/log/jockey.log.9.gz
/var/log/l2tpipsecvpn.pipe
/var/log/jockey.log.6.gz
/var/log/apport.log.2.gz
/var/log/apport.log.1
/var/log/jockey.log.10.gz
/var/log/dpkg.log
/var/log/mysql.log.2.gz
/var/log/mysql.log
/var/log/mysql.log.1.gz
/var/log/syslog.5.gz
/var/log/syslog.4.gz
/var/log/syslog.7.gz
/var/log/syslog.6.gz
/var/log/syslog.2.gz
/var/log/syslog.1
/var/log/syslog
/var/log/auth.log.2.gz
/var/log/jockey.log.4.gz
/var/log/jockey.log.3.gz
/var/log/jockey.log.2.gz
/var/log/syslog.3.gz
/var/log/mysql.log.7.gz
/var/log/mysql.log.5.gz
/var/log/apparmor
/var/log/dmesg.1.gz
/var/log/dmesg.0
/var/log/mysql.log.3.gz
/var/log/mysql.log.6.gz


================================================
FILE: tests/stdin.04.txt
================================================
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         2  0.0  0.0      0     0 ?        S    15:30   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    15:30   0:01  \_ [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S    15:30   0:00  \_ [kworker/u:0]
root         6  0.0  0.0      0     0 ?        S    15:30   0:00  \_ [migration/0]
root         7  0.0  0.0      0     0 ?        S    15:30   0:00  \_ [watchdog/0]
root         8  0.0  0.0      0     0 ?        S    15:30   0:00  \_ [migration/1]
root         9  0.0  0.0      0     0 ?        S    15:30   0:00  \_ [kworker/1:0]
root        10  0.0  0.0      0     0 ?        S    15:30   0:00  \_ [ksoftirqd/1]
root        12  0.0  0.0      0     0 ?        S    15:31   0:00  \_ [watchdog/1]
root        13  0.0  0.0      0     0 ?        S    15:31   0:00  \_ [migration/2]
root        15  0.0  0.0      0     0 ?        S    15:31   0:00  \_ [ksoftirqd/2]
root        16  0.0  0.0      0     0 ?        S    15:31   0:00  \_ [watchdog/2]
root        17  0.0  0.0      0     0 ?        S    15:31   0:00  \_ [migration/3]
root        19  0.0  0.0      0     0 ?        S    15:31   0:00  \_ [ksoftirqd/3]
root        20  0.0  0.0      0     0 ?        S    15:31   0:00  \_ [watchdog/3]
root        21  0.0  0.0      0     0 ?        S    15:31   0:00  \_ [migration/4]
root        23  0.0  0.0      0     0 ?        S    15:31   0:00  \_ [ksoftirqd/4]
root        24  0.0  0.0      0     0 ?        S    15:31   0:00  \_ [watchdog/4]
root        25  0.0  0.0      0     0 ?        S    15:31   0:00  \_ [migration/5]
root        27  0.0  0.0      0     0 ?        S    15:31   0:00  \_ [ksoftirqd/5]
root        28  0.0  0.0      0     0 ?        S    15:32   0:00  \_ [watchdog/5]
root        29  0.0  0.0      0     0 ?        S    15:32   0:00  \_ [migration/6]
root        31  0.0  0.0      0     0 ?        S    15:32   0:00  \_ [ksoftirqd/6]
root        32  0.0  0.0      0     0 ?        S    15:32   0:00  \_ [watchdog/6]
root        33  0.0  0.0      0     0 ?        S    15:32   0:00  \_ [migration/7]
root        35  0.0  0.0      0     0 ?        S    15:32   0:00  \_ [ksoftirqd/7]
root        36  0.0  0.0      0     0 ?        S    15:32   0:00  \_ [watchdog/7]
root        37  0.0  0.0      0     0 ?        S<   15:32   0:00  \_ [cpuset]
root        38  0.0  0.0      0     0 ?        S<   15:32   0:00  \_ [khelper]
root        39  0.0  0.0      0     0 ?        S    15:32   0:00  \_ [kdevtmpfs]
root        40  0.0  0.0      0     0 ?        S<   15:32   0:00  \_ [netns]
root        42  0.0  0.0      0     0 ?        S    15:32   0:00  \_ [sync_supers]
root        43  0.0  0.0      0     0 ?        S    15:32   0:00  \_ [bdi-default]
root        44  0.0  0.0      0     0 ?        S<   15:33   0:00  \_ [kintegrityd]
root        45  0.0  0.0      0     0 ?        S<   15:33   0:00  \_ [kblockd]
root        46  0.0  0.0      0     0 ?        S<   15:33   0:00  \_ [ata_sff]
root        47  0.0  0.0      0     0 ?        S    15:33   0:00  \_ [khubd]
root        48  0.0  0.0      0     0 ?        S<   15:33   0:00  \_ [md]
root        51  0.0  0.0      0     0 ?        S    15:33   0:00  \_ [khungtaskd]
root        52  0.0  0.0      0     0 ?        S    15:33   0:00  \_ [kswapd0]
root        53  0.0  0.0      0     0 ?        SN   15:33   0:00  \_ [ksmd]
root        54  0.0  0.0      0     0 ?        SN   15:33   0:00  \_ [khugepaged]
root        55  0.0  0.0      0     0 ?        S    15:33   0:00  \_ [fsnotify_mark]
root        56  0.0  0.0      0     0 ?        S    15:33   0:00  \_ [ecryptfs-kthrea]
root        57  0.0  0.0      0     0 ?        S<   15:33   0:00  \_ [crypto]
root        65  0.0  0.0      0     0 ?        S<   15:33   0:00  \_ [kthrotld]
root        67  0.0  0.0      0     0 ?        S    15:33   0:00  \_ [scsi_eh_0]
root        68  0.0  0.0      0     0 ?        S    15:33   0:00  \_ [scsi_eh_1]
root        69  0.0  0.0      0     0 ?        S    15:34   0:01  \_ [kworker/2:1]
root        70  0.0  0.0      0     0 ?        S    15:34   0:00  \_ [kworker/u:3]
root        89  0.0  0.0      0     0 ?        S<   15:34   0:00  \_ [devfreq_wq]
root        90  0.0  0.0      0     0 ?        S    15:34   0:00  \_ [kworker/7:1]
root        91  0.0  0.0      0     0 ?        S    15:34   0:00  \_ [kworker/4:1]
root        92  0.0  0.0      0     0 ?        S    15:34   0:05  \_ [kworker/1:1]
root        94  0.0  0.0      0     0 ?        S    15:34   0:00  \_ [kworker/6:1]
root        97  0.0  0.0      0     0 ?        S    15:35   0:00  \_ [kworker/5:1]
root       140  0.0  0.0      0     0 ?        S    15:35   0:00  \_ [kworker/7:2]
root       231  0.0  0.0      0     0 ?        S<   15:35   0:00  \_ [firewire]
root       300  0.0  0.0      0     0 ?        S<   15:35   0:00  \_ [xfs_mru_cache]
root       301  0.0  0.0      0     0 ?        S<   15:35   0:00  \_ [xfslogd]
root       302  0.0  0.0      0     0 ?        S<   15:35   0:00  \_ [xfsdatad]
root       304  0.0  0.0      0     0 ?        S<   15:35   0:00  \_ [xfsconvertd]
root       306  0.0  0.0      0     0 ?        S    15:35   0:00  \_ [xfsbufd/sda3]
root       307  0.0  0.0      0     0 ?        S    15:35   0:03  \_ [xfsaild/sda3]
root       703  0.0  0.0      0     0 ?        S    15:35   0:00  \_ [irq/47-mei]
root       718  0.0  0.0      0     0 ?        S<   15:35   0:00  \_ [applesmc-led]
root       722  0.0  0.0      0     0 ?        S    15:35   0:00  \_ [kworker/5:2]
root       789  0.0  0.0      0     0 ?        S<   15:35   0:00  \_ [cfg80211]
root       834  0.0  0.0      0     0 ?        S<   15:35   0:00  \_ [hci0]
root       858  0.0  0.0      0     0 ?        S<   15:35   0:00  \_ [hd-audio0]
root       862  0.0  0.0      0     0 ?        S<   15:35   0:00  \_ [hd-audio1]
root       986  0.0  0.0      0     0 ?        S<   15:36   0:00  \_ [kdmflush]
root       994  0.0  0.0      0     0 ?        S<   15:36   0:00  \_ [kcryptd_io]
root       995  0.0  0.0      0     0 ?        S<   15:36   0:00  \_ [kcryptd]
root      1177  0.0  0.0      0     0 ?        S    15:36   0:00  \_ [flush-8:0]
root      1279  0.0  0.0      0     0 ?        S<   15:36   0:00  \_ [krfcommd]
root      1867  0.0  0.0      0     0 ?        S    15:36   0:00  \_ [firegl]
root      1868  0.0  0.0      0     0 ?        S    15:36   0:00  \_ [firegl]
root      1869  0.0  0.0      0     0 ?        S    15:36   0:00  \_ [firegl]
root      1983  0.0  0.0      0     0 ?        S<   15:36   0:00  \_ [iprt]
root      2677  0.0  0.0      0     0 ?        S    15:37   0:03  \_ [kworker/2:2]
root      2826  0.0  0.0      0     0 ?        S    15:37   0:00  \_ [kworker/6:2]
root      2840  0.0  0.0      0     0 ?        S    15:37   0:00  \_ [kworker/4:2]
root      2914  0.0  0.0      0     0 ?        S    15:37   0:00  \_ [scsi_eh_7]
root      2915  0.0  0.0      0     0 ?        S    15:37   0:01  \_ [usb-storage]
root      2916  0.0  0.0      0     0 ?        S    15:37   0:00  \_ [scsi_eh_8]
root      2917  0.0  0.0      0     0 ?        S    15:37   0:01  \_ [usb-storage]
root      3046  0.1  0.0      0     0 ?        S    15:37   0:08  \_ [flush-ecryptfs-]
root      3769  0.0  0.0      0     0 ?        S    15:41   0:05  \_ [kworker/3:0]
root      4812  0.0  0.0      0     0 ?        S    17:31   0:01  \_ [kworker/0:2]
root      4915  0.1  0.0      0     0 ?        S    17:39   0:01  \_ [kworker/0:3]
root      4940  0.0  0.0      0     0 ?        S    17:43   0:00  \_ [kworker/3:2]
root      4958  0.1  0.0      0     0 ?        S    17:47   0:00  \_ [kworker/0:1]
root      5108  0.0  0.0      0     0 ?        S    17:49   0:00  \_ [kworker/3:1]
root      5160  0.0  0.0      0     0 ?        S    17:51   0:00  \_ [scsi_eh_9]
root      5161  0.0  0.0      0     0 ?        S    17:51   0:00  \_ [usb-storage]
root      5190  0.0  0.0      0     0 ?        S    17:51   0:00  \_ [kworker/7:0]
root      5195  0.0  0.0      0     0 ?        S    17:51   0:00  \_ [xfsbufd/sdc1]
root      5198  0.0  0.0      0     0 ?        S    17:51   0:00  \_ [xfsaild/sdc1]
root      5221  0.0  0.0      0     0 ?        S    17:51   0:00  \_ [flush-8:32]
root         1  0.0  0.0   3720  2148 ?        Ss   15:35   0:01 /sbin/init
root       375  0.0  0.0   2816   612 ?        S    15:36   0:00 upstart-udev-bridge --daemon
root       377  0.0  0.0   3504  1696 ?        Ss   15:36   0:00 /sbin/udevd --daemon
root      5176  0.0  0.0   3500  1264 ?        S    17:51   0:00  \_ /sbin/udevd --daemon
root      5177  0.0  0.0   3500  1220 ?        S    17:51   0:00  \_ /sbin/udevd --daemon
root       890  0.0  0.0   2828   360 ?        S    15:36   0:00 upstart-socket-bridge --daemon
root      1048  0.0  0.0   6664  2416 ?        Ss   15:36   0:00 /usr/sbin/sshd -D
syslog    1109  0.0  0.0  31044  1372 ?        Sl   15:36   0:00 rsyslogd -c5
102       1130  0.0  0.0   4372  2008 ?        Ss   15:36   0:01 dbus-daemon --system --fork --activation=upstart
root      1150  0.0  0.0   4612   856 tty4     Ss+  15:36   0:00 /sbin/getty -8 38400 tty4
root      1156  0.0  0.0   4612   844 tty5     Ss+  15:36   0:00 /sbin/getty -8 38400 tty5
root      1173  0.0  0.0   4724  1832 ?        Ss   15:36   0:00 /usr/sbin/bluetoothd
root      1201  0.0  0.0   4612   856 tty2     Ss+  15:36   0:00 /sbin/getty -8 38400 tty2
root      1202  0.0  0.0   4612   852 tty3     Ss+  15:36   0:00 /sbin/getty -8 38400 tty3
root      1205  0.0  0.0   4612   840 tty6     Ss+  15:36   0:00 /sbin/getty -8 38400 tty6
root      1234  0.0  0.0   7204  3184 ?        Ss   15:36   0:03 /usr/sbin/modem-manager
root      1239  0.0  0.0   2288   720 ?        Ss   15:36   0:00 acpid -c /etc/acpi/events -s /var/run/acpid.socket
root      1243  0.0  0.0  34020  3124 ?        Ssl  15:36   0:00 lightdm
root      1452  5.9  3.6 122592 296884 tty7    Ss+  15:36   8:08  \_ /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none
root      2572  0.0  0.0  18200  3616 ?        Sl   15:36   0:00  \_ lightdm --session-child 12 19
reze      2886  0.0  0.1  49672  8440 ?        Ssl  15:37   0:00      \_ gnome-session --session=gnome-classic
reze      2965  0.0  0.0   4060   208 ?        Ss   15:37   0:00          \_ /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session gnome-session --session=gnome-classic
reze      3005  0.0  0.2 245988 17284 ?        Sl   15:37   0:05          \_ /usr/lib/gnome-settings-daemon/gnome-settings-daemon
reze      3034  0.0  0.0   3692   780 ?        S    15:37   0:05          |   \_ syndaemon -i 2.0 -K -R -t
reze      3047  0.1  0.3 201020 29104 ?        Sl   15:37   0:09          \_ gnome-panel
reze      3056  0.0  0.0  57992  7748 ?        Sl   15:37   0:00          \_ /usr/lib/gnome-settings-daemon/gnome-fallback-mount-helper
reze      3064  0.0  0.1 152360 14100 ?        Sl   15:37   0:04          \_ /usr/lib/notification-daemon/notification-daemon
reze      3065  0.1  0.3 234464 26660 ?        Sl   15:37   0:09          \_ nautilus -n
reze      3068  0.0  0.1 254220 14692 ?        Sl   15:37   0:01          \_ nm-applet
reze      3076  0.0  0.0  39344  7312 ?        Sl   15:37   0:00          \_ /usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1
reze      3098  0.0  0.1 149008 10360 ?        Sl   15:37   0:00          \_ bluetooth-applet
reze      3194  0.0  0.0  41024  7904 ?        Sl   15:37   0:00          \_ /usr/lib/gnome-disk-utility/gdu-notification-daemon
reze      3218  0.0  0.1  74232  9272 ?        Sl   15:37   0:00          \_ telepathy-indicator
reze      3292  0.0  0.0  39768  7640 ?        Sl   15:37   0:00          \_ gnome-screensaver
reze      3293  0.0  0.0  54716  5472 ?        Sl   15:37   0:00          \_ zeitgeist-datahub
reze      3396  0.0  0.1  51284 10472 ?        Sl   15:38   0:00          \_ /usr/lib/evolution/3.2/evolution-alarm-notify
reze      3629  0.0  0.1  52616 11196 ?        Sl   15:38   0:00          \_ update-notifier
reze      3673  0.0  0.0  35720  3636 ?        Sl   15:39   0:00          \_ /usr/lib/deja-dup/deja-dup/deja-dup-monitor
root      1247  0.0  0.0  11060  3584 ?        Ss   15:36   0:00 /usr/sbin/cupsd -F
daemon    1257  0.0  0.0   2452   352 ?        Ss   15:36   0:00 atd
root      1265  0.0  0.0   2600   872 ?        Ss   15:36   0:00 cron
mysql     1275  0.0  0.4 319484 33812 ?        Ssl  15:36   0:02 /usr/sbin/mysqld
root      1284  0.0  0.0   3584   660 ?        Ss   15:36   0:02 /usr/sbin/irqbalance
avahi     1298  0.0  0.0   3584  1700 ?        S    15:36   0:00 avahi-daemon: running [prolix.local]
avahi     1299  0.0  0.0   3436   432 ?        S    15:36   0:00  \_ avahi-daemon: chroot helper
whoopsie  1370  0.0  0.0  25920  4460 ?        Ssl  15:36   0:00 whoopsie
root      1464  0.0  0.0  31104  5080 ?        Ssl  15:36   0:00 NetworkManager
root      5016  0.0  0.0   7364  2632 ?        S    17:48   0:00  \_ /usr/sbin/pppd nodetach lock nodefaultroute user movistarcr ttyUSB0 noipdefault noauth refuse-eap refuse-chap refuse-mschap refuse-mschap-v2 usepeerdns lcp-echo-failure 5 lcp-echo-interval 30 ipparam /org/freedesktop/NetworkManager/PPP/1 plugin /usr/lib/pppd/2.4.5/nm-pppd-plugin.so
nobody    5038  0.0  0.0   5384  1164 ?        S    17:48   0:00  \_ /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/var/run/sendsigs.omit.d/network-manager.dnsmasq.pid --listen-address=127.0.0.1 --conf-file=/var/run/nm-dns-dnsmasq.conf --cache-size=0 --proxy-dnssec
root      1482  0.0  0.0  25352  3764 ?        Sl   15:36   0:00 /usr/lib/policykit-1/polkitd --no-debug
root      1571  0.0  0.0   2216   256 ?        S    15:36   0:00 /bin/sh /usr/lib/ipsec/_plutorun --debug  --uniqueids yes --force_busy no --nocrsend no --strictcrlpolicy no --nat_traversal yes --keep_alive  --protostack netkey --force_keepalive no --disable_port_floating no --virtual_private  --listen  --crlcheckinterval 0 --ocspuri  --nhelpers  --dump  --opts  --stderrlog  --wait no --pre  --post  --log daemon.error --plutorestartoncrash true --pid /var/run/pluto/pluto.pid
root      1573  0.0  0.0   2216   272 ?        S    15:36   0:00  \_ /bin/sh /usr/lib/ipsec/_plutorun --debug  --uniqueids yes --force_busy no --nocrsend no --strictcrlpolicy no --nat_traversal yes --keep_alive  --protostack netkey --force_keepalive no --disable_port_floating no --virtual_private  --listen  --crlcheckinterval 0 --ocspuri  --nhelpers  --dump  --opts  --stderrlog  --wait no --pre  --post  --log daemon.error --plutorestartoncrash true --pid /var/run/pluto/pluto.pid
root      1577  0.0  0.0  13304  3160 ?        S    15:36   0:00  |   \_ /usr/lib/ipsec/pluto --nofork --secretsfile /etc/ipsec.secrets --ipsecdir /etc/ipsec.d --use-netkey --uniqueids --nat_traversal
root      1587  0.0  0.0  13200   836 ?        SN   15:36   0:00  |       \_ pluto helper  #  0                                                                                                             
root      1588  0.0  0.0  13200   836 ?        SN   15:36   0:00  |       \_ pluto helper  #  1                                                                                                             
root      1589  0.0  0.0  13200   836 ?        SN   15:36   0:00  |       \_ pluto helper  #  2                                                                                                             
root      1590  0.0  0.0  13200   836 ?        SN   15:36   0:00  |       \_ pluto helper  #  3                                                                                                             
root      1591  0.0  0.0  13200   836 ?        SN   15:36   0:00  |       \_ pluto helper  #  4                                                                                                             
root      1592  0.0  0.0  13200   836 ?        SN   15:36   0:00  |       \_ pluto helper  #  5                                                                                                             
root      1593  0.0  0.0  13200   836 ?        SN   15:36   0:00  |       \_ pluto helper  #  6                                                                                                             
root      1743  0.0  0.0   2088   304 ?        S    15:36   0:00  |       \_ _pluto_adns
root      1574  0.0  0.0   2216   544 ?        S    15:36   0:00  \_ /bin/sh /usr/lib/ipsec/_plutoload --wait no --post 
root      1572  0.0  0.0   2132   548 ?        S    15:36   0:00 logger -s -p daemon.error -t ipsec__plutorun
root      1897  0.0  0.0  39560  1840 ?        Ss   15:36   0:00 /usr/lib/l2tp-ipsec-vpn-daemon/L2tpIPsecVpnControlDaemon
root      1906  0.0  0.0      0     0 ?        Z    15:36   0:00  \_ [echo] <defunct>
root      1911  0.0  0.0   4136  1188 ?        Ss   15:36   0:00 ha_logd: read process                        
root      1925  0.0  0.0   4136   684 ?        S    15:36   0:00  \_ ha_logd: write process                       
root      2009  0.0  0.0   2232 
Download .txt
gitextract_1pfsqkt6/

├── .flake8
├── LICENSE.md
├── README.md
├── VERSION
├── distribution
├── distribution.py
├── distributionrc
└── tests/
    ├── runTests.sh
    ├── stderr.01.expected.txt
    ├── stderr.02.expected.txt
    ├── stderr.03.expected.txt
    ├── stderr.04.expected.txt
    ├── stderr.05.expected.txt
    ├── stderr.06.expected.txt
    ├── stderr.07.expected.txt
    ├── stdin.01.txt
    ├── stdin.02.txt
    ├── stdin.03.txt
    ├── stdin.04.txt
    ├── stdout.01.expected.txt
    ├── stdout.02.expected.txt
    ├── stdout.03.expected.txt
    ├── stdout.04.expected.txt
    ├── stdout.05.expected.txt
    ├── stdout.06.expected.txt
    └── stdout.07.expected.txt
Download .txt
SYMBOL INDEX (14 symbols across 1 files)

FILE: distribution.py
  class Histogram (line 28) | class Histogram:
    method __init__ (line 34) | def __init__(self):
    method histogram_bar (line 37) | def histogram_bar(self, s, histWidth, maxVal, barVal):
    method write_hist (line 82) | def write_hist(self, s, tokenDict):
  class InputReader (line 182) | class InputReader:
    method __init__ (line 190) | def __init__(self):
    method prune_keys (line 193) | def prune_keys(self, s):
    method tokenize_input (line 205) | def tokenize_input(self, s):
    method read_pretallied_tokens (line 264) | def read_pretallied_tokens(self, s):
    method read_numerics (line 299) | def read_numerics(self, s, h):
  class Settings (line 347) | class Settings:
    method __init__ (line 348) | def __init__(self):
  function doUsage (line 545) | def doUsage(s):
  function main (line 609) | def main():
Condensed preview — 26 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (237K chars).
[
  {
    "path": ".flake8",
    "chars": 29,
    "preview": "[flake8]\nignore = E501, W503\n"
  },
  {
    "path": "LICENSE.md",
    "chars": 14993,
    "preview": "GNU GENERAL PUBLIC LICENSE\n==========================\n\nVersion 2, June 1991\n\nCopyright (C) 1989, 1991 Free Software Foun"
  },
  {
    "path": "README.md",
    "chars": 35213,
    "preview": "New Canonical Source\n====================\n\nI have taken employment such that it is difficult for me to be the owner of t"
  },
  {
    "path": "VERSION",
    "chars": 6,
    "preview": "1.2.2\n"
  },
  {
    "path": "distribution",
    "chars": 22353,
    "preview": "#!/usr/bin/env perl\n\n# vim: set noexpandtab sw=4 ts=4:\n# --\n# A recent battle with vim and a Go program finally settled "
  },
  {
    "path": "distribution.py",
    "chars": 25044,
    "preview": "#! /usr/bin/env python3\n\n\"\"\"\nGenerate Graphs Directly in the (ASCII- or Unicode-based) Terminal\n\nIf you find yourself ty"
  },
  {
    "path": "distributionrc",
    "chars": 763,
    "preview": "# put this file at $HOME/.distributionrc or specify it as --rcfile=<location>\n# AS THE FIRST ARGUMENT to the script\n#\n# "
  },
  {
    "path": "tests/runTests.sh",
    "chars": 2341,
    "preview": "#!/bin/sh\n\n# make sure env is setup proper\nif [ \"xxx$distribution\" == \"xxx\" ] ; then\n\techo \"To run tests, first export d"
  },
  {
    "path": "tests/stderr.01.expected.txt",
    "chars": 177,
    "preview": "tokens/lines examined: 279    \n tokens/lines matched: 17,444,532\n       histogram keys: 279\n              runtime: 1.52m"
  },
  {
    "path": "tests/stderr.02.expected.txt",
    "chars": 160,
    "preview": "tokens/lines examined: 5,480    \n tokens/lines matched: 1,104\n       histogram keys: 144\n              runtime: 6.19ms\n "
  },
  {
    "path": "tests/stderr.03.expected.txt",
    "chars": 148,
    "preview": "tokens/lines examined: 29    \n tokens/lines matched: 29\n       histogram keys: 9\n              runtime: 0.31ms\n       Ke"
  },
  {
    "path": "tests/stderr.04.expected.txt",
    "chars": 38,
    "preview": "      Key|Ct (Pct)     Histogram\u001b[31m\n"
  },
  {
    "path": "tests/stderr.05.expected.txt",
    "chars": 147,
    "preview": "tokens/lines examined: 1,942    \n tokens/lines matched: 191\n       histogram keys: 11\n              runtime: 2.12ms\nKey|"
  },
  {
    "path": "tests/stderr.06.expected.txt",
    "chars": 312,
    "preview": "tokens/lines examined: 56,960... ; hash prunes: 0\rtokens/lines examined: 113,920... ; hash prunes: 0\rtokens/lines examin"
  },
  {
    "path": "tests/stderr.07.expected.txt",
    "chars": 33,
    "preview": " Key|Ct (Pct)     Histogram\u001b[32m\n"
  },
  {
    "path": "tests/stdin.01.txt",
    "chars": 5413,
    "preview": "27944\t/etc/acpi\n2981\t/etc/adduser.conf\n10\t/etc/adjtime\n15375\t/etc/alternatives\n395\t/etc/anacrontab\n1096\t/etc/ansible\n800"
  },
  {
    "path": "tests/stdin.02.txt",
    "chars": 64936,
    "preview": "2012-01-01  08:01:52  anacron[14182]: Job `cron.daily'\n2012-01-02  08:01:52  anacron[14182]: Normal exit\n2012-01-03  08:"
  },
  {
    "path": "tests/stdin.03.txt",
    "chars": 8441,
    "preview": "/var/log\n/var/log/ConsoleKit\n/var/log/ConsoleKit/history.1\n/var/log/ConsoleKit/history\n/var/log/apt\n/var/log/apt/term.lo"
  },
  {
    "path": "tests/stdin.04.txt",
    "chars": 36589,
    "preview": "USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND\nroot         2  0.0  0.0      0     0 ?        "
  },
  {
    "path": "tests/stdout.01.expected.txt",
    "chars": 2463,
    "preview": "         /etc/mateconf\u001b[0m|\u001b[34m7780758 \u001b[35m(44.60%) \u001b[37m•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••"
  },
  {
    "path": "tests/stdout.02.expected.txt",
    "chars": 1296,
    "preview": "        info\u001b[0m|\u001b[34m229 \u001b[35m(20.74%) \u001b[37m---------------------------------------------------------------------------"
  },
  {
    "path": "tests/stdout.03.expected.txt",
    "chars": 933,
    "preview": "2012-01-01\u001b[0m|\u001b[34m3 \u001b[35m(10.34%) \u001b[37m|||||||||||||||||||||||||||||||||||||||||||||||||||||\u001b[32m\n2012-01-02\u001b[0m|\u001b[34m"
  },
  {
    "path": "tests/stdout.04.expected.txt",
    "chars": 481,
    "preview": "      var\u001b[0m|\u001b[33m265 \u001b[35m(27.69%) \u001b[37m(((((((((((((((((((((((((((((((((((()\u001b[31m\n      log\u001b[0m|\u001b[33m265 \u001b[35m(27.69%"
  },
  {
    "path": "tests/stdout.05.expected.txt",
    "chars": 577,
    "preview": " 0\u001b[0m|\u001b[34m6 \u001b[35m(3.14%)   \u001b[37mppppc\u001b[32m\n 1\u001b[0m|\u001b[34m46 \u001b[35m(24.08%) \u001b[37mppppppppppppppppppppppppppppppppc\u001b[32m\n 2"
  },
  {
    "path": "tests/stdout.06.expected.txt",
    "chars": 1654,
    "preview": "  7\u001b[0m|\u001b[34m51975 \u001b[36m(28.12%) \u001b[31m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
  },
  {
    "path": "tests/stdout.07.expected.txt",
    "chars": 603,
    "preview": "   S\u001b[0m|\u001b[34m113 \u001b[35m(41.39%) \u001b[37mΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞ\u001b[32m\n  Sl\u001b"
  }
]

About this extraction

This page contains the full source code of the philovivero/distribution GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 26 files (219.9 KB), approximately 85.0k tokens, and a symbol index with 14 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!