<?xml version="1.0" encoding="utf-8"?>
<!-- generator="FeedCreator 1.7.2-ppt DokuWiki" -->
<?xml-stylesheet href="http://rg42.org/lib/exe/css.php?s=feed" type="text/css"?>
<rdf:RDF
    xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel rdf:about="http://rg42.org/feed.php">
        <title>Robin Gareus</title>
        <description></description>
        <link>http://rg42.org/</link>
        <image rdf:resource="http://rg42.org/lib/tpl/rob/images/favicon.ico" />
       <dc:date>2012-02-23T00:47:57+00:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="http://rg42.org/wiki/tags/installation"/>
                <rdf:li rdf:resource="http://rg42.org/wiki/syncshots/start"/>
                <rdf:li rdf:resource="http://rg42.org/wiki/ihm"/>
                <rdf:li rdf:resource="http://rg42.org/wiki/ldap"/>
                <rdf:li rdf:resource="http://rg42.org/wiki/dokupubsub"/>
                <rdf:li rdf:resource="http://rg42.org/wiki/tutorial"/>
                <rdf:li rdf:resource="http://rg42.org/wiki/tatort-dl"/>
            </rdf:Seq>
        </items>
    </channel>
    <image rdf:about="http://rg42.org/lib/tpl/rob/images/favicon.ico">
        <title>Robin Gareus</title>
        <link>http://rg42.org/</link>
        <url>http://rg42.org/lib/tpl/rob/images/favicon.ico</url>
    </image>
    <item rdf:about="http://rg42.org/wiki/tags/installation">
        <dc:format>text/html</dc:format>
        <dc:date>2012-02-21T12:18:03+00:00</dc:date>
        <dc:creator>rgareus</dc:creator>
        <title>Topic::installation</title>
        <link>http://rg42.org/wiki/tags/installation</link>
        <description>
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Tagged Items about installations, exhibits, and applied hard/software:
&lt;/p&gt;
&lt;table class=&quot;pagelist&quot;&gt;
	&lt;tr&gt;
		&lt;th class=&quot;page&quot;&gt;Page&lt;/th&gt;&lt;th class=&quot;date&quot;&gt;Date&lt;/th&gt;&lt;th class=&quot;tags&quot;&gt;Tags&lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td class=&quot;page&quot;&gt;&lt;a href=&quot;http://rg42.org/blog/breedr&quot; class=&quot;wikilink1&quot; title=&quot;blog:breedr&quot;&gt;breedr&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;date&quot;&gt;01.10.2008 18:11&lt;/td&gt;&lt;td class=&quot;tags&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/tags/news&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:news&quot; rel=&quot;tag&quot;&gt;news&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/floss&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:floss&quot; rel=&quot;tag&quot;&gt;FLOSS&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/installation&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:installation&quot; rel=&quot;tag&quot;&gt;installation&lt;/a&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td class=&quot;page&quot;&gt;&lt;a href=&quot;http://rg42.org/blog/frontera&quot; class=&quot;wikilink1&quot; title=&quot;blog:frontera&quot;&gt;frontera&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;date&quot;&gt;09.07.2008 21:27&lt;/td&gt;&lt;td class=&quot;tags&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/tags/floss&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:floss&quot; rel=&quot;tag&quot;&gt;FLOSS&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/installation&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:installation&quot; rel=&quot;tag&quot;&gt;Installation&lt;/a&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td class=&quot;page&quot;&gt;&lt;a href=&quot;http://rg42.org/blog/occupy_wall_screens&quot; class=&quot;wikilink1&quot; title=&quot;blog:occupy_wall_screens&quot;&gt;Occupy Wall Screens&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;date&quot;&gt;11.12.2011 00:03&lt;/td&gt;&lt;td class=&quot;tags&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/tags/installation&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:installation&quot; rel=&quot;tag&quot;&gt;installation&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/news&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:news&quot; rel=&quot;tag&quot;&gt;news&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/video&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:video&quot; rel=&quot;tag&quot;&gt;video&lt;/a&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td class=&quot;page&quot;&gt;&lt;a href=&quot;http://rg42.org/blog/picnic08&quot; class=&quot;wikilink1&quot; title=&quot;blog:picnic08&quot;&gt;picnic08&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;date&quot;&gt;21.09.2008 22:53&lt;/td&gt;&lt;td class=&quot;tags&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/tags/news&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:news&quot; rel=&quot;tag&quot;&gt;news&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/installation&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:installation&quot; rel=&quot;tag&quot;&gt;installation&lt;/a&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td class=&quot;page&quot;&gt;&lt;a href=&quot;http://rg42.org/blog/world_skin&quot; class=&quot;wikilink1&quot; title=&quot;blog:world_skin&quot;&gt;World Skin - a Photo Safari in the Land of War&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;date&quot;&gt;28.01.2010 17:34&lt;/td&gt;&lt;td class=&quot;tags&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/tags/video&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:video&quot; rel=&quot;tag&quot;&gt;video&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/installation&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:installation&quot; rel=&quot;tag&quot;&gt;installation&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/audio&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:audio&quot; rel=&quot;tag&quot;&gt;audio&lt;/a&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td class=&quot;page&quot;&gt;&lt;a href=&quot;http://rg42.org/oss/jrec/jrec2&quot; class=&quot;wikilink1&quot; title=&quot;oss:jrec:jrec2&quot;&gt;jrec2&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;date&quot;&gt;23.06.2009 11:27&lt;/td&gt;&lt;td class=&quot;tags&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/tags/jack&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:jack&quot; rel=&quot;tag&quot;&gt;JACK&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/floss&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:floss&quot; rel=&quot;tag&quot;&gt;FLOSS&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/musix&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:musix&quot; rel=&quot;tag&quot;&gt;MUSIX&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/installation&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:installation&quot; rel=&quot;tag&quot;&gt;INSTALLATION&lt;/a&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td class=&quot;page&quot;&gt;&lt;a href=&quot;http://rg42.org/oss/osc/start&quot; class=&quot;wikilink1&quot; title=&quot;oss:osc:start&quot;&gt;Open Sound Control Utils&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;date&quot;&gt;23.06.2009 11:27&lt;/td&gt;&lt;td class=&quot;tags&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/tags/floss&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:floss&quot; rel=&quot;tag&quot;&gt;FLOSS&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/installation&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:installation&quot; rel=&quot;tag&quot;&gt;INSTALLATION&lt;/a&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td class=&quot;page&quot;&gt;&lt;a href=&quot;http://rg42.org/oss/panjack/start&quot; class=&quot;wikilink1&quot; title=&quot;oss:panjack:start&quot;&gt;PanJack&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;date&quot;&gt;11.06.2008 12:31&lt;/td&gt;&lt;td class=&quot;tags&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/tags/floss&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:floss&quot; rel=&quot;tag&quot;&gt;FLOSS&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/jack&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:jack&quot; rel=&quot;tag&quot;&gt;JACK&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/musix&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:musix&quot; rel=&quot;tag&quot;&gt;MUSIX&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/installation&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:installation&quot; rel=&quot;tag&quot;&gt;installation&lt;/a&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td class=&quot;page&quot;&gt;&lt;a href=&quot;http://rg42.org/oss/xjadeo/xjadeo&quot; class=&quot;wikilink1&quot; title=&quot;oss:xjadeo:xjadeo&quot;&gt;xjadeo&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;date&quot;&gt;23.06.2009 11:27&lt;/td&gt;&lt;td class=&quot;tags&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/tags/jack&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:jack&quot; rel=&quot;tag&quot;&gt;JACK&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/floss&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:floss&quot; rel=&quot;tag&quot;&gt;FLOSS&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/video&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:video&quot; rel=&quot;tag&quot;&gt;VIDEO&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/installation&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:installation&quot; rel=&quot;tag&quot;&gt;INSTALLATION&lt;/a&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td class=&quot;page&quot;&gt;&lt;a href=&quot;http://rg42.org/weblog/2009/04_19_093928&quot; class=&quot;wikilink1&quot; title=&quot;weblog:2009:04_19_093928&quot;&gt;The Other Side&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;date&quot;&gt;19.04.2009 09:39&lt;/td&gt;&lt;td class=&quot;tags&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/tags/bookmark&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:bookmark&quot; rel=&quot;tag&quot;&gt;Bookmark&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/floss&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:floss&quot; rel=&quot;tag&quot;&gt;floss&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/installation&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:installation&quot; rel=&quot;tag&quot;&gt;installation&lt;/a&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td class=&quot;page&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/frontera&quot; class=&quot;wikilink1&quot; title=&quot;wiki:frontera&quot;&gt;the Frontera Project&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;date&quot;&gt;16.04.2008 15:05&lt;/td&gt;&lt;td class=&quot;tags&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/tags/floss&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:floss&quot; rel=&quot;tag&quot;&gt;FLOSS&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/video&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:video&quot; rel=&quot;tag&quot;&gt;Video&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/installation&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:installation&quot; rel=&quot;tag&quot;&gt;Installation&lt;/a&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td class=&quot;page&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/inout&quot; class=&quot;wikilink1&quot; title=&quot;wiki:inout&quot;&gt;InOut&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;date&quot;&gt;20.02.2009 15:07&lt;/td&gt;&lt;td class=&quot;tags&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/tags/development&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:development&quot; rel=&quot;tag&quot;&gt;development&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/installation&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:installation&quot; rel=&quot;tag&quot;&gt;installation&lt;/a&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td class=&quot;page&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/syncshots/start&quot; class=&quot;wikilink1&quot; title=&quot;wiki:syncshots:start&quot;&gt;Video synchronization - Screen-shots&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;date&quot;&gt;11.02.2008 01:37&lt;/td&gt;&lt;td class=&quot;tags&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/tags/video&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:video&quot; rel=&quot;tag&quot;&gt;Video&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/installation&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:installation&quot; rel=&quot;tag&quot;&gt;Installation&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/development&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:development&quot; rel=&quot;tag&quot;&gt;Development&lt;/a&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td class=&quot;page&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/vga2scart&quot; class=&quot;wikilink1&quot; title=&quot;wiki:vga2scart&quot;&gt;VGA to SCART&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;date&quot;&gt;23.06.2009 11:27&lt;/td&gt;&lt;td class=&quot;tags&quot;&gt;&lt;a href=&quot;http://rg42.org/wiki/tags/video&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:video&quot; rel=&quot;tag&quot;&gt;video&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/development&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:development&quot; rel=&quot;tag&quot;&gt;development&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/installation&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:installation&quot; rel=&quot;tag&quot;&gt;installation&lt;/a&gt;&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;

&lt;/div&gt;
</description>
    </item>
    <item rdf:about="http://rg42.org/wiki/syncshots/start">
        <dc:format>text/html</dc:format>
        <dc:date>2012-02-20T10:49:53+00:00</dc:date>
        <dc:creator>rgareus</dc:creator>
        <title>Video synchronization - Screen-shots</title>
        <link>http://rg42.org/wiki/syncshots/start</link>
        <description>
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
This is about testing and debugging Video/Screen synchronization.
&lt;/p&gt;

&lt;p&gt;
The problem is simple and common: You play a video file at a given framerate (eg 24 fps, 25fps or 29.97fps) 
while your Screen is refreshed at a different rate (eg 60Hz, or 75 Hz or 85Hz).
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT2 SECTION &quot;Video synchronization - Screen-shots&quot; [1-308] --&gt;
&lt;h2 class=&quot;sectionedit3&quot;&gt;&lt;a name=&quot;motivation_and_introduction&quot; id=&quot;motivation_and_introduction&quot;&gt;Motivation and Introduction&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT3 SECTION &quot;Motivation and Introduction&quot; [309-349] --&gt;
&lt;h2 class=&quot;sectionedit4&quot;&gt;&lt;a name=&quot;test_setup&quot; id=&quot;test_setup&quot;&gt;Test Setup&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;http://rg42.org/_detail/wiki/syncshots/vga2audio.jpg?id=wiki%3Asyncshots%3Astart&quot; class=&quot;media&quot; title=&quot;wiki:syncshots:vga2audio.jpg&quot;&gt;&lt;img src=&quot;http://rg42.org/_media/wiki/syncshots/vga2audio.jpg?w=200&quot; class=&quot;medialeft&quot; align=&quot;left&quot; title=&quot;VGA to Audio adapter&quot; alt=&quot;VGA to Audio adapter&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; video files with alternating black and white frames (at different framerates)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; cable from VGA (green-luminance) to soundcard (audio-in)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://kokkinizita.linuxaudio.org/linuxaudio/&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://kokkinizita.linuxaudio.org/linuxaudio/&quot;  rel=&quot;nofollow&quot;&gt;yass&lt;/a&gt; (yet another scrolling scope)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; different video players (mplayer, xine, xjadeo) in fullscreen mode&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;clearer&quot;&gt;&lt;/div&gt;

&lt;p&gt;
For the black video frames the signal will be zero during the whole cycle. For white frames it should be about 1V, with the start and end of each frame marked by a short (~1ms) zero.
&lt;/p&gt;

&lt;p&gt;
This may give you an idea: smoothly playing a 25fps file of alternating black and white frames on a 75Hz screen: 3times black ; 3 times white frame with vertical sync.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://rg42.org/_detail/wiki/syncshots/scope25fpsat75hz.png?id=wiki%3Asyncshots%3Astart&quot; class=&quot;media&quot; title=&quot;wiki:syncshots:scope25fpsat75hz.png&quot;&gt;&lt;img src=&quot;http://rg42.org/_media/wiki/syncshots/scope25fpsat75hz.png&quot; class=&quot;media&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
The setup was done on one machine with two screens (one for monitoring, and the 2nd screen used as probe displaying the video). Using a single machine allows for software to measure the delay between a requested screen update and resulting signal (after compensating the audio-interface&amp;#039;s latency). (Note that not all grafic boards allow DRI sync if two screens are in use) 
&lt;/p&gt;

&lt;p&gt;
…
&lt;/p&gt;
&lt;div class=&quot;tags&quot;&gt;&lt;span&gt;
&lt;a href=&quot;http://rg42.org/wiki/tags/video&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:video&quot; rel=&quot;tag&quot;&gt;Video&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/installation&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:installation&quot; rel=&quot;tag&quot;&gt;Installation&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/development&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:development&quot; rel=&quot;tag&quot;&gt;Development&lt;/a&gt;
&lt;/span&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;!-- EDIT4 SECTION &quot;Test Setup&quot; [350-] --&gt;</description>
    </item>
    <item rdf:about="http://rg42.org/wiki/ihm">
        <dc:format>text/html</dc:format>
        <dc:date>2012-02-20T10:48:02+00:00</dc:date>
        <dc:creator>rgareus</dc:creator>
        <title>IHM -- recursive semantic hypermedia archive</title>
        <link>http://rg42.org/wiki/ihm</link>
        <description>
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;http://rg42.org/_export/s5/wiki/ihm&quot; title=&quot;View page as slide show&quot;&gt;&lt;img src=&quot;http://rg42.org/lib/plugins/s5/screen.gif&quot; align=&quot;right&quot; alt=&quot;View page as slide show&quot; width=&quot;48&quot; height=&quot;48&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
&lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
Robin Gareus 
&lt;/p&gt;

&lt;p&gt;
CiTu, Université Paris 8; linuxaudio.org
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT5 SECTION &quot;IHM -- recursive semantic hypermedia archive&quot; [1-140] --&gt;
&lt;h2 class=&quot;sectionedit6&quot;&gt;&lt;a name=&quot;introductionthe_problem&quot; id=&quot;introductionthe_problem&quot;&gt;Introduction: The Problem&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; IHM needs a spiffy media archive :)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; There is no appropriate non-commercial solution.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;em&gt;joomla&lt;/em&gt; or &lt;em&gt;drupal&lt;/em&gt; could be customized; yet that path would require non-sustainable development effort.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT6 SECTION &quot;Introduction: The Problem&quot; [141-387] --&gt;
&lt;h2 class=&quot;sectionedit7&quot;&gt;&lt;a name=&quot;intromotivation_use-case&quot; id=&quot;intromotivation_use-case&quot;&gt;Intro.: Motivation / Use-case&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Why another &lt;em&gt;content-management system&lt;/em&gt; ?
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;Content&lt;/em&gt; means “some sort of information”, &lt;em&gt;management&lt;/em&gt; in this context means “doing something with it.”
&lt;/p&gt;

&lt;p&gt;
Most of the &lt;acronym title=&quot;Content Management System&quot;&gt;CMS&lt;/acronym&gt; are web-site revisioning systems with emphasis on social networks.
&lt;/p&gt;

&lt;p&gt;
We want a system to &lt;strong&gt;contain abstract items&lt;/strong&gt; or objects (i.e. image, article,
movie, person, location, comments,..) and be able to &lt;strong&gt;define semantic relations&lt;/strong&gt; between them.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT7 SECTION &quot;Intro.: Motivation / Use-case&quot; [388-848] --&gt;
&lt;h2 class=&quot;sectionedit8&quot;&gt;&lt;a name=&quot;introcollaborations_12&quot; id=&quot;introcollaborations_12&quot;&gt;Intro.: Collaborations (1/2)&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Potential applications, existing projects, collaborations:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; IHM - archive about history of man-machine interfaces&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; TheArtCollider - platform for connected creation (CiTu, Paris8)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; MMDB - MyMovieDatabase (GNU project)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Ozalid - upcoming social network and archive of the Bibliothèque nationale de France&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; zeega.org - interactive documentaries and new forms of storytelling (Meta-Lab, Harvard)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT8 SECTION &quot;Intro.: Collaborations (1/2)&quot; [849-1299] --&gt;
&lt;h2 class=&quot;sectionedit9&quot;&gt;&lt;a name=&quot;introcollaborations_22&quot; id=&quot;introcollaborations_22&quot;&gt;Intro.: Collaborations (2/2)&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Freesound.org - collection of audio-samples&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; newscoop/superdesk - newsroom production system (sourcefabric.org)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; airtime - radio station system (sourcefabric.org)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; mmTeX - fan-fiction layout and book publishing engine.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT9 SECTION &quot;Intro.: Collaborations (2/2)&quot; [1300-1574] --&gt;
&lt;h2 class=&quot;sectionedit10&quot;&gt;&lt;a name=&quot;introgoals_outline&quot; id=&quot;introgoals_outline&quot;&gt;Intro.: Goals / Outline&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Complete language-set to define relations&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Modular system (extended by plugins)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Publish/subscribe architecture&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Social network integration&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Pluggable front-ends:&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; n-dimensional navigation, timeline&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; interoperability with existing authoring tools, apps and data-sets.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; integrated &lt;acronym title=&quot;Extensible HyperText Markup Language&quot;&gt;XHTML&lt;/acronym&gt; engine&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT10 SECTION &quot;Intro.: Goals / Outline&quot; [1575-1936] --&gt;
&lt;h2 class=&quot;sectionedit11&quot;&gt;&lt;a name=&quot;implementationdata_model&quot; id=&quot;implementationdata_model&quot;&gt;Implementation: Data Model&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
The datamodel is a language based on triplets:
&lt;/p&gt;

&lt;p&gt;
“Subject” + “predicate” +  “Object”
&lt;/p&gt;

&lt;p&gt;
Where &lt;em&gt;subject&lt;/em&gt; and &lt;em&gt;objects&lt;/em&gt; are an noun for an item/thing/frame/object and &lt;em&gt;predicate&lt;/em&gt; is a verb.
&lt;/p&gt;

&lt;p&gt;
Both, &lt;em&gt;items&lt;/em&gt; and &lt;em&gt;predicates&lt;/em&gt; are modular types and each of
them may optionally have have dynamic &lt;em&gt;attributes or adverbs&lt;/em&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT11 SECTION &quot;Implementation: Data Model&quot; [1937-2298] --&gt;
&lt;h2 class=&quot;sectionedit12&quot;&gt;&lt;a name=&quot;impldata_model_example&quot; id=&quot;impldata_model_example&quot;&gt;Impl.: Data Model Example&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
“Mona Lisa” + was presented [from date to date] at + “the Louvre [website]”.
&lt;/p&gt;

&lt;p&gt;
“Mona Lisa” + was authored [on date] by + “L. da Vinci.”.
&lt;/p&gt;

&lt;p&gt;
Legend:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; “subject, object”&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; + predicate +&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; [attribute]&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT12 SECTION &quot;Impl.: Data Model Example&quot; [2299-2545] --&gt;
&lt;h2 class=&quot;sectionedit13&quot;&gt;&lt;a name=&quot;implreferences_edges&quot; id=&quot;implreferences_edges&quot;&gt;Impl.: References, Edges&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Each item in IHM has a canonical resource-&lt;acronym title=&quot;Uniform Resource Identifier&quot;&gt;URI&lt;/acronym&gt; (aka. UUID) - which can be used to &lt;strong&gt;universally reference&lt;/strong&gt; the content (similar to a permalink).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Edges are &lt;strong&gt;directional&lt;/strong&gt; (parent/child) links between two resource-URIs using a &lt;strong&gt;predicate&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; A matrix defines the potential relations.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT13 SECTION &quot;Impl.: References, Edges&quot; [2546-2879] --&gt;
&lt;h2 class=&quot;sectionedit14&quot;&gt;&lt;a name=&quot;impldata_types_and_relations&quot; id=&quot;impldata_types_and_relations&quot;&gt;Impl.: Data Types and Relations&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;http://rg42.org/_detail/wiki/ihm.png?id=wiki%3Aihm&quot; class=&quot;media&quot; title=&quot;wiki:ihm.png&quot;&gt;&lt;img src=&quot;http://rg42.org/_media/wiki/ihm.png?w=400&quot; class=&quot;mediaright&quot; align=&quot;right&quot; alt=&quot;&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://theartcollider.org/ihm-test/?viz=vis_form_admin_typematrix&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://theartcollider.org/ihm-test/?viz=vis_form_admin_typematrix&quot;  rel=&quot;nofollow&quot;&gt;http://theartcollider.org/ihm-test/?viz=vis_form_admin_typematrix&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT14 SECTION &quot;Impl.: Data Types and Relations&quot; [2880-3018] --&gt;
&lt;h2 class=&quot;sectionedit15&quot;&gt;&lt;a name=&quot;impltechnical_specs&quot; id=&quot;impltechnical_specs&quot;&gt;Impl.: Technical Specs&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;acronym title=&quot;Hypertext Preprocessor&quot;&gt;PHP&lt;/acronym&gt;/JavaScript/XHTML5, REST-&lt;acronym title=&quot;Application Programming Interface&quot;&gt;API&lt;/acronym&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Model/View/Controller&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; OAuth/OpenID for access control and authentication.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Atom/&lt;acronym title=&quot;Extensible Markup Language&quot;&gt;XML&lt;/acronym&gt; is the main data-format for content.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; uses existing &lt;acronym title=&quot;Resource Description Framework&quot;&gt;RDF&lt;/acronym&gt; templates (&lt;acronym title=&quot;Simple Object Access Protocol&quot;&gt;SOAP&lt;/acronym&gt;, DOAP, FOAF, etc)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; modular system: the layout/architecture is defined in the core but the actual visualization, rendering and [interaction + graphic] design is handled by plugins.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT15 SECTION &quot;Impl.: Technical Specs&quot; [3019-3444] --&gt;
&lt;h2 class=&quot;sectionedit16&quot;&gt;&lt;a name=&quot;impldata_aggregation&quot; id=&quot;impldata_aggregation&quot;&gt;Impl.: Data Aggregation&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Each object may be aggregated or synchronized with an external resource &lt;acronym title=&quot;Uniform Resource Identifier&quot;&gt;URI&lt;/acronym&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Items may reference read-only sources (media archive on disk, 3rd party information) - synchronisation.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Changes to the data-set are published (push) and can be subscribed to. Asynchronous updates.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT16 SECTION &quot;Impl.: Data Aggregation&quot; [3445-3767] --&gt;
&lt;h2 class=&quot;sectionedit17&quot;&gt;&lt;a name=&quot;prototypedemo&quot; id=&quot;prototypedemo&quot;&gt;Prototype: Demo&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;http://rg42.org/_detail/robin/ihm2.png?id=wiki%3Aihm&quot; class=&quot;media&quot; title=&quot;robin:ihm2.png&quot;&gt;&lt;img src=&quot;http://rg42.org/_media/robin/ihm2.png?w=500&quot; class=&quot;mediacenter&quot; alt=&quot;&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Site: &lt;a href=&quot;http://theartcollider.org/ihm-test/&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://theartcollider.org/ihm-test/&quot;  rel=&quot;nofollow&quot;&gt;http://theartcollider.org/ihm-test/&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;acronym title=&quot;Application Programming Interface&quot;&gt;API&lt;/acronym&gt;: &lt;a href=&quot;http://theartcollider.org/ihm-test/api_rest.php&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://theartcollider.org/ihm-test/api_rest.php&quot;  rel=&quot;nofollow&quot;&gt;http://theartcollider.org/ihm-test/api_rest.php&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT17 SECTION &quot;Prototype: Demo&quot; [3768-3927] --&gt;
&lt;h2 class=&quot;sectionedit18&quot;&gt;&lt;a name=&quot;prototypewhat_s_missing&quot; id=&quot;prototypewhat_s_missing&quot;&gt;Prototype: What&amp;#039;s missing&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Proper front-end (web and interaction design[er])&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Item visualization&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Project specific customizations&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Backend-parts:&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Authentication &amp;amp; access-control&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Pub/Sub &lt;acronym title=&quot;Application Programming Interface&quot;&gt;API&lt;/acronym&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Query filtering on edges.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; …&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Community management&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT18 SECTION &quot;Prototype: What's missing&quot; [3928-4225] --&gt;
&lt;h2 class=&quot;sectionedit19&quot;&gt;&lt;a name=&quot;prototypeoutlook_roadmap&quot; id=&quot;prototypeoutlook_roadmap&quot;&gt;Prototype: Outlook, Roadmap&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Publicly usable prototype: after x-mas&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Freeze APIs: spring 2012&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT19 SECTION &quot;Prototype: Outlook, Roadmap&quot; [4226-] --&gt;</description>
    </item>
    <item rdf:about="http://rg42.org/wiki/ldap">
        <dc:format>text/html</dc:format>
        <dc:date>2012-02-20T10:12:21+00:00</dc:date>
        <dc:creator>rgareus</dc:creator>
        <title>Open LDAP Server</title>
        <link>http://rg42.org/wiki/ldap</link>
        <description>
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
mirored from &lt;a href=&quot;http://www.metaconsultancy.com/whitepapers/ldap.htm&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://www.metaconsultancy.com/whitepapers/ldap.htm&quot;  rel=&quot;nofollow&quot;&gt;http://www.metaconsultancy.com/whitepapers/ldap.htm&lt;/a&gt;
&lt;/p&gt;
&lt;hr /&gt;

&lt;p&gt;
It is often convenient to share system information among workstations. For example, users like to be able to log in to multiple machines with the same password; this requires that the machines share the data conventionally stored in /etc/passwd and /etc/shadow. Using NFS usually isn&amp;#039;t an option, since that would share all of /etc/, and we may well want some things configured differently on each machine. &lt;acronym title=&quot;Network Information Service&quot;&gt;NIS&lt;/acronym&gt; used to be a common answer to this dilemma, but &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; (Local Directory Access Protocol) databases, being more flexible and scalable, have now become the preferred solution.
&lt;/p&gt;

&lt;p&gt;
&lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; databases are object-oriented (as opposed to relational, for those of you familiar with such beasts). An &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; database is filled with objects, each of which has associated attributes. Here, for example is a typical object representing a user account.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;dn: uid=john,ou=people,dc=example,dc=com
cn: John Doe
uid: john
uidNumber: 1001
gidNumber: 100
homeDirectory: /home/john
loginShell: /bin/bash
objectClass: top
objectClass: posixAccount&lt;/pre&gt;

&lt;p&gt;
Each object has a DN (distinguished name) attribute that identifies it uniquely. Each object is a member of one or more object classes, which determine which attributes it may and must have, according to a well-defined schema.
Objects in an &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; database are organized into a tree hierarchy, based on their DN. &lt;a href=&quot;http://rg42.org/_detail/wiki/ldap/ltree.png?id=wiki%3Aldap&quot; class=&quot;media&quot; title=&quot;wiki:ldap:ltree.png&quot;&gt;&lt;img src=&quot;http://rg42.org/_media/wiki/ldap/ltree.png&quot; class=&quot;medialeft&quot; align=&quot;left&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
By tradition, the organization example.com uses dc=example,dc=com for its root object (but nothing enforces this tradition). Below the root are objects representing different organizational units, such as people or hosts. The children of these objects are the people and hosts themselves.
&lt;/p&gt;

&lt;p&gt;
We use &lt;a href=&quot;http://openldap.org&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://openldap.org&quot;  rel=&quot;nofollow&quot;&gt;OpenLDAP&lt;/a&gt;, because it&amp;#039;s free and works for us. The rest of this whitepaper describes how to set up an OpenLDAP server to hold your organization&amp;#039;s user data.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT20 SECTION &quot;Open LDAP Server&quot; [1-1964] --&gt;
&lt;h2 class=&quot;sectionedit21&quot;&gt;&lt;a name=&quot;installation&quot; id=&quot;installation&quot;&gt;Installation&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
slapd is the name of the OpenLDAP &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; server daemon.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apt-get install slapd ldap-utils&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT21 SECTION &quot;Installation&quot; [1965-2081] --&gt;
&lt;h2 class=&quot;sectionedit22&quot;&gt;&lt;a name=&quot;basic_configuration&quot; id=&quot;basic_configuration&quot;&gt;Basic Configuration&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
The basic configuration file for slapd is /etc/ldap/slapd.conf. The file can be loosely divided into two parts: an operational part, describing how the slapd daemon does its job, and a database part, describing the &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; datastore (or datastores; a single slapd can serve multiple &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; databases).
&lt;/p&gt;

&lt;p&gt;
Consider first the operational part. A simple example follows.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;//slapd.conf//&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;# schema
include      /etc/ldap/schema/core.schema
include      /etc/ldap/schema/nis.schema
schemacheck  on

# run files
pidfile      /var/run/slapd.pid
argsfile     /var/run/slapd.args

# timeout (in seconds) for dead connections
timeout      60&lt;/pre&gt;

&lt;p&gt;
The schema part loads files which describe which sorts of objects may and must have which properties. Schema files are traditionally stored in the /etc/ldap/schema/ directory. Our example includes only the two most common schema files, but you may well want to load all the schema that ship with OpenLDAP, and even add some more of your own.
&lt;/p&gt;

&lt;p&gt;
By declaring schemacheck on, we tell slapd to require that objects conform to schema files before it accepts them. You should always maintain this requirement, as it helps protect you against accidental errors when updating your database.
&lt;/p&gt;

&lt;p&gt;
The database-specific part of the configuration file tells slapd the database root DN, and how and where to store the data. Here is a simple example:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# ldap database
database     ldbm
suffix       &amp;quot;dc=example,dc=com&amp;quot;
directory    &amp;quot;/var/lib/ldap&amp;quot;&lt;/pre&gt;

&lt;p&gt;
Our example stores data using an embedded database which stores files in /var/lib/ldap. The embedded database (ldbm) option is by far the most common backend, and is the only one we will discuss here. OpenLDAP allows other options, but they are much more difficult to configure.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT22 SECTION &quot;Basic Configuration&quot; [2082-3886] --&gt;
&lt;h2 class=&quot;sectionedit23&quot;&gt;&lt;a name=&quot;securing_openldap&quot; id=&quot;securing_openldap&quot;&gt;Securing OpenLDAP&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
OpenLDAP offers several mechanisms to protect the security of the data it stores. Here we discuss password hashing, access control lists, and connection encryption.
&lt;/p&gt;

&lt;p&gt;
The userPassword attribute is special. Clients use it to authenticate themselves to slapd, and slapd stores it in hashed form. (A hash is a transformation which is simple to do, but difficult to undo.) When a user types in a password, it is hased and compared against the stored hash, rather than being compared directly against a stored cleartext password. Since the cleartext password is not stored anywhere, this trick (which is also used by /etc/shadow) keeps your passwords safe even from someone who has broken in to your &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; server. You can specify the hash algorithm you want slapd to employ in slapd.conf.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;//slapd.conf//

# password hash algorithm
password-hash {MD5}&lt;/pre&gt;

&lt;p&gt;
We like MD5, since the mechanism is both secure and widely employed. SHA and SSHA are also secure, but less widely employed. CRYPT is the most widely employed hashing mechanism in the Unix universe, but is known to be insecure and should be avoided.
&lt;/p&gt;

&lt;p&gt;
It is important to define which users are allowed to read and write which object attributes. These “rights” are defined by ACLs (access control lists) in slapd.conf. Here is a simple example for account information.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;//slapd.conf//

# lock down passwords
access to attribute=userPassword
      by dn=&amp;quot;cn=admin,dc=example,dc=com&amp;quot; write
      by self write
      by anonymous auth
      by * none

# allow users to write some stuff
access to attribute=loginShell,shadowLastChange
      by dn=&amp;quot;cn=admin,dc=example,dc=com&amp;quot; write
      by self write
      by * read

# everything else is read-only
access to *
      by dn=&amp;quot;cn=admin,dc=example,dc=com&amp;quot; write
      by * read&lt;/pre&gt;

&lt;p&gt;
It is easy to make security mistakes when setting ACLs. For example, if you give users write-access to uidNumber, they can set it equal to zero to turn themselves into root. Consider carefully the security implications of each access privilege you grant.
&lt;/p&gt;

&lt;p&gt;
By default, &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; data, including passwords being transmitted for authentication, move across the network in the clear. To protect yourself against eavesdroppers, you should take the simple step of configuring slapd to offer encrypted sessions, and configuring your clients to use them. To enable encrypted sessions, use the openssl utilities to generate a key and corresponding public certificate, and tell slapd to use them for encrypted sessions.
slapd.conf
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;TLSCertificateFile /etc/ldap/ldap.example.crt
TLSCertificateKeyFile /etc/ldap/ldap.example.key
TLSCipherSuite HIGH:+MEDIUM:!LOW&lt;/pre&gt;

&lt;p&gt;
It is important that the CN (common name) on the certificate be exactly the FQDN (fully qualified domain name) which clients use to contact your &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; server. For example, if your server is named ldap.example.com, that should be the certificate CN, and clients should connect using that name, not the corresponding IP address. Such a restriction is only necessary for encrypted sessions.
&lt;/p&gt;

&lt;p&gt;
The certificate key file should be readable only by the user as which slapd runs (for the Debian package, this is root).
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# chmod /etc/ldap/ldap.example.key 0700&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT23 SECTION &quot;Securing OpenLDAP&quot; [3887-7135] --&gt;
&lt;h2 class=&quot;sectionedit24&quot;&gt;&lt;a name=&quot;openldap_utilities&quot; id=&quot;openldap_utilities&quot;&gt;OpenLDAP Utilities&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
There are two classes of utility programs which allow you to modify your OpenLDAP database. The slap* programs (slapadd, slapcat, and slapindex) read and modify an &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; database by operating directly on the files in /var/lib/ldap. To avoid database corruption, they should be employed only when slapd is not running. The ldap* programs (ldapsearch, ldapadd, ldapmodify, ldapdelete, and ldappasswd) read and modify an &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; database by interacting with the slapd server. They are essentially very simple &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; clients. They can only be employed when slapd is running. 
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;offline_slap_utilities&quot; id=&quot;offline_slap_utilities&quot;&gt;offline (slap*) utilities&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
The slapd* utilities accept ldif files as input. ldif files are just flat textfile lists of objects, with attributes indicated in a key: value format, one per line. Here is an example of a simple ldif file that creates the skeletal structure of a simple &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; database.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;/tmp/example.ldif

dn: dc=example,dc=com
dc: example
o: example.com
objectClass: top
objectClass: dcObject
objectClass: organization

dn: ou=people,dc=example,dc=com
ou: people
objectClass: top
objectClass: organizationalUnit

dn: cn=admin,dc=example,dc=com
cn: admin
userPassword: secret
objectClass: top
objectClass: organizationalRole
objectClass: simpleSecurityObject&lt;/pre&gt;

&lt;p&gt;
Getting these objects into the &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; database is easy.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# /etc/init.d/slapd stop
# slapadd -v &amp;lt; /tmp/example.ldif
# slapindex -v
# /etc/init.d/slapd start&lt;/pre&gt;

&lt;p&gt;
Note that we shut down the database before running slapadd. Note also that we ran slapindex after entering the data to update the index files. While indices are automatically maintained when changes are made to a running database (e.g. using ldap* commands), they must be updated “by hand” when changes are made directly to the database files; this is accomplished by running slapindex.
&lt;/p&gt;

&lt;p&gt;
The slapcat command is the “opposite” of slapadd. It extracts the contents of an &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; database into a ldif file. To make a backup of your &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; database,
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# /etc/init.d/slapd stop
# slapcat &amp;gt; /tmp/example.ldif
# /etc/init.d/slapd start&lt;/pre&gt;

&lt;p&gt;
Be sure to store the extracted ldif file in a safe place, since anyone who can read it can effectively read all the data in your &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; database. Since making this backup requires you to shut down your slapd server, backups of large, mission-critical &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; databases should be made from a replicating database (see slaves section below) designed specifically for this purpose.
&lt;/p&gt;

&lt;p&gt;
It is often necessary to use slapadd to create the skeletal structure of a new database, since when a database is first created, it does not contain any administrator object that has permission new objects. Once you have used slapadd to overcome this chicken-and-egg problem, though, you will probably want to use ldap* commands or even a &lt;acronym title=&quot;Graphical User Interface&quot;&gt;GUI&lt;/acronym&gt; &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; client for further database modifications.
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;online_ldap_utilities&quot; id=&quot;online_ldap_utilities&quot;&gt;online (ldap*) utilities&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
The ldap* utilities are easily installed on a Debian computer.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# apt-get install ldap-utils&lt;/pre&gt;

&lt;p&gt;
Keep in mind that these utilities need not be run on the &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; server.
&lt;/p&gt;

&lt;p&gt;
The file /etc/ldap/ldap.conf contains the basic configuration information necessary for the ldap* utilities to know with which &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; database you want them to interact. A simple example follows.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;/etc/ldap/ldap.conf

URI  ldap://localhost
BASE dc=example,dc=com&lt;/pre&gt;

&lt;p&gt;
The &lt;acronym title=&quot;Uniform Resource Identifier&quot;&gt;URI&lt;/acronym&gt; directive specifies the &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; server to use; in our example, we are working on the &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; server itself. The BASE directive specifies the DN of the root node of the database.
&lt;/p&gt;

&lt;p&gt;
The most common way to interact with an &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; server is to read data stored in it. The ldapsearch command allows you to do this from the command line. For example, to obtain the attributes of objects for which cn=admin,
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# ldapsearch -x cn=admin
dn: cn=admin,dc=example,dc=com
objectClass: organizationalRole
objectClass: simpleSecurityObject
objectClass: top
cn: admin&lt;/pre&gt;

&lt;p&gt;
You can use * as a wildcard in your search. To get every object in the database, use
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# ldapsearch -x objectClass=*&lt;/pre&gt;

&lt;p&gt;
You can use the ldapadd command to add objects to your ldap database. Like slapadd, ldapadd uses LDIF input syntax. Unlike slapadd, ldapadd interacts with slapd via &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; to make its modifications. Therefore it can be used across the network, can (in fact must) be used while slapd is running, and allows background tasks such as schema checking, indexing, modification time stamps, and replication to be handled transparently by slapd instead of by hand. For example, to add a user account, we prepare an LDIF file
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;/tmp/user.ldif&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;dn: uid=jdoe,ou=people,dc=example,dc=com
uid: jdoe
cn: Jane Doe
uidNumber: 1001
gidNumber: 100
homeDirectory: /home/jdoe
userPassword: password
loginShell: /bin/bash
objectClass: posixAccount&lt;/pre&gt;

&lt;p&gt;
and then upload it to the running ldap database
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;$ ldapadd -x -v -D cn=admin,dc=example,dc=com -W &amp;lt; /tmp/user.ldif&lt;/pre&gt;

&lt;p&gt;
Note that we bind as the administrator in order to gain write privleges.
&lt;/p&gt;

&lt;p&gt;
The ldapmodify utility allows you to modify the attributes to existing ldap objects, and the ldapdelete utility allows you to delete an ldap object completely.
&lt;/p&gt;

&lt;p&gt;
The ldappasswd utility, the last of the ldap* suite, is used to change userPassword attributes. Don&amp;#039;t use ldapmodify to do this, since that will write a value to the attribute directly, bypassing the hashing specified in slapd.conf. For the administrator to change Jane&amp;#039;s password,
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;$ ldappasswd -x -v -S -W -D cn=admin,dc=example,dc=com uid=jdoe,ou=people,dc=example,dc=com&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;migration_utilities&quot; id=&quot;migration_utilities&quot;&gt;Migration Utilities&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
PADL software makes available a set of migration tools which ease the transition from a system using flat files (/etc/passwd, /etc/group, /etc/hosts, /etc/networks, /etc/services, /etc/protocols) to a central directory server. You can download these tools from the PADL site, or install the Debian package
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# apt-get install migrationtools&lt;/pre&gt;

&lt;p&gt;
which places them in /usr/share/migrationtools/.
&lt;/p&gt;

&lt;p&gt;
To use these tools,
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# cd /usr/share/migrationtools
# ./migrate_passwd.pl /etc/passwd /tmp/passwd.ldif&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT24 SECTION &quot;OpenLDAP Utilities&quot; [7136-13179] --&gt;
&lt;h2 class=&quot;sectionedit25&quot;&gt;&lt;a name=&quot;performance_tuning&quot; id=&quot;performance_tuning&quot;&gt;Performance Tuning&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; databases take a beating. Every email, every login attempt, every directory listing (ls) on any machine at your site can result in a lookup. Fortunately, there are a number of things you can (and should!) do to increase OpenLDAP&amp;#039;s performance.
&lt;/p&gt;

&lt;p&gt;
Begin by generating indices, which are database tables that can be used to track down a record much faster than by looking though the entire database.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;/etc/ldap/slapd.conf

index objectClass eq,pres
index uid,uidNumber,gidNumber eq,pres
index mailLocalAddress eq,pres&lt;/pre&gt;

&lt;p&gt;
If monitoring (e.g. using top) indicates that slapd is often consuming a significant fraction of your CPU time, you are probably missing a useful index. &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; lookup should be I/O-bound, not CPU-bound.
&lt;/p&gt;

&lt;p&gt;
Try to give slapd enough memory to hold all or most of its data in memory. The cachesize directive specifies how many attribute values are cached in memory. The dbcachesize directive specifies the size, in bytes, of the space allocated to store database files in memory. The defaults for these numbers are almost never large enough. For our small organization, I use
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;slapd.conf

cachesize     10000
dbcachesize   1000000&lt;/pre&gt;

&lt;p&gt;
Ideally, cachesize is as large as the total number of entries in your database, and dbcachesize is as large as all the files in the /var/lib/ldap directory. At larger sites, you may find that your &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; server needs quite a bit of memory in order to attain these objectives.
&lt;/p&gt;

&lt;p&gt;
Make sure you are not writing more to your log files than you need to. If you can get away without an audit trail, set loglevel to 0. If you really need an audit trail, set loglevel to 256, and be sure to use a - in /etc/syslogd.conf to allow log entries to be written asynchronously.
&lt;/p&gt;

&lt;p&gt;
Minimize lookups by running nscd on your client machines. Consider upping slapd&amp;#039;s threads variable to 64 or 128.
&lt;/p&gt;

&lt;p&gt;
At very large sites, you may find that your lookup throughput is still insufficient, even after you have taken all these steps. At this point, you may have to invest in more or better hardware. If your throughput is disk I/O bound, consider dedicating a fast, &lt;acronym title=&quot;Small Computer System Interface&quot;&gt;SCSI&lt;/acronym&gt; disk just to /var/lib/ldap, and mount that disk with the noatime option in order to cut down down on access overhead. If your throughput is network I/O bound, make sure you have a fast ethernet card. Check that the packet collision rate suffered by your &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; server is still low (say 5% or less); if not, you need to upgrade your network. Finally, consider setting up a number of dedicated &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; slave machines, and assign the number of clients to each slave that produces a load it can handle. Instructions for setting up &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; slaves are presented in the following section.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT25 SECTION &quot;Performance Tuning&quot; [13180-15887] --&gt;
&lt;h2 class=&quot;sectionedit26&quot;&gt;&lt;a name=&quot;ldap_slaves&quot; id=&quot;ldap_slaves&quot;&gt;LDAP Slaves&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
An &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; slave is an &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; server whose contents mirror the contents of its &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; master. Slaves respond to read requests themselves, but when faced with a write request, a slave refers the client to its master. Any change to a master database is propagated to its slaves immediately and automatically; this process is called replication.
&lt;/p&gt;

&lt;p&gt;
&lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; slaves are useful for load-balancing; distributing client requests among a number of slaves can keep the master from getting hammered. &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; slaves are also useful for automatic failover. Many &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; clients can be configured to fall back to a second &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; server if the first does not respond; by setting a client&amp;#039;s fall-back server to be an &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; slave, you can keep your system running even if your &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; master crashes.
&lt;/p&gt;

&lt;p&gt;
Setting up a master-slave relationship between two &lt;acronym title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/acronym&gt; servers is not difficult.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;slapd.conf&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;replogfile        /var/lib/ldap/replog&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;replica host=slave.example.com:389
      binddn=&amp;quot;cn=admin,dc=example,dc=org&amp;quot;
      bindmethod=simple credentials=secret

slapd.conf

updatedn          &amp;quot;cn=admin,dc=example,dc=org&amp;quot;
updateref         ldap://master.example.org&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT26 SECTION &quot;LDAP Slaves&quot; [15888-] --&gt;</description>
    </item>
    <item rdf:about="http://rg42.org/wiki/dokupubsub">
        <dc:format>text/html</dc:format>
        <dc:date>2012-02-19T20:02:53+00:00</dc:date>
        <dc:creator>rgareus</dc:creator>
        <title>DokuWiki Publish/Subscribe</title>
        <link>http://rg42.org/wiki/dokupubsub</link>
        <description>
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Ideas on Server to Server communication to synchronize &lt;a href=&quot;http://www.dokuwiki.org/&quot; class=&quot;interwiki iw_doku&quot; target=&quot;_blank&quot; title=&quot;http://www.dokuwiki.org/&quot;&gt;dokuwiki&lt;/a&gt; content.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT27 SECTION &quot;DokuWiki Publish/Subscribe&quot; [1-126] --&gt;
&lt;h2 class=&quot;sectionedit28&quot;&gt;&lt;a name=&quot;news&quot; id=&quot;news&quot;&gt;News&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; took the detour to implement an &lt;a href=&quot;http://rg42.org/wiki/dokuoauth&quot; class=&quot;wikilink1&quot; title=&quot;wiki:dokuoauth&quot;&gt;oAuth plugin&lt;/a&gt;. — &lt;em&gt;22.10.2008 13:00&lt;/em&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; added a development &lt;a href=&quot;http://gareus.org/trac/dokuwikihacks/roadmap&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://gareus.org/trac/dokuwikihacks/roadmap&quot;  rel=&quot;nofollow&quot;&gt;roadmap&lt;/a&gt;. — &lt;em&gt;01.09.2008 12:30&lt;/em&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; coffee break - installed a &lt;a href=&quot;http://gareus.org/trac/dokuwikihacks&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://gareus.org/trac/dokuwikihacks&quot;  rel=&quot;nofollow&quot;&gt;trac for this project&lt;/a&gt;.  — &lt;em&gt;31.08.2008 15:18&lt;/em&gt; &lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Just&lt;/strong&gt; received and processed(!) the first XMPP notification. dokupubsub alpha-1 is out. — &lt;em&gt;31.08.2008 13:53&lt;/em&gt; &lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; I&amp;#039;ve started work on a prototype DokuWiki plugin. Download a &lt;a href=&quot;http://gareus.org/gitweb/?p=dokupubsub.git;a=snapshot;h=head&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://gareus.org/gitweb/?p=dokupubsub.git;a=snapshot;h=head&quot;  rel=&quot;nofollow&quot;&gt;devel-snapshot&lt;/a&gt;. dokupubsub interacts with &lt;a href=&quot;http://rg42.org/wiki/idavoll&quot; class=&quot;wikilink1&quot; title=&quot;wiki:idavoll&quot;&gt;idavoll&lt;/a&gt; to interface to the XMPP world. — &lt;em&gt;29.08.2008 15:02&lt;/em&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT28 SECTION &quot;News&quot; [127-825] --&gt;
&lt;h2 class=&quot;sectionedit29&quot;&gt;&lt;a name=&quot;dokupubsub&quot; id=&quot;dokupubsub&quot;&gt;dokupubsub&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;http://rg42.org/_detail/wiki/dwpubsub.png?id=wiki%3Adokupubsub&quot; class=&quot;media&quot; title=&quot;wiki:dwpubsub.png&quot;&gt;&lt;img src=&quot;http://rg42.org/_media/wiki/dwpubsub.png?w=111&quot; class=&quot;medialeft&quot; align=&quot;left&quot; alt=&quot;&quot; width=&quot;111&quot; /&gt;&lt;/a&gt;
The plugin code is still flux. You can test the &lt;a href=&quot;http://gareus.org/gitweb/?p=dokupubsub.git;a=snapshot;h=alpha-2&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://gareus.org/gitweb/?p=dokupubsub.git;a=snapshot;h=alpha-2&quot;  rel=&quot;nofollow&quot;&gt;alpha devel snapshot&lt;/a&gt; or have a look using the &lt;a href=&quot;http://gareus.org/trac/dokuwikihacks/browser&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://gareus.org/trac/dokuwikihacks/browser&quot;  rel=&quot;nofollow&quot;&gt;source-code-browser&lt;/a&gt;. You can check out the code with 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git clone git://gareus.org/dokupubsub&lt;/pre&gt;

&lt;p&gt;
&lt;em&gt;Note&lt;/em&gt;: This plugin is &lt;strong&gt;not safe&lt;/strong&gt; to run on any &lt;strong&gt;internet-connected&lt;/strong&gt; site just yet!
&lt;/p&gt;

&lt;p&gt;
Additional to installing the plugin into DokuWiki&amp;#039;s &lt;em&gt;lib/plugins&lt;/em&gt; folder, you&amp;#039;ll need to run &lt;em&gt;jabberd2&lt;/em&gt; and &lt;a href=&quot;http://rg42.org/wiki/idavoll&quot; class=&quot;wikilink1&quot; title=&quot;wiki:idavoll&quot;&gt;idavoll (setup notes)&lt;/a&gt; on &lt;code&gt;localhost&lt;/code&gt; with the webserver:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo twistd idavoll-http --jid=localhost
tail -f twistd.log&lt;/pre&gt;

&lt;p&gt;
The dokupubsub plugin writes debug info to &lt;code&gt;/tmp/PubSub.debug&lt;/code&gt;. Subscriptions (automatic wiki-page update notifications) are restricted&lt;sup&gt;&lt;a href=&quot;#fn__1&quot; name=&quot;fnt__1&quot; id=&quot;fnt__1&quot; class=&quot;fn_top&quot;&gt;1)&lt;/a&gt;&lt;/sup&gt; to the &lt;code&gt;ext:&lt;/code&gt; namespace - adjust the &lt;em&gt;&lt;acronym title=&quot;Access Control List&quot;&gt;ACL&lt;/acronym&gt;&lt;/em&gt; accordingly. Currently I&amp;#039;m testing subscribing to publications on localhost using the same DokuWiki.
&lt;/p&gt;

&lt;p&gt;
After editing a page (with the web-interface) it will be published to the gateway; the xmpp uri of the publication is saved with meta-data and added to the &lt;acronym title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/acronym&gt; header as &lt;code&gt;&amp;lt;link rel=“alternate feed” href=“xmpp:..”/&amp;gt;&lt;/code&gt; for discovery. Notifications from the gateway are handled with a custom &lt;code&gt;do[dokubookmark]=notify&lt;/code&gt; &lt;acronym title=&quot;Remote Procedure Call&quot;&gt;RPC&lt;/acronym&gt; handler inside the plugin.
&lt;/p&gt;

&lt;p&gt;
There is no PubSub admin interface yet. To subscribe to changes you&amp;#039;ll need to make a request specifying the originating XMPP uri and the destination wiki-ID eg:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;curl -d &amp;quot;what=ever&amp;quot; &amp;quot;http://localhost/dokuwiki/doku.php?do%5Bdokupubsub%5D=subscribe&amp;amp;id=wiki%3Astart&amp;amp;nodeid=xmpp%3Alocalhost%3F%3Bnode%3Dgeneric%2Fbe096541-c728-42f8-b0f6-f330a86b5ec7&amp;quot; &lt;/pre&gt;

&lt;p&gt;
or equivalently:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;curl -d &amp;quot;nodeid=xmpp:localhost?node=generic/123456789-abcd&amp;quot; -d &amp;quot;wikiid=start&amp;quot; &amp;quot;http://localhost/dokuwiki/doku.php?do%5Bdokupubsub%5D=subscribe&amp;quot;&lt;/pre&gt;

&lt;p&gt;
example xmpp-url discovery - see &lt;code&gt;/tmp/PubSub.debug&lt;/code&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;curl -d &amp;quot;url=http://localhost/dokuwiki/start&amp;quot;  &amp;quot;http://localhost/dokuwiki/doku.php?do%5Bdokupubsub%5D=discover&amp;quot; &lt;/pre&gt;

&lt;p&gt;
For testing, you can &lt;em&gt;fake&lt;/em&gt; notifications by saving an Atom-entry document as file &lt;code&gt;/tmp/ps.xml&lt;/code&gt; and run
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;curl  -d &amp;quot;@/tmp/ps.xml&amp;quot; &amp;quot;http://localhost/dokuwiki/doku.php?do%5Bdokupubsub%5D=notify&amp;amp;id=wiki%3Atest&amp;quot; &lt;/pre&gt;

&lt;p&gt;
Change the &lt;code&gt;id=??&lt;/code&gt; to match the wiki-page-id on the subscribing site.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT29 SECTION &quot;dokupubsub&quot; [826-3187] --&gt;
&lt;h2 class=&quot;sectionedit30&quot;&gt;&lt;a name=&quot;earlier_ideas_and_brainstorm&quot; id=&quot;earlier_ideas_and_brainstorm&quot;&gt;earlier ideas and brainstorm&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;about&quot; id=&quot;about&quot;&gt;About&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Motivation ranges from adding features such as DokuWiki mirror, backup and decentralized load-balancing solutions to semantic web communication and data-portability.
&lt;/p&gt;

&lt;p&gt;
Kludge solutions (like &lt;a href=&quot;http://rg42.org/wiki/dokursync&quot; class=&quot;wikilink1&quot; title=&quot;wiki:dokursync&quot;&gt;dokursync&lt;/a&gt;) work fine for smaller sites but there&amp;#039;s need for improvement on scalability and offering web-standards.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Outline&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://OAuth.net&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://OAuth.net&quot;  rel=&quot;nofollow&quot;&gt;http://OAuth.net&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://openID.org&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://openID.org&quot;  rel=&quot;nofollow&quot;&gt;http://openID.org&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;acronym title=&quot;Remote Procedure Call&quot;&gt;RPC&lt;/acronym&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; XMPP &amp;amp; Atom &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
I envisage a subscription and a publication plugin for DokuWiki, making use of existing infrastructure (eg. Atom and raw data export). A mechanism to distribute locks may be included in either or will be implemented in an optional standalone plugin.
&lt;/p&gt;

&lt;p&gt;
Current ideas include using a XMPP ↔ &lt;acronym title=&quot;Hyper Text Transfer Protocol&quot;&gt;HTTP&lt;/acronym&gt; gateway and or the &lt;a href=&quot;http://www.dokuwiki.org/devel:xmlrpc&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://www.dokuwiki.org/devel:xmlrpc&quot;  rel=&quot;nofollow&quot;&gt;WikiRPCInterface2&lt;/a&gt;. Then again, using a custom &lt;acronym title=&quot;Remote Procedure Call&quot;&gt;RPC&lt;/acronym&gt; notification to distribute edit-locks would be easier to maintain, setup and may have lower latency, but lacks interoperability.
&lt;/p&gt;

&lt;p&gt;
The intention is to minimize DokuWiki changes, and also keep the DokuWiki plugins rather simple. re-use existing frameworks and protocols.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Ideas&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
The preferred mechanism would be to implement Jabber XMPP  &lt;a href=&quot;http://www.xmpp.org/extensions/xep-0060.html&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://www.xmpp.org/extensions/xep-0060.html&quot;  rel=&quot;nofollow&quot;&gt;Publish-Subscribe&lt;/a&gt; extension in conjunction with a XMPP → &lt;acronym title=&quot;Remote Procedure Call&quot;&gt;RPC&lt;/acronym&gt; gatewaty.
&lt;/p&gt;

&lt;p&gt;
Having DokuWiki publish news is a minor task; email-subscription is already possible. Formatting it in &lt;acronym title=&quot;Extensible Markup Language&quot;&gt;XML&lt;/acronym&gt; or Atom and signing the change is straight-forward; wrapping and sending it to a gateway also easy.
&lt;/p&gt;

&lt;p&gt;
Acting upon subscriptions is a bit trickier. It&amp;#039;s feasible to just generate an automatic edit request via &lt;acronym title=&quot;Hyper Text Transfer Protocol&quot;&gt;HTTP&lt;/acronym&gt;-POST for each incoming XMPP news. This could be built-in or happen at a gateway; with design depending on implementation: Authentication could happen internally (DokuWiki signs data-changeset), as part of the protocol (oAuth) or via transport (HTTPS). the choice depends on the use-case and application: user-administrated vs. admin-maintained or low-traffic-decentraliced-wiki vs. mirror/load-balancing.
&lt;/p&gt;

&lt;p&gt;
options:
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; DokuWiki could use OAuth for setUID-requests - &lt;em&gt;normal&lt;/em&gt; &lt;code&gt;do=save&lt;/code&gt; POST can be used to perform updates. (oAuth-tokens are tunneled with XMPP-message/request to &lt;em&gt;any&lt;/em&gt; gateway - openID can be used as &lt;em&gt;remote&lt;/em&gt; user-account) &lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; whitelist/blacklist approach: local xmpp gateway filters and performs wiki updates (write files or &lt;em&gt;hardcoded-auth&lt;/em&gt; POST)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; custom DokuWiki shared-Auth mechanism. (eg. content-signature)&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
(1) is the most flexible and cool, alas also the most complex choice. (2) is pragmatic and probably fast (good performance and short implementation-time) wheres (3) may offer more advanced SPAM protection, user configuration and mapping and as well be on the way to provide a lock mechanism.
&lt;/p&gt;

&lt;p&gt;
PubSub does not strictly address locking. However Publishing is an atomic transaction in XMPP so a solution would be to publish an “invalidated” version of a page when beginning to edit and re-publish afterwards. It would either require very short draft-timeout times or DokuWiki would need send &lt;acronym title=&quot;Asynchronous JavaScript and XML&quot;&gt;AJAX&lt;/acronym&gt; requests on cancel edit and re-publish.
&lt;/p&gt;

&lt;p&gt;
A different approach for handling subscriptions would be a standalone gateway that interfaces with DokuWiki over &lt;acronym title=&quot;Extensible Markup Language&quot;&gt;XML&lt;/acronym&gt;-&lt;acronym title=&quot;Remote Procedure Call&quot;&gt;RPC&lt;/acronym&gt; instead of being implemented as as DokuWiki plugin..
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;resources&quot; id=&quot;resources&quot;&gt;Resources&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://wokkel.ik.nu/&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://wokkel.ik.nu/&quot;  rel=&quot;nofollow&quot;&gt;http://wokkel.ik.nu/&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://idavoll.ik.nu&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://idavoll.ik.nu&quot;  rel=&quot;nofollow&quot;&gt;http://idavoll.ik.nu&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.dokuwiki.org/devel:xmlrpc&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://www.dokuwiki.org/devel:xmlrpc&quot;  rel=&quot;nofollow&quot;&gt;http://www.dokuwiki.org/devel:xmlrpc&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.jspwiki.org/wiki/WikiRPCInterface2&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://www.jspwiki.org/wiki/WikiRPCInterface2&quot;  rel=&quot;nofollow&quot;&gt;http://www.jspwiki.org/wiki/WikiRPCInterface2&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.mediamatic.net/page/26605/en&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://www.mediamatic.net/page/26605/en&quot;  rel=&quot;nofollow&quot;&gt;http://www.mediamatic.net/page/26605/en&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.mediamatic.net/module/PubSub/&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://www.mediamatic.net/module/PubSub/&quot;  rel=&quot;nofollow&quot;&gt;http://www.mediamatic.net/module/PubSub/&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://svn.automattic.com/wordpress/trunk/wp-app.php&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://svn.automattic.com/wordpress/trunk/wp-app.php&quot;  rel=&quot;nofollow&quot;&gt;http://svn.automattic.com/wordpress/trunk/wp-app.php&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://tools.ietf.org/html/rfc5023&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://tools.ietf.org/html/rfc5023&quot;  rel=&quot;nofollow&quot;&gt;http://tools.ietf.org/html/rfc5023&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.tbray.org/ape/&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://www.tbray.org/ape/&quot;  rel=&quot;nofollow&quot;&gt;http://www.tbray.org/ape/&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
wokkel implements a &lt;acronym title=&quot;Hyper Text Transfer Protocol&quot;&gt;HTTP&lt;/acronym&gt; ↔ XMPP gatway that distributing Atom feeds along with an &lt;em&gt;authoritative resource &lt;acronym title=&quot;Uniform Resource Identifier&quot;&gt;URI&lt;/acronym&gt;&lt;/em&gt;. It&amp;#039;s intended to run on a host reachable by the web-server (localhost, or in DMZ);  the XMPP port is open to public (it&amp;#039;s a jabber server) while the &lt;acronym title=&quot;Hyper Text Transfer Protocol&quot;&gt;HTTP&lt;/acronym&gt; has a whitelist IP filter.
&lt;/p&gt;

&lt;p&gt;
see &lt;a href=&quot;http://idavoll.ik.nu/wiki/HTTP_Interface&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://idavoll.ik.nu/wiki/HTTP_Interface&quot;  rel=&quot;nofollow&quot;&gt;http://idavoll.ik.nu/wiki/HTTP_Interface&lt;/a&gt; and &lt;a href=&quot;http://idavoll.ik.nu/wiki/HTTP_Interface_Subscription&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://idavoll.ik.nu/wiki/HTTP_Interface_Subscription&quot;  rel=&quot;nofollow&quot;&gt;http://idavoll.ik.nu/wiki/HTTP_Interface_Subscription&lt;/a&gt;
After publication the XMPP-node ID should be included in the xhtml header to provide subscription discovery.
&lt;/p&gt;

&lt;p&gt;
as for DokuWiki clustering:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://dokuwiki.org/tips:farm&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://dokuwiki.org/tips:farm&quot;  rel=&quot;nofollow&quot;&gt;http://dokuwiki.org/tips:farm&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://dokuwiki.org/tips:farm2&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://dokuwiki.org/tips:farm2&quot;  rel=&quot;nofollow&quot;&gt;http://dokuwiki.org/tips:farm2&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.content-space.de/dokuwiki/projekte/dokufs&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://www.content-space.de/dokuwiki/projekte/dokufs&quot;  rel=&quot;nofollow&quot;&gt;http://www.content-space.de/dokuwiki/projekte/dokufs&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://chimeric.de/projects/dokuwiki/dokuvimki&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://chimeric.de/projects/dokuwiki/dokuvimki&quot;  rel=&quot;nofollow&quot;&gt;http://chimeric.de/projects/dokuwiki/dokuvimki&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://linuxboard.org.ua/notefinder/doku.php?id=screenshots&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://linuxboard.org.ua/notefinder/doku.php?id=screenshots&quot;  rel=&quot;nofollow&quot;&gt;http://linuxboard.org.ua/notefinder/doku.php?id=screenshots&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT30 SECTION &quot;earlier ideas and brainstorm&quot; [3188-] --&gt;&lt;div class=&quot;footnotes&quot;&gt;
&lt;div class=&quot;fn&quot;&gt;&lt;sup&gt;&lt;a href=&quot;#fnt__1&quot; id=&quot;fn__1&quot; name=&quot;fn__1&quot; class=&quot;fn_bot&quot;&gt;1)&lt;/a&gt;&lt;/sup&gt; 
hardcoded prefix - during development, &lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    <item rdf:about="http://rg42.org/wiki/tutorial">
        <dc:format>text/html</dc:format>
        <dc:date>2012-02-19T14:07:39+00:00</dc:date>
        <dc:creator>rgareus</dc:creator>
        <title>Abc midi tutorial</title>
        <link>http://rg42.org/wiki/tutorial</link>
        <description>
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
This page is based on
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.lesession.co.uk/abc/abc_notation.htm&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://www.lesession.co.uk/abc/abc_notation.htm&quot;  rel=&quot;nofollow&quot;&gt;Abc notation&lt;/a&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://staffweb.cms.gre.ac.uk/~c.walshaw/abc/&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://staffweb.cms.gre.ac.uk/~c.walshaw/abc/&quot;  rel=&quot;nofollow&quot;&gt;Abc midi homepage&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT31 SECTION &quot;Abc midi tutorial&quot; [1-199] --&gt;
&lt;h2 class=&quot;sectionedit32&quot;&gt;&lt;a name=&quot;introduction&quot; id=&quot;introduction&quot;&gt;Introduction&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Abc notation is a simple but powerful &lt;acronym title=&quot;American Standard Code for Information Interchange&quot;&gt;ASCII&lt;/acronym&gt; musical notation format, by Chris Walshaw.
A tune notated in abc can be played directly from the notation, or many software packages exist which can convert abc notation into MIDI, produce sheet music, play the file through the computer speaker, etc.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT32 SECTION &quot;Introduction&quot; [200-521] --&gt;
&lt;h2 class=&quot;sectionedit33&quot;&gt;&lt;a name=&quot;wiki_syntax&quot; id=&quot;wiki_syntax&quot;&gt;Wiki Syntax&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
This wiki allows to render Abc notation to images and midi files.
In order to do so, you need to insert an &lt;code&gt;&amp;lt;abc&amp;gt;&lt;/code&gt; command in the wiki page, followed by a &lt;em&gt;unique&lt;/em&gt; midi file name &lt;strong&gt;X:&lt;/strong&gt;. The code is parsed by Abc midi until the end tag&lt;code&gt;&amp;lt;/abc&amp;gt;&lt;/code&gt;, and (if no errors occured) displayed as a png image linked to the midi file. 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&amp;lt;abc&amp;gt;
X:42
T:Paddy O&amp;#039;Rafferty
C:Trad.
M:6/8
K:D
dff cee|def gfe|dff cee|dfe dBA|dff cee|def gfe|faf gfe|1 dfe dBA:|2 dfe dcB||
~A3 B3|gfe fdB|AFA B2c|dfe dcB|~A3 ~B3|efe efg|faf gfe|1 dfe dcB:|2 dfe dBA||
fAA eAA|def gfe|fAA eAA|dfe dBA|fAA eAA|def gfe|faf gfe|dfe dBA:|
&amp;lt;/abc&amp;gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;X:42&lt;/strong&gt; : this is a unique id for this midi snipplet. if you choose a non unique id, it may be overwritten by other wiki pages&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;T:&lt;/strong&gt; (optional): Title of the Tune&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;C:&lt;/strong&gt; (optional): Composer &lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;M:&lt;/strong&gt; (optional): Metrum (eg. &lt;strong&gt;M:3/4&lt;/strong&gt;)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;K:&lt;/strong&gt; : Key (eg. &lt;strong&gt;K:F&lt;/strong&gt; → F-major / F-Dur : one b)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
  the rest is Abc notation described in the following part of this tutorial. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT33 SECTION &quot;Wiki Syntax&quot; [522-1567] --&gt;
&lt;h2 class=&quot;sectionedit34&quot;&gt;&lt;a name=&quot;abc_syntax&quot; id=&quot;abc_syntax&quot;&gt;Abc Syntax&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Let&amp;#039;s get right into it…
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;notes&quot; id=&quot;notes&quot;&gt;Notes&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Middle C is notated as &lt;strong&gt;C&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
Starting at middle C, the notes in that octave are shown as &lt;strong&gt;CDEFGAB&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
The next octave above is shown in lowercase. Octaves further above are appended with a &lt;strong&gt;&amp;#039;&lt;/strong&gt;.
The middle C can be lowered an octave by appending an &lt;strong&gt;,&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
The middle four octaves are written as  &lt;strong&gt;C,D,E,F,G,A,B,CDEFGABcdefgabc&amp;#039;d&amp;#039;e&amp;#039;f&amp;#039;g&amp;#039;a&amp;#039;b&amp;#039;&lt;/strong&gt;,
but note that the range can be extended further by adding more commas or apostrophes. A picture paints a thousand words:
&lt;/p&gt;
&lt;div class=&quot;abc&quot;&gt;&lt;a href=&quot;http://rg42.org/lib/exe/fetch.php?cache=cache&amp;amp;media=plugin_abc:wiki:44.mid&quot;&gt;&lt;img src=&quot;http://rg42.org/lib/exe/fetch.php?cache=cache&amp;amp;media=plugin_abc:wiki:44.png&quot; width=&quot;513&quot; height=&quot;117&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;abc_src&quot;&gt;&lt;pre class=&quot;file&quot;&gt;X:44
M:4/8
K:C
C,D,E,F,G,A,B,CDEFGABcdefgabc&amp;#039;d&amp;#039;e&amp;#039;f&amp;#039;g&amp;#039;a&amp;#039;b&amp;#039;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;note_length_timing&quot; id=&quot;note_length_timing&quot;&gt;Note length / Timing&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Abc allows you to set the ‘default note length’ for each tune. This is set (as a fraction) in the tune header in the L: field.
&lt;/p&gt;
&lt;div class=&quot;table sectionedit35&quot;&gt;&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0&quot;&gt;Default note length &lt;/th&gt;&lt;th class=&quot;col1&quot;&gt; ‘English’ terminology &lt;/th&gt;&lt;th class=&quot;col2&quot;&gt; ‘American’ terminology &lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;1/2  &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;Minim 	&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Half note&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;1/4  &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Crotchet &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Quarter note&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;1/8  &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt;Quaver 	&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Eighth note&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;1/16 &lt;/td&gt;&lt;td class=&quot;col1 rightalign&quot;&gt;	Semi-quaver&lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; Sixteenth note&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;!-- EDIT35 TABLE [2343-2545] --&gt;
&lt;p&gt;
To modify a note length from the default, simply append an integer multiplier to it: with &lt;strong&gt;L:1/8&lt;/strong&gt; &lt;em&gt;(eight or quaver default)&lt;/em&gt; &lt;strong&gt;cd2e4 | f/2 g/4 f/4&lt;/strong&gt; renders as 
&lt;/p&gt;
&lt;div class=&quot;abc&quot;&gt;&lt;a href=&quot;http://rg42.org/lib/exe/fetch.php?cache=cache&amp;amp;media=plugin_abc:wiki:45.mid&quot;&gt;&lt;img src=&quot;http://rg42.org/lib/exe/fetch.php?cache=cache&amp;amp;media=plugin_abc:wiki:45.png&quot; width=&quot;513&quot; height=&quot;95&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;abc_src&quot;&gt;&lt;pre class=&quot;file&quot;&gt;X:45
L:1/8
K:C
M:
cd2e4 | f/2 g/4 f/4&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;rests&quot; id=&quot;rests&quot;&gt;Rests&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Rests are indicated by the (lower case) letter z. The length of rest is set exactly the same way as the length of note is, eg &lt;strong&gt;z4&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;sharps_flats&quot; id=&quot;sharps_flats&quot;&gt;Sharps, flats&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
To sharpen a note precede it with the circumflex or caret ^ &lt;strong&gt;^c&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
To flatten a note precede it with an underscore _ &lt;strong&gt;_B&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
Double sharps are shown as &lt;strong&gt;&lt;em&gt;^^&lt;/em&gt;&lt;/strong&gt; and double flats as &lt;strong&gt;&lt;em&gt;__&lt;/em&gt;&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
To naturalise (?) a note precede it with an equals sign = eg. &lt;strong&gt;=c&lt;/strong&gt;
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;key&quot; id=&quot;key&quot;&gt;Key&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
The key signature is specified by the K: field eg &lt;strong&gt;K:G&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
Major keys are assumed, but can be specified by maj eg &lt;strong&gt;K:Gmaj&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
Minor keys are shown by m or min, eg &lt;strong&gt;K:Gm&lt;/strong&gt; or &lt;strong&gt;K:Gmin&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
In the key signature field sharps are noted by the hash character # and flats by the letter b, eg
&lt;/p&gt;
&lt;div class=&quot;table sectionedit36&quot;&gt;&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;B flat  &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; K:Bb &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;C sharp &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; K:C# &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;!-- EDIT36 TABLE [3512-3547] --&gt;
&lt;p&gt;
Modal keys (the Lydian, Ionian, Mixolydian, Dorian, Aeolian, Phrygian and Locrian modes) can all be specified by adding the first 3 letters of the mode eg &lt;strong&gt;K: G mix&lt;/strong&gt; or &lt;strong&gt;K:Gmix&lt;/strong&gt;
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;time_signatures&quot; id=&quot;time_signatures&quot;&gt;Time signatures&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
the M: field and the rhythm R: field.
&lt;/p&gt;

&lt;p&gt;
Time signatures, or meters, like default note lengths, are shown as fractions in the M: field, eg: &lt;strong&gt;M:6/8&lt;/strong&gt; or 
&lt;strong&gt;M:4/4&lt;/strong&gt; or &lt;strong&gt;M:3/4&lt;/strong&gt;, and so forth. Common time is shown as C, and cut time as C| (the letter C followed by the pipe symbol).
&lt;/p&gt;

&lt;p&gt;
Abc also includes a rhythm field, R:, which is used for cataloguing and sorting collections of abc tunes: this is entirely free text (although there are obvious ‘standard’ entries eg R:reel, R:jig, R:schottische).
&lt;/p&gt;

&lt;p&gt;
An M: field can be placed in the middle of a tune to denote a change of meter.
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;mid-tune_changes_of_key_time_etc&quot; id=&quot;mid-tune_changes_of_key_time_etc&quot;&gt;Mid-tune changes of key, time etc.&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
The L: note length field, the M: meter field, the K: key signature field and the Q: tempo field can all be inserted in the middle of a tune to indicate a key change. Strictly speaking this should be on a new line eg to play a G major scale ‘up’ and a G minor scale ‘down’ again,
&lt;/p&gt;

&lt;p&gt;
K:G
GABcdefg
K:Gm
gfedcBAG
&lt;/p&gt;

&lt;p&gt;
but most software packages will allow the use of [ ] square brackets eg
&lt;/p&gt;

&lt;p&gt;
K:G
GABcdefg [K:Gm] gfedcBAG.
&lt;/p&gt;

&lt;p&gt;
If you want to change two fields at once, either put them on two new lines like this -
&lt;/p&gt;

&lt;p&gt;
K:G
GABcdefg |
M:6/8
K:Gm
gfe dcB | AGB FED |
&lt;/p&gt;

&lt;p&gt;
or put them both in the square brackets in the middle of the line like so :
&lt;/p&gt;

&lt;p&gt;
K:G
GABcdefg | [M:6/8 K:Gm] gfe dcB | AGB FED |
&lt;/p&gt;
&lt;div class=&quot;abc&quot;&gt;&lt;a href=&quot;http://rg42.org/lib/exe/fetch.php?cache=cache&amp;amp;media=plugin_abc:wiki:46.mid&quot;&gt;&lt;img src=&quot;http://rg42.org/lib/exe/fetch.php?cache=cache&amp;amp;media=plugin_abc:wiki:46.png&quot; width=&quot;620&quot; height=&quot;95&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;abc_src&quot;&gt;&lt;pre class=&quot;file&quot;&gt;X:46
K:G 
GABcdefg | [M:6/8 K:Gm] gfe dcB | AGB FED |&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;barlines_and_spaces&quot; id=&quot;barlines_and_spaces&quot;&gt;Barlines and spaces&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Barlines are denoted by the pipe symbol |. Our G major scale in jig time immediately becomes more readable :
&lt;/p&gt;

&lt;p&gt;
M:6/8
L:1/8
R:Jig
K:G
GABcde|fgfedc|BAG
&lt;/p&gt;
&lt;div class=&quot;abc&quot;&gt;&lt;a href=&quot;http://rg42.org/lib/exe/fetch.php?cache=cache&amp;amp;media=plugin_abc:wiki:48.mid&quot;&gt;&lt;img src=&quot;http://rg42.org/lib/exe/fetch.php?cache=cache&amp;amp;media=plugin_abc:wiki:48.png&quot; width=&quot;513&quot; height=&quot;95&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;abc_src&quot;&gt;&lt;pre class=&quot;file&quot;&gt;X:48
M:6/8
L:1/8
R:Jig
K:G
GABcde|fgfedc|BAG&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
A double bar is shown by ||, and by using the square bracket symbol as |] (thin-thick) and [| (thick-thin). Repeats are dealt with soon.
&lt;/p&gt;

&lt;p&gt;
To make the notation even more readable spaces can be inserted to separate groups of notes :
&lt;/p&gt;

&lt;p&gt;
M:6/8
L:1/8
R:Jig
K:Gm
GAB cde|fgf edc|BAG
&lt;/p&gt;

&lt;p&gt;
Spaces are also used within the melody, and by the various software packages which convert abc into standard notation, to group notes. The spacing of abc notation will tend to mirror the grouping which would be used in standard notation. Spaces may also be inserted at the start and / or end of bars to make the abc more readable. As an example, I find something like
&lt;/p&gt;

&lt;p&gt;
G | GAG GAG | c2G EFG | A2F DEF | GEC C2E |
&lt;/p&gt;

&lt;p&gt;
easier on the eye than
&lt;/p&gt;

&lt;p&gt;
G|GAG GAG|c2G EFG|A2F DEF|GEC C2E| 
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;repeats&quot; id=&quot;repeats&quot;&gt;Repeats&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Repeats bring the colon : into action. The start of a repeated section is shown by &lt;strong&gt;|:&lt;/strong&gt; and the end of a repeated section by &lt;strong&gt;:|&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
Where the end of one repeated section, and the beginning of the next, coincide, &lt;strong&gt;:||:&lt;/strong&gt; is technically correct, but this is usually shown without the pipe symbols eg &lt;strong&gt;::&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
Numbered and alternate repeats are indicated by &lt;strong&gt;[1&lt;/strong&gt; and &lt;strong&gt;[2&lt;/strong&gt; (etc.). Where the start of a section coincides with a barline the &lt;strong&gt;[&lt;/strong&gt; symbol may be omitted, eg &lt;strong&gt;DE FF |[1 GA Bc :|[2 GA BG ||&lt;/strong&gt; can also be written as &lt;strong&gt;DE FF |1 GA Bc :|2 GA BG ||&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
However if a repeat section does not coincide with a barline, always use the [ symbol instead of inserting an extra | .
&lt;/p&gt;

&lt;p&gt;
Note that there can be no blank space between the barline and the number - eg &lt;strong&gt;[1&lt;/strong&gt; and &lt;strong&gt;|1&lt;/strong&gt; are acceptable, whereas &lt;strong&gt;[ 1&lt;/strong&gt; and &lt;strong&gt;| 1&lt;/strong&gt; are not.
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;title_tand_index_x&quot; id=&quot;title_tand_index_x&quot;&gt;title (T:) and index (X:)&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Nearly every tune has a title, and one should always be included for identification purposes in tune lists, even if the exact title is not known. The title is indicated by the T: field eg &lt;strong&gt;T:Ballydesmond polka&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
A tune may have more than one title - in this case just add a second, third, etc. &lt;strong&gt;T:&lt;/strong&gt; field (each on a new line) and enter the alternative title(s) in there.
&lt;/p&gt;

&lt;p&gt;
There is one more field to introduce at this stage : the &lt;strong&gt;X:&lt;/strong&gt; index field.
&lt;/p&gt;

&lt;p&gt;
The &lt;strong&gt;X:&lt;/strong&gt; field is primarily for computers&amp;#039; benefit, as they (computers) have much more trouble than human beings in telling where one tune stops and the next starts. Many software packages therefore rely on the &lt;strong&gt;X:&lt;/strong&gt; field to signify the start of a tune, even if there&amp;#039;s only one tune in a file, and a blank line, followed by an &lt;strong&gt;X:&lt;/strong&gt; field, delimits one tune from the next. It is therefore good practise to include an &lt;strong&gt;X:&lt;/strong&gt; field at the head of your Abc tune(s).
&lt;/p&gt;

&lt;p&gt;
The &lt;strong&gt;X:&lt;/strong&gt; field is put on the first line of the notation of a tune, and takes the form &lt;strong&gt;&lt;em&gt;X:&amp;lt;number&amp;gt;&lt;/em&gt;&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
It is good practise (but not absolutely essential) for the &lt;strong&gt;X:&lt;/strong&gt; field to be incremental, eg the first tune in a file is &lt;strong&gt;X:1&lt;/strong&gt;, the second tune in the file is &lt;strong&gt;X:2&lt;/strong&gt;, etc.
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;tempo_q&quot; id=&quot;tempo_q&quot;&gt;tempo (Q:)&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
The tempo of a tune is shown in the Q: field, giving either the human or software musician a speed indication, eg &lt;strong&gt;Q:120&lt;/strong&gt; indicates the tempo as 120 notes of the default note length per minute.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Q:1/8 = 120&lt;/strong&gt; can also be used, to specify in this example that the tune goes at the rate of 120 1/8 notes per minute, regardless of the default note length.
&lt;/p&gt;

&lt;p&gt;
A T: field can be placed in the middle of a tune to denote a change of tempo - see the Mid-tune changes selection above.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT34 SECTION &quot;Abc Syntax&quot; [1568-8733] --&gt;
&lt;h2 class=&quot;sectionedit37&quot;&gt;&lt;a name=&quot;elements_in_the_tune_body&quot; id=&quot;elements_in_the_tune_body&quot;&gt;Elements in the tune body&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;ornaments&quot; id=&quot;ornaments&quot;&gt;Ornaments&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
The general symbol for an ornament is the tilde ~.
&lt;/p&gt;

&lt;p&gt;
The symbol is placed before the note to be ornamented, eg &lt;strong&gt;~G2&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
Note that the tilde is a general mark to indicated the presence of an ornament, and does not specify a particular ornamentation - it is usually interpreted as a roll or a turn. For the more precise notation of ornamentation such as Great Highland Bagpipe music, and for the notation of particular grace notes, enclose the notes in curly brackets { } eg &lt;strong&gt;&lt;em&gt;{GAGDG}G2&lt;/em&gt;&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
The notes within curly brackets have no fixed time value, so their length cannot be modified by use of the usual symbols : in other words anything like &lt;strong&gt;{G2AG2D}&lt;/strong&gt;, &lt;strong&gt;{GA/G/D/G}&lt;/strong&gt;, or &lt;strong&gt;{GA&amp;gt;GD&amp;gt;G}&lt;/strong&gt; is out of the question. The pitch of the notes is notated in the usual way, eg the octave modifiers, and &amp;#039; are useable.
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;slurs_and_ties&quot; id=&quot;slurs_and_ties&quot;&gt;Slurs and Ties&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
The minus sign - should be used to tie two notes of equal pitch, whilst the round brackets () join two or more notes which are to be slurred, or played legato.
&lt;/p&gt;

&lt;p&gt;
Two notes can be tied together with a minus sign - . This can be applied both within a bar and across bar lines, eg &lt;strong&gt;|DEF-|FGA|&lt;/strong&gt; and &lt;strong&gt;|DEF-FGA|&lt;/strong&gt; are both correct. The tie marking should be placed immediately after a note, but can be followed by a space.
&lt;/p&gt;

&lt;p&gt;
To slur a group of notes or join them together as a phrase , use round brackets ( ) to enclose the grouped notes, eg
&lt;strong&gt;(DEF|GAB)&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
Spaces can be used within the slur to improve the legibility of the file. However the first and last notes, (including any pitch and/or length markings) should be placed hard up against the beginning and ending brackets. So &lt;strong&gt;(^G A B/c/|E4 D4)&lt;/strong&gt; is correct, but &lt;strong&gt;( ^G A B/c/|E4 D4 )&lt;/strong&gt; is well wide of the mark.
&lt;/p&gt;

&lt;p&gt;
It&amp;#039;s also worth mentioning that you can &amp;#039;nest&amp;#039; slurs inside each other, so that a passage of music finishing with a tied note can be shown either as &lt;strong&gt;(D E F (G | G4))&lt;/strong&gt; or &lt;strong&gt;(D E F G-| G4)&lt;/strong&gt; are both understood. 
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;triplets_quadruplets_et_al&quot; id=&quot;triplets_quadruplets_et_al&quot;&gt;Triplets, quadruplets, et al&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
The basic notation for duplets, triplets, quadruplets etc. is straightforward : an opening round bracket, the number, and the notes within the tuplet eg
&lt;/p&gt;
&lt;div class=&quot;table sectionedit38&quot;&gt;&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0 leftalign&quot;&gt;Duplet     &lt;/th&gt;&lt;td class=&quot;col1 rightalign&quot;&gt;	&lt;strong&gt;(2GA&lt;/strong&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;th class=&quot;col0 leftalign&quot;&gt;Triplet    &lt;/th&gt;&lt;td class=&quot;col1 rightalign&quot;&gt; 	&lt;strong&gt;(3GAB&lt;/strong&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;th class=&quot;col0&quot;&gt;Quadruplet &lt;/th&gt;&lt;td class=&quot;col1 rightalign&quot;&gt;	&lt;strong&gt;(4GABA&lt;/strong&gt; &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;!-- EDIT38 TABLE [10907-10985] --&gt;
&lt;p&gt;
and so on, up to &lt;strong&gt;(9GABcdcBAG&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
Note that there are no spaces in the tuplet.
&lt;/p&gt;

&lt;p&gt;
The values of the particular tuplets are (to quote the abc specification)
&lt;/p&gt;
&lt;div class=&quot;table sectionedit39&quot;&gt;&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;(2 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;2 notes in the time of 3&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;(3 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;3 notes in the time of 2&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;(4 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;4 notes in the time of 3&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;(5 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;5 notes in the time of n&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;(6 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;6 notes in the time of 2&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;(7 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;7 notes in the time of n&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;(8 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;8 notes in the time of 3&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row7&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;(9 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;9 notes in the time of n&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;!-- EDIT39 TABLE [11141-11396] --&gt;
&lt;p&gt;
n is 3 in compound time signatures (3/4, 3/8, 9/8 etc), and 2 in simple time signatures (C, 4/4, 2/4 etc.)
&lt;/p&gt;

&lt;/div&gt;

&lt;h4&gt;&lt;a name=&quot;details&quot; id=&quot;details&quot;&gt;Details&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
For more complicated notation of irregular rhythmic episodes, abc allows for the use of the form &lt;strong&gt;(p:q:r&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;p = the number of notes to be put into time q
q = the time that p notes will be played in
r = the number of notes to continue to do this action for.&lt;/pre&gt;

&lt;p&gt;
If q is not specified, it defaults to 3 in compound time signatures and 2 in simple time signatures. If r is not     specified, it is taken to be the same as p.
&lt;/p&gt;

&lt;p&gt;
This comes into play when notating notes of different lengths within a tuplet eg &lt;strong&gt;(3:2:2G4c2&lt;/strong&gt; or &lt;strong&gt;(3:2:4G2A2Bc&lt;/strong&gt; and explains exactly what is going on in situations such as &lt;strong&gt;(3D2E2F2&lt;/strong&gt; - which is the same as putting &lt;strong&gt;(3:2:3D2E2F2 &lt;/strong&gt;
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;chords_and_unisons&quot; id=&quot;chords_and_unisons&quot;&gt;Chords and Unisons&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Chords for guitars etc. can be found here.
&lt;/p&gt;

&lt;p&gt;
Chords within a melody, eg what classical Western notation would show as multiple note heads on a single stem, are shown in abc by enclosing the notes in square brackets [ ]. There should be no spaces within the chord, length and pitch modifiers can be included as required, and it is a convention to state the notes of the chord in ascending order, eg &lt;strong&gt;[Acea]&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
Chords can be arranged to form beamed groups using spaces in the same way that individual notes are, eg &lt;strong&gt;[&lt;acronym title=&quot;Gigabyte&quot;&gt;GB&lt;/acronym&gt;][Ac] [B2d2] | [Bd][Ac] [G2B2] | [A4c4e4a4]&lt;/strong&gt;
&lt;/p&gt;
&lt;div class=&quot;abc&quot;&gt;&lt;a href=&quot;http://rg42.org/lib/exe/fetch.php?cache=cache&amp;amp;media=plugin_abc:wiki:49.mid&quot;&gt;&lt;img src=&quot;http://rg42.org/lib/exe/fetch.php?cache=cache&amp;amp;media=plugin_abc:wiki:49.png&quot; width=&quot;513&quot; height=&quot;95&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;abc_src&quot;&gt;&lt;pre class=&quot;file&quot;&gt;X:49
M:4/4
L:1/4
K:C
[GB][Ac] [B2d2] | [Bd][Ac] [G2B2] | [A4c4e4a4]&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
The syntax for chords can be used to notate more than one part in a single line of music - and in that case, or in cases where two strings play the same note, it will occasionally be necessary to notate a unison (eg both parts playing a note of the same pitch and length). Software which generates classical Western notation from abc will show unisons eg &lt;strong&gt;[AA]&lt;/strong&gt; as a note with both an upwards and a downwards stem.
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;guitar_chords&quot; id=&quot;guitar_chords&quot;&gt;Guitar chords&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Chords for accompanying instruments can be shown in abc using double quotation marks ” ” eg &lt;strong&gt;“Dm7”&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
The chord should appear before the first note of the section of melody which the chord applies to, eg &lt;strong&gt;“G”&lt;acronym title=&quot;Gigabyte&quot;&gt;GB&lt;/acronym&gt; d2 | “D”DF A2&lt;/strong&gt;
&lt;/p&gt;
&lt;div class=&quot;abc&quot;&gt;&lt;a href=&quot;http://rg42.org/lib/exe/fetch.php?cache=cache&amp;amp;media=plugin_abc:wiki:51.mid&quot;&gt;&lt;img src=&quot;http://rg42.org/lib/exe/fetch.php?cache=cache&amp;amp;media=plugin_abc:wiki:51.png&quot; width=&quot;513&quot; height=&quot;96&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;abc_src&quot;&gt;&lt;pre class=&quot;file&quot;&gt;X:51
M:4/4
L:1/4
K:G
&amp;quot;G&amp;quot;GB d2 | &amp;quot;D&amp;quot;DF A2&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Chords take the format &lt;strong&gt;note 	accidental 	type / bass&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;note :	A to G
accidental :	# or b
type :	m, min, maj, sus, dim, +, 7, 9, 11,#5, etc. etc
/ bass :	Bass note
accidental, type, and / bass are all optional.&lt;/pre&gt;

&lt;p&gt;
You may occasionally come across an abc file which uses the older abc style of denoting guitar chords, by surrounding them with addition signs +Gm+ : more recent versions of the abc specification specify the use of the “Gm” style, so please do your chords like that.
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;fiddle_bowing_marks&quot; id=&quot;fiddle_bowing_marks&quot;&gt;Fiddle bowing marks&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Up-bow and down-bow marks for fiddlers can be indicated by the letters u (up-bow) and v (down-bow), eg &lt;strong&gt;v_Au=Bv^c&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;line_ends_and_line_breaks&quot; id=&quot;line_ends_and_line_breaks&quot;&gt;Line ends and line breaks&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
In software which generates standard Western notation from abc, the general rule is that one line of abc will generate one line of tadpoles-hanging-on-five-barred-gates.
&lt;/p&gt;

&lt;p&gt;
Most packages will however &amp;#039;wrap&amp;#039; the staff of music onto the next line if your printed page width isn&amp;#039;t big enough.
&lt;/p&gt;

&lt;p&gt;
To try to insist that two lines of abc notation make one line of tadpoles, put a back slash &lt;strong&gt;\ &lt;/strong&gt;
at the end of the first line. Again, this may be over-ridden by the software if you run out of space.
&lt;/p&gt;

&lt;p&gt;
The other common symbol often seen used in marking line breaks is an exclamation mark &lt;strong&gt;!&lt;/strong&gt; placed at the end of a line of abc, to force the software generating the standard Western notation to start a new line. This is specific to one particular piece of abc software and is not actually a formal part of the abc notation specification, but (as so many abc files are generated in this particular software package, ABC2Win) it is worth mentioning here. 
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;accents&quot; id=&quot;accents&quot;&gt;Accents&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
If you want to indicate that a particular note should be played staccato, place a dot . before the note, eg &lt;strong&gt;.A&lt;/strong&gt; or even &lt;strong&gt;.G.A._B.c .d2.e.d.^c&lt;/strong&gt;
&lt;/p&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;song_words&quot; id=&quot;song_words&quot;&gt;Song words&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
The W: field (upper case W) in the header can be used as many times as needed to record the entire words of the song as a block of text eg
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;W:How much is that doggie in the window
W:The one with the waggly tail?
W:How much is that doggie in the window
W:I do hope that doggie&amp;#039;s for sale
(etc. etc.)&lt;/pre&gt;

&lt;p&gt;
This form of notating the song words will produce the words as a single text block below the tune, if the abc file is fed into a software package which generates standard Western notation.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT37 SECTION &quot;Elements in the tune body&quot; [8734-15914] --&gt;
&lt;h2 class=&quot;sectionedit40&quot;&gt;&lt;a name=&quot;information_fields_in_the_tune_header&quot; id=&quot;information_fields_in_the_tune_header&quot;&gt;Information fields in the tune header&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
As seen in the first part of this tutorial, the tune header contains a number of fields giving information about the tune such as title, rhythm, key signature, etc. The introductory tutorial mentioned the fields which must be shown in the tune header, and also described some of the optional information fields which are most commonly used.
&lt;/p&gt;

&lt;p&gt;
The abc specification allows for many more optional descriptive or information fields to be used in the tune header - the full list is :
&lt;/p&gt;
&lt;div class=&quot;table sectionedit41&quot;&gt;&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;A: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;(Geographical) Area : eg A:Brittany or A:Sussex&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;B: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Book, eg B:Encyclopeadia Blowzabellica or B:O&amp;#039;Neill&amp;#039;s&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;C: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Composer eg C:Andy Cutting or C:Trad&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;D: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Discography eg D:New Victory Band, One More Dance And Then&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;F: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;File Name eg &lt;a href=&quot;http://www.lesession.co.uk/woodenflute.abc&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://www.lesession.co.uk/woodenflute.abc&quot;  rel=&quot;nofollow&quot;&gt;http://www.lesession.co.uk/woodenflute.abc&lt;/a&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;G: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Group eg G:Flute - this is used for the purpose of indexing tunes in software, NOT for naming the group / band you acquired the tune from (which should be recorded in the S: source field).&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;H: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;History - Multiple H: fields may be used as needed to record text about the history of the tune. (Many people (including me) seem to tend to forget about the H: field and instead always put information like that in the N: notes field instead.)&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row7&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;I: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Information - used by certain software packages, NOT for historical information or notes (which should be recorded in the H: or N: fields).&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row8&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;K: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Key -see part one of this tutorial for further details&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row9&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;L: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Default note length -see part one of this tutorial for further details&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row10&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;M: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Meter :see part one of this tutorial for further details&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row11&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;N: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Notes : Multiple N: fields can be used as needed to record detailed text notes about, well, just about anything you want to say about the tune that won&amp;#039;t go in any of the other fields really …&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row12&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;O: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;(Geographical) Origin : eg O:Irish or O:Swedish&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row13&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;P: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Parts -see below for further details&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row14&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;Q: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Tempo -see part one of this tutorial for further details&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row15&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;R: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Rhythm -see part one of this tutorial for further details&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row16&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;S: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Source - where you got the tune from eg S:Olio or S:Dave Praties&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row17&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;T: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Title -see part one of this tutorial for further details&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row18&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;W: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Words -see below for further details&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row19&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;X: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Tune reference number -see part one of this tutorial for further details&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row20&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt;Z: 	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Transcription note - the identity of the transcriber or the source of the transcription, eg Z:Steve Mansfield&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;!-- EDIT41 TABLE [16445-18338] --&gt;
&lt;p&gt;
To repeat a small part of the first part of this tutorial:
&lt;/p&gt;

&lt;p&gt;
The X: index, T: title, M: meter, L: default note length, and K: key field are obligatory : the others are optional.
&lt;/p&gt;

&lt;p&gt;
The fields usually occur in the following order:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;X:
T:
M:
L:
[optional fields]
K:&lt;/pre&gt;

&lt;p&gt;
And immediately following the K: field on the next line is the body of the tune, eg the representation of the notes of the melody.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT40 SECTION &quot;Information fields in the tune header&quot; [15915-18744] --&gt;
&lt;h2 class=&quot;sectionedit42&quot;&gt;&lt;a name=&quot;putting_it_all_together&quot; id=&quot;putting_it_all_together&quot;&gt;Putting it all together&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;example_source&quot; id=&quot;example_source&quot;&gt;Example Source&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;X:1
T:Plead for Slough
T:Speed The Plough (arr.)
M:4/4
L:1/8
H:Illustrative file for abc tutorial
F:http://www.lesession.co.uk/abc/abc_notation_part2.htm
N:The tune that should be the English national anthem,
N:renamed in this version in honour of the John Betjeman poem
C:Trad.arr. Steve Mansfield June 2000
R:reel
P:(2A2B)ad infinitum
Z:Steve Mansfield 6/6/2000
K:G
P:A
&amp;quot;G&amp;quot; (GAB)c dedB | &amp;quot;G&amp;quot; .d.e.d.B dedB |
&amp;quot;Am&amp;quot; c2ec &amp;quot;D7&amp;quot; B2dB | &amp;quot;D&amp;quot;A2&amp;quot;Dm&amp;quot;A2 &amp;quot;Am&amp;quot; A2BA |
&amp;quot;G&amp;quot; (GABc d)edB | &amp;quot;G&amp;quot; .d.e.d.B dedB | &amp;quot;C&amp;quot; ~c2ec &amp;quot;G&amp;quot; ~B2dB- |
&amp;quot;D7&amp;quot; BA A2 &amp;quot;G&amp;quot; ~G4 ::
P:B
&amp;quot;C&amp;quot; g2g2 {GABcdef}g4 | &amp;quot;G&amp;quot; g2fe dBGB |
&amp;quot;Am&amp;quot; cAEc &amp;quot;Bm&amp;quot;BGDB | &amp;quot;F#m&amp;quot;A2A2 &amp;quot;D&amp;quot;A4 |
&amp;quot;C&amp;quot;g2g2 &amp;quot;G&amp;quot;g4 | &amp;quot;G&amp;quot;g2fe dBGB |
&amp;quot;C&amp;quot; (5cdedc &amp;quot;Am&amp;quot; ec&amp;quot;Bm&amp;quot;B2&amp;quot;~G&amp;quot;dB |
&amp;quot;A&amp;quot;[A2c2]&amp;quot;Am&amp;quot;[A2a2] &amp;quot;G&amp;quot;[G4B4d4g4] :|&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;&lt;a name=&quot;example&quot; id=&quot;example&quot;&gt;Example&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;div class=&quot;abc&quot;&gt;&lt;a href=&quot;http://rg42.org/lib/exe/fetch.php?cache=cache&amp;amp;media=plugin_abc:wiki:50_plead_for_slough.mid&quot;&gt;&lt;img src=&quot;http://rg42.org/lib/exe/fetch.php?cache=cache&amp;amp;media=plugin_abc:wiki:50_plead_for_slough.png&quot; width=&quot;513&quot; height=&quot;789&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;abc_src&quot;&gt;&lt;pre class=&quot;file&quot;&gt;X:50
T:Plead for Slough
T:Speed The Plough (arr.)
M:4/4
L:1/8
H:Illustrative file for abc tutorial
F:http://www.lesession.co.uk/abc/abc_notation_part2.htm
N:The tune that should be the English national anthem,
N:renamed in this version in honour of the John Betjeman poem
C:Trad.arr. Steve Mansfield June 2000
R:reel
P:(2A2B)ad infinitum
Z:Steve Mansfield 6/6/2000
K:G
P:A
&amp;quot;G&amp;quot; (GAB)c dedB | &amp;quot;G&amp;quot; .d.e.d.B dedB |
&amp;quot;Am&amp;quot; c2ec &amp;quot;D7&amp;quot; B2dB | &amp;quot;D&amp;quot;A2&amp;quot;Dm&amp;quot;A2 &amp;quot;Am&amp;quot; A2BA |
&amp;quot;G&amp;quot; (GABc d)edB | &amp;quot;G&amp;quot; .d.e.d.B dedB | &amp;quot;C&amp;quot; ~c2ec &amp;quot;G&amp;quot; ~B2dB- |
&amp;quot;D7&amp;quot; BA A2 &amp;quot;G&amp;quot; ~G4 ::
P:B
&amp;quot;C&amp;quot; g2g2 {GABcdef}g4 | &amp;quot;G&amp;quot; g2fe dBGB |
&amp;quot;Am&amp;quot; cAEc &amp;quot;Bm&amp;quot;BGDB | &amp;quot;F#m&amp;quot;A2A2 &amp;quot;D&amp;quot;A4 |
&amp;quot;C&amp;quot;g2g2 &amp;quot;G&amp;quot;g4 | &amp;quot;G&amp;quot;g2fe dBGB |
&amp;quot;C&amp;quot; (5cdedc &amp;quot;Am&amp;quot; ec&amp;quot;Bm&amp;quot;B2&amp;quot;~G&amp;quot;dB |
&amp;quot;A&amp;quot;[A2c2]&amp;quot;Am&amp;quot;[A2a2] &amp;quot;G&amp;quot;[G4B4d4g4] :|&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- EDIT42 SECTION &quot;Putting it all together&quot; [18745-] --&gt;</description>
    </item>
    <item rdf:about="http://rg42.org/wiki/tatort-dl">
        <dc:format>text/html</dc:format>
        <dc:date>2012-02-19T13:12:06+00:00</dc:date>
        <dc:creator>rgareus</dc:creator>
        <title>tatort-dl - an ARD-mediathek download utility</title>
        <link>http://rg42.org/wiki/tatort-dl</link>
        <description>
&lt;div class=&quot;level1&quot;&gt;



&lt;p&gt;
&lt;a href=&quot;http://rg42.org/_detail/wiki/tatort-dl.png?id=wiki%3Atatort-dl&quot; class=&quot;media&quot; title=&quot;wiki:tatort-dl.png&quot;&gt;&lt;img src=&quot;http://rg42.org/_media/wiki/tatort-dl.png&quot; class=&quot;mediaright&quot; align=&quot;right&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;code&gt;tatort-dl&lt;/code&gt; is a &lt;a href=&quot;http://en.wikipedia.org/wiki/Shell_script&quot; class=&quot;interwiki iw_wp&quot; target=&quot;_blank&quot; title=&quot;http://en.wikipedia.org/wiki/Shell_script&quot;&gt;shell-script&lt;/a&gt;ed &lt;a href=&quot;http://en.wikipedia.org/wiki/Command-line_interface&quot; class=&quot;interwiki iw_wp&quot; target=&quot;_blank&quot; title=&quot;http://en.wikipedia.org/wiki/Command-line_interface&quot;&gt;CLI&lt;/a&gt; tool for downloading films from &lt;a href=&quot;http://www.ardmediathek.de/&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://www.ardmediathek.de/&quot;  rel=&quot;nofollow&quot;&gt;http://www.ardmediathek.de/&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
It&amp;#039;s named after it&amp;#039;s main purpose: to download &lt;a href=&quot;http://de.wikipedia.org/wiki/Liste_der_Tatort-Folgen&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://de.wikipedia.org/wiki/Liste_der_Tatort-Folgen&quot;  rel=&quot;nofollow&quot;&gt;Tatorts&lt;/a&gt; ;) However - as of Jan 25 2010 - it also works with any other content on &lt;a href=&quot;http://www.ardmediathek.de/&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://www.ardmediathek.de/&quot;  rel=&quot;nofollow&quot;&gt;http://www.ardmediathek.de/&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Please read the license under “help” at ardmediathek.de before using &lt;code&gt;tatort-dl&lt;/code&gt;. Some Films or Clips are only available during certain hours and/or time-periods.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT43 SECTION &quot;tatort-dl - an ARD-mediathek download utility&quot; [1-637] --&gt;
&lt;h2 class=&quot;sectionedit44&quot;&gt;&lt;a name=&quot;installation_and_usage&quot; id=&quot;installation_and_usage&quot;&gt;Installation and Usage&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;em&gt;tatort-dl&lt;/em&gt; will work on all systems supporting &lt;em&gt;bash&lt;/em&gt;, &lt;em&gt;curl&lt;/em&gt; and &lt;em&gt;rtmpdump&lt;/em&gt;. It&amp;#039;s developed for GNU/Linux and may work on OSX and &lt;acronym title=&quot;Berkeley Standard Distribution - more that just a UNIX computer operating system&quot;&gt;BSD&lt;/acronym&gt;.
&lt;/p&gt;

&lt;p&gt;
Download: &lt;a href=&quot;http://rg42.org/gitweb/?p=scripts.git;a=blob_plain;f=tatort-dl.sh;hb=HEAD&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://rg42.org/gitweb/?p=scripts.git;a=blob_plain;f=tatort-dl.sh;hb=HEAD&quot;  rel=&quot;nofollow&quot;&gt;tatort-dl.sh (latest)&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Save it as &lt;code&gt;tatort-dl&lt;/code&gt; in &lt;code&gt;~/bin&lt;/code&gt; or &lt;code&gt;/usr/local/bin/&lt;/code&gt; and mark it as executable &lt;code&gt;chmod +x tatort-dl&lt;/code&gt;. 
&lt;/p&gt;

&lt;p&gt;
You need to have &lt;em&gt;rtmpdump&lt;/em&gt; and &lt;em&gt;curl&lt;/em&gt; software installed (&lt;code&gt;sudo apt-get install rtmpdump curl&lt;/code&gt;).
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Usage:
  tatort-dl &amp;lt;ARDmediathek-URL&amp;gt; [out-file]
The default out-file name is ./format&amp;lt;ard-uid&amp;gt;.f4v
 
Example:
  tatort-dl &amp;quot;http://www.ardmediathek.de/ard/servlet/content/3517136?documentId=3701294&amp;quot;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT44 SECTION &quot;Installation and Usage&quot; [638-1361] --&gt;
&lt;h2 class=&quot;sectionedit45&quot;&gt;&lt;a name=&quot;source_code&quot; id=&quot;source_code&quot;&gt;Source Code&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;div class=&quot;code&quot;&gt;&lt;p class=&quot;codehead HideOnInit&quot;&gt;&lt;a name=&quot;view_tatort-dlsh_source&quot;&gt;view tatort-dl.sh source&lt;/a&gt;&lt;/p&gt;&lt;pre class=&quot;code&quot;&gt;
#!/bin/bash
URL=$(echo -e &quot;$1&quot; | grep &quot;^http&quot;)
OUTFILE=$2

INTERACTIVE=yes
RTMPDUMP=rtmpdump
RTMPDUMPOPTS=&quot;&quot;
#RTMPDUMPOPTS+=&quot; --live&quot;
#RTMPDUMPOPTS+=&quot; --resume&quot;
#RTMPDUMPOPTS+=&quot; --quiet&quot;

if test -z &quot;$URL&quot; ; then
  echo -e &quot;Error: missing or invalid parameters\n\nUsage:\n $0 &amp;#60;ARDmediathek-URL&amp;#62; [out-file]\nThe deafult out-file name is ./format&amp;#60;ard-uid&amp;#62;.f4v\n\nExample:\n $0 \&quot;http://www.ardmediathek.de/ard/servlet/content/3517136?documentId=3701294\&quot;\n&quot; &amp;#62;&amp;#38;2;
  exit 1
fi

echo -en &quot;curl \&quot;$URL\&quot; ..&quot;
RTMPURLS=$(curl -s &quot;$URL&quot; | grep -i rtmp)


if test -z &quot;$RTMPURLS&quot; ; then
  echo  -e &quot;\nError: no 'rtmp://' URLs were found on the given Page.\n&quot;
  exit 1;
fi

COUNT=$(echo -e &quot;$RTMPURLS&quot; | wc -l)
  echo -e &quot; ..found $COUNT RTMP URL(s).&quot;

urldecode(){
  echo -e &quot;$(sed 'y/+/ /; s/%/\\x/g')&quot;
}

FLASH=$(echo &quot;$RTMPURLS&quot; | grep flashvars | tail -n1)
if test -n &quot;$FLASH&quot;; then

  RTMPURL=$(echo -ne &quot;$FLASH&quot; \
            | sed 's/^.*streamer=\([^&amp;#38;]*\)&amp;#38;.*$/\1/g' \
            | urldecode)
  PLAYPATH=$(echo -ne &quot;$FLASH&quot; \
             | sed 's/^.*file=\([^&amp;#38;]*\)&amp;#38;.*$/\1/g' \
             | urldecode)
  #echo &quot;RTMP: $RTMPURL&quot;
  #echo &quot;FILE: $PLAYPATH&quot;

else

  # try high-qualty first
  PARAM=$(echo &quot;$RTMPURLS&quot; | grep Web-L)
  # fall-back to medium-qualty
  if test -z &quot;$PARAM&quot;; then
    PARAM=$(echo &quot;$RTMPURLS&quot; | grep Web-M)
  fi
  # 2nd fall-back: use any rtmp URL
  if test -z &quot;$PARAM&quot;; then
    PARAM=$(echo &quot;$RTMPURLS&quot; | tail -n 1 )
  fi

  RTMPURL=$(echo -ne &quot;$PARAM&quot; | sed 's/^.*&quot;\(rtmp[t]*:[^&quot;]*\)&quot;,.*$/\1/g')
  PLAYPATH=$(echo -ne &quot;$PARAM&quot; | sed 's/^.*&quot;\(mp4:[^&quot;]*\)&quot;).*$/\1/g')
fi

test -z &quot;$RTMPURL&quot; &amp;#38;&amp;#38; RTMPURL=&quot;rtmp://vod.daserste.de/ardfs/&quot;

if test -z &quot;$OUTFILE&quot;; then
  OUTFILE=$(echo -ne &quot;$PLAYPATH&quot; | sed 's/^mp4:.*\/\([^\/?]*\)\?.*$/\1/g')
  OUTFILE=$(echo -ne &quot;$OUTFILE&quot; \
            | sed 's/^.*\///g' \
            | sed 's/\?.*$//g' \
            | sed 's/mp4://g' \
            | sed 's/\.f4v$//' \
            | sed 's/\.flv$//'\
           )
  OUTFILE=&quot;${OUTFILE}.flv&quot;
fi

echo
echo &quot;Parameters:&quot;
echo &quot; RTMP-URL : $RTMPURL&quot;
echo &quot; Playpath : $PLAYPATH&quot;
echo &quot; Saving to: $OUTFILE&quot;
echo -n &quot; PWD      : &quot;
pwd
echo

if test -z &quot;$PLAYPATH -o -z &quot;$OUTFILE ; then
 echo &quot;Error: empty playpath or blank output filename.&quot;
 exit 1
fi

if test -e &quot;$OUTFILE&quot;; then
  echo &quot;WARNING: output file &quot;$OUTFILE&quot; exists.&quot;
  if test -n &quot;$INTERACTIVE&quot;; then
    echo -n &quot;[A]bort/[d]elete it/[r]esume? [A/d/r]? &quot;
    read -n 1 VAL
    echo
    if test &quot;$VAL&quot; == &quot;d&quot;; then
      rm -i &quot;$OUTFILE&quot;;
    elif test &quot;$VAL&quot; == &quot;r&quot;; then
      RTMPDUMPOPTS+=&quot; --resume&quot;
    else
      exit;
    fi
  else # NON-INTERACTIVE
    echo &quot;Error: file exists. bailing out.&quot;
    exit
  fi
fi

if test -n &quot;$INTERACTIVE&quot;; then
  echo &quot;rtmpdump command-line:&quot;
  echo &quot; #$RTMPDUMP $RTMPDUMPOPTS -o \&quot;$OUTFILE\&quot; --playpath \&quot;$PLAYPATH\&quot; -r $RTMPURL&quot;
  echo

  echo -n &quot; Start Download ? [Y/n] &quot;
  read -n 1 VAL
  echo
  if test &quot;$VAL&quot; == &quot;n&quot; -o &quot;$VAL&quot; == &quot;N&quot;;  then
    exit;
  fi
fi

$RTMPDUMP $RTMPDUMPOPTS -o &quot;$OUTFILE&quot; --playpath &quot;$PLAYPATH&quot; -r $RTMPURL

echo
ls -l &quot;$OUTFILE&quot;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;tags&quot;&gt;&lt;span&gt;
&lt;a href=&quot;http://rg42.org/wiki/tags/floss&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:floss&quot; rel=&quot;tag&quot;&gt;floss&lt;/a&gt;, &lt;a href=&quot;http://rg42.org/wiki/tags/video&quot; class=&quot;wikilink1&quot; title=&quot;wiki:tags:video&quot; rel=&quot;tag&quot;&gt;video&lt;/a&gt;
&lt;/span&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;!-- EDIT45 SECTION &quot;Source Code&quot; [1362-] --&gt;</description>
    </item>
</rdf:RDF>

