<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>mindtrove &#187; pgo</title>
	<atom:link href="http://mindtrove.info/tag/pgo/feed/" rel="self" type="application/rss+xml" />
	<link>http://mindtrove.info</link>
	<description>Collecting ideas since 1980</description>
	<lastBuildDate>Thu, 01 Jul 2010 01:58:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>GtkBuilder/Glade on IronPython</title>
		<link>http://mindtrove.info/gtkbuilderglade-on-ironpython/</link>
		<comments>http://mindtrove.info/gtkbuilderglade-on-ironpython/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 12:10:48 +0000</pubDate>
		<dc:creator>Peter Parente</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[pgo]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://mindtrove.info/?p=236</guid>
		<description><![CDATA[Thanks to Stephane for his answer to my query about using GtkBuilder in IronPython. It turns out his Gtk#Beans package provides the magic sauce that is currently missing from gtk# trunk the current stable release. For completeness, here's the code I sent him that accomplishes the same thing using the older Glade.XML object for those [...]]]></description>
			<content:encoded><![CDATA[<p>Thanks to Stephane for his answer to my query about <a href="http://blog.reblochon.org/2009/08/gtkbuilder-on-ironpython.html">using GtkBuilder in IronPython</a>. It turns out his <a href="http://gitorious.org/gtk-sharp-beans">Gtk#Beans</a> package provides the magic sauce that is currently missing from <del datetime="2009-08-28T15:37:36+00:00">gtk# trunk</del> the current stable release.</p>
<p>For completeness, here's the code I sent him that accomplishes the same thing using the older Glade.XML object for those that are interested. It answers a <a href="http://lists.ironpython.com/pipermail/users-ironpython.com/2005-August/000968.html">long standing mailing list question</a> about using Glade.XML.Autoconnect in IronPython.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> clr
clr.<span style="color: black;">AddReference</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'gtk-sharp'</span><span style="color: black;">&#41;</span>
clr.<span style="color: black;">AddReference</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'glade-sharp'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">import</span> Gtk
<span style="color: #ff7700;font-weight:bold;">import</span> Glade
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> PyGladeAutoconnect<span style="color: black;">&#40;</span>gxml, target<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> _connect<span style="color: black;">&#40;</span>handler_name, event_obj, signal_name, <span style="color: #66cc66;">*</span>args<span style="color: black;">&#41;</span>:
        name = <span style="color: #483d8b;">''</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>frag.<span style="color: black;">title</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> frag <span style="color: #ff7700;font-weight:bold;">in</span> signal_name.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'_'</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        event = <span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span>event_obj, name<span style="color: black;">&#41;</span>
        event += <span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span>target, handler_name<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># add all widgets</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> widget <span style="color: #ff7700;font-weight:bold;">in</span> gxml.<span style="color: black;">GetWidgetPrefix</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">setattr</span><span style="color: black;">&#40;</span>target, gxml.<span style="color: black;">GetWidgetName</span><span style="color: black;">&#40;</span>widget<span style="color: black;">&#41;</span>, widget<span style="color: black;">&#41;</span>
    <span style="color: #808080; font-style: italic;"># connect all signals</span>
    gxml.<span style="color: black;">SignalAutoconnectFull</span><span style="color: black;">&#40;</span>_connect<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Application:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        gxml = Glade.<span style="color: black;">XML</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;test.glade&quot;</span>, <span style="color: #483d8b;">&quot;window1&quot;</span>, <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
        PyGladeAutoconnect<span style="color: black;">&#40;</span>gxml, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># window1 comes from glade file</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">window1</span>.<span style="color: black;">ShowAll</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> onWindowDelete<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, o, args<span style="color: black;">&#41;</span>:
        <span style="color: #808080; font-style: italic;"># connected via glade file definition</span>
        Gtk.<span style="color: black;">Application</span>.<span style="color: black;">Quit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
Gtk.<span style="color: black;">Application</span>.<span style="color: black;">Init</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
app = Application<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
Gtk.<span style="color: black;">Application</span>.<span style="color: black;">Run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://mindtrove.info/gtkbuilderglade-on-ironpython/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Outfoxing Gmail with Greasemonkey</title>
		<link>http://mindtrove.info/outfoxing-gmail-with-greasemonkey/</link>
		<comments>http://mindtrove.info/outfoxing-gmail-with-greasemonkey/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 11:56:21 +0000</pubDate>
		<dc:creator>Peter Parente</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[outfox]]></category>
		<category><![CDATA[pgo]]></category>
		<category><![CDATA[speech]]></category>

		<guid isPermaLink="false">http://mindtrove.info/?p=97</guid>
		<description><![CDATA[NOTE: The code in this post is out-of-date and does not work with recent versions of Outfox. See http://mindtrove.info/outfox-in-greasemonkey-revisited/ for a simpler, more compatible example. If you do update the GMail announcer code so it works with Outfox again, drop me a line and I'll link to your script. Can you remember a time when [...]]]></description>
			<content:encoded><![CDATA[<p><strong>NOTE</strong>: The code in this post is out-of-date and does not work with recent versions of Outfox. See http://mindtrove.info/outfox-in-greasemonkey-revisited/ for a simpler, more compatible example. If you do update the GMail announcer code so it works with Outfox again, drop me a line and I'll link to your script.</p>
<hr />
<p>Can you remember a time when the title of this blog post might have landed me in a straight jacket? Can you believe that was just a few short years ago? Yea, I can't either.</p>
<p>Anyway, Gary's post <a href="http://wwwx.cs.unc.edu/~gb/wp/blog/2008/07/27/outfox-speech-sound-and-more-for-firefox/">Outfox: speech, sound, and more for Firefox</a> talks about a new Firefox extension. He's using it to create cross-platform, self-voicing Web apps for kids with disabilities using a pure JS API. He hopes to extend his work to support alternative input devices such as game pads and switches as the Outfox extension matures and grows more flexible.</p>
<p>One of the other potential uses listed on the <a href="http://code.google.com/p/outfox">Outfox homepage</a> is <i>Adding new I/O to web sites with Greasemonkey</i>. Interesting. It's one thing to include Outfox explicitly in a page, but can it possibly work when injected by GM? What about for a complex app like Gmail with multiple iframes, dynamic changes, refreshing, etc.?</p>
<p>To learn about Outfox (and for fun), I decided to write a quick GM script for Gmail that announces the senders and times of new messages (bold items) in the inbox. (I would have done subject and summary too, but Outfox 0.1.0 appears to have some unicode issues and balked at some of the Gmail separator characters. Less is more at this point.) The script makes the announcement when the Gmail interface first loads, any time Gmail automatically refreshes its inbox view, or when the user clicks the refresh link to check for new mail. It is smart enough to announce a given message only once, however, so you don't hear the same message over and over again on each refresh.</p>
<p>Yes. It does actually work.</p>
<p>To try this script, make sure you have the Greasemonkey 0.8 and Outfox 0.1 extensions installed on Firefox 3. (Or use the latest available version of each.) Then visit the following link to have GM install the script: <a href="/files/gmail_announcer.user.js">gmail_announcer.user.js</a>.</p>
<p>For reference, the entire script is listed below:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// ==UserScript==</span>
<span style="color: #006600; font-style: italic;">// @name Gmail Announcer</span>
<span style="color: #006600; font-style: italic;">// @namespace http://www.mindtrove.info/</span>
<span style="color: #006600; font-style: italic;">// @description Speaks new Gmail inbox messages using Outfox</span>
<span style="color: #006600; font-style: italic;">// @include https://mail.google.com/mail/*</span>
<span style="color: #006600; font-style: italic;">// @include http://mail.google.com/mail/*</span>
<span style="color: #006600; font-style: italic;">// @require http://outfox.googlecode.com/svn/trunk/js/outfox.js</span>
<span style="color: #006600; font-style: italic;">// ==/UserScript==</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> need_say <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> ids <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> sayMessages<span style="color: #009900;">&#40;</span>msgs<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>outfox.<span style="color: #660066;">defaults</span>.<span style="color: #660066;">config</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">// outfox really needs a better way to detect ready ...</span>
	need_say <span style="color: #339933;">=</span> msgs<span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> header <span style="color: #339933;">=</span> <span style="color: #3366CC;">'New messages'</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> id <span style="color: #000066; font-weight: bold;">in</span> msgs<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">// say all messages</span>
	<span style="color: #003366; font-weight: bold;">var</span> msg <span style="color: #339933;">=</span> msgs<span style="color: #009900;">&#91;</span>id<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> segs <span style="color: #339933;">=</span> msg.<span style="color: #660066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Â»'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> sender <span style="color: #339933;">=</span> segs<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> time <span style="color: #339933;">=</span> segs<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">slice</span><span style="color: #009900;">&#40;</span>segs<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">search</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'â€¦'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>header<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    outfox.<span style="color: #660066;">say</span><span style="color: #009900;">&#40;</span>header<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    header <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	outfox.<span style="color: #660066;">say</span><span style="color: #009900;">&#40;</span>sender <span style="color: #339933;">+</span> <span style="color: #3366CC;">' at '</span> <span style="color: #339933;">+</span> time<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> onOutfoxReady<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>need_say<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">// say anything already queued</span>
	sayMessages<span style="color: #009900;">&#40;</span>need_say<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ids <span style="color: #339933;">=</span> need_say<span style="color: #339933;">;</span>
	need_say <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> onTableChange<span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> div <span style="color: #339933;">=</span> event.<span style="color: #660066;">target</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> trs <span style="color: #339933;">=</span> div.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'tr'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> count <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> new_ids <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> curr_ids <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> trs.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> tr <span style="color: #339933;">=</span> trs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>tr.<span style="color: #660066;">innerHTML</span>.<span style="color: #660066;">search</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&amp;lt;b&amp;gt;'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    <span style="color: #006600; font-style: italic;">// marked as a new message</span>
	    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>ids<span style="color: #009900;">&#91;</span>tr.<span style="color: #660066;">id</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> undefined<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #006600; font-style: italic;">// never announced</span>
		new_ids<span style="color: #009900;">&#91;</span>tr.<span style="color: #660066;">id</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> tr.<span style="color: #660066;">textContent</span><span style="color: #339933;">;</span>
		<span style="color: #339933;">++</span>count<span style="color: #339933;">;</span>
	    <span style="color: #009900;">&#125;</span>
	    <span style="color: #006600; font-style: italic;">// curr is announced + new</span>
	    curr_ids<span style="color: #009900;">&#91;</span>tr.<span style="color: #660066;">id</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> tr.<span style="color: #660066;">textContent</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// report if we can</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>sayMessages<span style="color: #009900;">&#40;</span>new_ids<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	ids <span style="color: #339933;">=</span> curr_ids<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> 
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> onDocumentChange<span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>event.<span style="color: #660066;">target</span>.<span style="color: #660066;">tagName</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'DIV'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> div <span style="color: #339933;">=</span> event.<span style="color: #660066;">target</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> tables <span style="color: #339933;">=</span> div.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'table'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #000066; font-weight: bold;">in</span> tables<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    <span style="color: #003366; font-weight: bold;">var</span> table <span style="color: #339933;">=</span> tables<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>table.<span style="color: #660066;">id</span> <span style="color: #339933;">!=</span> <span style="color: #3366CC;">''</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span>table.<span style="color: #660066;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'role'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #006600; font-style: italic;">// watch just table changes from now on</span>
		<span style="color: #003366; font-weight: bold;">var</span> div <span style="color: #339933;">=</span> table.<span style="color: #660066;">parentNode</span>.<span style="color: #660066;">parentNode</span><span style="color: #339933;">;</span>
		div.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'DOMNodeInserted'</span><span style="color: #339933;">,</span> onTableChange<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		document.<span style="color: #660066;">removeEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'DOMNodeInserted'</span><span style="color: #339933;">,</span> 
					     onDocumentChange<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #006600; font-style: italic;">// start outfox</span>
		<span style="color: #003366; font-weight: bold;">var</span> div <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>div<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		outfox.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span>div<span style="color: #339933;">,</span> onOutfoxReady<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #006600; font-style: italic;">// kick off initial read manually</span>
		onTableChange<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'target'</span> <span style="color: #339933;">:</span> table.<span style="color: #660066;">parentNode</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    <span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
document.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'DOMNodeInserted'</span><span style="color: #339933;">,</span> onDocumentChange<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://mindtrove.info/outfoxing-gmail-with-greasemonkey/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Accessibility Daily</title>
		<link>http://mindtrove.info/accessibility-daily/</link>
		<comments>http://mindtrove.info/accessibility-daily/#comments</comments>
		<pubDate>Mon, 19 May 2008 11:29:47 +0000</pubDate>
		<dc:creator>Peter Parente</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[blogs]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[pgo]]></category>

		<guid isPermaLink="false">http://mindtrove.info/?p=50</guid>
		<description><![CDATA[David informed me that he doesn't have the cycles to maintain his Accessible Planet site. As I've gotten some comments from people interested in an a11y news aggregator, I went on the hunt again for a solution. Gary came up with an interesting idea: create a shared Google Reader aggregate feed. The result is something very [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://mindforks.blogspot.com/">David</a> informed me that he doesn't have the cycles to maintain his <a href="http://aplanet.atrc.utoronto.ca/">Accessible Planet</a> site. As I've gotten some comments from people interested in an a11y news aggregator, I went on the hunt again for a solution.</p>
<p><a href="http://wwwx.cs.unc.edu/~gb/wp/">Gary</a> came up with an interesting idea: create a shared Google Reader aggregate feed. The result is something very much like a Planet instance, but with Google doing the aggregation and hosting. I added most of the feed URLs from David's existing site, slapped a subdomain together to (partially) hide the big, ugly Google permalink, and voila: <a href="http://a11y.mindtrove.info">Accessibility Daily</a>.</p>
<p>I'd like to give it a test run as an alternative to a Planet for now. Feel free to subscribe to the Atom feed or visit the HTML page. If you'd like your site listed, post a comment or shoot me an email with a link to your feed (preferably one that includes accessibility related news only).</p>
]]></content:encoded>
			<wfw:commentRss>http://mindtrove.info/accessibility-daily/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Planet A11y &#8230; Already Exists</title>
		<link>http://mindtrove.info/planet-a11y-already-exists/</link>
		<comments>http://mindtrove.info/planet-a11y-already-exists/#comments</comments>
		<pubDate>Sat, 17 May 2008 13:23:06 +0000</pubDate>
		<dc:creator>Peter Parente</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[pgo]]></category>

		<guid isPermaLink="false">http://mindtrove.info/?p=49</guid>
		<description><![CDATA[Steve Lee points out that David Bolter is already hosting a Planet instance for accessibility news aggregation. The link is: http://aplanet.atrc.utoronto.ca/. I'm all for using what's already up and running. Perhaps some simple domain redirection would make it slightly easier to locate in Google? Linux Foundation already owns a11y.org and uses it to redirect to http://www.linux-foundation.org/en/Accessibility. Maybe [...]]]></description>
			<content:encoded><![CDATA[<p>Steve Lee points out that David Bolter is already hosting a Planet instance for accessibility news aggregation. The link is: <a href="http://aplanet.atrc.utoronto.ca/">http://aplanet.atrc.utoronto.ca/</a>.</p>
<p>I'm all for using what's already up and running. Perhaps some simple domain redirection would make it slightly easier to locate in Google? Linux Foundation already owns <a href="http://a11y.org">a11y.org</a> and uses it to redirect to <a href="http://www.linux-foundation.org/en/Accessibility">http://www.linux-foundation.org/en/Accessibility</a>. Maybe they wouldn't mind pointing planet.a11y.org to David's ATRAC site?</p>
<p>A reference in the sidebar of <a href="http://planetplanet.org">planetplanet.org</a> might also help.</p>
]]></content:encoded>
			<wfw:commentRss>http://mindtrove.info/planet-a11y-already-exists/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Planet Accessibility</title>
		<link>http://mindtrove.info/planet-accessibility/</link>
		<comments>http://mindtrove.info/planet-accessibility/#comments</comments>
		<pubDate>Sat, 17 May 2008 04:18:55 +0000</pubDate>
		<dc:creator>Peter Parente</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[pgo]]></category>

		<guid isPermaLink="false">http://mindtrove.info/?p=48</guid>
		<description><![CDATA[Would anyone be interested in a Planet site specifically for accessibility blogs? I believe I would find it useful in keeping up with accessibility related development and news instead of hunting through mailing lists, newsgroups, blogs, and other Planets. But would anyone else benefit? Let me know if you're interested. I will volunteer time, effort, [...]]]></description>
			<content:encoded><![CDATA[<p>Would anyone be interested in a <a href="http://www.planetplanet.org/">Planet</a> site specifically for accessibility blogs? I believe I would find it useful in keeping up with accessibility related development and news instead of hunting through mailing lists, newsgroups, blogs, and other Planets. But would anyone else benefit?</p>
<p>Let me know if you're interested. I will volunteer time, effort, and maybe even hosting (if necessary) if public interest reaches some critical mass.</p>
]]></content:encoded>
			<wfw:commentRss>http://mindtrove.info/planet-accessibility/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Spatial PulseAudio</title>
		<link>http://mindtrove.info/spatial-pulseaudio/</link>
		<comments>http://mindtrove.info/spatial-pulseaudio/#comments</comments>
		<pubDate>Tue, 01 Jan 2008 18:50:56 +0000</pubDate>
		<dc:creator>Peter Parente</dc:creator>
				<category><![CDATA[HCI]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[auditory display]]></category>
		<category><![CDATA[pgo]]></category>
		<category><![CDATA[spatial sound]]></category>

		<guid isPermaLink="false">http://pithy.tumblr.com/post/22781001</guid>
		<description><![CDATA[In his interview about Pulse Audio in Fedora 8, Lennart Pottering mentions support for spatial sound as one of his future goals: Spatial event sounds: click on a button on the left side of your screen, and the event sound comes out of your left speaker. Click on one on the right side of your [...]]]></description>
			<content:encoded><![CDATA[<p>In his <a href="http://fedoraproject.org/wiki/Interviews/LennartPoettering">interview about Pulse Audio in Fedora 8</a>, Lennart Pottering mentions support for spatial sound as one of his future goals:</p>
<blockquote><p>Spatial event sounds: click on a button on the left side of your screen, and the event sound comes out of your left speaker. Click on one on the right side of your screen, and the event sound comes of of the right speaker. It’s earcandy, but I think this could actually be quite useful, but only if we get better quality event sounds, than we have right now.</p></blockquote>
<p>While spatialized event sounds may be “earcandy” as Lennart admits, there are other benefits of using 3D audio over mono sounds in certain applications. One interesting use concerns the separation of concurrent sound streams such that a user can distinguish and “pick out” one of many. The theory of <em>auditory scene analysis</em> (<a href="http://www.amazon.com/Auditory-Scene-Analysis-Perceptual-Organization/dp/0262521954">Bregman, 1990</a>) says (among many other things) that we humans can better segregate different sound sources and select one for attentive processing if the acoustic and semantic properties of streams from distinct sources differ along certain dimensions while certain properties within a stream remain constant over time.</p>
<p>For instance, say I make two audio recordings of the same person speaking two different utterances. In one recording, the person says “What a lovely bunch of coconuts.” In the other, “That dog certainly has fleas.” If I mix these two recordings into a mono track with the two utterances starting at exactly the same time, you will have a hard time determining and understanding the two independent phrases. If I create a stereo sound, with one phrase played in the left speaker and another in the right, you’ll have a much easier time identifying the original phrases. (But you’ll likely have to listen to the sound more than once before you can repeat both phrases: another tenet of auditory scene analysis.) Better still, if I apply a head related transfer function (<a href="http://en.wikipedia.org/wiki/Head-related_transfer_function">HRTF</a>) to each recording such that the two utterances appear to come from the left and right side of you head in a 3D space, your task becomes even easier.</p>
<p>In other words, spatialized sounds aid segregation and selection of independent streams of speech and sound. In fact, research (<a href="http://citeseer.ist.psu.edu/700855.html">McGookin, 2004</a>) suggests that spatialization alone is sufficient to aid recognition of information encoded in properties of concurrent musical sounds (<a href="http://en.wikipedia.org/wiki/Earcon">earcons</a>).</p>
<p>Applying the concept of distinguishable sound streams to screen readers is an interesting endeavor. (Or, at least, <a href="/clique">I think so</a>.) Screen readers currently rely on a single, serial stream of speech and sound to describe the multitasking, high-bandwidth graphical desktop. In a single stream design, reports of peripheral information outside the application focus are either non-existent, delayed, or interruptions, and can be easily missed. For instance, if a screen reader is busy reading an email when the user receives an instant message in another application, the screen reader has to decide whether to keep reading the email or announce the new message in some manner. If the screen reader interjects, the user might confuse the instant message content with that of the email or become annoyed with the interruption. If the screen reader decides to wait for the email reading to finish, the late announcement about the chat message runs the risk of being stale.</p>
<p>Worse yet, any single-stream announcement of the new message can be inadvertantly interrupted at any time by the next user command. In such a situation, unless the user tabs around looking for the new instant message or the chat program is set to play a sound every time a message is received (which still doesn’t indicate which of potentially many chats has the new message), the user may never learn of the existence of the new message.</p>
<p>Concurrent streams provide an answer to this peripheral awareness problem, but only if the screen reader can present them in a way that avoids masking other simultaneous streams. And this is exactly where the ability to spatialize sound helps. Without interrupting or modifying the stream of speech reading the email, another stream can pipe up and announce the new chat message with a sound, speech, or both according to the verbosity settings of the user (<em>Zing!</em> or “Message from Harvey” or “Harvey says ‘Hey! Stop reading your email and answer me! This is important!’”). As long as these streams are spatially separated <a href="http://www.icad.org/websiteV2.0/Conferences/ICAD2003/paper/46%20Brungart.pdf">according to some simple rules</a>, the user will be able to effectively distinguish them, ignore one, listen to one, and switch attention back and forth between them.</p>
<p>Instant messaging is just one example of a modern desktop application that begs for concurrent streams in screen readers. Just from looking at my GNOME desktop I see a system monitor, the clock applet, my network status, a popup balloon, and a log monitor all updating in the background while I write this post. Of course, a user can’t cope with all of these event sources reporting at once. But that’s where the interesting design problems start: how do we construct a usable multi-stream auditory display?</p>
<p>An open source library supporting spatial sound is a fundamental building-block for this investigation (and I’m certain, others). I hope Lennart pursues it.</p>
]]></content:encoded>
			<wfw:commentRss>http://mindtrove.info/spatial-pulseaudio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
