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

<channel>
	<title>xscDevBlog - LastSharp &#38; Co. &#187; Batch</title>
	<atom:link href="http://dev.xscheme.de/category/codeschnipsel/batch/feed/" rel="self" type="application/rss+xml" />
	<link>http://dev.xscheme.de</link>
	<description>Der xscheme-DevelopmentBlog</description>
	<lastBuildDate>Sun, 23 May 2010 11:40:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Zwischenstand: Universal Version Description (UVD) / Entwickler gesucht</title>
		<link>http://dev.xscheme.de/2009/05/zwischenstand-universal-version-description-uvd-entwickler-gesucht/</link>
		<comments>http://dev.xscheme.de/2009/05/zwischenstand-universal-version-description-uvd-entwickler-gesucht/#comments</comments>
		<pubDate>Wed, 13 May 2009 14:17:12 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Batch]]></category>
		<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Fundstücke]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Lapicon]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Theorie]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=755</guid>
		<description><![CDATA[Ich möchte an dieser Stelle einmal auf den aktuellen Stand des hier begonnenen Projekts verweisen, der sich wie folgt darstellt: Ich habe das UVD-Format weiter ausgearbeitet und angepasst und damit begonnen, eine C#-Bibliothek zu schreiben, die dessen Verarbeitung dient.
Als Beispiel sei die UVD von LastSharp gegeben, die wir im folgenden Codebeispiel mithilfe einer XSL-Transformation (DescriptionPage.xsl) [...]]]></description>
			<content:encoded><![CDATA[<p>Ich möchte an dieser Stelle einmal auf den aktuellen Stand des <a href="http://dev.xscheme.de/2009/05/universal-version-description-uvd/">hier</a> begonnenen Projekts verweisen, der sich wie folgt darstellt: Ich habe das UVD-Format weiter ausgearbeitet und angepasst und damit begonnen, eine C#-Bibliothek zu schreiben, die dessen Verarbeitung dient.</p>
<p>Als Beispiel sei die <a href="http://dev.xscheme.de/uvd/lastsharp.uvd.xml">UVD von LastSharp</a> gegeben, die wir im folgenden Codebeispiel mithilfe einer XSL-Transformation (<a href="http://dev.xscheme.de/uvd/DescriptionPage.xsl">DescriptionPage.xsl</a>) in eine HTML-Datei verwandeln. Das soll illustrieren, wie einfach die Verwendung von UVD sein kann, wenn entsprechende Bibliotheken vorhanden sind:</p>
<pre class="c-sharp:collapse" name="code">UVD lastsharp = UVD.Create("http://dev.xscheme.de/uvd/lastsharp.uvd.xml");
lastsharp.Save("c:/lastsharp.htm", "http://dev.xscheme.de/uvd/DescriptionPage.xsl");</pre>
<p>Nun haben wir eine Datei &#8220;lastsharp.htm&#8221;, die <a href="http://dev.xscheme.de/uvd/lastsharp.htm">hier</a> eingesehen werden kann und Beschreibungen in verschiedenen Sprachen und Längen bietet, Downloadlinks, etc&#8230; Außerdem sind (wie man bei der Ansicht des Quelltextes feststellen kann) auch die META-Tags zu Schlüsselwörtern und Beschreibungen bereits gesetzt, sodass die Seite auch für Suchmaschinen verwendbar ist.</p>
<p><span id="more-755"></span>Das UVD-Objekt (s. Code) bietet noch weitere Möglichkeiten, aber ich möchte nun auf den Update-Mechanismus zu sprechen kommen, den man mithilfe von UVD implementieren kann. Eine UVD kann einen Verweis auf die vorhergehende Version, sowie Informationen zum inkrementellen Update (lösche Datei X, aktualisiere Datei Y, &#8230;) enthalten, sodass man durch Untersuchen der Versionsgeschichte jede Version auf den neuesten Stand bringen kann.</p>
<p>Wir verwenden die folgenden (sinnlosen) Dateien zur Demonstration: <a href="http://dev.xscheme.de/uvd/updatetest1.xml">Version 1.2</a> &gt;&gt; <a href="http://dev.xscheme.de/uvd/updatetest2.xml">Version 1.1</a> &gt;&gt; <a href="http://dev.xscheme.de/uvd/updatetest3.xml">Version 1.0</a>. Mithilfe der UVDs läuft ein Update von Version 1.0 auf 1.2 folgendermaßen ab:</p>
<ol>
<li>Extrahiere aus der UVD zu Version 1.2 die URL zu Version 1.1!</li>
<li>Speichere die Update-Informationen in der UVD zu Version 1.1!</li>
<li>Führe nacheinander die Update-Schritte (1.0 &gt;&gt; 1.1) und (1.1 &gt;&gt; 1.2) aus!</li>
</ol>
<p>Die Bibliothek, an der ich gerade arbeite, verwendet hierfür sog. Update-Profile, die festlegen, welche Sprache und welches Betriebssystem für das Update berücksichtigt werden soll. Code:</p>
<pre class="c-sharp:collapse" name="code">UVD version12 = UVD.Create("http://dev.xscheme.de/uvd/updatetest1.xml");
UVDVersion currentVs = new UVDVersion(1, 0); // aktuelle Version
UpdateProfile profile = new UpdateProfile(); // OS und Sprache egal
Update u = profile.CreateUpdate(currentVs, version12);
foreach(UpdateSegment s in u)
{
    Console.WriteLine(s.ToString());
}
u.Execute("c:/program/"); // Programmverzeichnis muss angegeben werden!</pre>
<p>Das liefert folgende Ausgabe:</p>
<pre>[Add: file3.txt] http://www.download.de
[Execute: file3.txt]
[Remove: file4.txt]
[Add: file1.txt] http://www.download.de
[Update: file2.txt] http://www.download.de
[Execute: file3.txt]</pre>
<p>Anschließend werden genau diese Schritte ausgeführt. Bei der Erstellung des Updates wird im übrigen mehr oder weniger intelligent vorgegangen: wenn eine Datei in Version 1.2 gelöscht wird, wird sie in Version 1.1 gar nicht erst hinzugefügt. Und warum eine Datei hinzufügen, wenn sie irgendwann später überschrieben wird? Dieses Verhalten lässt sich über das Update-Profil festlegen. Wenn deaktiviert, lautet die Ausgabe:</p>
<pre><span style="text-decoration: underline;">[Add: file4.txt] http://www.download.de</span>
<span style="text-decoration: underline;">[Add: file2.txt] http://www.download.de</span>
[Add: file3.txt] http://www.download.de
[Execute: file3.txt]
<span style="text-decoration: underline;">[Remove: file4.txt]</span>
[Add: file1.txt] http://www.download.de
<span style="text-decoration: underline;">[Update: file2.txt] http://www.download.de</span>
[Execute: file3.txt]</pre>
<p>Soviel dazu. Was jetzt noch wichtig ist, ist die Übertragung der Bibliothek auf andere Programmiersprachen. <strong>Deswegen suche ich Entwickler, die mit mir gemeinsam UVD auf Java, PHP, etc&#8230; portieren.</strong> Bei Interesse einfach eine E-Mail schreiben an <a href="mailto:Yannick_Scherer@gmx.net">Yannick_Scherer@gmx.net</a>! Aber man sollte sich bewusst sein, dass das einiges an Arbeit bedeutet.</p>
<p>Mehr habe ich vorerst nicht vorzuweisen&#8230; Außer vielleicht das ultimative &#8220;einzeilige&#8221; Update (mit einer sinnvollen Datei funktioniert es dann auch&#8230;):</p>
<pre class="c-sharp:collapse" name="code">new UpdateProfile()
       .CreateUpdate(new UVDVersion(1, 0), UVD.Create("http://dev.xscheme.de/uvd/updatetest1.xml"))
       .Execute("c:/program/");</pre>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2009/05/zwischenstand-universal-version-description-uvd-entwickler-gesucht/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mp3Gain-Wrapper (C#)</title>
		<link>http://dev.xscheme.de/2008/08/mp3gain-codesnippet-c-batch/</link>
		<comments>http://dev.xscheme.de/2008/08/mp3gain-codesnippet-c-batch/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 15:48:32 +0000</pubDate>
		<dc:creator>xsc</dc:creator>
				<category><![CDATA[Batch]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[part of lastsharp]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=101</guid>
		<description><![CDATA[mp3Gain ist ein Programm zur (reversiblen!) Normalisierung der Lautstärke in MP3-Dateien. Die folgende Klasse kann mithilfe der Kommandozeilenversion von mp3Gain einen MP3-Titel normalisieren.

using System;
/*
 * [class] mp3Gain: Klasse zur Normalisierung von MP3-Dateien mithilfe von mp3Gain
 *
 * Copyright (C) 2008 Yannick Scherer
 * This program is free software; you can redistribute it and/or modify it [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://dev.xscheme.de/wp-content/uploads/2008/08/mp3gainlogosmall.gif" align="left" style="margin-right: 1em;" /><a href="http://mp3gain.sourceforge.net">mp3Gain</a> ist ein Programm zur (reversiblen!) Normalisierung der Lautstärke in MP3-Dateien. Die folgende Klasse kann mithilfe der <a href="http://prdownloads.sourceforge.net/mp3gain/mp3gain-dos-1_4_6.zip?download">Kommandozeilenversion von mp3Gain</a> einen MP3-Titel normalisieren.<br />
<span id="more-101"></span></p>
<pre class="c#" name="code">using System;
/*
 * [class] mp3Gain: Klasse zur Normalisierung von MP3-Dateien mithilfe von mp3Gain
 *
 * Copyright (C) 2008 Yannick Scherer
 * This program is free software; you can redistribute it and/or modify it under the terms of the GNU General
 * Public License as published by the Free Software Foundation; either version 3 of the License, or (at your
 * option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
 * for more details.
 *
 * You should have received a copy of the GNU General Public License along with this program;
 * if not, see http://www.gnu.org/licenses/.
 * */

using System.Diagnostics;
using System.Collections.Generic;
using System.Text;
using System.IO;

class mp3Gain
    {
        // mp3Gain-Daten
        private static Process          mp3GainProcess = null;
        private static ProcessStartInfo mp3GainProcessInfo = new ProcessStartInfo(mp3GainPath);
        private static string           mp3GainCurrentFile = "";
        public static bool              mp3GainIsRunning = false;
        public static string            mp3GainPath    { get { return System.Windows.Forms.Application.StartupPath+"/mp3gain/mp3gain.exe"; } }
        public static string            mp3GainParams { get { return "/r /d 20 /k /c /q"; } }
        // Lautstärke normalisieren
        public static void NormalizeVolume(string mp3File) {
            if (!mp3GainIsRunning &amp;&amp; File.Exists(mp3GainPath) &amp;&amp; File.Exists(mp3File)) {
                // Prozess läuft
                mp3GainIsRunning   = true;
                mp3GainCurrentFile = mp3File;
                // Datei, an der gearbeitet wird
                string mp3Work = mp3File+"_work.mp3";
                File.Copy(mp3File, mp3Work);
                // mp3GainProcessInfo initialisieren
                mp3GainProcessInfo.Arguments = mp3GainParams+" \""+mp3Work+"\"";
                mp3GainProcessInfo.WindowStyle = ProcessWindowStyle.Hidden;
                // mp3Gain aufrufen
                mp3GainProcess = new Process();
                mp3GainProcess.StartInfo = mp3GainProcessInfo;
                mp3GainProcess.EnableRaisingEvents = true;
                mp3GainProcess.Exited += new EventHandler(mp3GainExited);
                mp3GainProcess.Start();
            }
        }
        public static void mp3GainExited(object sender, EventArgs e)
        {
            // Daten rückkopieren
            string mp3Work = mp3GainCurrentFile + "_work.mp3";
            if (new FileInfo(mp3Work).Length &gt; 0)
            {
                File.Copy(mp3Work, mp3GainCurrentFile, true);
                File.Delete(mp3Work);
            }
            // Reset
            mp3GainIsRunning = false;
            mp3GainCurrentFile = "";
            return;
        }

    }</pre>
<p>Eine MP3-Datei wird normalisiert, durch den Aufruf <code>mp3Gain.NormalizeVolume(&lt;MP3-Datei&gt;)</code>.</p>
<p>Innerhalb der Klasse müssen noch der Pfad zu mp3gain.exe (<em>mp3GainPath</em>) angepasst werden, sowie die gewünschten Parameter (<em>mp3GainParams</em>). Eine Übersicht über die Parameter von mp3Gain gibt es <a href="http://wiki.ubuntuusers.de/MP3Gain?rev=66766">hier</a>.</p>
<p><strong>Batch</strong></p>
<p>Ein BatchFile, das mp3Gain verwendet, könnte folgendermaßen aussehen (vorrausgesetzt, es befindet sich im selben Verzeichnis wie mp3gain.exe):</p>
<pre>@rem // Ziehen Sie eine MP3-Datei auf dieses Batchfile, um sie zu normalisieren.

@rem // In aktuelles Verzeichnis wechseln
@cd /D %~d0%~p0

@echo --------------------------------------------------------------------
@echo Normalisieren von %1 ...
@echo --------------------------------------------------------------------
@ "%cd%/mp3gain.exe" &lt;Parameter&gt; %1
@echo --------------------------------------------------------------------
@echo Prozess abgeschlossen...
@echo --------------------------------------------------------------------
@pause</pre>
<p>Dieser Code lässt sich natürlich erweitern, sodass ganze Ordner bearbeitet werden. Das überlasse ich aber jedem, der fleißig genug dafür ist&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2008/08/mp3gain-codesnippet-c-batch/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
