reintegrate source code of 0.8.0.6
[psensor-pkg-debian.git] / README.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
2     "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
3 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
4 <head>\r
5 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />\r
6 <meta name="generator" content="AsciiDoc 8.6.7" />\r
7 <title>Psensor README</title>\r
8 <style type="text/css">\r
9 body {\r
10     padding: 1em 1em 1em 1em;\r
11     font-family: "Ubuntu", sans-serif;\r
12     font-size: 100%;\r
13     font-style: normal;\r
14     font-weight: normal;\r
15     color: #000;\r
16     background-color: #fff;\r
17     margin: 0 0 0 0;\r
18 }\r
19 \r
20 a {\r
21     color: #1982D1;\r
22     font-style: normal;\r
23     text-decoration: none;\r
24 }\r
25 \r
26 a:hover {\r
27     text-decoration: underline;\r
28 }\r
29 \r
30 h1 {\r
31     font-size: 140%;\r
32     font-style: normal;\r
33     font-weight: bold;\r
34     text-transform: uppercase;\r
35     margin: 0 0 1em 0;\r
36     padding: 0 0 0 0;\r
37 }\r
38 \r
39 \r
40 h2, #toctitle{\r
41     font-size: 110%;\r
42     font-style: normal;\r
43     font-weight: bold;\r
44     text-transform: uppercase;\r
45     margin: 2em 0em 1em 0em;\r
46     padding: 0 0 0 0;\r
47 }\r
48 \r
49 #footer {\r
50     padding-top: 2em;\r
51     color: #666;\r
52     clear: both;\r
53     text-align: right;\r
54     font-size: 75%;\r
55 }\r
56 \r
57 p {\r
58     font-size: 100%;\r
59     margin-bottom: 8px;\r
60 }\r
61 \r
62 table {\r
63     text-align: left;\r
64     padding: 0 0 0 0;\r
65     min-width: 50%;\r
66     border-spacing: 0;\r
67     border: 0;\r
68 }\r
69 \r
70 thead {\r
71     background-color: #000;\r
72     color: #fff;\r
73     padding: 0 0 0 0;\r
74 }\r
75 \r
76 tbody {\r
77     padding: 0 0 0 0;\r
78 }\r
79 \r
80 th {\r
81     padding: 0.25em 0.5em 0.25em 0.5em;\r
82     font-style: normal;\r
83     font-weight: normal;\r
84 }\r
85 \r
86 td {\r
87     padding: 0.25em 0.25em 0em 0.25em;\r
88 }\r
89 \r
90 #chart {\r
91     color: #000;\r
92     font-style: normal;\r
93     font-weight: normal;\r
94     width: 100%;\r
95     height: 300px;\r
96 }\r
97 \r
98 ul#menu-list li {\r
99     list-style: none;\r
100 }\r
101 \r
102 #menu-list {\r
103     padding: 0 0 0 0;\r
104     margin: 0 0 0 0;\r
105 }\r
106 \r
107 #menu {\r
108     float: left;\r
109     width: 20%;\r
110     padding: 0 0 0 0;\r
111     margin: 0 0 0 0;\r
112 }\r
113 \r
114 #main {\r
115     float: right;\r
116     width: 80%;\r
117     padding: 0 0 0 0;\r
118     margin: 0 0em 0 0;\r
119 }\r
120 \r
121 em {\r
122     font-weight: bold;\r
123     font-style: normal;\r
124 }\r
125 \r
126 #uptime {\r
127     font-weight: normal;\r
128 }\r
129 \r
130 #menu-list em {\r
131     text-transform: uppercase;\r
132 }\r
133 \r
134 #menu ul li {\r
135     padding-bottom: 1em;\r
136 }\r
137 \r
138 #menu-list ul li {\r
139     padding: 0 0 0 0em;\r
140 }\r
141 \r
142 </style>\r
143 <script type="text/javascript">\r
144 /*<![CDATA[*/\r
145 var asciidoc = {  // Namespace.\r
146 \r
147 /////////////////////////////////////////////////////////////////////\r
148 // Table Of Contents generator\r
149 /////////////////////////////////////////////////////////////////////\r
150 \r
151 /* Author: Mihai Bazon, September 2002\r
152  * http://students.infoiasi.ro/~mishoo\r
153  *\r
154  * Table Of Content generator\r
155  * Version: 0.4\r
156  *\r
157  * Feel free to use this script under the terms of the GNU General Public\r
158  * License, as long as you do not remove or alter this notice.\r
159  */\r
160 \r
161  /* modified by Troy D. Hanson, September 2006. License: GPL */\r
162  /* modified by Stuart Rackham, 2006, 2009. License: GPL */\r
163 \r
164 // toclevels = 1..4.\r
165 toc: function (toclevels) {\r
166 \r
167   function getText(el) {\r
168     var text = "";\r
169     for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
170       if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.\r
171         text += i.data;\r
172       else if (i.firstChild != null)\r
173         text += getText(i);\r
174     }\r
175     return text;\r
176   }\r
177 \r
178   function TocEntry(el, text, toclevel) {\r
179     this.element = el;\r
180     this.text = text;\r
181     this.toclevel = toclevel;\r
182   }\r
183 \r
184   function tocEntries(el, toclevels) {\r
185     var result = new Array;\r
186     var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');\r
187     // Function that scans the DOM tree for header elements (the DOM2\r
188     // nodeIterator API would be a better technique but not supported by all\r
189     // browsers).\r
190     var iterate = function (el) {\r
191       for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
192         if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {\r
193           var mo = re.exec(i.tagName);\r
194           if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {\r
195             result[result.length] = new TocEntry(i, getText(i), mo[1]-1);\r
196           }\r
197           iterate(i);\r
198         }\r
199       }\r
200     }\r
201     iterate(el);\r
202     return result;\r
203   }\r
204 \r
205   var toc = document.getElementById("toc");\r
206   if (!toc) {\r
207     return;\r
208   }\r
209 \r
210   // Delete existing TOC entries in case we're reloading the TOC.\r
211   var tocEntriesToRemove = [];\r
212   var i;\r
213   for (i = 0; i < toc.childNodes.length; i++) {\r
214     var entry = toc.childNodes[i];\r
215     if (entry.nodeName.toLowerCase() == 'div'\r
216      && entry.getAttribute("class")\r
217      && entry.getAttribute("class").match(/^toclevel/))\r
218       tocEntriesToRemove.push(entry);\r
219   }\r
220   for (i = 0; i < tocEntriesToRemove.length; i++) {\r
221     toc.removeChild(tocEntriesToRemove[i]);\r
222   }\r
223 \r
224   // Rebuild TOC entries.\r
225   var entries = tocEntries(document.getElementById("content"), toclevels);\r
226   for (var i = 0; i < entries.length; ++i) {\r
227     var entry = entries[i];\r
228     if (entry.element.id == "")\r
229       entry.element.id = "_toc_" + i;\r
230     var a = document.createElement("a");\r
231     a.href = "#" + entry.element.id;\r
232     a.appendChild(document.createTextNode(entry.text));\r
233     var div = document.createElement("div");\r
234     div.appendChild(a);\r
235     div.className = "toclevel" + entry.toclevel;\r
236     toc.appendChild(div);\r
237   }\r
238   if (entries.length == 0)\r
239     toc.parentNode.removeChild(toc);\r
240 },\r
241 \r
242 \r
243 /////////////////////////////////////////////////////////////////////\r
244 // Footnotes generator\r
245 /////////////////////////////////////////////////////////////////////\r
246 \r
247 /* Based on footnote generation code from:\r
248  * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html\r
249  */\r
250 \r
251 footnotes: function () {\r
252   // Delete existing footnote entries in case we're reloading the footnodes.\r
253   var i;\r
254   var noteholder = document.getElementById("footnotes");\r
255   if (!noteholder) {\r
256     return;\r
257   }\r
258   var entriesToRemove = [];\r
259   for (i = 0; i < noteholder.childNodes.length; i++) {\r
260     var entry = noteholder.childNodes[i];\r
261     if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")\r
262       entriesToRemove.push(entry);\r
263   }\r
264   for (i = 0; i < entriesToRemove.length; i++) {\r
265     noteholder.removeChild(entriesToRemove[i]);\r
266   }\r
267 \r
268   // Rebuild footnote entries.\r
269   var cont = document.getElementById("content");\r
270   var spans = cont.getElementsByTagName("span");\r
271   var refs = {};\r
272   var n = 0;\r
273   for (i=0; i<spans.length; i++) {\r
274     if (spans[i].className == "footnote") {\r
275       n++;\r
276       var note = spans[i].getAttribute("data-note");\r
277       if (!note) {\r
278         // Use [\s\S] in place of . so multi-line matches work.\r
279         // Because JavaScript has no s (dotall) regex flag.\r
280         note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];\r
281         spans[i].innerHTML =\r
282           "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +\r
283           "' title='View footnote' class='footnote'>" + n + "</a>]";\r
284         spans[i].setAttribute("data-note", note);\r
285       }\r
286       noteholder.innerHTML +=\r
287         "<div class='footnote' id='_footnote_" + n + "'>" +\r
288         "<a href='#_footnoteref_" + n + "' title='Return to text'>" +\r
289         n + "</a>. " + note + "</div>";\r
290       var id =spans[i].getAttribute("id");\r
291       if (id != null) refs["#"+id] = n;\r
292     }\r
293   }\r
294   if (n == 0)\r
295     noteholder.parentNode.removeChild(noteholder);\r
296   else {\r
297     // Process footnoterefs.\r
298     for (i=0; i<spans.length; i++) {\r
299       if (spans[i].className == "footnoteref") {\r
300         var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");\r
301         href = href.match(/#.*/)[0];  // Because IE return full URL.\r
302         n = refs[href];\r
303         spans[i].innerHTML =\r
304           "[<a href='#_footnote_" + n +\r
305           "' title='View footnote' class='footnote'>" + n + "</a>]";\r
306       }\r
307     }\r
308   }\r
309 },\r
310 \r
311 install: function(toclevels) {\r
312   var timerId;\r
313 \r
314   function reinstall() {\r
315     asciidoc.footnotes();\r
316     if (toclevels) {\r
317       asciidoc.toc(toclevels);\r
318     }\r
319   }\r
320 \r
321   function reinstallAndRemoveTimer() {\r
322     clearInterval(timerId);\r
323     reinstall();\r
324   }\r
325 \r
326   timerId = setInterval(reinstall, 500);\r
327   if (document.addEventListener)\r
328     document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);\r
329   else\r
330     window.onload = reinstallAndRemoveTimer;\r
331 }\r
332 \r
333 }\r
334 asciidoc.install(2);\r
335 /*]]>*/\r
336 </script>\r
337 </head>\r
338 <body class="article">\r
339 <div id="header">\r
340 <h1>Psensor README</h1>\r
341 <div id="toc">
342   <div id="toctitle">Table of Contents</div>
343   <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
344 </div>\r
345 </div>\r
346 <div id="content">\r
347 <div class="sect1">\r
348 <h2 id="_introduction">1. Introduction</h2>\r
349 <div class="sectionbody">\r
350 <div class="paragraph"><p>Psensor is a graphical hardware monitoring application for Linux.</p></div>\r
351 <div class="paragraph"><p>It draws realtime charts and raises alerts about:</p></div>\r
352 <div class="ulist"><ul>\r
353 <li>\r
354 <p>\r
355 the temperature of the motherboard and CPU sensors (using\r
356    lm-sensors).\r
357 </p>\r
358 </li>\r
359 <li>\r
360 <p>\r
361 the temperature of the NVidia GPUs (using XNVCtrl).\r
362 </p>\r
363 </li>\r
364 <li>\r
365 <p>\r
366 the temperature of the Hard Disk Drives (using hddtemp or libatasmart).\r
367 </p>\r
368 </li>\r
369 <li>\r
370 <p>\r
371 the rotation speed of the fans (using lm-sensors).\r
372 </p>\r
373 </li>\r
374 <li>\r
375 <p>\r
376 the temperature of a remote computer.\r
377 </p>\r
378 </li>\r
379 <li>\r
380 <p>\r
381 the cpu load.\r
382 </p>\r
383 </li>\r
384 </ul></div>\r
385 <div class="paragraph"><p>Alerts are using Desktop Notification and a specific GTK+ status icon.</p></div>\r
386 <div class="paragraph"><p>For Ubuntu users, Psensor is providing an Application Indicator which turns\r
387 red under alert and a menu for quickly check all sensors.</p></div>\r
388 <div class="paragraph"><p>It is possible to monitor remotely a computer:</p></div>\r
389 <div class="ulist"><ul>\r
390 <li>\r
391 <p>\r
392 start <tt>psensor-server</tt> on the remote computer.\r
393 </p>\r
394 </li>\r
395 <li>\r
396 <p>\r
397 start <tt>psensor</tt> using: <tt>psensor --url=http://hostname:3131</tt>.\r
398 </p>\r
399 </li>\r
400 </ul></div>\r
401 <div class="paragraph"><p><tt>psensor-server</tt> is a minimal Web server, a Web browser can be used to\r
402 monitor the remote computer by opening the URL:\r
403 <tt>http://hostname:3131</tt>.</p></div>\r
404 <div class="admonitionblock">\r
405 <table><tr>\r
406 <td class="icon">\r
407 <div class="title">Warning</div>\r
408 </td>\r
409 <td class="content"><tt>psensor-server</tt> does not provide any way to restrict the connection\r
410 to the HTTP server, worst, no effort has been made against malicious\r
411 HTTP attacks.  You should make the <tt>psensor-server</tt> port available\r
412 only to a network or computer you trust by using the usual network\r
413 security tools of the system (for example:\r
414 <a href="http://www.netfilter.org/projects/iptables/index.html">iptables</a>).</td>\r
415 </tr></table>\r
416 </div>\r
417 </div>\r
418 </div>\r
419 <div class="sect1">\r
420 <h2 id="_installation_using_distribution_packages">2. Installation Using Distribution Packages</h2>\r
421 <div class="sectionbody">\r
422 <div class="sect2">\r
423 <h3 id="_debian">2.1. Debian</h3>\r
424 <div class="paragraph"><p>For Debian, the binary and source packages are available in the\r
425 Wheezy, unstable and testing repositories.</p></div>\r
426 <div class="paragraph"><p>Debian package information is available at:\r
427 <a href="http://packages.qa.debian.org/p/psensor.html">http://packages.qa.debian.org/p/psensor.html</a>.</p></div>\r
428 <div class="paragraph"><p>To do the installation:</p></div>\r
429 <div class="listingblock">\r
430 <div class="content">\r
431 <pre><tt>sudo apt-get install psensor psensor-server</tt></pre>\r
432 </div></div>\r
433 </div>\r
434 <div class="sect2">\r
435 <h3 id="_ubuntu">2.2. Ubuntu</h3>\r
436 <div class="paragraph"><p>Since Ubuntu Oneiric (11.10), psensor is available in the universe\r
437 repository of Ubuntu.</p></div>\r
438 <div class="paragraph"><p>To install <tt>psensor</tt> or <tt>psensor-server</tt>:</p></div>\r
439 <div class="listingblock">\r
440 <div class="content">\r
441 <pre><tt>sudo apt-get install psensor\r
442 sudo apt-get install psensor-server</tt></pre>\r
443 </div></div>\r
444 <div class="paragraph"><p>Or search them in the Ubuntu Software Center.</p></div>\r
445 <div class="paragraph"><p>For other Ubuntu releases or user the more recent release, the easiest\r
446 way is to use the dedicated PPA.</p></div>\r
447 <div class="paragraph"><p>Last stable version:</p></div>\r
448 <div class="listingblock">\r
449 <div class="content">\r
450 <pre><tt>sudo apt-get apt-add-repository ppa:/jfi/psensor\r
451 sudo apt-get update\r
452 sudo apt-get install psensor\r
453 sudo apt-get install psensor-server</tt></pre>\r
454 </div></div>\r
455 <div class="paragraph"><p>Last development version which should not contain major bugs:</p></div>\r
456 <div class="listingblock">\r
457 <div class="content">\r
458 <pre><tt>sudo apt-get apt-add-repository ppa:/jfi/psensor-unstable\r
459 sudo apt-get update\r
460 sudo apt-get install psensor\r
461 sudo apt-get install psensor-server</tt></pre>\r
462 </div></div>\r
463 <div class="paragraph"><p>Daily trunk build which may contain major bugs and partialy\r
464 implemented features:</p></div>\r
465 <div class="listingblock">\r
466 <div class="content">\r
467 <pre><tt>sudo apt-get apt-add-repository ppa:/jfi/psensor-daily-trunk\r
468 sudo apt-get update\r
469 sudo apt-get install psensor\r
470 sudo apt-get install psensor-server</tt></pre>\r
471 </div></div>\r
472 </div>\r
473 </div>\r
474 </div>\r
475 <div class="sect1">\r
476 <h2 id="_installation_from_source_archive">3. Installation From Source Archive</h2>\r
477 <div class="sectionbody">\r
478 <div class="paragraph"><p><tt>psensor</tt> and <tt>psensor-server</tt> can be compiled and installed on any\r
479 modern GNU/Linux distribution.</p></div>\r
480 <div class="sect2">\r
481 <h3 id="_compilation_prerequisites">3.1. Compilation Prerequisites</h3>\r
482 <div class="paragraph"><p>The compilation of <tt>psensor</tt> requires:</p></div>\r
483 <div class="ulist"><ul>\r
484 <li>\r
485 <p>\r
486 make\r
487 </p>\r
488 </li>\r
489 <li>\r
490 <p>\r
491 gcc (or llvm)\r
492 </p>\r
493 </li>\r
494 <li>\r
495 <p>\r
496 lm-sensors\r
497 </p>\r
498 </li>\r
499 <li>\r
500 <p>\r
501 library sensors4\r
502 </p>\r
503 </li>\r
504 <li>\r
505 <p>\r
506 library gtk3 &gt;=3.4\r
507 </p>\r
508 </li>\r
509 <li>\r
510 <p>\r
511 library gconf2\r
512 </p>\r
513 </li>\r
514 <li>\r
515 <p>\r
516 help2man\r
517 </p>\r
518 </li>\r
519 <li>\r
520 <p>\r
521 asciidoc (optional, required to produce the html version of the\r
522    faq)\r
523 </p>\r
524 </li>\r
525 <li>\r
526 <p>\r
527 cppcheck (optional, static source checker)\r
528 </p>\r
529 </li>\r
530 <li>\r
531 <p>\r
532 library libnotify (optional)\r
533 </p>\r
534 </li>\r
535 <li>\r
536 <p>\r
537 library libappindicator (optional)\r
538 </p>\r
539 </li>\r
540 <li>\r
541 <p>\r
542 library libXNVCtrl (optional)\r
543 </p>\r
544 </li>\r
545 <li>\r
546 <p>\r
547 library json0 and curl (optional, required for remote monitoring)\r
548 </p>\r
549 </li>\r
550 <li>\r
551 <p>\r
552 library unity (&gt;=v3.4.2, optional)\r
553 </p>\r
554 </li>\r
555 <li>\r
556 <p>\r
557 library gtop2 (optional, required for CPU usage)\r
558 </p>\r
559 </li>\r
560 <li>\r
561 <p>\r
562 library atasmart (optional, for disk monitoring)\r
563 </p>\r
564 </li>\r
565 </ul></div>\r
566 <div class="paragraph"><p>The specific requirements for <tt>psensor-server</tt>:</p></div>\r
567 <div class="ulist"><ul>\r
568 <li>\r
569 <p>\r
570 library libmicrohttpd\r
571 </p>\r
572 </li>\r
573 <li>\r
574 <p>\r
575 library json0\r
576 </p>\r
577 </li>\r
578 </ul></div>\r
579 <div class="paragraph"><p>For Debian 7.0:</p></div>\r
580 <div class="listingblock">\r
581 <div class="content">\r
582 <pre><tt>sudo apt-get install asciidoc cppcheck gcc gettext libgtk-3-dev\r
583 libgconf2-dev libnotify-dev libsensors4-dev help2man\r
584 libcurl4-openssl-dev libjson0-dev libmicrohttpd-dev libgtop2-dev\r
585 libatasmart-dev make</tt></pre>\r
586 </div></div>\r
587 <div class="paragraph"><p>For Fedora 17:</p></div>\r
588 <div class="listingblock">\r
589 <div class="content">\r
590 <pre><tt>sudo yum install gcc gtk3-devel GConf2-devel lm_sensors-devel cppcheck\r
591 libatasmart-devel libcurl-devel json-c-devel libmicrohttpd-devel\r
592 help2man libnotify-devel libgtop2-devel make</tt></pre>\r
593 </div></div>\r
594 <div class="paragraph"><p>For Ubuntu 12.10:</p></div>\r
595 <div class="listingblock">\r
596 <div class="content">\r
597 <pre><tt>sudo apt-get install asciidoc autoconf automake autopoint\r
598 debhelper (&gt;= 9) cppcheck gettext help2man libappindicator3-dev\r
599 libatasmart-dev libcurl4-gnutls-dev libgconf2-dev libgtk-3-dev\r
600 libgtop2-dev libjson0-dev libmicrohttpd-dev libnotify-dev\r
601 libsensors4-dev libunity-dev nvidia-settings perl</tt></pre>\r
602 </div></div>\r
603 </div>\r
604 <div class="sect2">\r
605 <h3 id="_compilation_and_installation_steps">3.2. Compilation and Installation Steps</h3>\r
606 <div class="olist arabic"><ol class="arabic">\r
607 <li>\r
608 <p>\r
609 download the source archive from: <a href="http://wpitchoune.net/psensor/files">http://wpitchoune.net/psensor/files</a>\r
610 </p>\r
611 </li>\r
612 <li>\r
613 <p>\r
614 Extract files from the source archive\r
615 </p>\r
616 </li>\r
617 <li>\r
618 <p>\r
619 Compilation: <tt>./configure;make clean all</tt>\r
620 </p>\r
621 </li>\r
622 <li>\r
623 <p>\r
624 Installation:  <tt>make install</tt> (require to have root permission)\r
625 </p>\r
626 </li>\r
627 <li>\r
628 <p>\r
629 Start the sensor detection script: <tt>sensors-detect</tt> and follows the\r
630 instructions. Reboot or activate the kernel modules which have\r
631 been found.\r
632 </p>\r
633 </li>\r
634 <li>\r
635 <p>\r
636 To monitor HDDs, the <tt>hddtemp</tt> daemon must be installed and running.\r
637 </p>\r
638 </li>\r
639 <li>\r
640 <p>\r
641 Run: <tt>psensor</tt>\r
642 </p>\r
643 </li>\r
644 </ol></div>\r
645 </div>\r
646 <div class="sect2">\r
647 <h3 id="_ati_amd_gpu_support">3.3. ATI/AMD GPU Support</h3>\r
648 <div class="paragraph"><p>When the OpenSource ATI driver is used, the monitoring\r
649 information is available throw lm-sensors and does not require the\r
650 following instructions.</p></div>\r
651 <div class="paragraph"><p>When the proprietary ATI driver(Catalyst) is used, the build is\r
652 requiring an additional library.</p></div>\r
653 <div class="paragraph"><p>Download the\r
654 <a href="http://developer.amd.com/sdks/ADLSDK/Pages/default.aspx">ATI ADL SDK</a>\r
655 and extracts the files of the archive into a directory [dir].</p></div>\r
656 <div class="paragraph"><p>Replace the step 3. of the above section by <tt>./configure\r
657 --with-libatiadl=[dir]</tt> where <tt>[dir]</tt> must be the directory where you\r
658 have extracted the ATI ADL SDK. Other steps are indentical.</p></div>\r
659 </div>\r
660 </div>\r
661 </div>\r
662 <div class="sect1">\r
663 <h2 id="_contact">4. Contact</h2>\r
664 <div class="sectionbody">\r
665 <div class="paragraph"><p>Bugs and comments can be sent to <a href="mailto:jeanfi@gmail.com">jeanfi@gmail.com</a>.</p></div>\r
666 <div class="paragraph"><p>Home page: <a href="http://wpitchoune.net/psensor">http://wpitchoune.net/psensor</a></p></div>\r
667 </div>\r
668 </div>\r
669 </div>\r
670 <div id="footnotes"><hr /></div>\r
671 <div id="footer">\r
672 <div id="footer-text">\r
673 Last updated 2013-05-26 19:23:21 CEST\r
674 </div>\r
675 </div>\r
676 </body>\r
677 </html>\r