<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Peter's Blog - Nodes for bloglines</title>
    <link>http://www.petersblog.org/</link>
    <description>Nodes containing the tag bloglines</description>
    <item>
      <title>Net Abuse</title>
      <link>http://www.petersblog.org/node/view/1098</link>
      <description>&lt;p&gt;
Extracts from awstats logs, bandwidth used by various visitors to this site: 
&lt;/p&gt;
&lt;p&gt;
&lt;table&gt; &lt;tr&gt;&lt;td&gt;crawler.bloglines.com&lt;/td&gt;&lt;td&gt;353.02 MB&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;MSIECrawler&lt;/td&gt;&lt;td&gt;           567.41 MB&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Inktomi Slurp&lt;/td&gt;&lt;td&gt;         135.79 MB&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Googlebot&lt;/td&gt;&lt;td&gt;             59.86 MB&lt;/td&gt;&lt;/tr&gt; &lt;/table&gt; 
&lt;/p&gt;
&lt;p&gt;
Apparently MSIECrawler is IE sucking the entire contents of the site. A couple of people seem to have done this, what is the point? Is this site that interesting? Are the spam blogs (copies of legitimate blogs full of links to p0ker sites) using IE for their scraping technology? My attitude to the spammers turns from annoyance to pity. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="/tag/bloglines"&gt;Bloglines&lt;/a&gt; is getting a bit carried away, 353M just downloading RSS feeds. 
&lt;/p&gt;
&lt;p&gt;
InkTomi Slurp is still slurping and not returning any visitors from search results. 
&lt;/p&gt;
&lt;p&gt;
Googlebot drives 95% of my traffic so 59M is acceptable. 
&lt;/p&gt;
&lt;p&gt;
Here is my latest crack at apache log file analysis in &lt;a href="/tag/python"&gt;python&lt;/a&gt;: 
&lt;/p&gt;
&lt;pre class="lazy"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Apache log file analysis.&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="Keyword"&gt;import&lt;/span&gt; re
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; &lt;span class="Keyword"&gt;import&lt;/span&gt; datetime
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Regular expression for parsing apache log file.&lt;/span&gt;
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt; oLogRE &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;re.compile&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="Keyword"&gt;r&lt;/span&gt;&lt;span class="String"&gt;'''&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;[&lt;/span&gt;&lt;span class="Constant"&gt;\d&lt;/span&gt;&lt;span class="Constant"&gt;.&lt;/span&gt;&lt;span class="Constant"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;&lt;span class="String"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="Constant"&gt;.&lt;/span&gt;&lt;span class="Keyword"&gt;*&lt;/span&gt;&lt;span class="Constant"&gt;\s&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;                &lt;span class="Comment"&gt;# host&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  11 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="String"&gt;                  &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;[&lt;/span&gt;&lt;span class="Keyword"&gt;^&lt;/span&gt;&lt;span class="Constant"&gt;\s&lt;/span&gt;&lt;span class="Constant"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;&lt;span class="Constant"&gt;\s&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;                        &lt;span class="Comment"&gt;# ?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  12 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="String"&gt;                  &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;[&lt;/span&gt;&lt;span class="Keyword"&gt;^&lt;/span&gt;&lt;span class="Constant"&gt;\s&lt;/span&gt;&lt;span class="Constant"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;&lt;span class="Constant"&gt;\s&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;                        &lt;span class="Comment"&gt;# ?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  13 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="String"&gt;                  &lt;span class="Constant"&gt;\[&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;.&lt;/span&gt;&lt;span class="Keyword"&gt;*?&lt;/span&gt;&lt;span class="String"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="Constant"&gt;\]&lt;/span&gt;&lt;span class="Constant"&gt;\s&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;                     &lt;span class="Comment"&gt;# when&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  14 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="String"&gt;                  &amp;quot;&lt;span class="String"&gt;&lt;span class="String"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;.&lt;/span&gt;&lt;span class="Keyword"&gt;*?&lt;/span&gt;&lt;span class="String"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="Constant"&gt;\s&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;.&lt;/span&gt;&lt;span class="Keyword"&gt;*&lt;/span&gt;&lt;span class="String"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="Constant"&gt;\s&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;.&lt;/span&gt;&lt;span class="Keyword"&gt;*&lt;/span&gt;&lt;span class="String"&gt;)&lt;/span&gt;&lt;/span&gt;&amp;quot;&lt;span class="Constant"&gt;\s&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;         &lt;span class="Comment"&gt;# method, path, protocol&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  15 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="String"&gt;                  &lt;span class="String"&gt;&lt;span class="String"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;\d&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;&lt;span class="String"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="Constant"&gt;\s&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;                         &lt;span class="Comment"&gt;# Error code&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  16 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="String"&gt;                  &lt;span class="String"&gt;&lt;span class="String"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;[&lt;/span&gt;&lt;span class="Keyword"&gt;^&lt;/span&gt;&lt;span class="Constant"&gt;\s&lt;/span&gt;&lt;span class="Constant"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;&lt;span class="String"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="Constant"&gt;\s&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;                      &lt;span class="Comment"&gt;# Size ?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  17 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="String"&gt;                  &amp;quot;&lt;span class="String"&gt;&lt;span class="String"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;.&lt;/span&gt;&lt;span class="Keyword"&gt;*?&lt;/span&gt;&lt;span class="String"&gt;)&lt;/span&gt;&lt;/span&gt;&amp;quot;&lt;span class="Constant"&gt;\s&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;                       &lt;span class="Comment"&gt;# Referrer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  18 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="String"&gt;                  &amp;quot;&lt;span class="String"&gt;&lt;span class="String"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;.&lt;/span&gt;&lt;span class="Keyword"&gt;*?&lt;/span&gt;&lt;span class="String"&gt;)&lt;/span&gt;&lt;/span&gt;&amp;quot;                          &lt;span class="Comment"&gt;# Agent&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  19 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'''&lt;/span&gt;&lt;/span&gt;, re.VERBOSE&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  20 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  21 &lt;/span&gt; LOG_Who &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;0&lt;/span&gt;
&lt;span class="line-numbers"&gt;  22 &lt;/span&gt; LOG_When &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
&lt;span class="line-numbers"&gt;  23 &lt;/span&gt; LOG_How &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;2&lt;/span&gt;
&lt;span class="line-numbers"&gt;  24 &lt;/span&gt; LOG_What &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;3&lt;/span&gt;
&lt;span class="line-numbers"&gt;  25 &lt;/span&gt; LOG_Protocol &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;4&lt;/span&gt;
&lt;span class="line-numbers"&gt;  26 &lt;/span&gt; LOG_Error &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;5&lt;/span&gt;
&lt;span class="line-numbers"&gt;  27 &lt;/span&gt; LOG_Size &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;6&lt;/span&gt;
&lt;span class="line-numbers"&gt;  28 &lt;/span&gt; LOG_Referrer &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;7&lt;/span&gt;
&lt;span class="line-numbers"&gt;  29 &lt;/span&gt; LOG_Agent &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;8&lt;/span&gt;
&lt;span class="line-numbers"&gt;  30 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  31 &lt;/span&gt; &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;ScanFile&lt;/span&gt;( &lt;span class="Variable"&gt;strFile&lt;/span&gt;):
&lt;span class="line-numbers"&gt;  32 &lt;/span&gt;     &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  33 &lt;/span&gt; &lt;span class="String"&gt;    Scan apache log file and return hits.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  34 &lt;/span&gt; &lt;span class="String"&gt;    &lt;span class="String"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  35 &lt;/span&gt;     &lt;span class="Keyword"&gt;for&lt;/span&gt; strLine &lt;span class="Keyword"&gt;in&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Support"&gt;open&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;c:&lt;span class="Constant"&gt;\\&lt;/span&gt;Desktop&lt;span class="Constant"&gt;\\&lt;/span&gt;access.log&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;readlines&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;:
&lt;span class="line-numbers"&gt;  36 &lt;/span&gt;         oMatch &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;oLogRE.match&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strLine&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  37 &lt;/span&gt;         &lt;span class="Keyword"&gt;if&lt;/span&gt; oMatch:
&lt;span class="line-numbers"&gt;  38 &lt;/span&gt;             &lt;span class="Keyword"&gt;yield&lt;/span&gt;( &lt;span class="MetaFunctionCallPy"&gt;oMatch.groups&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;)
&lt;span class="line-numbers"&gt;  39 &lt;/span&gt;         &lt;span class="Keyword"&gt;else&lt;/span&gt;:
&lt;span class="line-numbers"&gt;  40 &lt;/span&gt;             &lt;span class="Keyword"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Reject: &lt;span class="StringInterpolation"&gt;%s&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;%&lt;/span&gt; strLine
&lt;span class="line-numbers"&gt;  41 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  42 &lt;/span&gt; &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;GatherBy&lt;/span&gt;( &lt;span class="Variable"&gt;oHits&lt;/span&gt;, &lt;span class="Variable"&gt;nField&lt;/span&gt;):
&lt;span class="line-numbers"&gt;  43 &lt;/span&gt;     &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  44 &lt;/span&gt; &lt;span class="String"&gt;    Gather hits from list of hits into a dictionary keyed&lt;/span&gt;
&lt;span class="line-numbers"&gt;  45 &lt;/span&gt; &lt;span class="String"&gt;    by unique values of a specific field.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  46 &lt;/span&gt; &lt;span class="String"&gt;    &lt;span class="String"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  47 &lt;/span&gt;     oDict &lt;span class="Keyword"&gt;=&lt;/span&gt; {}
&lt;span class="line-numbers"&gt;  48 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  49 &lt;/span&gt;     &lt;span class="Keyword"&gt;for&lt;/span&gt; oHit &lt;span class="Keyword"&gt;in&lt;/span&gt; oHits:
&lt;span class="line-numbers"&gt;  50 &lt;/span&gt;         oKey &lt;span class="Keyword"&gt;=&lt;/span&gt; oHit[nField]
&lt;span class="line-numbers"&gt;  51 &lt;/span&gt;         &lt;span class="Keyword"&gt;if&lt;/span&gt; oKey &lt;span class="Keyword"&gt;in&lt;/span&gt; oDict:
&lt;span class="line-numbers"&gt;  52 &lt;/span&gt;             oDict[oKey].&lt;span class="MetaFunctionCallPy"&gt;append&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; oHit&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  53 &lt;/span&gt;         &lt;span class="Keyword"&gt;else&lt;/span&gt;:
&lt;span class="line-numbers"&gt;  54 &lt;/span&gt;             oDict[oKey] &lt;span class="Keyword"&gt;=&lt;/span&gt; [oHit]
&lt;span class="line-numbers"&gt;  55 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  56 &lt;/span&gt;     &lt;span class="Keyword"&gt;return&lt;/span&gt; oDict
&lt;span class="line-numbers"&gt;  57 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  58 &lt;/span&gt; &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;FilterBy&lt;/span&gt;( &lt;span class="Variable"&gt;oHits&lt;/span&gt;, &lt;span class="Variable"&gt;nField&lt;/span&gt;, &lt;span class="Variable"&gt;strFilter&lt;/span&gt;):
&lt;span class="line-numbers"&gt;  59 &lt;/span&gt;     &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  60 &lt;/span&gt; &lt;span class="String"&gt;    Filter hits from list of hits by unique values of a specific field.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  61 &lt;/span&gt; &lt;span class="String"&gt;    &lt;span class="String"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  62 &lt;/span&gt;     oRE &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;re.compile&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strFilter&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  63 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  64 &lt;/span&gt;     &lt;span class="Keyword"&gt;for&lt;/span&gt; oHit &lt;span class="Keyword"&gt;in&lt;/span&gt; oHits:
&lt;span class="line-numbers"&gt;  65 &lt;/span&gt;         &lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;oRE.search&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="MetaFunctionCallPy"&gt;oHit&lt;span class="MetaFunctionCallPy"&gt;[&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;nField&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;:
&lt;span class="line-numbers"&gt;  66 &lt;/span&gt;             &lt;span class="Keyword"&gt;yield&lt;/span&gt;( oHit)
&lt;span class="line-numbers"&gt;  67 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  68 &lt;/span&gt; &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;FilterByDate&lt;/span&gt;( &lt;span class="Variable"&gt;oHits&lt;/span&gt;,
&lt;span class="line-numbers"&gt;  69 &lt;/span&gt;                   &lt;span class="Variable"&gt;oStartDate&lt;/span&gt;,
&lt;span class="line-numbers"&gt;  70 &lt;/span&gt;                   &lt;span class="Variable"&gt;oEndDate&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;datetime.date.today&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;+&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;datetime.timedelta&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Constant"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;):
&lt;span class="line-numbers"&gt;  71 &lt;/span&gt;     &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  72 &lt;/span&gt; &lt;span class="String"&gt;    Filter hits &amp;gt;= Start Date and &amp;lt; End Date&lt;/span&gt;
&lt;span class="line-numbers"&gt;  73 &lt;/span&gt; &lt;span class="String"&gt;    &lt;span class="String"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  74 &lt;/span&gt;     oRE &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;re.compile&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="Keyword"&gt;r&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;\d&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;&lt;span class="String"&gt;)&lt;/span&gt;&lt;/span&gt;/&lt;span class="String"&gt;&lt;span class="String"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;\w&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;&lt;span class="String"&gt;)&lt;/span&gt;&lt;/span&gt;/&lt;span class="String"&gt;&lt;span class="String"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;\d&lt;/span&gt;&lt;span class="Keyword"&gt;+&lt;/span&gt;&lt;span class="String"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="Constant"&gt;.&lt;/span&gt;&lt;span class="Keyword"&gt;*&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  75 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  76 &lt;/span&gt;     &lt;span class="Keyword"&gt;for&lt;/span&gt; oHit &lt;span class="Keyword"&gt;in&lt;/span&gt; oHits:
&lt;span class="line-numbers"&gt;  77 &lt;/span&gt;         strDate &lt;span class="Keyword"&gt;=&lt;/span&gt; oHit[LOG_When]
&lt;span class="line-numbers"&gt;  78 &lt;/span&gt;         strDay, strMonth, strYear &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;oRE.match&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strDate&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;groups&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  79 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  80 &lt;/span&gt;         nDay &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Support"&gt;int&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strDay&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  81 &lt;/span&gt;         nMonth &lt;span class="Keyword"&gt;=&lt;/span&gt; [&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Jan&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Feb&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Mar&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;,
&lt;span class="line-numbers"&gt;  82 &lt;/span&gt;                   &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Apr&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;May&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Jun&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;,
&lt;span class="line-numbers"&gt;  83 &lt;/span&gt;                   &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Jul&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Aug&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Sep&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;,
&lt;span class="line-numbers"&gt;  84 &lt;/span&gt;                   &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Oct&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Nov&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Dec&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;].&lt;span class="MetaFunctionCallPy"&gt;index&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strMonth&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;+&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
&lt;span class="line-numbers"&gt;  85 &lt;/span&gt;         nYear &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Support"&gt;int&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strYear&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  86 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  87 &lt;/span&gt;         oDate &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;datetime.date&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; nYear, nMonth, nDay&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  88 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  89 &lt;/span&gt;         &lt;span class="Keyword"&gt;if&lt;/span&gt; oDate &lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;&lt;span class="Keyword"&gt;=&lt;/span&gt; oStartDate &lt;span class="Keyword"&gt;and&lt;/span&gt; oDate &lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt; oEndDate:
&lt;span class="line-numbers"&gt;  90 &lt;/span&gt;             &lt;span class="Keyword"&gt;yield&lt;/span&gt;( oHit)
&lt;span class="line-numbers"&gt;  91 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  92 &lt;/span&gt; &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;AnalyseBy&lt;/span&gt;( &lt;span class="Variable"&gt;oHits&lt;/span&gt;, &lt;span class="Variable"&gt;nField&lt;/span&gt;, &lt;span class="Variable"&gt;bJustSummary&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;False&lt;/span&gt;):
&lt;span class="line-numbers"&gt;  93 &lt;/span&gt;     &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  94 &lt;/span&gt; &lt;span class="String"&gt;    Print hits by unique values of a specific field&lt;/span&gt;
&lt;span class="line-numbers"&gt;  95 &lt;/span&gt; &lt;span class="String"&gt;    and generate counts and bytes for each unique value.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  96 &lt;/span&gt; &lt;span class="String"&gt;    &lt;span class="String"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  97 &lt;/span&gt;     oDict &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;GatherBy&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; oHits, nField&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  98 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  99 &lt;/span&gt;     oKeys &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;oDict.keys&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 100 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 101 &lt;/span&gt;     &lt;span class="MetaFunctionCallPy"&gt;oKeys.sort&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 102 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 103 &lt;/span&gt;     nGrandTotalCounts &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;0&lt;/span&gt;
&lt;span class="line-numbers"&gt; 104 &lt;/span&gt;     nGrandTotalBytes &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;0&lt;/span&gt;
&lt;span class="line-numbers"&gt; 105 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 106 &lt;/span&gt;     &lt;span class="Keyword"&gt;for&lt;/span&gt; oKey &lt;span class="Keyword"&gt;in&lt;/span&gt; oKeys:
&lt;span class="line-numbers"&gt; 107 &lt;/span&gt;         nCount &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Support"&gt;len&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="MetaFunctionCallPy"&gt;oDict&lt;span class="MetaFunctionCallPy"&gt;[&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;oKey&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 108 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 109 &lt;/span&gt;         nTotal &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;0&lt;/span&gt;
&lt;span class="line-numbers"&gt; 110 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 111 &lt;/span&gt;         &lt;span class="Keyword"&gt;for&lt;/span&gt; oHit &lt;span class="Keyword"&gt;in&lt;/span&gt; oDict[oKey]:
&lt;span class="line-numbers"&gt; 112 &lt;/span&gt;             strSize &lt;span class="Keyword"&gt;=&lt;/span&gt; oHit[LOG_Size]
&lt;span class="line-numbers"&gt; 113 &lt;/span&gt;             &lt;span class="Keyword"&gt;if&lt;/span&gt; strSize &lt;span class="Keyword"&gt;!=&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;-&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;:
&lt;span class="line-numbers"&gt; 114 &lt;/span&gt;                 nTotal &lt;span class="Keyword"&gt;+=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Support"&gt;int&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;strSize&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 115 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 116 &lt;/span&gt;         &lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="Keyword"&gt;not&lt;/span&gt; bJustSummary:
&lt;span class="line-numbers"&gt; 117 &lt;/span&gt;             &lt;span class="Keyword"&gt;print&lt;/span&gt; oKey, nCount, nTotal
&lt;span class="line-numbers"&gt; 118 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 119 &lt;/span&gt;         nGrandTotalCounts &lt;span class="Keyword"&gt;+=&lt;/span&gt; nCount
&lt;span class="line-numbers"&gt; 120 &lt;/span&gt;         nGrandTotalBytes &lt;span class="Keyword"&gt;+=&lt;/span&gt; nTotal
&lt;span class="line-numbers"&gt; 121 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 122 &lt;/span&gt;     &lt;span class="Keyword"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Unique items: &lt;span class="StringInterpolation"&gt;%d&lt;/span&gt;, Total Hits: &lt;span class="StringInterpolation"&gt;%d&lt;/span&gt;, Total Bytes: &lt;span class="StringInterpolation"&gt;%d&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;%&lt;/span&gt; (&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Support"&gt;len&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;oKeys&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;,
&lt;span class="line-numbers"&gt; 123 &lt;/span&gt;                                                                  nGrandTotalCounts,
&lt;span class="line-numbers"&gt; 124 &lt;/span&gt;                                                                  nGrandTotalBytes)
&lt;span class="line-numbers"&gt; 125 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 126 &lt;/span&gt; oStartDate &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;datetime.date.today&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;-&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;datetime.timedelta&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="Constant"&gt;8&lt;/span&gt; &lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; week yesterday&lt;/span&gt;
&lt;span class="line-numbers"&gt; 127 &lt;/span&gt; oEndDate &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;datetime.date.today&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;-&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;datetime.timedelta&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="Constant"&gt;1&lt;/span&gt; &lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;  &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; yesterday&lt;/span&gt;
&lt;span class="line-numbers"&gt; 128 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 129 &lt;/span&gt; oAllHits &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Support"&gt;list&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="MetaFunctionCallPy"&gt;FilterByDate&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="MetaFunctionCallPy"&gt;ScanFile&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;c:&lt;span class="Constant"&gt;\\&lt;/span&gt;Desktop&lt;span class="Constant"&gt;\\&lt;/span&gt;access.log&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 130 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;                               oStartDate, oEndDate&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 131 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;oAllHits.extend&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Support"&gt;list&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="MetaFunctionCallPy"&gt;FilterByDate&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="MetaFunctionCallPy"&gt;ScanFile&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;c:&lt;span class="Constant"&gt;\\&lt;/span&gt;Desktop&lt;span class="Constant"&gt;\\&lt;/span&gt;access.log.1&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 132 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;                                     oStartDate, oEndDate&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 133 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 134 &lt;/span&gt; &lt;span class="Keyword"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;User Agents&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 135 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;AnalyseBy&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; oAllHits, LOG_Agent, &lt;span class="Constant"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 136 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 137 &lt;/span&gt; &lt;span class="Keyword"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;All Hosts (hence all usage)&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 138 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;AnalyseBy&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; oAllHits, LOG_Who, &lt;span class="Constant"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 139 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 140 &lt;/span&gt; &lt;span class="Keyword"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Hits from bloglines&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 141 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 142 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Determine different bloglines feeds and analyse each one&lt;/span&gt;
&lt;span class="line-numbers"&gt; 143 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 144 &lt;/span&gt; &lt;span class="Keyword"&gt;for&lt;/span&gt; strFeed, oFeedHits &lt;span class="Keyword"&gt;in&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;GatherBy&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="MetaFunctionCallPy"&gt;FilterBy&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; oAllHits,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 145 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;                                              LOG_Agent,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 146 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;                                              &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Bloglines&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 147 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;                                    LOG_What&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;items&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;:
&lt;span class="line-numbers"&gt; 148 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 149 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Now analyse by agent:  agent includes number of subscribers&lt;/span&gt;
&lt;span class="line-numbers"&gt; 150 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; so we see subscribers per feed.&lt;/span&gt;
&lt;span class="line-numbers"&gt; 151 &lt;/span&gt;     &lt;span class="Keyword"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Bloglines feed &lt;span class="StringInterpolation"&gt;%s&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;%&lt;/span&gt; strFeed
&lt;span class="line-numbers"&gt; 152 &lt;/span&gt;     &lt;span class="MetaFunctionCallPy"&gt;AnalyseBy&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; oFeedHits, LOG_Agent&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 153 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 154 &lt;/span&gt; &lt;span class="Keyword"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Hits from MSIECrawler by host&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 155 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;AnalyseBy&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="MetaFunctionCallPy"&gt;FilterBy&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; oAllHits, LOG_Agent, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;MSIECrawler&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;, LOG_Who&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 156 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 157 &lt;/span&gt; &lt;span class="Keyword"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Hits from Inktomi/yahoo slurp&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 158 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;AnalyseBy&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="MetaFunctionCallPy"&gt;FilterBy&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; oAllHits, LOG_Agent, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Slurp&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;, LOG_Agent&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Example output for week ending yesterday. Notes: 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
659,628,604 bytes served in a week! 
&lt;/li&gt;
&lt;li&gt;
Slurp took 45,786,926 bytes 
&lt;/li&gt;
&lt;li&gt;
MSIECrawl user took 49,980,154 bytes 
&lt;/li&gt;
&lt;li&gt;
I've got more bloglines subscribers than I thought. 
&lt;/li&gt;
&lt;li&gt;
Just how many rss feed urls does &lt;a href="/tag/drupal"&gt;drupal&lt;/a&gt; provide? 
&lt;/li&gt;&lt;/ul&gt;

&lt;div class="verbatim-block"&gt;&lt;pre&gt;User Agents
Unique items: 497, Total Hits: 76052, Total Bytes: 659628604

All Hosts (hence all usage)
Unique items: 3301, Total Hits: 76052, Total Bytes: 659628604

Hits from bloglines
Bloglines feed /blog/1/feed
Bloglines/3.0-rho (http://www.bloglines.com; 1 subscriber) 252 13730570
Bloglines/3.0-rho (http://www.bloglines.com; 3 subscribers) 256 13947306
Bloglines/3.0-rho (http://www.bloglines.com; 5 subscribers) 252 13730570
Bloglines/3.0-rho (http://www.bloglines.com; 7 subscribers) 256 13947306
Unique items: 4, Total Hits: 1016, Total Bytes: 55355752
Bloglines feed /blog/feed
Bloglines/3.0-rho (http://www.bloglines.com; 1 subscriber) 242 13189698
Unique items: 1, Total Hits: 242, Total Bytes: 13189698
Bloglines feed /atom/feed
Bloglines/3.0-rho (http://www.bloglines.com; 3 subscribers) 256 1449434
Unique items: 1, Total Hits: 256, Total Bytes: 1449434
Bloglines feed /tags/18/feed
Bloglines/3.0-rho (http://www.bloglines.com; 1 subscriber) 256 12427520
Unique items: 1, Total Hits: 256, Total Bytes: 12427520
Bloglines feed /blog/feed/1
Bloglines/3.0-rho (http://www.bloglines.com; 5 subscribers) 252 0
Unique items: 1, Total Hits: 252, Total Bytes: 0
Bloglines feed /taxonomy/term/5/0/feed
Bloglines/3.0-rho (http://www.bloglines.com; 1 subscriber) 242 3832796
Unique items: 1, Total Hits: 242, Total Bytes: 3832796
Bloglines feed /node/feed
Bloglines/3.0-rho (http://www.bloglines.com; 3 subscribers) 256 13959338
Unique items: 1, Total Hits: 256, Total Bytes: 13959338
Bloglines feed /rss.xml
Bloglines/3.0-rho (http://www.bloglines.com; 3 subscribers) 256 0
Bloglines/3.0-rho (http://www.bloglines.com; 7 subscribers) 256 0
Unique items: 2, Total Hits: 512, Total Bytes: 0
Bloglines feed /tags/3/feed
Bloglines/3.0-rho (http://www.bloglines.com; 1 subscriber) 250 12999000
Unique items: 1, Total Hits: 250, Total Bytes: 12999000

Hits from MSIECrawler by host
81.159.46.223 1784 49980154
Unique items: 1, Total Hits: 1784, Total Bytes: 49980154

Hits from Inktomi/yahoo slurp
Mozilla/5.0 (compatible; Yahoo! Slurp China;) 58 800642
Mozilla/5.0 (compatible; Yahoo! Slurp;) 2066 44986284
Unique items: 2, Total Hits: 2124, Total Bytes: 45786926
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Related Posts: &lt;a href="/tag/apache"&gt;apache&lt;/a&gt; &lt;a href="/tag/awstats"&gt;awstats&lt;/a&gt; &lt;a href="/tag/bloglines"&gt;bloglines&lt;/a&gt; &lt;a href="/tag/log"&gt;log&lt;/a&gt; &lt;a href="/tag/python"&gt;python&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/1098</guid>
      <category domain="http://www.technorati.com/tag">apache</category>
      <category domain="http://www.technorati.com/tag">awstats</category>
      <category domain="http://www.technorati.com/tag">bloglines</category>
      <category domain="http://www.technorati.com/tag">log</category>
      <category domain="http://www.technorati.com/tag">python</category>
    </item>
    <item>
      <title>Gregarius RSS Aggregator</title>
      <link>http://www.petersblog.org/node/view/1037</link>
      <description>&lt;p&gt;
I like using a web base aggregator so that I can access it from whereever I may be and it will remember my subscrptions and what articles I have already read. For some time I've been toying with the idea of installing an RSS aggregator on my dedicated server. This would be something to replace &lt;a href="/tag/bloglines"&gt;bloglines&lt;/a&gt; but which I could tweak to my liking. I haven't been in a big hurry to do this as bloglines has been ok thus far. However, the other day I was using it and I realised how slow it can be, waiting for it to download new articles. I thought this was an excellent reason to seek alternatives. 
&lt;/p&gt;
&lt;p&gt;
I had a look around for web based aggragators and found the &lt;a href="http://en.wikipedia.org/wiki/List_of_news_aggregators"&gt;wikipedia list of news aggregators&lt;/a&gt; and from this I found &lt;a href="http://gregarius.net/"&gt;Gregarius&lt;/a&gt;. Installation was very straightforward: 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
Create mysql database, user and password for it 
&lt;/li&gt;
&lt;li&gt;
untar Gregarius into domain directory 
&lt;/li&gt;
&lt;li&gt;
edit config file to tell it details of the database 
&lt;/li&gt;
&lt;li&gt;
access it through web server. 
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
It's pretty standard LAMP stuff. 
&lt;/p&gt;
&lt;p&gt;
It's nice to use, very configurable, much more so than bloglines. You can control when the feeds get aggregated (for now I plan to press the refresh button to manually trigger aggregation), how many articles per page, you can read as a 'river of news' (articles from different sources mixed togther by creation date) or read them grouped by feed. Other aggregators only support the 'river of news' format which I don't really like as I don't like to mentally context switch between unrelated topics between each posting: for example, first post is a dilbert cartoon, followed by bbc news about untimely deaths, followed by an engadget piece about a new mp3 player, it's all over the place. I prefer to go through my feeds in the order that is interesting to me at the time (cherry pick, Dilbert first normally). 
&lt;/p&gt;
&lt;p&gt;
Gregarius supports a few themes and plugins and so far these have fixed the minor quibbles I had. For example, I wanted to read postings in order of creation rather than newest first which means reading down the page. However, the 'mark all as read and get some more' button was at the top of the page some once I got to the bottom I had to scroll to the top to get more articles. Someone had already had this problem and there was a plugin available to put an extra button at the bottom of the page. 
&lt;/p&gt;
&lt;p&gt;
One little hack I had to do was with the 'lilina' theme which supports a button to collapse the left sidebar which will be useful on my Dell &lt;a href="/tag/d410"&gt;d410&lt;/a&gt; with a 12" screen. However, this theme also collapses the articles down to titles by default which I did not want. I fixed this be editing the themes/lilina/item.php file as follows: 
&lt;/p&gt;
&lt;pre class="lazy"&gt;    &amp;lt;!--pcw &amp;lt;div class=&amp;quot;content&amp;quot; id=&amp;quot;c&amp;lt;?php &lt;span class="Support"&gt;echo&lt;/span&gt; rss_item_id(); ?&amp;gt;&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;--&amp;gt;
    &amp;lt;div class=&amp;quot;content&amp;quot; id=&amp;quot;c&amp;lt;?php &lt;span class="Support"&gt;echo&lt;/span&gt; rss_item_id(); ?&amp;gt;&amp;quot; style=&amp;quot;display:block&amp;quot;
&lt;/pre&gt;
&lt;p&gt;
i.e. by default the article contents is display:block rather than display:none. 
&lt;/p&gt;
&lt;p&gt;
What I most miss from bloglines is being able to press 'j' to go to the next article. 
&lt;/p&gt;
&lt;p&gt;
What I dislike about Gregarius most is that it isn't spelt Gregarious. 
&lt;/p&gt;
&lt;p&gt;
ToDo: figure out how to get cron to prune old articles from the database. It can be done explicitly through the admin pages but I don't want more chores. 
&lt;/p&gt;&lt;p&gt;Related Posts: &lt;a href="/tag/bloglines"&gt;bloglines&lt;/a&gt; &lt;a href="/tag/gregarius"&gt;gregarius&lt;/a&gt; &lt;a href="/tag/rss"&gt;rss&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/1037</guid>
      <category domain="http://www.technorati.com/tag">bloglines</category>
      <category domain="http://www.technorati.com/tag">gregarius</category>
      <category domain="http://www.technorati.com/tag">rss</category>
    </item>
    <item>
      <title>Google RSS Reader</title>
      <link>http://www.petersblog.org/node/view/1006</link>
      <description>&lt;p&gt;
I had a play with &lt;a href="http://www.google.com/reader/lens/"&gt;googles online rss reader&lt;/a&gt;. It is very fancy but I don't think it would tempt me away from &lt;a href="/tag/bloglines"&gt;bloglines&lt;/a&gt;: 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
You only see one article at a time. Bloglines shows you all the articles from a feed in one page which I think is better for spotting the interesting stuff. You can step through the articles with the j button in both bloglines and the google reader (coincidence? Group homage to vi?) 
&lt;/li&gt;
&lt;li&gt;
I don't want to go through a mix of articles from all feeds in chronological order. I like to go through feed by feed. If I open the list of feeds in the google reader it occupies half the screen on my &lt;a href="/tag/d410"&gt;d410&lt;/a&gt;. 
&lt;/li&gt;
&lt;li&gt;
It is a bit buggy: at one point the 'loading' splash thing got stuck on. But like most google software it is beta. 
&lt;/li&gt;
&lt;li&gt;
It carefully strips the colour coding and indentation out of syntax highlighted code. Bloglines strips the indentation. I am not sure why they do this, is it the presentation police? 
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
What I am looking for is the mysthical rss aggregator with bayesian filtering that will learn what interests you and only show that. I'd write one if there were only nine days in every week. 
&lt;/p&gt;
&lt;p&gt;
Conclusion: google see rss as the future and want to slap adverts all over my blatherings. 
&lt;/p&gt;&lt;p&gt;Related Posts: &lt;a href="/tag/bloglines"&gt;bloglines&lt;/a&gt; &lt;a href="/tag/google"&gt;google&lt;/a&gt; &lt;a href="/tag/rss"&gt;rss&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/1006</guid>
      <category domain="http://www.technorati.com/tag">bloglines</category>
      <category domain="http://www.technorati.com/tag">google</category>
      <category domain="http://www.technorati.com/tag">rss</category>
    </item>
    <item>
      <title>bloglines</title>
      <link>http://www.petersblog.org/node/view/785</link>
      <description>&lt;p&gt;
&lt;a href="http://www.bloglines.com"&gt;bloglines&lt;/a&gt; is a web-based news aggregator. 
&lt;/p&gt;&lt;p&gt;Related Posts: &lt;a href="/tag/bloglines"&gt;bloglines&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/785</guid>
      <category domain="http://www.technorati.com/tag">bloglines</category>
    </item>
    <item>
      <title>Bloglines article duplication</title>
      <link>http://www.petersblog.org/node/view/774</link>
      <description>&lt;p&gt;
I use &lt;a href="http://www.bloglines.com"&gt;bloglines&lt;/a&gt; for my rss aggregation. On it I subscribe to my own rss feeds to reassure myself that they are reaching the outside world. Since I installed the &lt;a href="tags/awtags"&gt;awtags&lt;/a&gt; module my postings have all contained links to their tag entries. This doesn't really bother me, it may encourage people to visit my site if they see useful links in the rss feed. 
&lt;/p&gt;
&lt;p&gt;
Bloglines tries to deliver articles that have changed and it appears to do this by comparing the contents of the rss file with its previous contents. If there are any small changes bloglines displays the article in the same way as it does for new articles. 
&lt;/p&gt;
&lt;p&gt;
I don't like to hastle people when I edit articles to correct spelling mistakes or whatever so I have altered the &lt;a href="http://www.drupal.org"&gt;drupal&lt;/a&gt; ping module to only ping (i.e. tell the outside world) if a new posting is created, not if it is modified. However, bloglines appears to poll my feed and so the slightest change will result in articles appearing as if the are new. Today I assigned some tags to some older articles using awtags and this was suficient for the them to be displayed by blogines as new articles as they were still in the rss feed. 
&lt;/p&gt;
&lt;p&gt;
This is the long way of apologising to anyone who thinks I a winding them up by republishing old articles with no noticable changes. 
&lt;/p&gt;
&lt;p&gt;
I see I have a new subscribed on bloglines. Welcome, hope you find my whitterings interesting. I am getting more visitors since I started using awtags, especially from technorati. 
&lt;/p&gt;&lt;p&gt;Related Posts: &lt;a href="/tag/awtags"&gt;awtags&lt;/a&gt; &lt;a href="/tag/bloglines"&gt;bloglines&lt;/a&gt; &lt;a href="/tag/drupal"&gt;drupal&lt;/a&gt; &lt;a href="/tag/rss"&gt;rss&lt;/a&gt; &lt;a href="/tag/tagging"&gt;tagging&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/774</guid>
      <category domain="http://www.technorati.com/tag">awtags</category>
      <category domain="http://www.technorati.com/tag">bloglines</category>
      <category domain="http://www.technorati.com/tag">drupal</category>
      <category domain="http://www.technorati.com/tag">rss</category>
      <category domain="http://www.technorati.com/tag">tagging</category>
    </item>
    <item>
      <title>Ask Jeeves buys Bloglines</title>
      <link>http://www.petersblog.org/node/view/701</link>
      <description>&lt;p&gt;
&lt;a href="http://napsterization.org/stories/archives/000397.html"&gt;Apparently&lt;/a&gt; &lt;a href="http://www.ask.com"&gt;Ask Jeeves&lt;/a&gt; has bought &lt;a href="http://www.bloglines.com"&gt;Bloglines&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
On friday Ask Jeeves spider was hammering &lt;a href="http://www.petersblog.org"&gt;my site&lt;/a&gt; for most of the day, thoroughly indexing it. It has been there before but this was quite intense. Could it be that Ask got a list of blogs from bloglines and were busy indexing them all? Or was it a glitch in their bot? 
&lt;/p&gt;&lt;p&gt;Related Posts: &lt;a href="/tag/bloglines"&gt;bloglines&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/701</guid>
      <category domain="http://www.technorati.com/tag">bloglines</category>
    </item>
    <item>
      <title>RSS Aggregation</title>
      <link>http://www.petersblog.org/node/view/470</link>
      <description>&lt;p&gt;
I was thinking today how cool and hip I was using &lt;a href="http://www.bloglines.com"&gt;Bloglines&lt;/a&gt; as an RSS aggregator compared to people who just go through a list of favourite web sites every day. So 1995. Go RSS, join the 21st century. 
&lt;/p&gt;
&lt;p&gt;
Then I thought about it some more and this is essentially what I am doing with bloglines: I have a list of feeds that I go through one by one, looking through the articles. No real difference to going through a sidebar full of bookmarks, looking at websites. 
&lt;/p&gt;
&lt;p&gt;
If I am going to evangelise RSS aggregation, what am I going to say are the advantages? Why bother? 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
Uniform presentation 
&lt;/li&gt;
&lt;li&gt;
No adverts (for now: I cannot imagine this will forever be true) 
&lt;/li&gt;
&lt;li&gt;
Um 
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
I'm going to continue with bloglines as the reasons above are enough for me, I just won't try to evangelise. As it happens I am not a good evangelist: I have yet to convert anyone to FireFox for example which should be pretty easy. Even after I removed the adware from my boss's PC he showed no interest in FireFox. 
&lt;/p&gt;
&lt;p&gt;
Maybe I should examine my RSSing habits and figure out if I am missing the point in some way. 
&lt;/p&gt;
&lt;p&gt;
The only people I know who are at all interested in gmail are those of a geeky persuasion. 
&lt;/p&gt;&lt;p&gt;Related Posts: &lt;a href="/tag/bloglines"&gt;bloglines&lt;/a&gt; &lt;a href="/tag/email"&gt;email&lt;/a&gt; &lt;a href="/tag/firefox"&gt;firefox&lt;/a&gt; &lt;a href="/tag/gmail"&gt;gmail&lt;/a&gt; &lt;a href="/tag/rss"&gt;rss&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/470</guid>
      <category domain="http://www.technorati.com/tag">bloglines</category>
      <category domain="http://www.technorati.com/tag">email</category>
      <category domain="http://www.technorati.com/tag">firefox</category>
      <category domain="http://www.technorati.com/tag">gmail</category>
      <category domain="http://www.technorati.com/tag">rss</category>
    </item>
    <item>
      <title>Bloglines new aggregator</title>
      <link>http://www.petersblog.org/node/view/432</link>
      <description>&lt;p&gt;
Decided upon &lt;a href="http://www.bloglines.com"&gt;Bloglines&lt;/a&gt; for my news aggregating needs. It has lots of features and is fast enough. It even allows me to add a blog roll box here. 
&lt;/p&gt;
&lt;p&gt;
It is comprehensive, almost overwhealming in the options that are available. My tip: subscribe to a blog just to get a username. That way you don't have to use your email address as an identifer that can be scraped by spambots. 
&lt;/p&gt;
&lt;p&gt;
Previously I was using the &lt;a href="http://pyds.muensterland.org/"&gt;Python Desktop Server&lt;/a&gt; news aggregator that works very nicely but has two disadvantages: 
&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;
it needs a server to run on and now I am shutting down my home server I won't have one. 
&lt;/li&gt;
&lt;li&gt;
I can access Bloglines from work without setting up an ssh tunnel. 
&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Related Posts: &lt;a href="/tag/blog"&gt;blog&lt;/a&gt; &lt;a href="/tag/bloglines"&gt;bloglines&lt;/a&gt; &lt;a href="/tag/pyds"&gt;pyds&lt;/a&gt; &lt;a href="/tag/python"&gt;python&lt;/a&gt; &lt;a href="/tag/ssh"&gt;ssh&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/432</guid>
      <category domain="http://www.technorati.com/tag">blog</category>
      <category domain="http://www.technorati.com/tag">bloglines</category>
      <category domain="http://www.technorati.com/tag">pyds</category>
      <category domain="http://www.technorati.com/tag">python</category>
      <category domain="http://www.technorati.com/tag">ssh</category>
    </item>
  </channel>
</rss>
