<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    
    <title>Netz - Rettung - Recht (Artikel mit Tag ruby)</title>
    <link>https://netz-rettung-recht.de/</link>
    <description>Bloggen seit Juni 2003</description>
    <dc:language>de</dc:language>
    <generator>Serendipity 2.5.0 - http://www.s9y.org/</generator>
    <pubDate>Sat, 11 May 2019 14:37:13 GMT</pubDate>

    <image>
    <url>https://netz-rettung-recht.de/templates/2k11/img/s9y_banner_small.png</url>
    <title>RSS: Netz - Rettung - Recht - Bloggen seit Juni 2003</title>
    <link>https://netz-rettung-recht.de/</link>
    <width>100</width>
    <height>21</height>
</image>

<item>
    <title>t - Twittern auf der Kommandozeile</title>
    <link>https://netz-rettung-recht.de/archives/2146-t-Twittern-auf-der-Kommandozeile.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2146-t-Twittern-auf-der-Kommandozeile.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2146</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2146</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Clients für Twitter gibt es viele, und logischerweise sind diese in der Regel GUI-Applikationen, also Programme mit einer grafischen Benutzeroberfläche. Gerade dann, wenn man Zugriffe auf Twitter automatisieren will, kann aber ein Kommandozeilenprogramm sehr praktisch sein. &lt;code&gt;t&lt;/code&gt; (&lt;a href=&quot;https://github.com/sferik/t&quot; title=&quot;&quot;&gt;&lt;em&gt;Twitter CLI&lt;/em&gt;&lt;/a&gt;) ist ein solcher Twitter-Client für die Kommandozeile, oder, mit den Worten des Entwicklers &lt;em&gt;A command-line power tool for Twitter&lt;/em&gt;.&lt;/p&gt;

&lt;h3 id=&quot;installation&quot;&gt;Installation&lt;/h3&gt;

&lt;p&gt;Für die Installation benötigt man zunächst einmal &lt;em&gt;Ruby&lt;/em&gt;, denn das ist die Sprache, in der &lt;code&gt;t&lt;/code&gt; geschrieben ist. Unter Debian sollte &lt;code&gt;apt install ruby ruby-dev rubygems&lt;/code&gt; weiterhelfen.&lt;/p&gt;

&lt;p&gt;Die eigentliche Installation erfolgt dann über den Ruby-Paketmanager vermittels &lt;code&gt;gem install t&lt;/code&gt;; notwendige Dependencies (Abhängigkeiten) werden mitinstalliert.&lt;/p&gt;

&lt;p&gt;Bedauerlicherweise wird der Start des Tools (seit 2017!) die Fehlermeldung &lt;code&gt;uninitialized constant Twitter::REST&lt;/code&gt; nach sich ziehen. Das ist als &lt;a href=&quot;https://github.com/sferik/twitter/issues/878&quot; title=&quot;&quot;&gt;Issue 878&lt;/a&gt; seit langem berichtet, aber wohl noch nicht behoben. Dabei ist die Lösung - oder jedenfalls ein Workaround - &lt;a href=&quot;https://github.com/sferik/twitter/issues/878#issuecomment-349718252&quot; title=&quot;&quot;&gt;einfach&lt;/a&gt;: es muss nur in der Datei &lt;code&gt;lib/t/cli.rb&lt;/code&gt; innerhalb des Gem-Verzeichnisses (dessen Pfad u.a. von der Ruby-Version und der Version von &lt;code&gt;t&lt;/code&gt; abhängt) die Einbindung einer Konstante angepasst werden &amp;#8230;&lt;/p&gt;

&lt;h3 id=&quot;konfiguration-anmeldung&quot;&gt;Konfiguration / Anmeldung&lt;/h3&gt;

&lt;p&gt;Die Konfiguration ist hingegen aufwendiger geworden, weil dazu eine Applikation bei Twitter registriert werden muss, und die Hürden dafür hat Twitter erhöht.&lt;/p&gt;

&lt;p&gt;Als erstes wird ein &lt;em&gt;Developer Account&lt;/em&gt; benötigt, der an einen bestehenden Twitter-Account gekoppelt ist.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ein solcher Account wird online &lt;a href=&quot;https://developer.twitter.com/en/apply/&quot; title=&quot;&quot;&gt;beantragt&lt;/a&gt; und setzt eine Anmeldung bei Twitter mit einem Account voraus, für den eine gültige Mailadresse und eine gültige Mobiltelefonnummer hinterlegt sind (!).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Man muss sich entscheiden, ob man den Zugang für sich selbst oder seine Organisation benötigt. Außerdem ist ein Name für den Entwickler-Account zu vergeben und das Land auszuwählen, von dem aus man in erster Linie tätig ist.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 917px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:676 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;917&quot; height=&quot;782&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2019/twitter-dev-01.png&quot;  alt=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Einrichtung eines Developer-Accounts.&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Danach wird abgefragt, in welchen Bereichen man tätig sein will. Zudem muss man sein Projekt anhand von Leitfragen in Freitext beschreiben und sich dazu äußern, ob das Projekt Daten von Twittern für die öffentliche Verwaltung zugänglich macht.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nach Bestätigung der Benutzungsbedingungen wird der Antrag geprüft und in der Regel zeitnah positiv beschieden.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Danach kann man in seinem brandneuen &lt;em&gt;Developer Account&lt;/em&gt; eine Applikation registrieren.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Das geschieht über in der &lt;a href=&quot;https://developer.twitter.com/en/apps&quot; title=&quot;&quot;&gt;App-Übersicht&lt;/a&gt; über den Button &amp;#8220;Create an app&amp;#8221;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Auch hier ist wieder ein Name für die App zu vergeben, der dann auch - in Clients, die das noch tun - als Name des Clients angezeigt wird, mit dem gepostetet wurde. Auch eine Beschreibung der App muss sein, die URL einer Webseite für die App, viele andere Einstellungen - und verpflichtend ist am Ende erneut eine Beschreibung der Verwendungszwecke dieser konkreten App, auf deren Basis Twitter die App dann freigibt.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 1031px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:677 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;1031&quot; height=&quot;892&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2019/twitter-dev-02.png&quot;  alt=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Anmeldung einer App.&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Ist das geschehen, sollte man sich die Details der App noch einmal ansehen; sie benötigt jedenfalls die Rechte &amp;#8220;Read&amp;#8221; und &amp;#8220;Write&amp;#8221;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dieser App muss man nunmehr noch den Zugriff auf das eigene Twitter-Konto erlauben.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Mit &lt;code&gt;t authorize&lt;/code&gt; wird der Anmeldeprozess gestartet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Es wird eine URL angezeigt, die man aufrufen muss, um sich dort dann bei Twitter anzumelden - mit dem Account, auf den &lt;code&gt;t&lt;/code&gt; dann später zugreifen soll.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nunmehr erhält man eine PIN, die auf der Shell (wo &lt;code&gt;t authorize&lt;/code&gt; läuft) eingegeben muss.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fertig!&lt;/p&gt;

&lt;p&gt;Die Anmeldung bei weiteren Accounts kann dann in gleicher Weise erfolgen - man muss sich nur sinnvollerweise zwischendurch bei Twitter aus- und mit dem richtigen Account wieder einloggen.&lt;/p&gt;

&lt;h3 id=&quot;verwendung&quot;&gt;Verwendung&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;t&lt;/code&gt; bietet &lt;a href=&quot;https://github.com/sferik/t#usage-examples&quot; title=&quot;&quot;&gt;vielfältige Möglichkeiten&lt;/a&gt;. Zwei einfache Beispiele:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;t accounts&lt;/code&gt; zeigt an, auf welche Accounts man Zugriff hat, und erlaubt die Auswahl des aktiven Accounts, auf den die folgenden Befehle angewendet werden.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;t update TEXT&lt;/code&gt; twittert &amp;#8220;TEXT&amp;#8221;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So lassen sich bspw. Statusmeldungen automatisch twittern, Termine ankündigen u.v.m.&lt;/p&gt;

&lt;p&gt;Viel Spaß!&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/872222936ee24951b4598fa7516d2e7e&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Wed, 09 Jan 2019 08:50:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2146-guid.html</guid>
    <category>ruby</category>
<category>twitter</category>

</item>
<item>
    <title>Zeitstempel von Dateien unter Versionsverwaltung</title>
    <link>https://netz-rettung-recht.de/archives/2052-Zeitstempel-von-Dateien-unter-Versionsverwaltung.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2052-Zeitstempel-von-Dateien-unter-Versionsverwaltung.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2052</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2052</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Die Verwaltung von Dateien in einem Versionskontrollsystem (VCS) wie &lt;em&gt;git&lt;/em&gt; hat einen Nachteil: der Zeitstempel im Dateisystem gibt nicht mehr den Zeitpunkt der letzten Änderung an dieser Datei wieder, sondern den Zeitpunkt, zu dem sie zuletzt (ggf. mit vielen anderen Dateien) ausgecheckt wurde.&lt;/p&gt;

&lt;p&gt;Für Webseiten bedeutet das, dass man für die Ausgabe des Datums der letzten Änderung nicht mehr auf den Zeitstempel der entsprechenden Datei zurückgreifen kann. Das macht mir nichts aus, denn zum einen verwende ich mittlerweile weitgehend statische Webseiten, bei denen das ohnehin nicht ohne weiteres möglich wäre, und zum anderen bringt dieser Ansatz zwar den Vorteil der Automatisierung mit sich, aber zugleich den - aus meiner Sicht überwiegenden - Nachteil, dass jeder verbesserte Tippfehler, jede unsichtbare Änderung am Seitengerüst als &amp;#8220;Update&amp;#8221; vermerkt wird, obwohl der Inhalt möglicherweise weiterhin völlig veraltet ist. Ich ziehe es daher vor, selbst zu entscheiden, was als &amp;#8220;Änderung&amp;#8221; gilt, und dann das Datum der letzten Änderung selbst zu setzen.&lt;/p&gt;

&lt;p&gt;So weit, so gut - aber wie sieht das mit Downloaddateien aus?&lt;/p&gt;

&lt;h3 id=&quot;zeitstempel-von-downloadangeboten-passend-setzen&quot;&gt;Zeitstempel von Downloadangeboten passend setzen&lt;/h3&gt;

&lt;p&gt;Jedenfalls dann, wenn man Downloadangebote nicht nur verlinkt, sondern den Downloadbereich auch als Dateiübersicht zugänglich macht - wie ich es &lt;a href=&quot;https://th-h.de/archives/&quot; title=&quot;Index of /archives&quot;&gt;auf meinen Webseiten&lt;/a&gt; tue -, ist es für den Nutzer gelinde gesagt verwirrend, wenn der angezeigte Zeitstempel der Dateien nichts mit der letzten Änderung derselben zu tun hat.&lt;/p&gt;

&lt;p&gt;Dafür gibt es natürlich verschiedene einfache Lösungen: Zum einen könnte ich darauf verzichten, einen Downloadbereich in diesem Sinne anzuzeigen, und die Dateien einfach nur verlinken. Tatsächlich sind die meisten Downloadangebote irgendwo auf meinen Seiten verlinkt, und ich speichere für sie auch Metadaten wie bspw. das Datum der letzten Änderung, das bei dem Link angezeigt wird, wie bspw. bei meinen &lt;a href=&quot;https://th-h.de/rescue/#downloads&quot; title=&quot;Rund um das Rettungswesen | th-h.de&quot;&gt;Downloads aus dem Bereich des Rettungswesens&lt;/a&gt;. Ich schätze es aber gerade, dass man in den Downloadangeboten auch &amp;#8220;einfach so&amp;#8221; stöbern kann. - Zum anderen könnte ich darauf verzichten, Downloads unter Versionskontrolle zu stellen, und sie in einem gesonderten Archiv speichern. Gerade für Software-Releases - und auch meine FAQs - wäre das vernünftig; beide werden ohnehin in gesonderten &lt;em&gt;git&lt;/em&gt;-Repositories versioniert, so dass es nicht erforderlich ist, einzelne Releases nochmal im Repository meiner Webseiten zu speichern. Andererseits gibt es aber Downloads, die nicht selbst unter Versionskontrolle stehen, und - mir viel wichtiger - eine getrennte Speicherung der Downloadangebote würde bedeuten, dass ich meine Webseiten nicht &amp;#8220;aus einem Guss&amp;#8221; aus dem &lt;em&gt;git&lt;/em&gt;-Repository erzeugen bzw. wiederherstellen kann; ich müsste dann den Downloadbereich getrennt sichern und einspielen.&lt;/p&gt;

&lt;p&gt;Trotz allem denke ich regelmäßig darüber nach, die Downloadangebote aus der Versionskontrolle herauszunehmen (das ist ja ein wenig auch eine Frage der Größe des Repositories). Bis dahin wollte ich aber eine andere Lösung für das Problem der &amp;#8220;falschen&amp;#8221; Zeitstempel im Directory-Listing - und eigentlich kann das so schwierig ja nicht sein: immerhin &lt;em&gt;habe&lt;/em&gt; ich Metadaten, aus denen sich für jede einzelne Datei im Downloadbereich das Datum der letzten (inhaltlichen) Änderung ergibt. Wie schwer kann es sein, den Zeitstempel - also das Datum der letzten Änderung der Datei im Dateisystem, die sog. &lt;em&gt;modification time&lt;/em&gt; oder kurz &lt;em&gt;mtime&lt;/em&gt; - passend zu setzen?&lt;/p&gt;

&lt;p&gt;Wie sich herausstellt: nicht sehr schwer. Es genügt, ein paar Zeilen als &lt;code&gt;postprocess&lt;/code&gt;-Block in der &lt;em&gt;Nanoc&lt;/em&gt;-Konfiguration hinzuzufügen:&lt;/p&gt;

&lt;p&gt;&lt;div class=&quot;ruby geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;postprocess &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# iterate over all items starting with /archives/ or /net/usenet/faqs/ with kind &amp;amp;#8220;file&amp;amp;#8221; or &amp;amp;#8220;faq&amp;amp;#8221; that have &amp;amp;#8220;updated_at&amp;amp;#8221; set&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; items.&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;select&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;|&lt;/span&gt;item&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;|&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;%&lt;/span&gt;r&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;lt;^&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;archives&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;|&lt;/span&gt;net&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;/&lt;/span&gt;usenet&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;/&lt;/span&gt;faqs&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;/&amp;gt;&lt;/span&gt; =~ item.&lt;span style=&quot;color:#9900CC;&quot;&gt;identifier&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;amp;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;amp; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8216;file&amp;amp;#8217;, &amp;amp;#8216;faq&amp;amp;#8217; ].include?(item[:kind]) &amp;amp;amp;&amp;amp;amp;&amp;amp;#160;!item[:updated_at].nil? }.each do |item|&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# prefer the &amp;amp;#8220;text&amp;amp;#8221; representation, if available (for FAQs)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;unless&lt;/span&gt; item.&lt;span style=&quot;color:#9900CC;&quot;&gt;reps&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:text&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;.&lt;span style=&quot;color:#0000FF; font-weight:bold;&quot;&gt;nil&lt;/span&gt;?&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; path = item.&lt;span style=&quot;color:#9900CC;&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;rep: &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:text&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;else&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; path = item.&lt;span style=&quot;color:#9900CC;&quot;&gt;path&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# use the output files, not the source&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; path = &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@config&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:output_dir&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;+&lt;/span&gt; path&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# change the mtime to &amp;amp;#8220;updated_at&amp;amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# &amp;amp;#8220;updated_at&amp;amp;#8221; is part Date (when set to 2017-10-01), part String (when set to &amp;amp;#8216;2017-10-01&amp;amp;#8217;),&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# so it has to be converted to strings and parsed (instead of using .to_time)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#CC00FF; font-weight:bold;&quot;&gt;FileUtils&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;touch&lt;/span&gt; path, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:mtime&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#CC00FF; font-weight:bold;&quot;&gt;Time&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;parse&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;item&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:updated_at&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;to_s&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Gut, die Zeitstempel sind jetzt immer noch auffällig, weil ich natürlich nur das Datum der letzten Änderung mitführe, nicht die Uhrzeit, und die Dateien daher scheinbar alle um Mitternacht erzeugt werden, aber damit lässt sich leben. Einziger Nachteil: Die unerwartet &amp;#8220;alten&amp;#8221; Dateien im Downloadbereich bringen das Dependency-Tracking von &lt;em&gt;Nanoc&lt;/em&gt; durcheinander und werden daher bei jedem Durchlauf neu erzeugt, weil die Ausgabedateien (mit einem Zeitstempel von vor einigen Monaten oder Jahren) scheinbar älter sind als die Quelldateien (die frisch aus der Versionskontrolle ausgecheckt wurden und daher einen aktuellen Zeitstempel haben), aber damit lässt sich leben.&lt;/p&gt;

&lt;h3 id=&quot;symlinks-erzeugen&quot;&gt;Symlinks erzeugen&lt;/h3&gt;

&lt;p&gt;Außerdem konnte ich so ein weiteres Problem lösen:&lt;/p&gt;

&lt;p&gt;Die Downloads meiner Scripts (und anderer Software) tragen die Versionsnummer im Dateinamen, bspw. &lt;code&gt;checkmail-0-6-1.tar.gz&lt;/code&gt; für die Version 0.6.1 von &lt;code&gt;checkmail&lt;/code&gt;. Ich möchte aber zugleich immer die aktuellste Version unter dem generischen Namen &lt;code&gt;checkmail.tar.gz&lt;/code&gt; anbieten. Nichts einfacher als das: &lt;code&gt;checkmail.tar.gz&lt;/code&gt; muss ein Symlink auf den jeweils neuesten &amp;#8220;versionierten&amp;#8221; Dateinamen sein. Das lässt sich so auch in das &lt;em&gt;gir&lt;/em&gt;-Repository einchecken &amp;#8230; nur bearbeite ich meine Webseiten unter Windows - und da ist das Konzept von &lt;em&gt;symbolic links&lt;/em&gt; eher nicht so bekannt. Dieses Problem hatte ich vorübergehend &amp;#8220;gelöst&amp;#8221;, indem ich einfach zwei identische Dateien gespeichert habe - aber das ist natürlich ein nerviger Hack, der doppelt Platz braucht und einfach nicht elegant ist.&lt;/p&gt;

&lt;p&gt;Nachdem ich jetzt ohnehin die Dateien im Downloadbereich nach ihrer Generierung nachbehandle, lassen sich dabei auch direkt die &lt;em&gt;Symlinks&lt;/em&gt; erzeugen - zwar immer noch aus einer Platzhalterdatei, aber dafür genügt dann eine leere Datei, die nur den passenden Namen trägt. Mein Ansatz dafür ist folgender (eingefügt in den oben bereits gezeigten Block):&lt;/p&gt;

&lt;p&gt;&lt;div class=&quot;ruby geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;postprocess &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8230;]&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# use the output files, not the source&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; path = &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@config&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:output_dir&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;+&lt;/span&gt; path&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# generate symlinks&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;if&lt;/span&gt; item&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:kind&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt; == &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8216;file&amp;amp;#8217; &amp;amp;amp;&amp;amp;amp; item[:current]&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# remove placeholder and symlink generic name (&amp;amp;#8216;myprog.tar.gz&amp;amp;#8217;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# to current file (&amp;amp;#8216;myprog-1-2-17.tar.gz&amp;amp;#8217;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#CC00FF; font-weight:bold;&quot;&gt;FileUtils&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;rm&lt;/span&gt; path&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#CC00FF; font-weight:bold;&quot;&gt;FileUtils&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;ln_s&lt;/span&gt; item&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:current&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;, path&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# mtime shall be changed for the current file&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; path = &lt;span style=&quot;color:#CC00FF; font-weight:bold;&quot;&gt;File&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;dirname&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;path&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8216;/&amp;amp;#8217; + item[:current]&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# change the mtime to &amp;amp;#8220;updated_at&amp;amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8230;]&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Insgesamt fühlt sich das immer noch wie ein Hack an, aber immerhin nicht mehr ganz so krude. &lt;img src=&quot;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/6b60e9cfe777446d9c4d57b097010356&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Mon, 15 Jan 2018 06:15:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2052-guid.html</guid>
    <category>git</category>
<category>nanoc</category>
<category>ruby</category>

</item>
<item>
    <title>nanoc-dejure 1.2 released</title>
    <link>https://netz-rettung-recht.de/archives/2017-nanoc-dejure-1.2-released.html</link>
            <category>Bits'n'Bytes</category>
            <category>Releases</category>
    
    <comments>https://netz-rettung-recht.de/archives/2017-nanoc-dejure-1.2-released.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2017</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2017</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Mein &lt;a href=&quot;https://th-h.de/net/software/nanoc-dejure/&quot; title=&quot;Nanoc-Filter für dejure.org-Rechtsvernetzung | th-h.de&quot;&gt;&lt;em&gt;Nanoc&lt;/em&gt;-Filter&lt;/a&gt; für die juristische Vernetzungsfunktion von &lt;em&gt;dejure.org&lt;/em&gt; steht nun in der Version 1.2 zur Verfügung und ist damit - endlich - auch mit der aktuellen &lt;em&gt;Nanoc&lt;/em&gt;-Version 4.x kompatibel.&lt;/p&gt;

&lt;p&gt;Dazu gehören folgende Neuerungen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Die automatische Verlinkung kann für Überschriften (die HTML-Elemente &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; bis &lt;code&gt;&amp;lt;hx&amp;gt;&lt;/code&gt;) deaktiviert werden&lt;sup id=&quot;fnref:2017_1&quot;&gt;&lt;a href=&quot;#fn:2017_1&quot; class=&quot;footnote-ref&quot; role=&quot;doc-noteref&quot; title=&quot;&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verlinkungen erfolgen mit HTTPS als Protokoll&lt;sup id=&quot;fnref:2017_2&quot;&gt;&lt;a href=&quot;#fn:2017_2&quot; class=&quot;footnote-ref&quot; role=&quot;doc-noteref&quot; title=&quot;&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kompatibilität mit &lt;em&gt;Nanoc 4&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;

&lt;li id=&quot;fn:2017_1&quot; role=&quot;doc-endnote&quot;&gt;
&lt;p&gt;Beides ist implementiert, scheint aber bei Tests noch nicht richtig zu funktionieren. Ich hoffe, dafür noch eine Lösung finden zu können, bin bislang aber ratlos, nachdem im Wesentlichen dieselbe Implementation für das &lt;em&gt;Serendipity&lt;/em&gt;-Plugin, das auch hier im Blog läuft, probemlos funktioniert.&amp;#160;&lt;a href=&quot;#fnref:2017_1&quot; class=&quot;footnote-backref&quot; role=&quot;doc-backlink&quot; title=&quot;&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id=&quot;fn:2017_2&quot; role=&quot;doc-endnote&quot;&gt;
&lt;p&gt;Siehe Fußnote 1.&amp;#160;&lt;a href=&quot;#fnref:2017_2&quot; class=&quot;footnote-backref&quot; role=&quot;doc-backlink&quot; title=&quot;&quot;&gt;&amp;#8617;&amp;#xFE0E;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/div&gt;
 
    </content:encoded>

    <pubDate>Mon, 21 Aug 2017 09:00:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2017-guid.html</guid>
    <category>nanoc</category>
<category>ruby</category>

</item>
<item>
    <title>git-commit-notifier</title>
    <link>https://netz-rettung-recht.de/archives/2015-git-commit-notifier.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2015-git-commit-notifier.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2015</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2015</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Es gibt zwar nicht sehr viele &amp;#8220;eigene&amp;#8221; &lt;em&gt;git&lt;/em&gt;-Repositories, an denen außer mir noch andere mitentwickeln, aber einige doch schon, zumindest potentiell; und ungeachtet dessen bereitet es mir auch als bloße Spielerei Freude, wenn ich zumindest die Möglichkeit anbieten kann, per Mail über neue Commits zu informieren.&lt;/p&gt;

&lt;p&gt;Bisher habe ich das mit dem &amp;#8220;eingebauten&amp;#8221; - quasi im Lieferumfang befindlichen - Script &lt;code&gt;post-receive-email&lt;/code&gt; gelöst, das allerdings optisch altbacken daherkommt und v.a. kein Diff mitliefert. Oft habe ich nach Alternativen geschaut und bin dabei immer wieder über &lt;a href=&quot;http://git-commit-notifier.github.io/&quot; title=&quot;Git Commit Notifier by git-commit-notifier&quot;&gt;&lt;code&gt;git-commit-notifier&lt;/code&gt;&lt;/a&gt; gestolpert, das aber irgendwie[tm] bei mir nicht recht laufen wollte.
Der - schon mehrmals erwähnte - &lt;a href=&quot;https://netz-rettung-recht.de/archives/2014-Webseiten-Umzug.html&quot; title=&quot;&quot;&gt;Serverumzug&lt;/a&gt;, den auch meine öffentlichen &lt;em&gt;git&lt;/em&gt;-Repositories mitgemacht haben, bot nun die Gelegenheit für einen neuen Anlauf - und was soll ich sagen? Es funktioniert!&lt;/p&gt;

&lt;p&gt;Wenn &lt;em&gt;Ruby&lt;/em&gt; vorhanden ist (&lt;code&gt;apt install ruby rubygems&lt;/code&gt;), genügt ein &lt;code&gt;gem install git-commit-notifier&lt;/code&gt;, und dann bedarf es nur noch eines Hooks (&lt;code&gt;post-receive&lt;/code&gt; im &lt;code&gt;hooks&lt;/code&gt;-Verzeichnis, ausführbar!) mit dem folgenden Inhalt:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/sh
git-commit-notifier /path/to/git-notifier-config.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#8230; und einer Konfiguration in &lt;code&gt;/path/to/git-notifier-config.yaml&lt;/code&gt; nach dem vorhandenen &lt;a href=&quot;https://raw.githubusercontent.com/git-commit-notifier/git-commit-notifier/master/config/git-notifier-config.example.yml&quot; title=&quot;&quot;&gt;Muster&lt;/a&gt;, und schon gibt es schön bunte Benachrichtigungen, deren Adressaten und Inhalt sehr weitgehend konfigurierbar sind.&lt;/p&gt;

&lt;div class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 1691px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:466 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;1691&quot; height=&quot;748&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2017/git-commit-notifier-example.png&quot;  alt=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Screenshot einer durch &lt;i&gt;git commit notifier&lt;/i&gt; generierten Benachrichtigung.&lt;/div&gt;&lt;/div&gt;
 
    </content:encoded>

    <pubDate>Fri, 18 Aug 2017 06:05:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2015-guid.html</guid>
    <category>git</category>
<category>ruby</category>

</item>
<item>
    <title>Externe Datenquellen für nanoc</title>
    <link>https://netz-rettung-recht.de/archives/2005-Externe-Datenquellen-fuer-nanoc.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2005-Externe-Datenquellen-fuer-nanoc.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2005</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2005</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Bereits vor gut zwei Jahren hatte ich &lt;a href=&quot;https://netz-rettung-recht.de/archives/1850-nanoc-und-MySQL.html&quot; title=&quot;&quot;&gt;berichtet&lt;/a&gt;, wie man &lt;em&gt;nanoc&lt;/em&gt; mit einer (MySQL-)Datenbank als Datenquelle betreiben kann, und auf die entsprechende &lt;a href=&quot;https://nanoc.ws/doc/guides/using-external-sources/&quot; title=&quot;&quot;&gt;Dokumentation&lt;/a&gt; verwiesen. Schon damals hatte ich angemerkt, dass sich in dem dort gezeigten Weg möglicherweise ein Zwischenschritt einsparen lässt. Dies habe ich dann mittlerweile auch erfolgreich getestet.&lt;/p&gt;

&lt;h3 id=&quot;das-beispiel-aus-der-nanoc-dokumentation&quot;&gt;Das Beispiel aus der &lt;em&gt;nanoc&lt;/em&gt;-Dokumentation&lt;/h3&gt;

&lt;p&gt;Das in der &lt;em&gt;nanoc&lt;/em&gt;-Dokumentation gezeigte Beispiel generiert aus jedem Datensatz in der Datenbank ein &lt;em&gt;Item&lt;/em&gt; (also im Prinzip ein Dokument), das keinen Inhalt hat, aber die einzelnen Datenbankfelder als Attribute enthält, und erzeugt diese &amp;#8220;leeren&amp;#8221; Seiten unter &lt;code&gt;/external/hr/employees/&lt;/code&gt;. Das ergibt sich aus dem Zusammenwirken des Prefixes &lt;code&gt;items_root: /external/hr&lt;/code&gt; in der &lt;code&gt;nanoc.yaml&lt;/code&gt; einerseits und der Funktion zum Erzeugen von &lt;em&gt;Items&lt;/em&gt; in der Definition der Datenquelle andererseits:&lt;/p&gt;

&lt;p&gt;&lt;div class=&quot;ruby geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; items&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@db&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:employees&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;map&lt;/span&gt; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;|&lt;/span&gt;employee&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;|&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; new_item&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8221;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; employee,&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8220;/employees/#{employee[:id]}&amp;amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Für jeden Datensatz wird ein &lt;em&gt;Item&lt;/em&gt; &lt;code&gt;/employees/ID/&lt;/code&gt; (also für den Datensatz mit dem Feld &lt;code&gt;id: 1&lt;/code&gt; ein &lt;em&gt;Item&lt;/em&gt; &lt;code&gt;/employees/1/&lt;/code&gt;) erzeugt, dem der Pfad &lt;code&gt;/external/hr&lt;/code&gt; vorangestellt wird (also im Beispiel &lt;code&gt;/external/hr/employees/1/&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Alle diese Seiten dort sind leer, weshalb ihre Erzeugung im Beispiel auch unterdrückt wird. Von ihnen werden nur die Attribute (&amp;#8220;Metadaten&amp;#8221;) benötigt, um ein Verzeichnis mit allen Mitarbeitern zu erstellen.&lt;/p&gt;

&lt;h3 id=&quot;meine-anwendung-f-r-d-e-n-net-&quot;&gt;Meine Anwendung für &lt;em&gt;d-e-n.net&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;Diese Lösung hatte ich für die &amp;#8220;&lt;a href=&quot;http://d-e-n.net/user/&quot; title=&quot;302 Found&quot;&gt;Schreiberliste von &lt;em&gt;de.etc.notfallrettung&lt;/em&gt;&lt;/a&gt;&amp;#8221; übernommen.&lt;/p&gt;

&lt;p&gt;Da ich dort aber nicht nur eine Liste der Nutzer, sondern für jeden auch eine Profilseite benötige, war ich zweischrittig vorgegangen: in einem ersten Schritt wurden - wie im Beispiel - die Daten eingelesen und leere Seiten (unter &lt;code&gt;/_external/db/users/ID&lt;/code&gt;) erzeugt und in einem zweiten Schritt aus den Attributen dieser leeren Seiten entsprechende Profilseiten erstellt, indem im &lt;code&gt;preprocess&lt;/code&gt;-Block der &lt;code&gt;Rules&lt;/code&gt; eine entsprechende Funktion aufgerufen wurde.&lt;/p&gt;

&lt;p&gt;Schon damals fand ich das recht ineffizient: einmal &amp;#8220;leere&amp;#8221; Seiten nur mit Attributen erstellen, deren Ausgabe unterdrücken und dann für jedes dieser &amp;#8220;virtuellen&amp;#8221; &lt;em&gt;Items&lt;/em&gt; noch einmal eine Seite erzeugen, die dann ausgegeben wird? Warum nicht den ersten Schritt entfallen lassen und direkt die Profilseiten erstellen?&lt;/p&gt;

&lt;p&gt;Gesagt, (zwei Jahre später) getan: es genügt, &lt;code&gt;new_item()&lt;/code&gt; statt des &amp;#8220;leeren&amp;#8221; Inhalts den passenden Seiteninhalt zu übergeben (und ggf. die notwendigen Zusatzattribute hinzuzufügen):&lt;/p&gt;

&lt;p&gt;&lt;div class=&quot;ruby geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; items&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@db&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:employees&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;map&lt;/span&gt; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;|&lt;/span&gt;employee&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;|&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; new_item&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8220;= render &amp;amp;#8216;profile&amp;amp;#8217;&amp;amp;#8221;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#123;&lt;/span&gt;:updated_at &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;=&amp;gt;&lt;/span&gt; employee&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:changedate&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:title&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;=&amp;gt;&lt;/span&gt; employee&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:name&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;,&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:description&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8220;Profile of #{employee[:name]}&amp;amp;#8221;}.merge(employee),&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8220;/employees/#{employee[:id]}&amp;amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Dann musste nur noch - neben einigen Anpassungsarbeiten im Code - in der &lt;code&gt;nanoc.yaml&lt;/code&gt; entsprechend &lt;code&gt;items_root:&lt;/code&gt; auf &lt;code&gt;/&lt;/code&gt; gesetzt werden, damit die Daten auch unter &lt;code&gt;/user/ID&lt;/code&gt; aufscheinen, und schon war der unnötige Zwischenschritt entfallen.&lt;/p&gt;

&lt;h3 id=&quot;der-konkrete-code&quot;&gt;Der konkrete Code&lt;/h3&gt;

&lt;p&gt;Die Datenquelle wird dabei bei mir wie folgt in der &lt;code&gt;nanoc.yaml&lt;/code&gt; eingebunden:&lt;/p&gt;

&lt;p&gt;&lt;div class=&quot;ruby geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;data_sources:&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;-&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# The type is the identifier of the data source. By default, this will be&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# &amp;lt;code&amp;gt;filesystem_unified&amp;lt;/code&amp;gt;.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; type: filesystem_unified&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8230;]&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;-&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# Add mysql database (lib/data_sources/user_db)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; type: &amp;#160; &amp;#160; &amp;#160; &amp;#160; userdb&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; items_root: &amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Definiert wird die Datenquelle dann in &lt;code&gt;lib/data_sources/user_db.rb&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;div class=&quot;ruby geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# taken from http://nanoc.ws/docs/guides/using-external-sources/&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;require&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8216;sequel&amp;amp;#8217;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;class&lt;/span&gt; UserDataSource &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;lt; ::&lt;span style=&quot;color:#6666ff; font-weight:bold;&quot;&gt;Nanoc::DataSource&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; identifier &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:userdb&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; up&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@db&lt;/span&gt; = Sequel.&lt;span style=&quot;color:#9900CC;&quot;&gt;mysql2&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:host&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;=&amp;gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8217;HOSTNAME&amp;amp;#8217;, :user=&amp;gt;&amp;amp;#8217;USER&amp;amp;#8217;, :password=&amp;gt;&amp;amp;#8217;PASS&amp;amp;#8217;, :database=&amp;gt;&amp;amp;#8217;DATABASE&amp;amp;#8217;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; end&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;def&lt;/span&gt; items&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@db&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:users&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;map&lt;/span&gt; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;|&lt;/span&gt;user&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;|&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; fullname = &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;user&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:vorname&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;,user&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:name&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;join&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8217; &amp;amp;#8217;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# create profile page&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#6666ff; font-weight:bold;&quot;&gt;Nanoc::Item&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8220;= render &amp;amp;#8216;profile&amp;amp;#8217;&amp;amp;#8221;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#123;&lt;/span&gt;:author &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;=&amp;gt;&lt;/span&gt; fullname, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:created_at&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8216;2002-11-14&amp;amp;#8217;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:updated_at&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;=&amp;gt;&lt;/span&gt; user&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:changedate&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:title&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8220;Profil von #{fullname}&amp;amp;#8221;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:short&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8220;#{fullname}&amp;amp;#8221;, :template =&amp;gt; &amp;amp;#8216;page-container&amp;amp;#8217;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:description&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8220;Profil des Autors #{fullname} in der Newsgroup de.etc.notfallrettung&amp;amp;#8221;}.merge(user),&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8220;/user/#{user[:id]}/&amp;amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; end&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Ich arbeite derzeit noch mit dem alten &lt;em&gt;nanoc&lt;/em&gt; 3.x, weshalb dort statt &lt;code&gt;new_item()&lt;/code&gt; noch &lt;code&gt;Nanoc::Item.new()&lt;/code&gt; verwendet wird.&lt;/p&gt;

&lt;p&gt;Mit der dargestellten Funktion in der Definition der Datenquelle wird für jeden Datensatz eine Seite (ein &lt;em&gt;Item&lt;/em&gt;) erzeugt, die (das) als einzigen Inhalt &lt;code&gt;= render &#039;profile&#039;&lt;/code&gt; enthält. Da in den &lt;code&gt;Rules&lt;/code&gt; angegeben ist, dass die Seiten unterhalb von &lt;code&gt;/user/&lt;/code&gt; einen &lt;em&gt;HAML&lt;/em&gt;-Filter durchlaufen, wird mithin der Inhalt der Datei &lt;code&gt;profile&lt;/code&gt; im Verzeichnis &lt;code&gt;/layouts/&lt;/code&gt; eingefügt - das Template für alle Profilseiten. Mit dem &lt;em&gt;ERB&lt;/em&gt;-Filter wäre entsprechend &lt;code&gt;&amp;lt;%= render &#039;profile&#039; %&amp;gt;&lt;/code&gt; einzufügen. Die erzeugte Seite bzw. das erzeugte &lt;em&gt;Item&lt;/em&gt; erhält überdies alle Felder aus dem Datensatz als Attribute übergeben, verbunden mit weiteren, zusätzlichen Attributen wie &lt;code&gt;:author&lt;/code&gt; oder &lt;code&gt;:title&lt;/code&gt;. Am Schluss bekommt die Seite / das &lt;em&gt;Item&lt;/em&gt; einen Identifier unter Nutzung des Datensatzfeldes &lt;code&gt;id&lt;/code&gt;, für &lt;code&gt;id: 1&lt;/code&gt; also dementsprechend &lt;code&gt;/user/1/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Fertig!&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/8381fb6728d94c49ad72dbb9ddb70695&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Mon, 24 Jul 2017 05:30:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2005-guid.html</guid>
    <category>nanoc</category>
<category>ruby</category>

</item>
<item>
    <title>nanoc-dejure 1.0 released</title>
    <link>https://netz-rettung-recht.de/archives/1997-nanoc-dejure-1.0-released.html</link>
            <category>Bits'n'Bytes</category>
            <category>Releases</category>
    
    <comments>https://netz-rettung-recht.de/archives/1997-nanoc-dejure-1.0-released.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1997</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1997</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Drei Wochen nach der &lt;a href=&quot;https://netz-rettung-recht.de/archives/1992-Vernetzungsfunktion-von-dejure.org-als-nanoc-Filter.html&quot; title=&quot;&quot;&gt;ersten Fassung&lt;/a&gt; meines &lt;a href=&quot;http://th-h.de/net/software/nanoc-dejure/&quot; title=&quot;302 Found&quot;&gt;&lt;i&gt;nanoc&lt;/i&gt;-Filters&lt;/a&gt; für die juristische Vernetzungsfunktion von &lt;i&gt;dejure.org&lt;/i&gt; kann ich nun die Version &lt;strong&gt;1.0&lt;/strong&gt; präsentieren.&lt;/p&gt;

&lt;p&gt;Neben einem &lt;em&gt;Changelog&lt;/em&gt; und einer (englischsprachigen) &lt;em&gt;Readme&lt;/em&gt;-Datei gibt es folgende Neuerungen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Das Cache-Verzeichnis wird jetzt auch dann korrekt erzeugt, wenn das übergeordnete &lt;code&gt;tmp&lt;/code&gt;-Verzeichnis noch fehlt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Die Gültigkeitsdauer des Caches beträgt künftig standardmäßig sieben (und nicht nur vier) Tage. Sie ist außerdem konfigurierbar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dokumente ohne irgendwelche hinzuzufügenden Links werden platzsparender gecached.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Der Aufruf der API erfolgt nunmehr über HTTPS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Einzelne Dokumente können durch Hinzufügen des Textes &lt;code&gt;&amp;lt;!-- no-dejure --&amp;gt;&lt;/code&gt; irgendwo auf der Seite von der Bearbeitung durch den Filter ausgenommen werden.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
 
    </content:encoded>

    <pubDate>Fri, 26 May 2017 05:10:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1997-guid.html</guid>
    <category>nanoc</category>
<category>ruby</category>

</item>
<item>
    <title>nanoc commands</title>
    <link>https://netz-rettung-recht.de/archives/1996-nanoc-commands.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1996-nanoc-commands.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1996</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1996</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Vergangene Woche schrieb ich über &lt;a href=&quot;https://netz-rettung-recht.de/archives/1995-Git-Aliases.html&quot; title=&quot;&quot;&gt;Aliase für &lt;em&gt;Git&lt;/em&gt;&lt;/a&gt; - und heute möchte ich etwas ähnliches für &lt;em&gt;nanoc&lt;/em&gt; vorstellen.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;nanoc&lt;/em&gt; ermöglicht es nämlich, eigene Kommandos in Form von Ruby-Scripts zu definieren, die dann in &lt;code&gt;commands/&lt;/code&gt; gespeichert werden und - bspw. als &lt;code&gt;commands/COMMAND.rb&lt;/code&gt; - mit &lt;code&gt;nanoc COMMAND&lt;/code&gt; ausgeführt werden. Die Dokumentation hat unter der Überschrift &amp;#8220;&lt;a href=&quot;https://nanoc.ws/doc/cli/#writing-commands&quot; title=&quot;&quot;&gt;Writing commands&lt;/a&gt;&amp;#8221; ein Beispiel dazu und verweist ansonsten auf die Dokumentation von &lt;a href=&quot;http://www.rubydoc.info/gems/cri&quot; title=&quot;&quot;&gt;&lt;em&gt;Cri&lt;/em&gt;&lt;/a&gt;, dem dafür verwendeten Framework.&lt;/p&gt;

&lt;p&gt;Die Anwendungsmöglichkeiten dafür sind vielfältig:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Der &lt;a href=&quot;https://www.cccs.de/&quot; title=&quot;CCC Stuttgart - Startseite&quot;&gt;CCCS&lt;/a&gt; hat ein &lt;a href=&quot;https://github.com/cccs/cccs-website/blob/master/commands/create-flyer.rb&quot; title=&quot;cccs-website/commands/create-flyer.rb at master · cccs/cccs-website · GitHub&quot;&gt;Script&lt;/a&gt;, mit dem sich aus einem &lt;a href=&quot;https://github.com/cccs/cccs-website/blob/master/content/_data/aushang.svg&quot; title=&quot;cccs-website/content/_data/aushang.svg at master · cccs/cccs-website · GitHub&quot;&gt;Template&lt;/a&gt; Flyer für die Ankündigung von Vorträgen erzeugen lassen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Teilweise gebe ich RSS-Feeds als Bestandteil meiner Webseiten aus. Diese Feeds müssen natürlich regelmäßig ausgelesen werden, gefolgt von einem Rebuild der Webseite. Das entsprechende, per Cronjob aufgerufene Script hat, als &lt;em&gt;nanoc&lt;/em&gt;-Kommando implementiert, den Vorteil, jederzeit auch so aufgerufen werden zu können und im selben Repository zu stecken wie der Rest der Website.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Die meisten meiner Webseiten haben ein Kommando, mit dem sich die Quelldateien komplett durch einen frischen Checkout ersetzen lassen, wenn bspw. einige Dateien gelöscht worden sind (was sonst bei meinem &lt;a href=&quot;https://netz-rettung-recht.de/archives/1994-Workflow-fuer-die-Erstellung-und-Pflege-von-Webseiten.html&quot; title=&quot;&quot;&gt;Workflow&lt;/a&gt; dazu führt, dass die Dateien weiter vorhanden bleiben). Im Prinzip wird dabei das Quellverzeichnis komplett geleert, dann ein frischer &lt;em&gt;Git&lt;/em&gt;-Checkout vorgenommen, &lt;code&gt;nanoc prune&lt;/code&gt; entfernt überzählige compilierte Dateien aus dem Ausgabeverzeichnis, und ggf. werden vor dem Compilieren noch RSS-Feeds ausgelesen oder andere notwendige Operationen vorgenommen, damit alle erforderlichen Daten für den Aufbau der Website zur Verfügung stehen.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Andere Beispiele:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://jakoblaegdsmand.com/en/blog/creating-screenshots-with-nanoc-command/&quot; title=&quot;Creating screenshots with nanoc command | Jakob Lægdsmand - Freelance web architect &amp;amp; developer&quot;&gt;Creating screenshots with nanoc command&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A &lt;a href=&quot;http://blog.arkency.com/2015/03/extract-a-service-object-in-any-framework/#before&quot; title=&quot;&quot;&gt;create-post&lt;/a&gt; command&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verwendet ihr auch &lt;em&gt;nanoc&lt;/em&gt;-Kommandos?&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Mon, 22 May 2017 04:05:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1996-guid.html</guid>
    <category>nanoc</category>
<category>ruby</category>

</item>
<item>
    <title>Vernetzungsfunktion von dejure.org als nanoc-Filter</title>
    <link>https://netz-rettung-recht.de/archives/1992-Vernetzungsfunktion-von-dejure.org-als-nanoc-Filter.html</link>
            <category>Bits'n'Bytes</category>
            <category>Releases</category>
    
    <comments>https://netz-rettung-recht.de/archives/1992-Vernetzungsfunktion-von-dejure.org-als-nanoc-Filter.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1992</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1992</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Das - kostenlose - juristische Informationsportal &lt;a href=&quot;https://dejure.org/&quot; title=&quot;d e j u r e . o r g - Gesetze und Rechtsprechung&quot;&gt;&lt;i&gt;dejure.org&lt;/i&gt;&lt;/a&gt; bietet nach eigenen Angaben 90% der am häufigsten zitierten deutschen (Bundes-)Gesetze, insgesamt rund 300 an der Zahl, und dazu vor allem eine umfassende Literaturdatenbank mit Urteilen, Anmerkungen und Querverweisen an. Ist ein Gesetz nicht verfügbar, wird der Nutzer auf den entsprechenden Eintrag in der umfassenden Sammlung des deutschen Bundesrechts bei &lt;i&gt;buzer.de&lt;/i&gt; - einem weiteren kostenlosen juristischen Informationsdienst - weitergeleitet.&lt;/p&gt;

&lt;p&gt;Außerdem stellt &lt;i&gt;dejure.org&lt;/i&gt; mit seiner &lt;a href=&quot;https://dejure.org/vernetzung.html&quot; title=&quot;dejure.org - Wartung&quot;&gt;juristischen Vernetzungsfunktion&lt;/a&gt; eine Möglichkeit zur &amp;#8220;automatischen Verlinkung von Gesetzes- und Rechtsprechungszitaten über eine einfache Schnittstelle&amp;#8221; zur Verfügung. Jeder Paragraph eines bei &lt;i&gt;dejure.org&lt;/i&gt; (oder &lt;i&gt;buzer.de&lt;/i&gt;) erfassten Gesetzes, jede Urteilsfundstelle wird auf Wunsch mit einem passenden Link auf &lt;i&gt;dejure.org&lt;/i&gt; hinterlegt. Für eine Vielzahl von Webapplikationen (Blogs, CMS, Foren, Wikis), darunter &lt;i&gt;Wordpress&lt;/i&gt;, &lt;i&gt;Serendipity&lt;/i&gt; und &lt;i&gt;Dokuwiki&lt;/i&gt;, sind Plugins verfügbar; außerdem wird eine Beispiel-Implementierung in PHP bereitgestellt, die sich als Vorlage für eigene Plugins verwenden lässt.&lt;/p&gt;

&lt;p&gt;In diesem Blog verwende ich die Vernetzungsfunktion bereits seit vielen Jahren; gerne hätte ich eine solche Funktion auch für meine privaten Webseiten gehabt. Nach deren Relaunch war ich dann motiviert genug, mir diese Möglichkeit zu schaffen. Theoretisch sollte das nicht schwer sein: &lt;i&gt;nanoc&lt;/i&gt;, mein &lt;em&gt;static site generator&lt;/em&gt;, unterstützt das Konzept von Filtern, die (bspw.) aus &lt;i&gt;Markdown&lt;/i&gt; HTML machen. In gleicher Weise lässt sich die Vernetzungsfunktion einbinden. Einziges Problem: die Beispiel-Implementierung ist in PHP gehalten, Varianten in Perl und ASP werden angeboten, aber ich bräuchte Ruby &amp;#8230; und das &amp;#8220;spreche&amp;#8221; ich dazu noch kaum. Dennoch: einen Versuch erschien es mir wert.&lt;/p&gt;

&lt;p&gt;Und zu meiner Überraschung war es dann gar nicht so schwierig, das PHP-Beispiel in Ruby als &lt;i&gt;nanoc&lt;/i&gt;-Filter nachzubauen: erst nur die Grundfunktion, dann - aufgrund der stark ansteigenden Compile-Zeiten - auch den optionalen Cache. Und schon habe ich einen Prototypen in Betrieb, der auf meiner Homepage alle Gesetzes- und Rechtsprechungszitate mit &lt;i&gt;dejure.org&lt;/i&gt; verlinkt!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Interessenten können sich den Filter auf meiner &lt;a href=&quot;http://th-h.de/net/software/nanoc-dejure/&quot; title=&quot;302 Found&quot;&gt;Homepage&lt;/a&gt; herunterladen.&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/721032a30b6f496a8408b518ce82e861&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Wed, 10 May 2017 05:40:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1992-guid.html</guid>
    <category>nanoc</category>
<category>ruby</category>

</item>
<item>
    <title>Installation von nanoc unter Windwows 7</title>
    <link>https://netz-rettung-recht.de/archives/1824-Installation-von-nanoc-unter-Windwows-7.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1824-Installation-von-nanoc-unter-Windwows-7.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1824</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1824</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Über &lt;a href=&quot;http://nanoc.ws/&quot; title=&quot;&quot;&gt;&lt;strong&gt;nanoc&lt;/strong&gt;&lt;/a&gt;, einen Generator für statische Webseiten, hatte ich hier im Blog bereits &lt;a href=&quot;https://netz-rettung-recht.de/plugin/tag/nanoc&quot; title=&quot;&quot;&gt;berichtet&lt;/a&gt;. Bislang nutze ich ihn auf verschiedenen Linux-Maschinen ohne Probleme, wollte ihn aber nunmehr auch auf meinem Laptop unter &lt;em&gt;Windows 7&lt;/em&gt; installieren, um auch ohne Netzanbindung das eine oder andere ausprobieren zu können.&lt;/p&gt;

&lt;h3 id=&quot;installationsanleitung&quot;&gt;Installationsanleitung&lt;/h3&gt;

&lt;p&gt;Ausgehend von einer über Google gefundenen &lt;a href=&quot;http://www.fredshack.com/docs/nanoc.html&quot; title=&quot;301 Moved Permanently&quot;&gt;Anleitung&lt;/a&gt; gestaltet sich die grundsätzliche Installation unter Windows überraschend einfach und problemlos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Zunächst benötigt man &lt;em&gt;Ruby&lt;/em&gt; - dankenswerterweise gibt es dafür einen Windows-&lt;a href=&quot;http://rubyinstaller.org/downloads/&quot; title=&quot;&quot;&gt;Installer&lt;/a&gt; zum Download. Empfohlen wird derzeit &lt;em&gt;Ruby 1.9.3&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bei der Installation sollten die Optionen &lt;code&gt;Add Ruby executables to your PATH&lt;/code&gt; und &lt;code&gt;Associate .rb and .rbw files with this Ruby installation&lt;/code&gt; ausgewählt werden. Ggf. wird ein Reboot erforderlich.&lt;/li&gt;
&lt;li&gt;Testen lässt sich die Installation bspw. durch den Aufruf des interaktiven Interpreters mit &lt;code&gt;irb&lt;/code&gt; (verlassen wird er mit &lt;code&gt;quit&lt;/code&gt;) und durch den Aufruf von &lt;code&gt;gem --version&lt;/code&gt;, um zu testen, ob auch der Paketmanager &lt;em&gt;RubyGems&lt;/em&gt; installiert und lauffähig ist.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;nanoc&lt;/em&gt; selbst wird dann einfach vermittels &lt;code&gt;gem install nanoc&lt;/code&gt; installiert. Das funktionierte bei mir erfreulicherweise ohne jedes Problem; auch der Aufruf war sofort möglich.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Die Installation von &lt;em&gt;Win32::Console&lt;/em&gt; verbessert ggf. die Darstellung und kann ebenso einfach mit &lt;code&gt;gem install win32console&lt;/code&gt; erfolgen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fehlt zum Abschluss noch ein integrierter Webserver, falls man einen solchen nicht bereits zur Verfügung hat: &lt;code&gt;gem install adsf&lt;/code&gt; ermöglicht es, die generierte Webpräsenz mittels &lt;code&gt;nanoc view&lt;/code&gt; unter &lt;code&gt;http::/localhost:3000&lt;/code&gt; anzuschauen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nutzt man weitere Filter und Funktionen wie &lt;em&gt;kramdown&lt;/em&gt; oder ähnliches, sind die entsprechenden Gems nachzuinstallieren. Gebräuchlich mag bspw. &lt;code&gt;gem install kramdown haml rubypants&lt;/code&gt; sein.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So weit, so gut. Endlich mal ein Fall, wo die Installation eher &amp;#8220;unixoider&amp;#8221; Software unter Windows ohne größere Probleme funktioniert, könnte man denken.&lt;/p&gt;

&lt;p&gt;Und dann kam &lt;em&gt;LESS&lt;/em&gt;.&lt;/p&gt;

&lt;h3 id=&quot;-less-is-less-than-helpul&quot;&gt;&lt;em&gt;LESS&lt;/em&gt; is less than helpul&lt;/h3&gt;

&lt;p&gt;Neben den bereits genannten &lt;em&gt;Gems&lt;/em&gt; benötige ich für meine &lt;em&gt;Bootstrap&lt;/em&gt;-basierten Webpräsenzen auch &lt;em&gt;LESS&lt;/em&gt;; sowohl &lt;a href=&quot;https://netz-rettung-recht.de/archives/1817-Frameworks-fuer-HTML,-CSS-und-Javascript.html&quot; title=&quot;&quot;&gt;&lt;em&gt;Bootstrap&lt;/em&gt;&lt;/a&gt; als auch &lt;a href=&quot;https://netz-rettung-recht.de/archives/1818-LESS,-SASS-und-Co..html&quot; title=&quot;&quot;&gt;&lt;em&gt;LESS&lt;/em&gt;&lt;/a&gt; habe ich ja bereits beschrieben.&lt;/p&gt;

&lt;p&gt;Auch &lt;em&gt;LESS&lt;/em&gt; gibt es als &lt;em&gt;Gem&lt;/em&gt;; dessen Installation unter Windows ist aufgrund der enthaltenen Abhängigkeiten allerdings schwierig und zeigte sich - für mich - als unmöglich. Ein beherztes &lt;code&gt;gem install less&lt;/code&gt; zieht nämlich auch die Installation von &lt;code&gt;therubyracer&lt;/code&gt; nach sich, das wiederum &lt;code&gt;libv8&lt;/code&gt;, eine &lt;em&gt;Javascript&lt;/em&gt;-Engine, benötigt. Und die ist sperrig.&lt;/p&gt;

&lt;p&gt;Eine Recherche bei Google zeigt eine nahezu unüberschaubare Zahl von entsprechenden Threads, sei es in einem &lt;a href=&quot;https://www.ruby-forum.com/topic/4398451&quot; title=&quot;&quot;&gt;Ruby-Forum&lt;/a&gt; oder bei &lt;em&gt;StackOverflow&lt;/em&gt; unter Überschriften wie &amp;#8220;&lt;a href=&quot;http://stackoverflow.com/questions/26733956/installing-gem-therubyracer-on-windows-7&quot; title=&quot;Forbidden - Stack Exchange&quot;&gt;Installing Gem therubyracer on windows 7&lt;/a&gt;&amp;#8221;, &amp;#8220;&lt;a href=&quot;http://stackoverflow.com/questions/6356450/therubyracer-gem-on-windows&quot; title=&quot;Forbidden - Stack Exchange&quot;&gt;therubyracer gem on windows&lt;/a&gt;&amp;#8221; oder &amp;#8220;&lt;a href=&quot;http://stackoverflow.com/questions/17850218/installing-less-in-ruby-windows&quot; title=&quot;Forbidden - Stack Exchange&quot;&gt;Installing Less in Ruby - Windows&lt;/a&gt;&amp;#8221;, oder auch &amp;#8220;&lt;a href=&quot;http://stackoverflow.com/questions/8126465/bundle-install-update-libv8-therubyracer-installation-fails-with-native-ex&quot; title=&quot;Forbidden - Stack Exchange&quot;&gt;bundle install / update: libv8 (therubyracer) installation fails (with native extensions)&lt;/a&gt;&amp;#8221; oder &amp;#8220;&lt;a href=&quot;http://stackoverflow.com/questions/19673714/rails-gem-install-error-error-installing-libv8-error-failed-to-build-gem-nati&quot; title=&quot;Forbidden - Stack Exchange&quot;&gt;rails gem install ERROR: Error installing libv8: ERROR: Failed to build gem native extension&lt;/a&gt;&amp;#8221;. Zumeist wurde dann auf ein Git-Repository bei &lt;em&gt;Github&lt;/em&gt; namens &amp;#8220;&lt;a href=&quot;https://github.com/hiranpeiris/therubyracer_for_windows&quot; title=&quot;Page not found · GitHub · GitHub&quot;&gt;therubyracer for windows&lt;/a&gt;&amp;#8221; verwiesen, das mir allerdings auch nicht weitergeholfen hat.&lt;/p&gt;

&lt;p&gt;Nach etlichen Stunden habe ich dann irgendwann frustriert aufgegeben.&lt;/p&gt;

&lt;p&gt;Falls es einem meiner Leser gelungen sein sollte, &lt;em&gt;Ruby&lt;/em&gt;, &lt;em&gt;LESS&lt;/em&gt; und Windows miteinander zu versöhnen, oder falls jemand andere kluge Ideen hat: immer her damit!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nachtrag vom 2015-02-22&lt;/strong&gt;: Das erwähnte Repository &lt;em&gt;&amp;#8220;therubyracer for windows&amp;#8221;&lt;/em&gt; ist nicht mehr verfügbar.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[Dieser Eintrag wurde nachträglich im Februar 2015 veröffentlicht.]&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/19c9107555d5464bb02bb3439d763aa4&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Sun, 25 Jan 2015 17:00:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1824-guid.html</guid>
    <category>followerpower</category>
<category>nanoc</category>
<category>ruby</category>
<category>windows</category>

</item>

</channel>
</rss>
