LaTeX – Mathe-Modus und BibTex

Mai 8, 2013 um 6:09 vormittags | Veröffentlicht in LaTeX, Ubuntuusers | 10 Kommentare

Wie ich schon vor längerer Zeit geschrieben habe, halte ich in diesem Semester, zusammen mit zwei Kollegen, am Informatik-Institut der Uni Wien einen LaTeX-Workshop ab. Dieses Mal waren die Themen, die wir vorgetragen haben Mathematik-Modus (Formelsetzen) und BibTeX (Zitieren).

Selbstverständlich ist auch diesen Folien der Umfang dieses Teilbereiches von LaTeX nicht erschöpft, sie sollen nur einen Punkt zum Einstieg bieten.

Beim nächsten Termin (4.6.) wird es um Tabellen erstellen, Grafiken einbinden und Referenzen setzen (innerhalb und außerhalb des Dokuments) gehen.

Dateien

Mathe-Modus.tex  <– TeX-File für den Mathe-Modus
Mathe-Modus.pdf  <– Kompiliertes PDF
BibTeX.tex  <– TeX-File für BibTex
BibTeX.pdf  <– Kompiliertes PDF

Einheit01.bib  <– Das zugehörige Bib-File (Zitiermaterial)
include.tex  <– Header-File mit allen notwendigen Layout-Informationen und eingebundenen Paketen
cc-by-sa.png  <– CC-Grafik

Anmerkung: Das Original aus dem Workshop hat auf der Titelfolie noch eine zusätzliche Grafik: das Logo des Mentoring-Programms der Uni Wien. Da ich dieses nicht unter eine CC-Lizenz  stellen kann habe ich es kurzerhand herausgenommen. Außerdem habe ich den Header noch nicht aufgeräumt. Hier ist ein Haufen an neuen Kommandos, welche keine logische Struktur haben. All das in Version 2.0 :)

Wie auch im PDF geschrieben: alle diese Dateien stehen unter einer CC-BY-SA 3.0, mit einer Ausnahme: die cc-by-sa.png-Grafik, an welcher alleine Creative Commons die Rechte hält.

=-=-=-=-=
Powered by Blogilo

Horner – Konvertieren zwischen Zahlensystemen

April 8, 2013 um 7:25 nachmittags | Veröffentlicht in Bash, Free Software/Open Source, Programmieren, Ubuntuusers | 10 Kommentare

“Mama, weißt du wie ich von einem Zahlensystem in ein anderes umrechne?”

“Nein, Schätzchen. Weiß Linux es nicht?”

“Nein, ich kann kein Programm finden, dass das kann.”

“Es gibt kein Programm um zwischen Zahlensystemen zu Konvertieren? Oh, nein …”

*Türe wird aufgestoßen, Horner-man stürmt herein*

“Fürchtet euch nicht, gesetzestreue Linuxer! Eure Klagen wurden erhöhrt!”

“Ooh, Horner-man. Unser Held!”

Autsch. Das tut weh. Ich habe es selbst geschrieben und es schmerzt trotzdem sehr. Abgegriffenes Szenario, unglaubwürdige Darsteller, ein Hauch von Sexismus. Autsch.

Kommen wir zum Thema. Seit Langem wollte ich ein Programm haben, mit dem ich einen Wert in verschiedenen Zahlensystemen darstellen kann. Dazu musste dieses Programm jedoch die Umrechnung zwischen diesen Systemen beherrschen. Mein vorrangiges Ziel war die Umrechnung vom Dezimalsystem ins Binärsystem und umgekehrt. Es gibt sicherlich Programme da draußen, die dafür geschrieben sind oder es zumindest nebenbei beherrschen. Speziell die Konvertierung zwischen Zahlensystemen zur Basis 2, 8, 10 und 16 findet sich häufig in digitalen Taschenrechnern. Speedcrunch ist ein schönes Beispiel dafür. Allerdings wollte ich nicht einfach nur ein Programm, welches mir ein Ergebnis anzeigt, sondern auch die Möglichkeit dieses Programm in einem Script zu verwenden. Es musste also konsolenbasiert arbeiten und Ein- und Ausgabe sollten über die Standardkanäle erfolgen.

Da ich kein entsprechendes Programm gefunden habe, habe ich mir vorgenommen selbst eines zu schreiben. Da ich außerdem schon länger das Horner-Schema testweise implementieren wollte,  entschied ich mich dazu, die Umrechnung damit vorzunehmen. Dazu muss erwähnt werden: ich habe dieses Programm für meine persönlichen Bedürfnisse entwickelt, weswegen es nur mit ganzen Zahlen umgehen kann. Die Berechnung mit Gleitkommazahlen ist um einiges komplizierter und es braucht ein bisschen Hirnschmalz um ein Programm zu entwickeln, das nicht sofort Probleme mit der Rechengenauigkeit bekommt. Vielleicht erweitere ich das Programm irgendwann in diese Richtung. Vorerst kann es nur Integer verwerten. Dafür kann es mit Zahlen verschiedenen Basen arbeiten. Die Untergrenze ist Basis 2 (Binär), die Obergrenze ist 36. Rein theoretisch könnte es natürlich noch mehr Basen verarbeiten, bei 36 gehen mir jedoch die sinnvollen Zahlenrepräsentationen aus (0-9, a-z).

Das Programm, oder mehr die Befehlssammlung, kann positive und negative Zahlen von 0 bis 4294967295 verwerten. Dabei ist jedoch 4294967295 das Minimum an Obergrenze. Auf einem 64-bit System ist die Obergrenze 18446744073709551615 (abhängig vom Compiler; hier: GCC). Installation und Verwendung werden noch beschrieben. Zuerst jedoch eine kleine Exkursion:

Was ist das Horner-Schema?

Das Horner-Schema wurde von William George Horner entwickelt und dient der Polynomberechnung. Da die Umrechnung in ein anderes Zahlensystem als Polynom dargestellt werden kann ist das Horner Schema (oder Horner’s Method im Englischen) eine sehr einfache und schnelle Art der Berechnung. Im Großen und Ganzen funktioniert es so:

Umwandlung in das Dezimalsystem; B ist die Basis, a ist die Ausgangszahl, a1 die erste Stelle derselben, …:
(((a1*B + a2)*B + a3)*B + a4) ...

Bsp:
Wir wollen den Binärwert (Basis = 2) 101010 in das Dezimalsystem umwandeln:
((((1*2+0)*2+1)*2+0)*2+1)*2+0 = 42

Die Umwandlung eines Dezimalwertes in ein anderes System funktioniert analog dazu. Zuerst wird per Modulo (Restwertdivision) der Restwert errechnet. Dieser stellt bereits eine Stelle des Ergebnisses dar. Da dieser Rechenvorgang genau umgekehrt zur Umwandlung ins Dezimalsystem verläuft, ist auch das Ergebnis umgekehrt:
42   % 2 = 0
42-0 / 2 = 21
21   % 2 = 1
21-1 / 2 = 10
10   % 2 = 0
10-0 / 2 = 5
 5   % 2 = 1
 5-1 / 2 = 2
 2   % 2 = 0
 2-0 / 2 = 1
 1   % 2 = 1
 1-1 / 2 = 0

Sobald die Zahl, mit der man rechnet 0 geworden ist, endet die Rechnung. Die fettgedruckten Zahlen ergeben, von unten nach oben gelesen, das Ergebnis. Die Zeichenkette ist also 101010. Das ist dieselbe Zeichenkette, die wir zuvor ins Dezimalsystem umgewandelt haben. Es funktioniert!

Die Programme

Ich habe für jeden Rechenvorgang ein C++-Programm geschrieben. 2dec wandelt eine Zahl in das Dezimalsystem um, dec2 wandelt eine Dezimalzahl in eine beliebige Basis (von 2 bis 36) um. Die beiden Programme können jedes für sich aufgerufen werden mit:
dec2 <Basis> <Wert>
2dec <Basis> <Wert>

Die <Basis> ist immer die Basis aus der, bzw. in die ich umrechnen möchte. Die jeweils andere Basis ist ja das Dezimalsystem.

Möchte ich nun den Wert 42 in das Binärsystem umrechnen, so rufe ich das Programm dec2 auf:
dec2 2 42

Möchte ich die Berechnung umdrehen, so verwende ich das Programm 2dec:
2dec 2 101010

Die beiden Programme lassen sich kombinieren, wenn ich von einer Basis in eine andere konvertieren möchte und keine von beiden die Basis 10 ist. Möchte ich wissen, welchen Binärwert der Hexadezimale Ausdruck affe hat, dann mache ich das so:
dec2 2 $(2dec 16 affe)

Ergebnis: 1010111111111110

Das Script

Diese Kombination übernimmt das Script horner. Dieses übernimmt per -i die Basis des Inputs und per -o die Basis, in die der Wert umgewandelt werden soll (Output):
horner -i 16 -o 2 affe
entspricht der obigen Kombination der beiden Programme. Das Script geht davon aus, dass die beiden Programme in einem Verzeichnis abgelegt sind, das in der $PATH-Variablen des Nutzers eingetragen ist.

Das Makefile

Am Besten ist es, wenn man den Code selbst kompiliert. Für all diejenigen, die sich dabei unwohl fühlen oder es einfach noch nicht gemacht haben: keine Sorge, das Makefile übernimmt diese Arbeit. Dazu muss das Paket automake im System installiert sein.

Installation

Zuerst benötigt man den Code, den es hier zum herunterladen gibt.

Dieses Archiv lässt sich per
tar -xvzf Horner.tar.gz
ins aktuelle Verzeichnis entpacken. Die entpackten Dateien liegen dann im selben Verzeichnis wie das Archiv.

Sobald man die Dateien entpackt hat muss man nur in einem Terminal
make
aufrufen. Dies kompiliert den Code und erzeugt die beiden Programme 2dec und dec2.

Mittels
make install
kann man die Programme dann automatisch installieren. Dabei werden sie im Verzeichnis /bin im Home-Verzeichnis des Nutzers abgelegt. Dieses Verzeichnis sollte immer im $PATH liegen und der Nutzer hat dort immer Schreibrechte. Möchtest du die Installation anpassen (sprich: die Dateien woanders unterbringen), dann musst du nur die Dateien 2dec, dec2 und horner im gewünschten Verzeichnis ablegen.

Abschlussbemerkung

Die Programme, das Script und das Makefile stehen unter der GPLv3. Sie sind in keinster Art und Weise getestet und implementieren so gut wie keine Fehlerbehandlung. Über Bugmeldungen freue ich mich, kann aber nicht versprechen, dass ich sie schnell behebe. Wie erwähnt: die Programme sind aus Neugier entstanden und erfüllen meine Anforderungen. Deswegen habe ich vorerst auch nicht vor, sie auf GitHub oder sonstwo hochzuladen. Wenn du das gerne tun möchtest, tu dir keinen Zwang an. Informiere mich in diesem Fall aber bitte darüber.

Über den Inhalt der Programme und des Scripts verliere ich hier keine großen Worte. Wenn du Interesse hast zu erfahren was hier genau passiert, dann schreib mir das in den Kommentaren. Ich antworte dir dann entweder dort oder schreibe einen neuen Artikel zum Thema.

=-=-=-=-=
Powered by Blogilo

Neuer Urheberrechtsvorschlag lässt Atem stocken

April 1, 2013 um 2:21 vormittags | Veröffentlicht in 1. April, Humor, Ubuntuusers | 4 Kommentare

Die deutsche Verwertungsgesellschaft GEMA und ihr österreichisches Pendant haben sich für einen neuen Vorschlag zur Urheberrechtsabgabe zusammengetan. Laut Presseaussendung werden sich durch die gemeinsame Aktion mehr Chancen darauf ausgerechnet, dass die betroffenen Länder tatsächlich diesen Vorschlag umsetzen.

Ein Sprecher der GEMA nennt den neuen Vorschlag “revolutionär” und einen Schritt in die richtige Richtung. Wenn es aus dieser Ecke so tönt, dann weiß bereits jeder, der mehr als 3 Hirnzellen im Kopf hat, dass es für die Menschen ein schlechter Deal wird.

Die Prämisse hinter dem Vorschlag der beiden Organisationen lautet so: Jeder Mensch hat in seinem Leben urheberrechtlich geschütztes Material konsumiert. Dieses Material hat sich zu einem Zeitpunkt in seinem Gehirn als Gedanke, Gefühl oder sonstwie manifestiert. Stirbt nun dieser Mensch und dekompostiert in seinem Grab, dann geraten die betroffenen Hirnzellen in der ein oder anderen Form wieder in Umlauf. Bei Verwesung sollen die Atome, die zuvor die Zellen gebildet haben, in die Luft entweichen. Diese Luft wird dann wiederum von anderen Menschen eingeatmet und somit das urheberrechtlich geschützte Material erneut wiederverwertet. Doch dieser Mensch zahlt nichts dafür!

Den Einwand, dass es sich bei solch kleinen Mengen um Fair-Use handeln könnte lassen die Gesellschaften erst gar nicht gelten, denn “der durchschnittliche Mensch atmet ja nicht nur einmal pro Tag, sondern mehrmals. Dadurch summieren sich dieser Mengen zu einem großen Ganzen auf. Unsere Statistiken zeigen, dass der Durchschnittliche Mensch am Tag 2 mal Beethovens 9te veratmet”, so die GEMA.

Der Vorschlag sieht nun eine allgemeine Zahlungspflicht für jede Person vor, die sich länger als einen Atemzug auf dem Staatsgebiet eines der betroffenen Staaten aufhält. Man könne auch Pauschale Beträge für eine Anzahl an Atemzügen bezahlen, welche geringer wären als äquivalente einzelne Atemzüge. So könnten Menschen, die bereit sind €50,- pro Monat hinzublättern an einem Tag bis zu 1.000 mal atmen. Ab €200,- sind es 10.000 mal. Ein normaler Erwachsener braucht normalerweise 11-15 Atemzüge pro Minute, was auf etwas mehr als 20.000 Atemzüge am Tag kommt. Daher gibt es auch einen Ganztagestarif, der 22.000 Atemzüge freistellt. Dieser kommt auf €400,-/Monat.

Für Spitzensportler und Schulen gibt es eigene Tarife, da dort zum einen besonders viel geatmet wird und zum Anderen der Austausch der eigenen Atemluft mit anderen Personen stärker konzentriert ist.

Auf Anfrage von Taach bei der US Amerikanischen RIAA teilte uns ein Sprecher mit, dass das “… Modell sehr interessant ist, jedoch ein wenig zu kurz greift. Wir arbeiten an einer Lösung, die besonders auf Menschen Bezug nimmt, die besonders viel ausatmen.”

=-=-=-=-=
Powered by Blogilo

Tanglu – Immer ein aktuelles Debian

März 15, 2013 um 2:53 nachmittags | Veröffentlicht in Debian, Free Software/Open Source, KDE, Ubuntuusers | 12 Kommentare

Debian ist bekannt als superstabil, superhart … und superalt. Es wird viel Mühe in die Härtung eines Paketes gesteckt und in das Finden von Bugs. Da Debian erst dann ein Release bringt, wenn ein gewisser Mindeststandard erreicht ist, ist auch immer offen wann die nächste Version erscheint. Normalerweise wird 18 Monate nach einem Release der aktuelle Stand in Testing eingefroren. Das bedeutet, dass unabhängig vom Stand im Rest der Welt keine neuen Programmversionen mehr einfließen. Dann beginnt die Phase in der Maintainer ihre Pakete soweit verbessern, dass ein Release erfolgen kann. Oftmals dauert dies ein halbes Jahr und länger. (It’s ready, when it’s ready.)

Besonders bei Software wie Firefox (neues Release alle 6 Wochen) ist dies natürlich problematisch, weswegen die Debian-Entwickler … eigene Patches … Iceweasel. Firefox ist jedoch bei weitem nicht die einzige Software, die bei einem Debian-Release bereits veraltet ist. Auch KDE hat z.B. einen 6-Monats-Rythmus. Die Chance, dass KDE bereits um eins höher gezählt hat, wenn Debian Stable aktualisiert wird, ist sehr hoch.

Diese Lücke will Tanglu nun schließen. Bis jetzt findet man dort nur eine Ankündigung, welche die Pläne für Tanglu erläutert. Die Wichtigsten davon sind:

  • Tanglu will eine Lücke von Debian schließen. In der Zeit eines Debian Freezes sollen neue Programm-Versionen bei Tanglu weiterentwickelt werden. Dazu lädt Tanglu alle Paket-Maintainer in das Projekt ein, will jedoch niemanden zwingen. Bei Herausgabe von Debian Stable sollen die aktuellen Tanglu-Pakete wieder nach Debian zurückfließen.
  • Ein fester Release-Rythmus von 6 Monaten.
  • Die Installation proprietärer Firmware (Treiber) will Tanglu so einfach wie möglich machen, diese soll jedoch nicht in der Standardinstallation enthalten sein. Stallmans Ungnade ist ihnen trotzdem sicher.
  • Pakete sollen möglichst nah an Debian und damit möglichst nahe an Upstream (die ursprünglichen Entwickler) bleiben. Im Gegensatz zu z.B. Ubuntu will man keine eigenen Patches schreiben, wenn nicht notwendig.
  • Vollständige Kompatibilität zu Debian ist Muss. Eigenkreationen wie Mir (konkretes Beispiel) sollen nicht passieren. Eine Art Software-Center soll es aber geben.
  • Als grafische Oberfläche will man sich zu Anfang auf KDE focussieren. GNOME Vanilla und andere Desktops sollen jedoch, wenn es eine Community dafür gibt, ebenfalls verfügbar werden,

Laut eigener Aussage besteht das Team hinter Tanglu aus nicht sehr vielen Leuten. Dass man eine eigene Distribution stemmen kann ist man sich hier aber scheinbar sicher. Ein konkretes Datum für die erste Ausgabe ist noch nicht genannt worden. Bei einem 6-Monats-Rythmus bis zum Release plus Anfangsarbeiten ist jeoch vor Oktober eher nicht damit zu rechnen.

Ich habe mir schon länger überlegt auf eine Debian-basierte Distribution, welche nicht Ubuntu ist, umzusteigen, vielleicht sogar Debian selbst. Davon hat mich bis jetzt die teilweise stark veraltete Softwareauswahl von Debian Stable abgehalten. Tanglu ist für mich diesbezüglich eine interessante Alternative. Vielleicht wird mein Laptop ja nicht auf Kubuntu 13.10 aktualisiert.

=-=-=-=-=
Powered by Blogilo

LaTeX – Ein Einstieg

März 13, 2013 um 7:48 vormittags | Veröffentlicht in LaTeX, Ubuntuusers | 7 Kommentare

Lange ist es her, dass ich etwas über LaTeX geschrieben habe. An sich habe ich einen Einstieg in LaTeX schon vor längerer Zeit einmal beschrieben. Dieses Semester leite ich, gemeinsam mit zwei Kollegen an der Uni Wien einen LaTeX-Workshop, in welchem wir versuchen Studienanfänger an LaTeX heranzuführen. Dazu haben wir ein paar Foliensätze zusammengestellt, mit denen wir das jeweilige Thema vorstellen. Die Themen sind folgende:

  • Einstieg/Installation von LaTeX
  • Mathematik-Modus
  • Zitieren mit BibTeX
  • Grafiken verwenden
  • Tabellen bauen
  • Referenzen innerhalb und außerhalb des Dokuments
  • Präsentationen mit Beamer

Wir sind immer noch dabei Foliensätze zu erstellen, deswegen kann ich jetzt nur den ersten Foliensatz online stellen. Die Foliensätze sind so verfasst, dass sie möglichst selbsterklärend sind. Deswegen werde ich hier nicht viel über den Inhalt verlieren. Natürlich besteht LaTeX aus wesentlich mehr als die Folien abdecken können. Es soll eben nur ein Einstieg sein. Weitere Foliensätze folgen, sobald sie in einer finalen Version vorliegen.

Dateien

Einheit01.tex  <– Das haupt-TeX-File
Einheit01.bib  <– Das zugehörige Bib-File (Zitiermaterial)
include.tex  <– Header-File mit allen notwendigen Layout-Informationen und eingebundenen Paketen
cc-by-sa.png  <– CC-Grafik
Einheit01.pdf  <– Fertiges PDF

Anmerkung: Das Original aus dem Workshop hat auf der Titelfolie noch eine zusätzliche Grafik: das Logo des Mentoring-Programms der Uni Wien. Da ich dieses nicht unter eine CC-Lizenz  stellen kann habe ich es kurzerhand herausgenommen. Außerdem habe ich den Header noch nicht aufgeräumt. Hier ist ein Haufen an neuen Kommandos, welche keine logische Struktur haben. All das in Version 2.0 :)

Wie auch im PDF geschrieben: alle diese Dateien stehen unter einer CC-BY-SA 3.0, mit einer Ausnahme: die cc-by-sa.png-Grafik, an welcher alleine Creative Commons die Rechte hält.

=-=-=-=-=
Powered by Blogilo

Ubuntu und MariaDB – Wann? UPDATE

Januar 28, 2013 um 2:25 vormittags | Veröffentlicht in Free Software/Open Source, Ubuntu, Ubuntuusers | 9 Kommentare

Nachdem Oracle Sun aufgekauft hat sind bereits viele Projekte in Oracles Händen zerflossen. OpenOffice.org wurde in LibreOffice geforkt und der Großteil der Community-Entwickler schlossen sich dem Fork an. OOo fristet seither ein eher bescheidenes Dasein unter dem Dach der Apache Foundation. OpenSolaris, die Community-Version von Solaris wurde von Oracle abgewürgt, die wichtigsten Entwickler gründeten den Fork OpenIndiana. Das ODF-Plugin für MS Office, unter Sun kostenfrei erhältlich, war von Oracle für etwa $ 70,- zu beziehen. Inzwischen laufen alle Links von Oracles Website zum Plug-In ins Leere.

Bei MySQL versucht Oracle Anwender offensichtlich zum Umstieg auf Oracles Datenbank oder zumindest auf die Enterprise Version zu bewegen. Eine nicht-öffentliche Fehlerdatenbank und ein Ausgrenzen der Community machen MySQL, trotz GPL, zu einem proprietären Projekt. Auch scheinen in der Community-Version seit dem Verkauf wichtige Funktionen zu fehlen. So erhalte ich beim Einsatz von MySQL (5.5) aus den Ubuntu-Quellen nur Fehler, wenn ich versuche TRIGGEREXCEPTROLE oder CHECK zu verwenden.

Mehrere Distributoren haben inzwischen angekündigt die Standard-Datenbank von MySQL auf MariaDB umzustellen, OpenSuse hat es sogar schon gemacht. MariaDB ist ein Fork von MySQL, geleitet von Michael Widenius, dem Schöpfer von MySQL. Es verspricht Feature-Gleichheit oder sogar -Vorsprung zu MySQL Enterprise und wird als OpenSource-Projekt geführt. Leider gibt es dazu noch keine Aussagen von Ubuntu.

[UPDATE]

Heeeere commmmes annnnnnnotherone …..

[/UPDATE]

Liebe Ubuntu-Entwickler, bitte folgt dem Beispiel eurer Kollegen und ersetzt MySQL durch eine bessere Alternative.

P.S.: Eine Anleitung um MariaDB auf Ubuntu/Debian zu installieren.

[UPDATE 2]

Auch Slackware und Arch setzen nun auf MariaDB. Bei Ubuntu gibt es weder auf der offiziellen Homepage, noch bei Mark Shuttleworth irgendwelche Kommentare dazu. Immerhin auf Ubuntuusers gibt es einen Artikel zu MariaDB, welcher allerdings erst im Aufbau ist. Man kann wohl nicht davon ausgehen, dass MariaDB bereits in Ubuntu 13.04 enthalten sein wird. Vielleicht haben wir ja Glück und es kommt mit 13.10. Inzwischen liebäugle ich mit einem Umstieg …

[/UPDATE 2]

=-=-=-=-=
Powered by Blogilo

Playr – Ein iPod Shuffle für die Bash

Januar 21, 2013 um 10:05 vormittags | Veröffentlicht in Bash, Multimedia, Programmieren, Ubuntuusers | 9 Kommentare

Schon länger habe ich nach einer Möglichkeit gesucht ein paar Musikdateien auszuwählen und in zufälliger Reihenfolge abspielen zu lassen. Das kann sowohl ein einzelnes Album sein, als auch eine Zusammenstellung mehrere Tracks aus verschiedenen Verzeichnissen. Außerdem sollte dieses Programm Konsolen-basiert sein, da ich es für schnelle Wiedergabe brauche und nicht zuerst in einer GUI alles zusammenklicken will. Da ich ein solches Programm leider noch nicht gefunden habe, habe ich mir selbst ein Bash-Skript zusammengestellt, welches als Scheduler dient und play (Paket sox aus den Quellen) zum Abspielen verwendet. play kann sowohl OGG, FLAC und WAV abspielen. Nach Installation von libsox-fmt-mp3 auch MP3.

Playr

Playr steht für die Zusammensetzung aus play (dem Programm fürs Abspielen der einzelnen Tracks) und random (engl.: zufällig). Dass es aussieht wie ein Web2.0-Name ist wiederum Zufall (dt.: coincidence).

Die grobe Funktionsweise: Die übergebenen Musiktracks werden in eine versteckte Textdatei geschrieben. Dann wird mit Hilfe von $RANDOM eine Zufallszahl zur Berechnung des nächsten Tracks verwendet. Dieser Track wird sodann abgespielt und aus der Textdatei entfernt. Das verhindert, dass dieser erneut abgespielt wird (was etwas ist, dass ich bei portablen Audio-Playern sehr nervig finde). Solange noch Tracks in der Liste sind wird fortgefahren.

Soll die Wiedergabe abgebrochen werden, muss der Nutzer nur [strg]+[c] drücken. Leider habe ich bis jetzt keine Möglichkeit gefunden zusätzlich dazu auch einfach zum nächsten Track zu wechseln. Man kann natürlich einfach die trap entfernen, dann bricht [strg]+[c] nur das aktuelle play ab. Dann kann jedoch das Skript selbst nicht mehr komfortabel beendet werden.

Das Skript

Wir beginnen mit der trap. Dieses Konstrukt sorgt dafür, dass unser Skript [strg]+[c] verarbeiten kann. Dafür schreiben wir folgende Zeile:
trap quit SIGINT SIGTERM

Diese Zeile führt dazu, dass beim Erhalt der Signale SIGINT (Signal 2) oder SIGTERM (Signal 15) quit ausgeführt wird. Nun ist quit kein Bash-Befehl sondern eine Funktion, die wir uns selbst schreiben, welche das Skript geordnet beendet:
function quit {
    rm -f $TRACK_FILE $TEMP_FILE
    exit 1
}

Diese Funktion schreiben wir vor die Trap. In dieser löschen wir einfach unsere Textdateien, damit sie beim nächsten Programmaufruf nicht stören.

Als nächstes definieren wir zwei Variablen für unsere versteckten Textdateien. Zum einen eine Datei um die Tracklist zu speichern, zum Anderen eine Datei in der die veränderte Liste gespeichert wird:
TRACK_FILE=/tmp/.tracklist.playr
TEMP_FILE=/tmp/.temp.playr

Wir speichern die Dateien in  /tmp , damit sie keine Verzeichnisse zumüllen. Außerdem sollten wir in  /tmp  immer Schreibzugriff haben. Sollte  /tmp  nicht verfügbar sein, kann man das Verzeichnis ja auf  $HOME  ändern.

Nun wirds Zeit sicherheitshalber Überbleibsel einer vorherigen Ausführung zu entfernen:
rm -f $TRACK_FILE $TEMP_FILE

Nur für den Fall, dass etwas total schief gelaufen ist.

Um die Tracklist zu erzeugen schreiben wir nun einfach alle Parameter, die beim Skriptaufruf übergeben wurde in das TRACK_FILE:
for file in " $@ "; do
    echo " $file "
done > $TRACK_FILE

Das funktioniert gewisserweise wie eine foreach-Schleife. Eine beliebige Anzahl Parameter wird durchlaufen ( $@ ). Der jeweils aktuelle Parameter wird in  $file  gespeichert und in der Schleife verarbeitet. Hier wird er einfach an die Standardausgabe geschickt. Die komplette Ausgabe der Schleife wird wieder auf  $TRACK_FILE  umgebogen, wodurch die Ausgabe nicht auf der Kommandozeile erscheint, sondern in der angegebenen Datei.

Die Größe der Tracklist holen wir uns mit wc:
size=$( cat "$TRACK_FILE" | wc -l)

Natürlich könnte man die Datei auch gleich als Parameter für wc angeben:
wc -l " $TRACK_FILE "

Dann jedoch erhält man eine Ausgabe nach folgendem Muster:
6 .tracklist.playr

Man muss also erst noch den eigentlichen Wert extrahieren. Da mache ich lieber den “Umweg” über cat. Ist kürzer.

Nun kommt die eigentliche Hauptschleife des Programmes:
while [[ $size -gt 0 ]]; do
    ## Code
    ((size–))
done

Diese Schleife läuft solange durch, bis  $size  den Wert 0 hat. Da  $size  auf jeden Fall größer als 0 sein muss und in jedem Durchgang um eins verringert wird, ist das irgendwann der Fall. Mit der Abbruchbedingung verhindern wir auch, dass die Schleife ausgeführt wird, wenn die Tracklist leer ist.

Es ist Zeit. Zeit um die Urväter, die Auditoren, die Götter anzurufen. Zeit eine Zufallszahl zu erzeugen. Einer Zufallszahl innerhalb eines Intervalls errechnet man am Besten mithilfe von Modulo. Modulo ist der Name der in der Unterstufe als Restwertdivision bekannten Berechnung.

Kleine Beispiele:  10 / 3 = 3 . Rest:  1 13 / 5 = 2 . Rest:  3 . Uns interessiert immer der Restwert. Dieser ist auf jeden Fall immer  um  1  kleiner als der Divisor (für diejenigen, die schon lange aus der Schule draußen sind :) ).

Bash scheint keine built-in Funktion für Modulo zu haben, dafür gibt es ein paar andere Möglichkeiten eine solche Berechnung durchzuführen. Am ansprechendsten habe ich  let  gefunden:
let "rand = $RANDOM % $size + 1"

In der Variable  $rand  wird das Ergebnis der Berechnung festgehalten.  $size  ist natürlich der Begrenzer.  $RANDOM  ist eine Umgebungsvariable, welche bei jedem Aufruf einen neuen zufälligen Integer (Ganzzahl) ausgibt. Da diese Berechnung bei einer Tracklist-Größe von z.B.  6  den Wertebereich von  0-5  abdeckt, wir aber kein  0 tes Lied, dafür aber ein  6 tes, zählen wir zum Ergebnis einfach  1  dazu.

Den damit errechneten Track erhalten so:
track= " $( head  $TRACK_FILE  -n$rand | tail -n1)

Hier passiert ein bisschen was:
head  -n$rand

filtert die ersten  $rand  Zeilen aus der Liste. Ist  $rand also  2 , dann erhalten wir durch  head   die ersten  2  Zeilen. Dadurch ist der gesuchte Track immer an letzter Stelle in der Liste. Diese letzte Stelle können wir uns nun per  tail  holen:
tail  -n1

Hier holt uns  tail  die  1 ste Zeile von hinten. Damit haben wird unseren Track. Dieser wird nun in die Variable  $track  gespeichert.

Jetzt wird es Zeit den Track abzuspielen:
play " $track "

Natürlich kann man auch das Ausrechnen des Tracks und den Aufruf von  play  in einer Zeile unterbringen. Ich bin jedoch eher für lesbaren Code als für “Zeileneffizienz”.

Zum Abschluss muss noch eine neue Tracklist angelegt werden, ohne den gerade abgespielten Track. Dazu holen wir uns zuerst alle Tracks vor dem Aktuellen:
head " $TRACK_FILE " -n$[ $rand-1 ] > " $TEMP_FILE "

und die Tracks danach:
tail " $TRACK_FILE " -n$[ $size-$rand ] >> " $TEMP_FILE "

Mit
$rand-1

holen wir uns alle Tracks vor dem Aktuellen und sparen diesen aus. Hingegen
$size-$rand

liefert uns alle Tracks nach dem Aktuellen. Damit erhalten wir wieder dieselbe Liste wie zuvor, nur ohne dem letzten Track. Man beachte die Pfeile, welche das Ergebnis jeweils nach $TEMP_FILE schicken. In der ersten Zeile befindet sich nur ein Pfeil. Das bedeutet, dass die Datei überschrieben und neu befüllt wird. Es wird also nur das gespeichert, was in dieser Zeile herauskommt. In der zweiten Zeile hingegen sind zwei Pfeile. Das bedeutet, das das Ergebnis an die Datei angehängt wird. Der Inhalt der Datei wird also nicht über-, sondern der neue Inhalt dahinter in die Datei geschrieben.

Schließlich müssen wir die neue Tracklist noch über die alte schreiben:
mv " $TEMP_FILE " " $TRACK_FILE "

Nach der Schleife selbst rufen wir noch einmal quit auf, damit das Skript sich auch ohne Abbruch durch den Nutzer sauber beendet.

Das vollständige Skript

#!/bin/bash

function quit {
     rm  -f $TRACK_FILE $TEMP_FILE
     exit  1
}

trap  quit SIGINT SIGTERM

TRACK_FILE=/tmp/.tracklist.playr
TEMP_FILE=/tmp/.temp.playr

rm  -f $TRACK_FILE $TEMP_FILE

for  file  in  $@ do
     echo   $file
done > $TRACK_FILE

size=$( cat  ”$TRACK_FILE” |  wc  -l)

while [[  $size -gt 0 ]]; do
     let  “rand =  $RANDOM  %  $size  + 1″
    
track= " $( head  $TRACK_FILE  -n$rand  tail  -n1)
     play  $track
     head   $TRACK_FILE  -n$[ $rand-1 ] >  $TEMP_FILE
     tail   $TRACK_FILE  -n$[ $size-$rand ] >>  $TEMP_FILE
     mv   $TEMP_FILE ” “ $TRACK_FILE
    ((size–))
done

quit

Zum Schluss

Ich bin vergleichsweise ein Anfänger in Shell-Script. Ich habe einige Erfahrung in C++ und es kann daher sein, dass ich versuche Konzepte daraus in Bash umzusetzen, obwohl es wesentlich einfachere Lösungen gibt. Wenn du eine bessere Lösung weißt, schreibe sie doch bitte in die Kommentare.

Lizenz

Das Skript steht unter der GPLv3.

Project Godus – möglicher Linux Support [Update]

Dezember 19, 2012 um 8:15 nachmittags | Veröffentlicht in Games, Ubuntuusers | Hinterlasse einen Kommentar

Für all diejenigen, die das Herzschlagfinale bis jetzt noch nicht miterlebt haben: Project Godus, das aktuell in der Entwicklung befindliche Werk von Peter Molyneux (Populous, Dungeon Keeper, Black&White) hat vor ein paar Stunden sein Kampagnenziel auf Kickstarter erreicht (450.000 GBP).

Pünktlich dazu haben sie weitere Stretch-Goals veröffentlicht. Linux- und OUYA-Support sollen kommen, wenn die Kampagne in den verbleibenden 40 Stunden noch mindestens 100.000 GBP einnimmt. Geht auf die Kickstarter-seite und schaut auch das Prototyp-Video an.

Auch wenn 100.000 im Vergleich viel sind, so hat das Projekt in den letzten paar Tagen mehr als 150.000 GBP Unterstützung eingefahren. Noch etwas mehr und Linux ist wieder um ein Großartiges Spiel reicher – ganz unabhängig von Steam.

[UPDATE] Das Stretch-Goal Linux-Support wurde auf 525.000 GBP heruntergesetzt. Aktuell stehen wir bei 521,364 GBP und 74 Minuten. [/UPDATE]

[UPDATE 2] Was für ein Herzschlagfinale. Eineinhalb Minuten vor der Deadline springt der Counter auf exakt 525.000 GBP. Die Kampagne endet mit 526.523 GBP. Godus kommt auf Linux! [/UPDATE 2]

=-=-=-=-=
Powered by Blogilo

Alternativen zu youtube-dl

Dezember 13, 2012 um 9:28 nachmittags | Veröffentlicht in Bash, Free Software/Open Source, Multimedia, Programmieren, Ubuntuusers | 15 Kommentare

Ich mag youtube-dl. Es ist einfach zu benutzen, ist plattformunabhängig (Python) und braucht nicht viele Ressourcen (Terminal-Anwendung).

Leider mag youtube-dl mich zur Zeit nicht. Sobald ich versuche ein Video herunterzuladen schaufelt die Anwendung meinen Arbeitsspeicher voll, sodass alles andere in den Swap ausweichen muss. Das führt dazu, dass das System innerhalb von Sekunden nicht mehr reagiert. Am längsten überlebt noch die Maus, welche sich etwa eine halbe Minute lang stark ruckelnd bewegen kann. Danach ist auch sie tot und das Einzige das hilft ist ein Hard-Reset. Keine wünschenswerte Situation.

Ich habe bereits
youtube-dl -U
als sudo ausgeführt um ein update des Scripts zu erzwingen. Das hat leider nichts geholfen. Der Streaming-Dienst ist auch egal. Ob YouTube, Vimeo oder sonst was, das Problem ist immer gleich.

Logischer Schritt: ich schaue mich nach Alternativen um. Wenn man per
apt-cache search
nach youtube sucht, werden einem bereits eine Liste an Programmen angeboten, welche in der Lage sind Videos von Streaming-Services herunterzuladen. Darunter befinden sich

  • clive
  • cclive
  • fatrat
  • slimrat
  • nicovideo-dl
  • get-flash-videos
  • metacafe-dl
  • nomnom

clive

Speziell clive hat meine Aufmerksamkeit erregt. Es ist ein Terminal-Tool, welches sich für Streaming-Services eignet, die ihre Videos in einem Flash-Player abspielen. Es ist leichtgewichtig, hat eine Vielzahl an praktischen Optionen und verhält sich allgemein sehr wie ich es von youtube-dl gewohnt bin.

Ein einfaches
clive <video_url>
lädt das Video an der angegebenen URL herunter. An sich kann man damit leben. Allerdings hat clive eben mehrere interessante Funktionen, mit denen man sich gerne spielt. Dazu gehört einmal der Schalter -F. Damit erhält man eine Liste von verfügbaren Formaten und Qualitätsstufen in denen das Video vorhanden ist. Diese Liste kommt im Format
hd|mobile|sd
Die durch “|” getrennten Optionen kann man dann in einem zweiten Aufruf dem Schalter -f angeben, welcher dann dafür sorgt, dass clive das Video in der gewünschten Qualität herunterlädt.

Da es etwas unbequem ist für jedes Video zwei Programm-Aufrufe zu starten, habe ich ein einfaches Skript geschrieben, welches diese Aufgabe abnimmt:

#!/bin/bash

VIDEO_URL="$1"
TEMP_FILE=".video-dl_temp_file"

clive -F "$VIDEO_URL" > "$TEMP_FILE"

CHOICES=$(cat "$TEMP_FILE" | tail -n1)

echo -n "Choose format (${CHOICES%% *}|best): "
read FORMAT

clive "$VIDEO_URL" --format="$FORMAT"
--filename-format="%t_$FORMAT.%s"

rm -f "$TEMP_FILE"

Was passiert hier?

VIDEO_URL=”$1
Wir speichern die angegebene URL in einer Variable.

TEMP_FILE=”.video-dl_temp_file
Der Einfachheit halber brauchen wir eine temporäre Textdatei, in welcher wir Informationen speichern können. Der Punkt am Anfang des Dateinamens bedeutet, dass die Datei versteckt ist. Sie wird also im Dateibrowser, oder per ls nicht angezeigt. Die Datei wird am Ende des Skripts wieder gelöscht.

clive -F “$VIDEO_URL” > “$TEMP_FILE
Hier holen wir uns die möglichen Formate, in denen das Video vorliegt und schreiben diese Ausgabe in die temporäre Datei. Da es sich hierbei um zwei Zeilen handelt und nur die zweite Zeile relevant ist, brauche ich:

CHOICES=$(cat ”$TEMP_FILE” | tail -n1)
Diese Zeile gibt mir den Inhalt der temporären Datei aus (cat), schneidet die letzte Zeile ab (tail) und speichert die gewünschte Zeile in der Variablen CHOICES.

Als Nächstes fragen wir den Nutzer, welches Format bevorzug wird:
echo -n “Choose format (${CHOICES%% *}|best): 
wobei
${CHOICES%% *}
dafür sorgt, dass hinter der Liste nichts mehr steht. clive gibt hier nochmal die Adresse des Videos aus. Dieser Ausdruck schneidet sie weg.

Dann lesen wir die Wahl des Nutzers ein:
read FORMAT

Nun ist es an der Zeit endlich das Video herunterzuladen:
clive ”$VIDEO_URL” –format=”$FORMAT
–filename-format=”%t_$FORMAT.%s

–filename-format gibt die Formatierung des Dateinamens an. %t und %s sind dabei Platzhalter, welche für den Titel und das Suffix der Datei stehen. Zusätzlich zu den Platzhaltern kann man noch beliebig weitere Vorgaben für den Dateinamen machen. Ich füge zwischen Dateinamen und Suffix noch das Format der Datei ein.

Nachdem die Video-Datei sicher auf der Platte liegt lösche ich noch die temporäre Datei:
rm -f “$TEMP_FILE

Fazit

Bis jetzt habe ich clive mit YouTube und Vimeo getestet. Beides funktionierte sehr gut und machte keine Probleme. Das Skript ist natürlich ausbaufähig. Zur Zeit kann es immer nur mit einem Video gleichzeitig umgehen und möglicherweise findet man noch einen besseren Weg als die Informationen in einer temporären Datei zu speichern. Für meine aktuellen Zwecke reichts.

clive steht unter der GPLv3.

=-=-=-=-=
Powered by Blogilo

PengPod – KDE Plasma Active auf 10”-Tablet

November 24, 2012 um 8:25 nachmittags | Veröffentlicht in GNU/Linux, Ubuntuusers | 5 Kommentare

Wer Aaron Seigos Blog in den letzten Monaten verfolgt hat, der weiß, dass das voller Enthusiasmus angekündigte KDE Plasma Active-Tablet Vivaldi musste einen herben Rückschlag hinnehmen. Seigo ist zwar wieder auf der Suche nach einem neuen Hardware-Partner, die Produktion von Vivaldi wurde aber auf unbestimmte Zeit verschoben. In diese Lücke scheint nun PengPod zu springen.

Auf der Crowdfunding-Plattform indiegogo läuft noch bis zum 2. Dezember ein Projekt, welches sich die Produktion eines Tablets mit Android oder Linux zur Aufgabe gemacht hat. Das Projekt möchte drei verschiedene Geräte herstellen:

  1. Den PengPod 700 – Ein Tablet mit 7” Display
  2. Den PengPod 1000 – Ein Tablet mit 10” Display
  3. Den PengStick – Ein Mini-PC auf USB-Stick

Auf all diesen Geräten wird Android 4.0 oder ein System mit Linux 3.0 laufen. Mit 1 GB Ram und einer Auflösung von 1024×600 (bzw. 800×480 beim PengPod 700) ist die Hardware nicht unbedingt marktführend, für unter $200 aber ganz gut. Der eingebaute Chipsatz (Allwinner A10) soll Full-HD unterstützen, was in Kombination mit dem HDMI-Slot interessant sein kann. Die CPU läuft mit 1.2 GHz und der interne Speicher von 8 GB ist mittels SD-Karten erweiterbar. Standardmäßig wird Android installiert, man kann jedoch gegen $5 Aufpreis Linux vorinstalliert, bzw. gegen $8 Aufpreis eine 8GB SD-Karte mit Linux-Image zum Dual-Boot bekommen. Den Bildern nach setzt auch das PengPod unter Linux auf KDE Plasma Active als grafische Oberfläche.

Das Projekt ist zur Zeit auf 70% seines angepeilten Zieles angekommen. Auch wenn ich mir sicherlich ein Vivaldi zulegen werde, sobald es in Produktion geht, ist das PengPod einen Blick wert.

P.S.: Ich weiß natürlich, dass Android ein Linux-Fork ist. Eben deswegen spricht man aber im Allgemeinen vom Android-Kernel.

=-=-=-=-=
Powered by Blogilo

Nächste Seite »

Bloggen Sie auf WordPress.com. | Theme: Pool von Borja Fernandez.
Einträge und Kommentare feeds.

Follow

Bekomme jeden neuen Artikel in deinen Posteingang.