<?xml version="1.0" encoding="iso-8859-1"?><!-- generator="b2evolution/3.3.3" -->
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>RLPF.ar</title>
		<link>http://www.dewdrop-world.net/words/blog5.php</link>
		<atom:link rel="self" type="application/rss+xml" href="http://www.dewdrop-world.net/words/blog5.php?tempskin=_rss2" />
		<description></description>
		<language>en-US</language>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<admin:generatorAgent rdf:resource="http://b2evolution.net/?v=3.3.3"/>
		<ttl>60</ttl>
				<item>
			<title>Markup</title>
			<link>http://www.dewdrop-world.net/words/blog5.php/2012/02/20/markup</link>
			<pubDate>Mon, 20 Feb 2012 15:37:04 +0000</pubDate>			<dc:creator>James</dc:creator>
			<category domain="main">Technical</category>			<guid isPermaLink="false">167@http://www.dewdrop-world.net/words/</guid>
						<description>&lt;p&gt;My first class of the new term is tomorrow. That put me face to face with a sticky problem that had been irritating me all last semester. I want to archive the contents of my presentation slides in my semester org-mode file, but it was becoming increasingly painful to synchronize the org-mode text with the OpenOffice slides. More often than not, I would fix a typo or adjust some text in the slides and not carry it over to the permanent record. If I wanted to search all the slides for a semester, I would have to open multiple documents instead of scanning one long outline-format text file.&lt;/p&gt;
&lt;p&gt;So today, I decided to tackle it head-on. Talk about the eleventh hour...&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://orgmode.org/&quot;&gt;Org-mode&lt;/a&gt; allows parts of the outline to be exported to &lt;a href=&quot;http://www.latex-project.org/&quot;&gt;LaTeX&lt;/a&gt;, using various &quot;document classes.&quot; One of those is Beamer, designed for presentations. So, why not write the slides directly in org-mode and create the presentation from there?&lt;/p&gt;
&lt;p&gt;This means learning a whole new workflow. Fortunately, org-mode is beautifully designed and the markup syntax is about as unobtrusive as one could imagine. I can write:&lt;/p&gt;
&lt;pre&gt;***** Sample Editor and Offline Processing: Review&lt;br /&gt;- *Some important words* you need to know or you /will/ get confused&lt;br /&gt;  - *Audio clip* - An entry in the Pool&lt;br /&gt;    - Usually matches a file on disk&lt;br /&gt;  - *Audio event* - Part of an audio clip, in an audio track&lt;br /&gt;    - Many audio events can use the same audio clip (same file)&lt;br /&gt;  - *Audio part* - A collection of audio events&lt;br /&gt;    - These appear in one block in an audio track&lt;br /&gt;    - We haven't done anything with audio parts yet&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;... and get this (margins trimmed for the image; the main text is centered vertically in the frame):&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-02/sample-slide.png&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-02/sample-slide.png&quot; alt=&quot;&quot; width=&quot;480&quot; height=&quot;290&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;It turns out, this is a dramatic improvement over what I had been doing before. For each slide, I would copy and paste the text into OpenOffice Impress and format by hand. This way, I write the text with minimal structural hints and, after only five keystrokes (ctrl-c, ctrl-e, p), get a layout that is easy to read (though not elegant).&lt;/p&gt;
&lt;p&gt;It's interesting: As software tools become more visual, more mouse-oriented, more WYSIWYG, lately I'm using more tools that are based on markup of plain text: a retrogression in interface design that also happens to streamline the workflow.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; In org-mode, I can add to-do lists, timestamps, appointments, outline headings, drawers with a few keystrokes. Graphical organizers would require multiple mouse clicks through different fields of complex forms. &lt;/li&gt;
&lt;li&gt; &lt;a href=&quot;http://supercollider.sourceforge.net/&quot;&gt;SuperCollider&lt;/a&gt;'s help system is migrating to a markup strategy: write in plain text, and the help browser produces quite handsome HTML automatically. This makes it possible for anybody on any platform to contribute documentation -- all you need is a text editor -- and supports some rich indexing and searching features that weren't possible using the previous HTML format. &lt;/li&gt;
&lt;li&gt;&lt;em&gt;(Edit)&lt;/em&gt; I initially forgot to mention &lt;a href=&quot;http://lilypond.org/&quot;&gt;lilypond&lt;/a&gt; for music typesetting. I've crowed about that &lt;a href=&quot;/words/blog5.php/2011/04/27/first-go-with-lilypond&quot;&gt;before&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt; And now, Beamer for slideshows. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It makes me wonder if WYSIWYG is, functionally, a step backward: accessible but ultimately less powerful.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dewdrop-world.net/words/blog5.php/2012/02/20/markup&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>My first class of the new term is tomorrow. That put me face to face with a sticky problem that had been irritating me all last semester. I want to archive the contents of my presentation slides in my semester org-mode file, but it was becoming increasingly painful to synchronize the org-mode text with the OpenOffice slides. More often than not, I would fix a typo or adjust some text in the slides and not carry it over to the permanent record. If I wanted to search all the slides for a semester, I would have to open multiple documents instead of scanning one long outline-format text file.</p>
<p>So today, I decided to tackle it head-on. Talk about the eleventh hour...</p>
<p><a href="http://orgmode.org/">Org-mode</a> allows parts of the outline to be exported to <a href="http://www.latex-project.org/">LaTeX</a>, using various "document classes." One of those is Beamer, designed for presentations. So, why not write the slides directly in org-mode and create the presentation from there?</p>
<p>This means learning a whole new workflow. Fortunately, org-mode is beautifully designed and the markup syntax is about as unobtrusive as one could imagine. I can write:</p>
<pre>***** Sample Editor and Offline Processing: Review<br />- *Some important words* you need to know or you /will/ get confused<br />  - *Audio clip* - An entry in the Pool<br />    - Usually matches a file on disk<br />  - *Audio event* - Part of an audio clip, in an audio track<br />    - Many audio events can use the same audio clip (same file)<br />  - *Audio part* - A collection of audio events<br />    - These appear in one block in an audio track<br />    - We haven't done anything with audio parts yet<br /></pre>
<p>... and get this (margins trimmed for the image; the main text is centered vertically in the frame):</p>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/sample-slide.png"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/sample-slide.png" alt="" width="480" height="290" /></a></div>
<p>It turns out, this is a dramatic improvement over what I had been doing before. For each slide, I would copy and paste the text into OpenOffice Impress and format by hand. This way, I write the text with minimal structural hints and, after only five keystrokes (ctrl-c, ctrl-e, p), get a layout that is easy to read (though not elegant).</p>
<p>It's interesting: As software tools become more visual, more mouse-oriented, more WYSIWYG, lately I'm using more tools that are based on markup of plain text: a retrogression in interface design that also happens to streamline the workflow.</p>
<ul>
<li> In org-mode, I can add to-do lists, timestamps, appointments, outline headings, drawers with a few keystrokes. Graphical organizers would require multiple mouse clicks through different fields of complex forms. </li>
<li> <a href="http://supercollider.sourceforge.net/">SuperCollider</a>'s help system is migrating to a markup strategy: write in plain text, and the help browser produces quite handsome HTML automatically. This makes it possible for anybody on any platform to contribute documentation -- all you need is a text editor -- and supports some rich indexing and searching features that weren't possible using the previous HTML format. </li>
<li><em>(Edit)</em> I initially forgot to mention <a href="http://lilypond.org/">lilypond</a> for music typesetting. I've crowed about that <a href="http://www.dewdrop-world.net/words/blog5.php/2011/04/27/first-go-with-lilypond">before</a>. </li>
<li> And now, Beamer for slideshows. </li>
</ul>
<p>It makes me wonder if WYSIWYG is, functionally, a step backward: accessible but ultimately less powerful.</p><div class="item_footer"><p><small><a href="http://www.dewdrop-world.net/words/blog5.php/2012/02/20/markup">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dewdrop-world.net/words/blog5.php/2012/02/20/markup#comments</comments>
			<wfw:commentRss>http://www.dewdrop-world.net/words/blog5.php?tempskin=_rss2&#38;disp=comments&#38;p=167</wfw:commentRss>
		</item>
				<item>
			<title>Saturday walkabout</title>
			<link>http://www.dewdrop-world.net/words/blog5.php/2012/02/18/saturday-walkabout</link>
			<pubDate>Sat, 18 Feb 2012 14:30:58 +0000</pubDate>			<dc:creator>James</dc:creator>
			<category domain="main">General</category>			<guid isPermaLink="false">166@http://www.dewdrop-world.net/words/</guid>
						<description>&lt;p&gt;Next week, classes begin. Beyond that, after days of cloudy weather, the sun was actually out in fits and starts today -- a good time to go to the park!&lt;/p&gt;
&lt;p&gt;But first, a detour after lunch to find the Modern Toilet restaurant -- a novelty eatery whose gimmick is restroom decor: bowls, plates, glasses and even the seats are shaped like toilets.&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-02/modtoilet.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-02/modtoilet.jpg&quot; alt=&quot;&quot; width=&quot;480&quot; height=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-02/modtoilet-latte.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-02/modtoilet-latte.jpg&quot; alt=&quot;&quot; width=&quot;360&quot; height=&quot;427&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(Ahem)&lt;/em&gt; Wisely, lunch was at a nearby noodle-and-dumpling shack instead, prior to the toilet quest. No temptation (if you could even call it &quot;temptation&quot;) to try the food.&lt;/p&gt;
&lt;p&gt;On to the park. This time it was the Martyrs' Park, honoring fallen heroes of the Communist Revolution. The theme is inescapable right from the entrance.&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-02/martyrs-gun.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-02/martyrs-gun.jpg&quot; alt=&quot;&quot; width=&quot;480&quot; height=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The centerpiece is a funereal mound, surrounded by a traditional stone walls decorated by chimera (&quot;kylin,&quot; I think, but don't quote me on that). I found it ironic that signs of Guangzhou's capitalist success were so prominently visible. This conflict between the old and new is everywhere in China.&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-02/martyrs-mound.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-02/martyrs-mound.jpg&quot; alt=&quot;&quot; width=&quot;480&quot; height=&quot;360&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Then, in one corner, signs of coming spring! Some flowering trees were just starting to blossom.&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-02/white-flower.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-02/white-flower.jpg&quot; alt=&quot;&quot; width=&quot;480&quot; height=&quot;360&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-02/pink-flower.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-02/pink-flower.jpg&quot; alt=&quot;&quot; width=&quot;480&quot; height=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dewdrop-world.net/words/blog5.php/2012/02/18/saturday-walkabout&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Next week, classes begin. Beyond that, after days of cloudy weather, the sun was actually out in fits and starts today -- a good time to go to the park!</p>
<p>But first, a detour after lunch to find the Modern Toilet restaurant -- a novelty eatery whose gimmick is restroom decor: bowls, plates, glasses and even the seats are shaped like toilets.</p>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/modtoilet.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/modtoilet.jpg" alt="" width="480" height="640" /></a></div>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/modtoilet-latte.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/modtoilet-latte.jpg" alt="" width="360" height="427" /></a></div>
<p><em>(Ahem)</em> Wisely, lunch was at a nearby noodle-and-dumpling shack instead, prior to the toilet quest. No temptation (if you could even call it "temptation") to try the food.</p>
<p>On to the park. This time it was the Martyrs' Park, honoring fallen heroes of the Communist Revolution. The theme is inescapable right from the entrance.</p>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/martyrs-gun.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/martyrs-gun.jpg" alt="" width="480" height="640" /></a></div>
<p>The centerpiece is a funereal mound, surrounded by a traditional stone walls decorated by chimera ("kylin," I think, but don't quote me on that). I found it ironic that signs of Guangzhou's capitalist success were so prominently visible. This conflict between the old and new is everywhere in China.</p>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/martyrs-mound.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/martyrs-mound.jpg" alt="" width="480" height="360" /></a></div>
<p>Then, in one corner, signs of coming spring! Some flowering trees were just starting to blossom.</p>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/white-flower.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/white-flower.jpg" alt="" width="480" height="360" /></a></div>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/pink-flower.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/pink-flower.jpg" alt="" width="480" height="640" /></a></div><div class="item_footer"><p><small><a href="http://www.dewdrop-world.net/words/blog5.php/2012/02/18/saturday-walkabout">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dewdrop-world.net/words/blog5.php/2012/02/18/saturday-walkabout#comments</comments>
			<wfw:commentRss>http://www.dewdrop-world.net/words/blog5.php?tempskin=_rss2&#38;disp=comments&#38;p=166</wfw:commentRss>
		</item>
				<item>
			<title>First dragon-year post!</title>
			<link>http://www.dewdrop-world.net/words/blog5.php/2012/02/04/first-dragon-year-post</link>
			<pubDate>Sat, 04 Feb 2012 10:14:45 +0000</pubDate>			<dc:creator>James</dc:creator>
			<category domain="main">General</category>			<guid isPermaLink="false">165@http://www.dewdrop-world.net/words/</guid>
						<description>&lt;p&gt;How clever. I've managed almost a whole month without a single word here! And this is vacation time. I have been writing a lot of code, though. I'm tempted to say that I'm fairly close to the point where I can put Hadron aside for a little while. The caveat, of course, is that most dangerous of phrases: &quot;Just one more thing...&quot; When is there ever &lt;em&gt;only&lt;/em&gt; &quot;just one more thing&quot;? This whole project has been about one thing turning into two, into five, into 12... if I turn my attention to something else in the next week or so, it will be by force of will rather than by actual completion.&lt;/p&gt;
&lt;p&gt;I'm proud of this week's success: a graphic editor for the fundamental type of &quot;event pattern&quot; in SuperCollider. Lots of little moving parts: adding and deleting rows, drag and drop to reorder, connecting to other Hadron plugins, connecting control signals from other Hadron plugins into pattern calculations. But it's working nicely and it's quite useful, worth extracting from Hadron and publishing for general use. I might even use it myself when composing, as a pattern sketchpad.&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-02/Pbindef-editor.png&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-02/Pbindef-editor.png&quot; alt=&quot;&quot; width=&quot;602&quot; height=&quot;150&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Guangzhou is a bit boring over the holiday. This is a city where people come to work; when the major holidays roll around, the population drops noticeably. One can actually stand comfortably on line 3 of the metro, even at rush hour; at other times of the year, it's never quite as bad as Tokyo (no station guards with white gloves needed) but it is (ahem) &lt;em&gt;cozy&lt;/em&gt;. There is less stimulus, but more quiet time to focus on challenging problems. I made good use of it.&lt;/p&gt;
&lt;p&gt;I did escape for an overnight to Shenzhen. I'll have to collect my impressions of that place another time, except to say briefly that it's very new, very modern, and a consequence of newness (it started to develop into a major metropolis only within the last 30 years) is a strange, unrooted, ephemeral quality. There's more there than Gertrude Stein's &quot;no there there,&quot; but perhaps a bit on the antiseptic side for my taste.&lt;/p&gt;
&lt;p&gt;The highlight was an exhibit at the Shenzhen Museum of sculptures from the collection of Juan Antonio Perez Sim&amp;#243;n. No especially major pieces (though a Rodin stood out), but all the works were beautifully executed.&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-02/toward-the-goal.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-02/toward-the-goal.jpg&quot; alt=&quot;&quot; width=&quot;540&quot; height=&quot;405&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-02/girl-with-dog.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-02/girl-with-dog.jpg&quot; alt=&quot;&quot; width=&quot;480&quot; height=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-02/rodin.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-02/rodin.jpg&quot; alt=&quot;&quot; width=&quot;480&quot; height=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dewdrop-world.net/words/blog5.php/2012/02/04/first-dragon-year-post&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>How clever. I've managed almost a whole month without a single word here! And this is vacation time. I have been writing a lot of code, though. I'm tempted to say that I'm fairly close to the point where I can put Hadron aside for a little while. The caveat, of course, is that most dangerous of phrases: "Just one more thing..." When is there ever <em>only</em> "just one more thing"? This whole project has been about one thing turning into two, into five, into 12... if I turn my attention to something else in the next week or so, it will be by force of will rather than by actual completion.</p>
<p>I'm proud of this week's success: a graphic editor for the fundamental type of "event pattern" in SuperCollider. Lots of little moving parts: adding and deleting rows, drag and drop to reorder, connecting to other Hadron plugins, connecting control signals from other Hadron plugins into pattern calculations. But it's working nicely and it's quite useful, worth extracting from Hadron and publishing for general use. I might even use it myself when composing, as a pattern sketchpad.</p>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/Pbindef-editor.png"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/Pbindef-editor.png" alt="" width="602" height="150" /></a></div>
<p>Guangzhou is a bit boring over the holiday. This is a city where people come to work; when the major holidays roll around, the population drops noticeably. One can actually stand comfortably on line 3 of the metro, even at rush hour; at other times of the year, it's never quite as bad as Tokyo (no station guards with white gloves needed) but it is (ahem) <em>cozy</em>. There is less stimulus, but more quiet time to focus on challenging problems. I made good use of it.</p>
<p>I did escape for an overnight to Shenzhen. I'll have to collect my impressions of that place another time, except to say briefly that it's very new, very modern, and a consequence of newness (it started to develop into a major metropolis only within the last 30 years) is a strange, unrooted, ephemeral quality. There's more there than Gertrude Stein's "no there there," but perhaps a bit on the antiseptic side for my taste.</p>
<p>The highlight was an exhibit at the Shenzhen Museum of sculptures from the collection of Juan Antonio Perez Sim&#243;n. No especially major pieces (though a Rodin stood out), but all the works were beautifully executed.</p>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/toward-the-goal.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/toward-the-goal.jpg" alt="" width="540" height="405" /></a></div>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/girl-with-dog.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/girl-with-dog.jpg" alt="" width="480" height="640" /></a></div>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/rodin.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-02/rodin.jpg" alt="" width="480" height="640" /></a></div><div class="item_footer"><p><small><a href="http://www.dewdrop-world.net/words/blog5.php/2012/02/04/first-dragon-year-post">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dewdrop-world.net/words/blog5.php/2012/02/04/first-dragon-year-post#comments</comments>
			<wfw:commentRss>http://www.dewdrop-world.net/words/blog5.php?tempskin=_rss2&#38;disp=comments&#38;p=165</wfw:commentRss>
		</item>
				<item>
			<title>Busy boy</title>
			<link>http://www.dewdrop-world.net/words/blog5.php/2012/01/10/title-1</link>
			<pubDate>Tue, 10 Jan 2012 14:44:49 +0000</pubDate>			<dc:creator>James</dc:creator>
			<category domain="main">General</category>			<guid isPermaLink="false">164@http://www.dewdrop-world.net/words/</guid>
						<description>&lt;p&gt;I'm a busy boy. How busy?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jamshark70/hadron/commits/master&quot;&gt;https://github.com/jamshark70/hadron/commits/master&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(See January 8-10.)&lt;/p&gt;
&lt;p&gt;Just today, I cracked the make-or-break problem for this entire project: driving a plugin called &lt;em&gt;HrPresetMorph&lt;/em&gt; by external signals (where previously, you could drive it by the mouse only). Why is it critical? This plugin lets you put &quot;presets&quot; (sets of values taken from other plugins) on an x-y grid. Moving around in the grid calculates new presets exist in between the given ones, making a concrete relationship between two-dimensional position and sound.&lt;/p&gt;
&lt;p&gt;The other part of the project is to  get x-y coordinate data from webcam analysis and control sound by it. What could be more obvious than using the webcam coordinates to set the HrPresetMorph position? That's why, immediately after trying HrPresetMorph for the first time, I put this, &quot;OMG!&quot; and all, into my &lt;a href=&quot;http://orgmode.org/&quot;&gt;org-mode&lt;/a&gt; file:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;****** TODO OMG! HrPresetMorph needs to be video-drivable!!!&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;That turned out to be several days' worth of work. First, the original plug-in couldn't be driven from outside, because the original design was to tweak every available parameter based on grid position. If the grid position itself is a tweakable parameter, then you fall into the computing black hole known as &quot;infinite recursion&quot; where the grid position makes a new grid position, which makes a.....  So I had to prevent that and, for good measure, let the user decide which parameters to control instead of assuming all of them. The method to calculate the new values was a mess (inefficient, and the result depends on factors not directly related to the math). Then the result sounded choppy because it sent several momentary updates every second, and didn't generate smooth curves. That called for a thorough rework of the connection between the new data and the audio processing.&lt;/p&gt;
&lt;p&gt;At the end of all that, I can say confidently:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It was worth it -- it's working beautifully.&lt;/li&gt;
&lt;li&gt;I now know the pain of every IT consultant in the world.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The bread-and-butter of IT consulting is to come into a company and fix up somebody else's code. Invariably, the code is not written the way you would have done it, leading to a number of &quot;what were they thinking?&quot; moments. (&lt;a href=&quot;http://thedailywtf.com/&quot;&gt;TheDailyWTF&lt;/a&gt; is an extensive compendium.) I'll spare the details, except for my usual sermon (probably familiar to readers of the SuperCollider mailing list) about separating data storage and processing from interface objects.&lt;/p&gt;
&lt;p&gt;Hadron (the original project) doesn't maintain this separation, and it's caused me no end of trouble. Just one recent example, from a plug-in that uses text to generate a synthesis function for control signals When loading a patch from disk, the function text is set by sticking it into the graphic interface and then calling an action function in the interface. No problem, right? We put the text into the TextView, so, asking the TextView what it's holding should give you the same text back.&lt;/p&gt;
&lt;p&gt;Except, in the interface framework that the students will be using for this project, &lt;em&gt;that doesn't happen&lt;/em&gt;. So the patch initializes incorrectly and doesn't sound like it did before saving.&lt;/p&gt;
&lt;p&gt;The solution is that the text should be kept in a variable, apart from the interface. But isn't that too much trouble? No, it's sensible design. Variables are intended for data storage. They don't do anything else, and what they do, they do extremely well. Interface objects have to do a whole lot else, and the additional complexity means that a slight change in circumstances, timing etc. could produce a different result. It's not acceptable to get different results based on a butterfly flapping its wings close to your mouse.&lt;/p&gt;
&lt;p&gt;In short, this kind of thing:&lt;/p&gt;
&lt;pre&gt;{ |somethingGottenFromDisk|&lt;br /&gt;	anInterfaceObject.valueAction = somethingGottenFromDisk;&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;... is a bad idea. DON'T DO IT.&lt;/p&gt;
&lt;p&gt;I should add, though, that Batuhan Bozkurt, the original author, displayed a level of patience in creating the user interaction that I would simply not have had. My complaints diminish neither his achievement, nor my gratitude that there is this code to fix up in the first place. I intend this as a cautionary tale for future work, not as an indictment.&lt;/p&gt;
&lt;p&gt;Whew! After all of that, I think I might need another one of these:&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-01/fullers.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-01/fullers.jpg&quot; alt=&quot;&quot; width=&quot;360&quot; height=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;For over a year in Guangzhou, I have been looking for anything resembling a porter, without success. Then, in the Ol&amp;#233; Food Halls in Taikoo Hui mall (&quot;Food Halls&quot; -- ha! you're not &lt;a href=&quot;http://www.harrods.com/food-and-wine&quot;&gt;Harrod's&lt;/a&gt;): some half-liter cans of Fuller's London Porter. You'd have needed a forklift to pry my jaw off the floor.&lt;/p&gt;
&lt;p&gt;For those who don't know my predilection: Porter is &lt;em&gt;The Best Ale I Know&lt;/em&gt;. Guinness Stout is widely available here, but it's one-dimensional by comparison -- too bitter, too heavy. Porter has the heft of a stout, but with an extra note of sweetness giving it a more complex character.&lt;/p&gt;
&lt;p&gt;The Fuller's does not disappoint. Unfortunately, it's priced to remain nothing more than an occasional, very special treat. But even the one taste... ah! Civilization.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dewdrop-world.net/words/blog5.php/2012/01/10/title-1&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>I'm a busy boy. How busy?</p>
<p><a href="https://github.com/jamshark70/hadron/commits/master">https://github.com/jamshark70/hadron/commits/master</a></p>
<p>(See January 8-10.)</p>
<p>Just today, I cracked the make-or-break problem for this entire project: driving a plugin called <em>HrPresetMorph</em> by external signals (where previously, you could drive it by the mouse only). Why is it critical? This plugin lets you put "presets" (sets of values taken from other plugins) on an x-y grid. Moving around in the grid calculates new presets exist in between the given ones, making a concrete relationship between two-dimensional position and sound.</p>
<p>The other part of the project is to  get x-y coordinate data from webcam analysis and control sound by it. What could be more obvious than using the webcam coordinates to set the HrPresetMorph position? That's why, immediately after trying HrPresetMorph for the first time, I put this, "OMG!" and all, into my <a href="http://orgmode.org/">org-mode</a> file:</p>
<p><code>****** TODO OMG! HrPresetMorph needs to be video-drivable!!!</code></p>
<p>That turned out to be several days' worth of work. First, the original plug-in couldn't be driven from outside, because the original design was to tweak every available parameter based on grid position. If the grid position itself is a tweakable parameter, then you fall into the computing black hole known as "infinite recursion" where the grid position makes a new grid position, which makes a.....  So I had to prevent that and, for good measure, let the user decide which parameters to control instead of assuming all of them. The method to calculate the new values was a mess (inefficient, and the result depends on factors not directly related to the math). Then the result sounded choppy because it sent several momentary updates every second, and didn't generate smooth curves. That called for a thorough rework of the connection between the new data and the audio processing.</p>
<p>At the end of all that, I can say confidently:</p>
<ol>
<li>It was worth it -- it's working beautifully.</li>
<li>I now know the pain of every IT consultant in the world.</li>
</ol>
<p>The bread-and-butter of IT consulting is to come into a company and fix up somebody else's code. Invariably, the code is not written the way you would have done it, leading to a number of "what were they thinking?" moments. (<a href="http://thedailywtf.com/">TheDailyWTF</a> is an extensive compendium.) I'll spare the details, except for my usual sermon (probably familiar to readers of the SuperCollider mailing list) about separating data storage and processing from interface objects.</p>
<p>Hadron (the original project) doesn't maintain this separation, and it's caused me no end of trouble. Just one recent example, from a plug-in that uses text to generate a synthesis function for control signals When loading a patch from disk, the function text is set by sticking it into the graphic interface and then calling an action function in the interface. No problem, right? We put the text into the TextView, so, asking the TextView what it's holding should give you the same text back.</p>
<p>Except, in the interface framework that the students will be using for this project, <em>that doesn't happen</em>. So the patch initializes incorrectly and doesn't sound like it did before saving.</p>
<p>The solution is that the text should be kept in a variable, apart from the interface. But isn't that too much trouble? No, it's sensible design. Variables are intended for data storage. They don't do anything else, and what they do, they do extremely well. Interface objects have to do a whole lot else, and the additional complexity means that a slight change in circumstances, timing etc. could produce a different result. It's not acceptable to get different results based on a butterfly flapping its wings close to your mouse.</p>
<p>In short, this kind of thing:</p>
<pre>{ |somethingGottenFromDisk|<br />	anInterfaceObject.valueAction = somethingGottenFromDisk;<br />}</pre>
<p>... is a bad idea. DON'T DO IT.</p>
<p>I should add, though, that Batuhan Bozkurt, the original author, displayed a level of patience in creating the user interaction that I would simply not have had. My complaints diminish neither his achievement, nor my gratitude that there is this code to fix up in the first place. I intend this as a cautionary tale for future work, not as an indictment.</p>
<p>Whew! After all of that, I think I might need another one of these:</p>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/fullers.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/fullers.jpg" alt="" width="360" height="480" /></a></div>
<p>For over a year in Guangzhou, I have been looking for anything resembling a porter, without success. Then, in the Ol&#233; Food Halls in Taikoo Hui mall ("Food Halls" -- ha! you're not <a href="http://www.harrods.com/food-and-wine">Harrod's</a>): some half-liter cans of Fuller's London Porter. You'd have needed a forklift to pry my jaw off the floor.</p>
<p>For those who don't know my predilection: Porter is <em>The Best Ale I Know</em>. Guinness Stout is widely available here, but it's one-dimensional by comparison -- too bitter, too heavy. Porter has the heft of a stout, but with an extra note of sweetness giving it a more complex character.</p>
<p>The Fuller's does not disappoint. Unfortunately, it's priced to remain nothing more than an occasional, very special treat. But even the one taste... ah! Civilization.</p><div class="item_footer"><p><small><a href="http://www.dewdrop-world.net/words/blog5.php/2012/01/10/title-1">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dewdrop-world.net/words/blog5.php/2012/01/10/title-1#comments</comments>
			<wfw:commentRss>http://www.dewdrop-world.net/words/blog5.php?tempskin=_rss2&#38;disp=comments&#38;p=164</wfw:commentRss>
		</item>
				<item>
			<title>Welcome to 2012!</title>
			<link>http://www.dewdrop-world.net/words/blog5.php/2012/01/04/welcome-to-2012</link>
			<pubDate>Wed, 04 Jan 2012 09:26:29 +0000</pubDate>			<dc:creator>James</dc:creator>
			<category domain="main">General</category>			<guid isPermaLink="false">163@http://www.dewdrop-world.net/words/</guid>
						<description>&lt;p&gt;It's the first post of the new year -- here's hoping friends and family, near and far and can look forward to a peaceful and happy new year.&lt;/p&gt;
&lt;p&gt;I rang in the new year watching the English Premier League in, of all places, Guangning, about two hours northwest of Guangzhou. (Chelsea lost to Aston Villa, by the way. Pout.) It's a medium-sized burg, just large enough to support a decent hotel (thank heaven!) but too small to be modernized and (relatively) sanitized like the major metropolitan areas. How did I find myself in such a place?&lt;/p&gt;
&lt;p&gt;My new &lt;em&gt;petit ami&lt;/em&gt; invited me to join his family on a new year's weekend trip, going to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Huang Yao Ancient Town&quot; in Guangxi province, just to the west of Guangdong (dong &amp;#19996; is east, xi &amp;#35199; is west),&lt;/li&gt;
&lt;li&gt;Guangning for dinner with family friends and to spend the night,&lt;/li&gt;
&lt;li&gt;and last to a tangerine orchard up in the mountains to pick a couple of basketsful.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With my last grades turned on Friday, I was free to go and needed the rest. So off we went, early in the morning on Saturday.&lt;/p&gt;
&lt;h3&gt;Ancient Town&lt;/h3&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-01/old-city-tree.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-01/old-city-tree.jpg&quot; alt=&quot;&quot; width=&quot;480&quot; height=&quot;360&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;An &quot;Ancient Town&quot; like this one could be a dicey proposition. All too often, they have acquired the worst characteristics of modern Venice in Italy: inconvenient, expensive, crawling with tourists, and overrun with trinket shops that are lucky to rise to the level of an eyesore. Huang Yao was not any of those things, at least on a chilly December 31. I remember one street with souvenir shops, but the rest of the town was mostly unscathed. Some villagers had set up stalls where you could buy dessert or, at others, spicy pickled seasonings to use for cooking, but these, too, were scattered around and never crowded the scenery.&lt;/p&gt;
&lt;p&gt;Nothing luxurious here. We took lunch at a restaurant located in one family's residence.&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-01/old-city-lunch-restaurant.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-01/old-city-lunch-restaurant.jpg&quot; alt=&quot;&quot; width=&quot;360&quot; height=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The town is nestled in the mountains and a small river runs through the middle. Despite the cloudy weather, it wasn't hard to find good places for pictures.&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-01/old-city-big-bridge.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-01/old-city-big-bridge.jpg&quot; alt=&quot;&quot; width=&quot;480&quot; height=&quot;360&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-01/old-city-boats-river.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-01/old-city-boats-river.jpg&quot; alt=&quot;&quot; width=&quot;360&quot; height=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-01/old-city-small-bridge.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-01/old-city-small-bridge.jpg&quot; alt=&quot;&quot; width=&quot;480&quot; height=&quot;360&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Even an old town can't completely avoid the pressures of modernization. What happens when a car, possibly under the control of an inebriated driver (or out of his control?), veers off of a narrow stone bridge with decorative railings that were plainly not designed to highway specifications?&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-01/old-city-crash.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-01/old-city-crash.jpg&quot; alt=&quot;&quot; width=&quot;480&quot; height=&quot;360&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;Guangning dinner&lt;/h3&gt;
&lt;p&gt;A small and plain restaurant, but quite nice food. The first dish was puzzling, though. Several of the chunks of meat contained what looked like small rib bones, but far too small to be typical livestock (even chickens).&lt;/p&gt;
&lt;p&gt;I found out later what it was.&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-01/dinner-rodent.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-01/dinner-rodent.jpg&quot; alt=&quot;&quot; width=&quot;480&quot; height=&quot;360&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;Picking tangerines&lt;/h3&gt;
&lt;p&gt;Nothing really to say except that the location was serene and lovely.&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-01/oranges1.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-01/oranges1.jpg&quot; alt=&quot;&quot; width=&quot;480&quot; height=&quot;360&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/12-01/oranges2.jpg&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/12-01/oranges2.jpg&quot; alt=&quot;&quot; width=&quot;360&quot; height=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dewdrop-world.net/words/blog5.php/2012/01/04/welcome-to-2012&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>It's the first post of the new year -- here's hoping friends and family, near and far and can look forward to a peaceful and happy new year.</p>
<p>I rang in the new year watching the English Premier League in, of all places, Guangning, about two hours northwest of Guangzhou. (Chelsea lost to Aston Villa, by the way. Pout.) It's a medium-sized burg, just large enough to support a decent hotel (thank heaven!) but too small to be modernized and (relatively) sanitized like the major metropolitan areas. How did I find myself in such a place?</p>
<p>My new <em>petit ami</em> invited me to join his family on a new year's weekend trip, going to:</p>
<ul>
<li>"Huang Yao Ancient Town" in Guangxi province, just to the west of Guangdong (dong &#19996; is east, xi &#35199; is west),</li>
<li>Guangning for dinner with family friends and to spend the night,</li>
<li>and last to a tangerine orchard up in the mountains to pick a couple of basketsful.</li>
</ul>
<p>With my last grades turned on Friday, I was free to go and needed the rest. So off we went, early in the morning on Saturday.</p>
<h3>Ancient Town</h3>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/old-city-tree.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/old-city-tree.jpg" alt="" width="480" height="360" /></a></div>
<p>An "Ancient Town" like this one could be a dicey proposition. All too often, they have acquired the worst characteristics of modern Venice in Italy: inconvenient, expensive, crawling with tourists, and overrun with trinket shops that are lucky to rise to the level of an eyesore. Huang Yao was not any of those things, at least on a chilly December 31. I remember one street with souvenir shops, but the rest of the town was mostly unscathed. Some villagers had set up stalls where you could buy dessert or, at others, spicy pickled seasonings to use for cooking, but these, too, were scattered around and never crowded the scenery.</p>
<p>Nothing luxurious here. We took lunch at a restaurant located in one family's residence.</p>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/old-city-lunch-restaurant.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/old-city-lunch-restaurant.jpg" alt="" width="360" height="480" /></a></div>
<p>The town is nestled in the mountains and a small river runs through the middle. Despite the cloudy weather, it wasn't hard to find good places for pictures.</p>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/old-city-big-bridge.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/old-city-big-bridge.jpg" alt="" width="480" height="360" /></a></div>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/old-city-boats-river.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/old-city-boats-river.jpg" alt="" width="360" height="480" /></a></div>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/old-city-small-bridge.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/old-city-small-bridge.jpg" alt="" width="480" height="360" /></a></div>
<p>Even an old town can't completely avoid the pressures of modernization. What happens when a car, possibly under the control of an inebriated driver (or out of his control?), veers off of a narrow stone bridge with decorative railings that were plainly not designed to highway specifications?</p>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/old-city-crash.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/old-city-crash.jpg" alt="" width="480" height="360" /></a></div>
<h3>Guangning dinner</h3>
<p>A small and plain restaurant, but quite nice food. The first dish was puzzling, though. Several of the chunks of meat contained what looked like small rib bones, but far too small to be typical livestock (even chickens).</p>
<p>I found out later what it was.</p>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/dinner-rodent.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/dinner-rodent.jpg" alt="" width="480" height="360" /></a></div>
<h3>Picking tangerines</h3>
<p>Nothing really to say except that the location was serene and lovely.</p>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/oranges1.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/oranges1.jpg" alt="" width="480" height="360" /></a></div>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/oranges2.jpg"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/12-01/oranges2.jpg" alt="" width="360" height="480" /></a></div><div class="item_footer"><p><small><a href="http://www.dewdrop-world.net/words/blog5.php/2012/01/04/welcome-to-2012">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dewdrop-world.net/words/blog5.php/2012/01/04/welcome-to-2012#comments</comments>
			<wfw:commentRss>http://www.dewdrop-world.net/words/blog5.php?tempskin=_rss2&#38;disp=comments&#38;p=163</wfw:commentRss>
		</item>
				<item>
			<title>Descent into madness (FFT noise reduction)</title>
			<link>http://www.dewdrop-world.net/words/blog5.php/2011/12/22/descent-into-madness-fft-noise-reduction</link>
			<pubDate>Thu, 22 Dec 2011 11:04:52 +0000</pubDate>			<dc:creator>James</dc:creator>
			<category domain="main">Technical</category>			<guid isPermaLink="false">162@http://www.dewdrop-world.net/words/</guid>
						<description>&lt;p&gt;Rewind about a week. After months of great performance from my Frankenstein voice recognition setup -- headset mic --&amp;gt; JACK --&amp;gt; PulseAudio --&amp;gt; VirtualBox running WinXP --&amp;gt; Dragon NaturallySpeaking -- suddenly dictation accuracy went into the toilet. What's more, it was bad only in Linux; Windows, no problem.&lt;/p&gt;
&lt;p&gt;At this point, most users would complain to an online forum and/or buy a new microphone, and hope for the best. But I'm... an audio professional, so that's not nearly enough. (Note: Here's where it's going to start getting a bit technical. It will get a lot more technical as we go...)&lt;/p&gt;
&lt;p&gt;So... first, compare recordings from Windows and Linux.&lt;/p&gt;
&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;/words/media/blogs/rlpf/11-12/mic-problem.png&quot;&gt;&lt;img src=&quot;/words/media/blogs/rlpf/11-12/mic-problem.png&quot; alt=&quot;&quot; width=&quot;479&quot; height=&quot;294&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;This shows two problems. 1 - the signal level in Linux is a lot lower. The dictation software can't tell when I'm speaking and when I'm not. 2 - the Linux signal is not centered around 0. In technical terms, it has a negative &quot;DC (Direct Current) offset.&quot;&lt;/p&gt;
&lt;p&gt;But why stop there? I also happen to be in possession of a state-of-the-art real-time digital signal processing engine (SuperCollider), and the architecture in Linux allows me to connect it to any other audio application. So what happens if I tell SuperCollider to remove the DC offset (LeakDC unit generator), and insert SC between the microphone and VirtualBox? Not quite a miracle, but the speech recognition improved dramatically. It was short of where it was before, but nearly usable. Without the extra processing, it was impossible.&lt;/p&gt;
&lt;p&gt;LeakDC took care of problem #2. Problem #1 is not only that the signal level is lower. The voice signal is softer, but the noise level is about the same. If I use SC to amplify the signal, the noise will also be louder, and that's just as bad for dictation accuracy.&lt;/p&gt;
&lt;p&gt;Enter the technique used for noise removal in a variety of software: analyze a short recording of the noise for its spectral characteristics, and then subtract those characteristics from the signal to be cleaned up. Well, SuperCollider can do that (with some help from Dan Stowell's excellent FFT unit generators in the sc3-plugins package)!&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Record the noise into a buffer.
&lt;pre&gt;SynthDef(\rec, {&lt;br /&gt;	RecordBuf.ar(LeakDC.ar(SoundIn.ar(0)), samplebuf, loop: 0,&lt;br /&gt;		doneAction: 2);&lt;br /&gt;}).send(z);&lt;br /&gt;z.sync;&lt;br /&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Get the audio out of the buffer, apply a &lt;a href=&quot;http://en.wikipedia.org/wiki/Windowing_function&quot;&gt;windowing envelope&lt;/a&gt;, and calculate the &lt;a href=&quot;http://en.wikipedia.org/wiki/Fast_Fourier_transform&quot;&gt;Fast Fourier Transform&lt;/a&gt;. ('nrfactor' only amplifies the noise level before the FFT.)
&lt;pre&gt;fork {&lt;br /&gt;	samplebuf.getToFloatArray(wait: 0.05, action: { |data_in|&lt;br /&gt;		data = data_in;&lt;br /&gt;		cond.unhang;&lt;br /&gt;	});&lt;br /&gt;};&lt;br /&gt;cond.hang;&lt;br /&gt;&lt;br /&gt;hamm = Signal.hammingWindow(data.size);&lt;br /&gt;data = Signal.fill(data.size, { |i| data[i] * hamm[i] });&lt;br /&gt;fftdata = (data * nrfactor).fft(Signal.newClear(data.size),&lt;br /&gt;	Signal.fftCosTable(data.size));&lt;br /&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Put the FFT into a new buffer. The magnitudes and phases (real and imaginary parts) have to be interleaved: &lt;em&gt;[].flop.flat&lt;/em&gt;.
&lt;pre&gt;fork {&lt;br /&gt;	fftbuf = Buffer.sendCollection(&lt;br /&gt;		z,&lt;br /&gt;		[fftdata.real, fftdata.imag].flop.flat,&lt;br /&gt;		1, 0.05, {&lt;br /&gt;			cond.unhang;&lt;br /&gt;		}&lt;br /&gt;	);&lt;br /&gt;};&lt;br /&gt;cond.hang;&lt;br /&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It's a little tricky to use the new buffer. &quot;PV&quot; (&lt;a href=&quot;http://en.wikipedia.org/wiki/Phase_vocoder&quot;&gt;Phase Vocoder&lt;/a&gt;) unit generators in SuperCollider often overwrite the FFT frame, because they expect a new FFT analysis to be generated in each go-round. So, though it might seem redundant, it's necessary to PV_Copy from the prepared buffer into a temporary buffer for the rest of the processing. The noise reduction itself is actually fairly simple: PV_MagSubtract subtracts energy corresponding to the noise spectrum.&lt;/p&gt;
&lt;pre&gt;SynthDef(\nr, { |fftbuf, amp, maxLevel = 0.99|&lt;br /&gt;	var sig = LeakDC.ar(SoundIn.ar(0)),&lt;br /&gt;	fft = FFT(LocalBuf(BufFrames.ir(fftbuf)), sig),&lt;br /&gt;	fftsource = FFTTrigger(fftbuf),&lt;br /&gt;	fftsub = FFTTrigger(LocalBuf(BufFrames.ir(fftbuf))),&lt;br /&gt;	copy = PV_Copy(fftsource, fftsub);&lt;br /&gt;	fft = PV_MagSubtract(fft, fftsub, 1);&lt;br /&gt;	Out.ar(0, Limiter.ar(IFFT(fft) * amp.dbamp, maxLevel) ! 2);&lt;br /&gt;}).send(z);&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;But that's still not enough coding! This is something I need to use daily, so it has to be convenient. I should be able to run it as a script -- &lt;em&gt;sclang /path/to/micfix-script.scd&lt;/em&gt; -- and it should do everything: manipulate the JACK connections, run the processing, and also show a little window with a few simple controls. I won't go into all the details in text, but the attached file shows how it's done, for the brave or the just curious. (Note: The script requires a development version of SC, with the QT GUI framework. The extension should be '.scd' really, but this bloggy software doesn't like that. Ho hum -- rename it after you download. Oh... and, I hope I removed all the swear words from the comments.)&lt;/p&gt;
&lt;p&gt;How is it working? Pretty well -- maybe better than it ought to work, for such a na&amp;#239;ve  algorithm. NaturallySpeaking still struggles more than I would like, but accuracy is around 90% at best, good enough for now. Probably I will still have to get a new microphone, but my dictation setup is decently usable again. So it was a worthy experiment.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Edit:&lt;/strong&gt;&lt;/em&gt; Updated the file. There was a bug with the &quot;new noise sample&quot; button. Fixed now.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dewdrop-world.net/words/blog5.php/2011/12/22/descent-into-madness-fft-noise-reduction&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Rewind about a week. After months of great performance from my Frankenstein voice recognition setup -- headset mic --&gt; JACK --&gt; PulseAudio --&gt; VirtualBox running WinXP --&gt; Dragon NaturallySpeaking -- suddenly dictation accuracy went into the toilet. What's more, it was bad only in Linux; Windows, no problem.</p>
<p>At this point, most users would complain to an online forum and/or buy a new microphone, and hope for the best. But I'm... an audio professional, so that's not nearly enough. (Note: Here's where it's going to start getting a bit technical. It will get a lot more technical as we go...)</p>
<p>So... first, compare recordings from Windows and Linux.</p>
<div class="image_block"><a href="http://www.dewdrop-world.net/words/media/blogs/rlpf/11-12/mic-problem.png"><img src="http://www.dewdrop-world.net/words/media/blogs/rlpf/11-12/mic-problem.png" alt="" width="479" height="294" /></a></div>
<p>This shows two problems. 1 - the signal level in Linux is a lot lower. The dictation software can't tell when I'm speaking and when I'm not. 2 - the Linux signal is not centered around 0. In technical terms, it has a negative "DC (Direct Current) offset."</p>
<p>But why stop there? I also happen to be in possession of a state-of-the-art real-time digital signal processing engine (SuperCollider), and the architecture in Linux allows me to connect it to any other audio application. So what happens if I tell SuperCollider to remove the DC offset (LeakDC unit generator), and insert SC between the microphone and VirtualBox? Not quite a miracle, but the speech recognition improved dramatically. It was short of where it was before, but nearly usable. Without the extra processing, it was impossible.</p>
<p>LeakDC took care of problem #2. Problem #1 is not only that the signal level is lower. The voice signal is softer, but the noise level is about the same. If I use SC to amplify the signal, the noise will also be louder, and that's just as bad for dictation accuracy.</p>
<p>Enter the technique used for noise removal in a variety of software: analyze a short recording of the noise for its spectral characteristics, and then subtract those characteristics from the signal to be cleaned up. Well, SuperCollider can do that (with some help from Dan Stowell's excellent FFT unit generators in the sc3-plugins package)!</p>
<ol>
<li>Record the noise into a buffer.
<pre>SynthDef(\rec, {<br />	RecordBuf.ar(LeakDC.ar(SoundIn.ar(0)), samplebuf, loop: 0,<br />		doneAction: 2);<br />}).send(z);<br />z.sync;<br /></pre>
</li>
<li>Get the audio out of the buffer, apply a <a href="http://en.wikipedia.org/wiki/Windowing_function">windowing envelope</a>, and calculate the <a href="http://en.wikipedia.org/wiki/Fast_Fourier_transform">Fast Fourier Transform</a>. ('nrfactor' only amplifies the noise level before the FFT.)
<pre>fork {<br />	samplebuf.getToFloatArray(wait: 0.05, action: { |data_in|<br />		data = data_in;<br />		cond.unhang;<br />	});<br />};<br />cond.hang;<br /><br />hamm = Signal.hammingWindow(data.size);<br />data = Signal.fill(data.size, { |i| data[i] * hamm[i] });<br />fftdata = (data * nrfactor).fft(Signal.newClear(data.size),<br />	Signal.fftCosTable(data.size));<br /></pre>
</li>
<li>Put the FFT into a new buffer. The magnitudes and phases (real and imaginary parts) have to be interleaved: <em>[].flop.flat</em>.
<pre>fork {<br />	fftbuf = Buffer.sendCollection(<br />		z,<br />		[fftdata.real, fftdata.imag].flop.flat,<br />		1, 0.05, {<br />			cond.unhang;<br />		}<br />	);<br />};<br />cond.hang;<br /></pre>
</li>
</ol>
<p>It's a little tricky to use the new buffer. "PV" (<a href="http://en.wikipedia.org/wiki/Phase_vocoder">Phase Vocoder</a>) unit generators in SuperCollider often overwrite the FFT frame, because they expect a new FFT analysis to be generated in each go-round. So, though it might seem redundant, it's necessary to PV_Copy from the prepared buffer into a temporary buffer for the rest of the processing. The noise reduction itself is actually fairly simple: PV_MagSubtract subtracts energy corresponding to the noise spectrum.</p>
<pre>SynthDef(\nr, { |fftbuf, amp, maxLevel = 0.99|<br />	var sig = LeakDC.ar(SoundIn.ar(0)),<br />	fft = FFT(LocalBuf(BufFrames.ir(fftbuf)), sig),<br />	fftsource = FFTTrigger(fftbuf),<br />	fftsub = FFTTrigger(LocalBuf(BufFrames.ir(fftbuf))),<br />	copy = PV_Copy(fftsource, fftsub);<br />	fft = PV_MagSubtract(fft, fftsub, 1);<br />	Out.ar(0, Limiter.ar(IFFT(fft) * amp.dbamp, maxLevel) ! 2);<br />}).send(z);<br /></pre>
<p>But that's still not enough coding! This is something I need to use daily, so it has to be convenient. I should be able to run it as a script -- <em>sclang /path/to/micfix-script.scd</em> -- and it should do everything: manipulate the JACK connections, run the processing, and also show a little window with a few simple controls. I won't go into all the details in text, but the attached file shows how it's done, for the brave or the just curious. (Note: The script requires a development version of SC, with the QT GUI framework. The extension should be '.scd' really, but this bloggy software doesn't like that. Ho hum -- rename it after you download. Oh... and, I hope I removed all the swear words from the comments.)</p>
<p>How is it working? Pretty well -- maybe better than it ought to work, for such a na&#239;ve  algorithm. NaturallySpeaking still struggles more than I would like, but accuracy is around 90% at best, good enough for now. Probably I will still have to get a new microphone, but my dictation setup is decently usable again. So it was a worthy experiment.</p>
<p><em><strong>Edit:</strong></em> Updated the file. There was a bug with the "new noise sample" button. Fixed now.</p><div class="item_footer"><p><small><a href="http://www.dewdrop-world.net/words/blog5.php/2011/12/22/descent-into-madness-fft-noise-reduction">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dewdrop-world.net/words/blog5.php/2011/12/22/descent-into-madness-fft-noise-reduction#comments</comments>
			<wfw:commentRss>http://www.dewdrop-world.net/words/blog5.php?tempskin=_rss2&#38;disp=comments&#38;p=162</wfw:commentRss>
		</item>
				<item>
			<title>Work is not possible in China</title>
			<link>http://www.dewdrop-world.net/words/blog5.php/2011/12/20/work-is-not-possible-in-china</link>
			<pubDate>Tue, 20 Dec 2011 10:01:02 +0000</pubDate>			<dc:creator>James</dc:creator>
			<category domain="main">General</category>			<guid isPermaLink="false">161@http://www.dewdrop-world.net/words/</guid>
						<description>&lt;p&gt;Today: I can't work at home because the neighbors are remodeling, which means horrid grinding noises, off-and-on, all day long as they rip out old floor tiling. Fine -- go to Starbucks for internet. It's not too long before the guy next to me starts practically yelling into his cell phone. Take it outside, please! So I find another table, finally get into a coding task (for a school project, no less), and &lt;strong&gt;my&lt;/strong&gt; phone starts ringing off the hook.&lt;/p&gt;
&lt;p&gt;Nice. I've been planning a workshop for next semester, but at this rate, we could actually have it in a couple of years.&lt;/p&gt;
&lt;p&gt;OK. Rant over. :)&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dewdrop-world.net/words/blog5.php/2011/12/20/work-is-not-possible-in-china&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Today: I can't work at home because the neighbors are remodeling, which means horrid grinding noises, off-and-on, all day long as they rip out old floor tiling. Fine -- go to Starbucks for internet. It's not too long before the guy next to me starts practically yelling into his cell phone. Take it outside, please! So I find another table, finally get into a coding task (for a school project, no less), and <strong>my</strong> phone starts ringing off the hook.</p>
<p>Nice. I've been planning a workshop for next semester, but at this rate, we could actually have it in a couple of years.</p>
<p>OK. Rant over. :)</p><div class="item_footer"><p><small><a href="http://www.dewdrop-world.net/words/blog5.php/2011/12/20/work-is-not-possible-in-china">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dewdrop-world.net/words/blog5.php/2011/12/20/work-is-not-possible-in-china#comments</comments>
			<wfw:commentRss>http://www.dewdrop-world.net/words/blog5.php?tempskin=_rss2&#38;disp=comments&#38;p=161</wfw:commentRss>
		</item>
				<item>
			<title>Movin' on up</title>
			<link>http://www.dewdrop-world.net/words/blog5.php/2011/12/18/movin-on-up</link>
			<pubDate>Sun, 18 Dec 2011 13:38:14 +0000</pubDate>			<dc:creator>James</dc:creator>
			<category domain="main">General</category>			<guid isPermaLink="false">160@http://www.dewdrop-world.net/words/</guid>
						<description>&lt;p&gt;This is the last month of the lease in the &quot;&lt;a href=&quot;/words/blog5.php/2011/01/08/new-old-digs&quot;&gt;new old apartment&lt;/a&gt;.&quot; This raises the question: stay another year, or move out?&lt;/p&gt;
&lt;p&gt;On the side of staying: I'm established here. I know where to go for food and other supplies, and there's a convenient bus route directly to campus.&lt;/p&gt;
&lt;p&gt;On the side of moving: The apartment is too big for me. We needed separate rooms for living, working and sleeping, but now, it doesn't quite make sense for me to be by myself in a three-bedroom apartment. The quality of the interior is better than it could be, I suppose, but less than relaxing. Oh, and the Internet speed is intolerable on weekends and nights.&lt;/p&gt;
&lt;p&gt;So I asked around, and found out that one of the professors at the conservatory has a one room apartment for rent, in a hotel building where some of the floors have been converted into residences. The main drawback: I really meant &quot;one room.&quot; That's not &quot;one bedroom.&quot; One. Room. But the plus side is that the space inside is &lt;em&gt;very&lt;/em&gt; nice -- rich, dark, soft wood tones in the living area and attractive tiling in the bathroom. The location is also good for me -- five minutes on foot to the nearest metro station, and that station is closer to school than the one I was taking from here.&lt;/p&gt;
&lt;p&gt;It seems like the best option. I looked at some other places, but they were all more expensive for less space, and less convenient for my commute. (The place I'm considering is also smaller, but the rent is no more than I'm paying now -- and for a big upgrade in quality.)&lt;/p&gt;
&lt;p&gt;So who knows? In another month, I might be writing from a &quot;new new apartment.&quot;&lt;/p&gt;
&lt;p&gt;Today is Jimmy's birthday. I'm not sure how much I should or shouldn't say, but I hope it was a nice one.&lt;/p&gt;
&lt;p&gt;A bit tired from a long and active weekend, so I think I'll finish watching the interesting but gruesome &quot;The Mermaids Singing&quot; episode of the British crime series from a few years back, &lt;em&gt;&lt;/em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Wire_in_the_Blood&quot;&gt;&lt;em&gt;Wire in the Blood&lt;/em&gt;&lt;/a&gt;. Less flash, more substance than CSI: it's got my attention.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dewdrop-world.net/words/blog5.php/2011/12/18/movin-on-up&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>This is the last month of the lease in the "<a href="http://www.dewdrop-world.net/words/blog5.php/2011/01/08/new-old-digs">new old apartment</a>." This raises the question: stay another year, or move out?</p>
<p>On the side of staying: I'm established here. I know where to go for food and other supplies, and there's a convenient bus route directly to campus.</p>
<p>On the side of moving: The apartment is too big for me. We needed separate rooms for living, working and sleeping, but now, it doesn't quite make sense for me to be by myself in a three-bedroom apartment. The quality of the interior is better than it could be, I suppose, but less than relaxing. Oh, and the Internet speed is intolerable on weekends and nights.</p>
<p>So I asked around, and found out that one of the professors at the conservatory has a one room apartment for rent, in a hotel building where some of the floors have been converted into residences. The main drawback: I really meant "one room." That's not "one bedroom." One. Room. But the plus side is that the space inside is <em>very</em> nice -- rich, dark, soft wood tones in the living area and attractive tiling in the bathroom. The location is also good for me -- five minutes on foot to the nearest metro station, and that station is closer to school than the one I was taking from here.</p>
<p>It seems like the best option. I looked at some other places, but they were all more expensive for less space, and less convenient for my commute. (The place I'm considering is also smaller, but the rent is no more than I'm paying now -- and for a big upgrade in quality.)</p>
<p>So who knows? In another month, I might be writing from a "new new apartment."</p>
<p>Today is Jimmy's birthday. I'm not sure how much I should or shouldn't say, but I hope it was a nice one.</p>
<p>A bit tired from a long and active weekend, so I think I'll finish watching the interesting but gruesome "The Mermaids Singing" episode of the British crime series from a few years back, <em></em><a href="http://en.wikipedia.org/wiki/Wire_in_the_Blood"><em>Wire in the Blood</em></a>. Less flash, more substance than CSI: it's got my attention.</p><div class="item_footer"><p><small><a href="http://www.dewdrop-world.net/words/blog5.php/2011/12/18/movin-on-up">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dewdrop-world.net/words/blog5.php/2011/12/18/movin-on-up#comments</comments>
			<wfw:commentRss>http://www.dewdrop-world.net/words/blog5.php?tempskin=_rss2&#38;disp=comments&#38;p=160</wfw:commentRss>
		</item>
			</channel>
</rss>

