Sonntag, 31. Dezember 2017

Google Analytics Opt-out cookie javascript

For alternative browsers and mobile devices for a Google Analytics Opt-Out you can use this simple javascript with a function and set a cookie.


This Google Analytics Opt-out cookie javascript use the function wich is inside the Google Analytics Opt-out browser AddOn.

This Google Analytics Opt-out cookie javascript works with older and newer Google Analytic script code snippets.

This Google Analytics Opt-out cookie javascript works with the ga.js and the analytics.js javascript files wich are loaded by the Google Analytics javascript code snippet.

You must insert this javascript code directly before your Google Analytics javascript code snippet. Here both shown together.

<!-- Google Analytics Opt-out -->
<script type="text/javascript">
var domainname = window.location.hostname;
var gaoptoutcookiename = "gaoptoutcookie" + domainname.replace(/\./g, "");
if (document.cookie.indexOf(gaoptoutcookiename) >= 0) {
var a = document.createElement("script");
a.type = "text/javascript";
a.innerText = 'window["_gaUserPrefs"] = { ioo : function() { return true; } }';
document.documentElement.insertBefore(a, document.documentElement.firstChild);
}
function googleanalyticsoptout() {
var gaoptoutcookienamevalue = gaoptoutcookiename + "=" + "accepted;" + "expires=Wed, 1 Jan 2100 00:00:00 UTC;" + "path=/";
document.cookie = gaoptoutcookienamevalue;
}
</script>
<!-- End Google Analytics Opt-out -->

<!-- Google Analytics -->
<script>
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-XXXXX-Y', 'auto');
ga('send', 'pageview');
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>
<!-- End Google Analytics -->


And that is the HTML code snippet for your privacy policy.

<a href="javascript:googleanalyticsoptout();">Google Analytics Opt-out cookie to save</a>

It is possible that Google will change the function in her script, then it will not work anymore. You can then extract the function yourself from the Google Analytics Opt-out Browser AddOn and replace it with the old one.

No guarantee. No warranty. No support.
Use at your own risk.
Weiterlesen »

Samstag, 23. Dezember 2017

PHP get current directory name and file name

Get the current directory name and file name in PHP. There are several ways to get the name of the current directory and the current filename in PHP with different results. Below are some methods with their command and result listed.

Template:
echo command; || var_dump(command);
result as value || array || error_reporting

/var/www/html/testa/testb/test.php


echo getcwd();
/var/www/html/testa/testb


__DIR__ ( Magic constant )

echo __DIR__;
/var/www/html/testa/testb

echo getcwd(__DIR__);
[Warning: getcwd() expects exactly 0 parameters, ...]

echo dirname(__DIR__);
/var/www/html/testa

echo basename(__DIR__);
testb

echo realpath(__DIR__);
/var/www/html/testa/testb

var_dump(pathinfo(__DIR__));
array(3) {
  ["dirname"]=>
  string(43) "/var/www/html/testa"
  ["basename"]=>
  string(5) "testb"
  ["filename"]=>
  string(5) "testb"
}


__FILE__ ( Magic constant )

echo __FILE__;
/var/www/html/testa/testb/test.php

echo getcwd(__FILE__);
[Warning: getcwd() expects exactly 0 parameters, ...]

echo dirname(__FILE__);
/var/www/html/testa/testb

echo basename(__FILE__);
test.php

echo realpath(__FILE__);
/var/www/html/testa/testb/test.php

var_dump(pathinfo(__FILE__));
array(4) {
  ["dirname"]=>
  string(49) "/var/www/html/testa/testb"
  ["basename"]=>
  string(8) "test.php"
  ["extension"]=>
  string(3) "php"
  ["filename"]=>
  string(4) "test"
}


pathinfo(__FILE__)[]

echo pathinfo(__FILE__)["dirname"];
/var/www/html/testa/testb

echo pathinfo(__FILE__)["basename"];
test.php

echo pathinfo(__FILE__)["extension"];
php

echo pathinfo(__FILE__)["filename"];
test


dirname + preg_split

var_dump(preg_split("/\//", dirname(__FILE__)));
array(6) {
  [0]=>
  string(0) ""
  [1]=>
  string(3) "var"
  [2]=>
  string(3) "www"
  [3]=>
  string(7) "html"
  [4]=>
  string(5) "testa"
  [5]=>
  string(5) "testb"
}


dirname + preg_split + count - 1

echo preg_split("/\//", dirname(__FILE__))[count(preg_split("/\//", dirname(__FILE__))) - 1];
testb


realpath + preg_split

var_dump(preg_split("/\//", realpath(__FILE__)));
array(7) {
  [0]=>
  string(0) ""
  [1]=>
  string(3) "var"
  [2]=>
  string(3) "www"
  [3]=>
  string(7) "html"
  [4]=>
  string(5) "testa"
  [5]=>
  string(5) "testb"
  [6]=>
  string(8) "test.php"
}

realpath + preg_split + count - 1

preg_split("/\//", realpath(__FILE__))[count(preg_split("/\//", realpath(__FILE__))) - 1];
test.php

---

PHP source code

<?php

echo 'echo getcwd();<br>' . getcwd();
echo "<br>";

echo "<br>";
echo "<b>__DIR__ ( Magic constant )</b><br>";

echo "<br>";
echo "echo __DIR__;<br>";
echo __DIR__;
echo "<br>";

echo 'echo getcwd(__DIR__);<br>' . getcwd(__DIR__);
echo "<br>";
echo 'echo dirname(__DIR__);<br>' . dirname(__DIR__);
echo "<br><br>";
echo 'echo basename(__DIR__);<br>' . basename(__DIR__);
echo "<br><br>";
echo 'echo realpath(__DIR__);<br>' . realpath(__DIR__);
echo "<pre>";
echo 'var_dump(pathinfo(__DIR__));<br>';
var_dump(pathinfo(__DIR__));
echo "</pre>";

echo "<b>__FILE__ ( Magic constant )</b><br>";

echo "<br>";
echo "echo __FILE__;<br>";
echo __FILE__;
echo "<br>";

echo 'echo getcwd(__FILE__);<br>' . getcwd(__FILE__);
echo "<br>";
echo 'echo dirname(__FILE__);<br>' . dirname(__FILE__);
echo "<br><br>";
echo 'echo basename(__FILE__);<br>' . basename(__FILE__);
echo "<br><br>";
echo 'echo realpath(__FILE__);<br>' . realpath(__FILE__);
echo "<pre>";
echo 'var_dump(pathinfo(__FILE__));<br>';
var_dump(pathinfo(__FILE__));
echo "</pre>";

echo "pathinfo(__FILE__)[]";
echo "<br>";
echo 'echo pathinfo(__FILE__)["dirname"];<br>';
echo pathinfo(__FILE__)["dirname"];
echo "<br>";

echo "<br>";
echo 'echo pathinfo(__FILE__)["basename"];<br>';
echo pathinfo(__FILE__)["basename"];
echo "<br>";

echo "<br>";
echo 'echo pathinfo(__FILE__)["extension"];<br>';
echo pathinfo(__FILE__)["extension"];
echo "<br>";

echo "<br>";
echo 'echo pathinfo(__FILE__)["filename"];<br>';
echo pathinfo(__FILE__)["filename"];
echo "<br>";

echo "<br>";
echo "<pre>";
echo 'var_dump(preg_split("/\//", dirname(__FILE__)));<br>';
var_dump(preg_split("/\//", dirname(__FILE__)));
echo "</pre>";

echo "<br>";
echo 'echo preg_split("/\//", dirname(__FILE__))[count(preg_split("/\//", dirname(__FILE__))) - 1];<br>';
echo preg_split("/\//", dirname(__FILE__))[count(preg_split("/\//", dirname(__FILE__))) - 1];
echo "<br>";

echo "<br>";
echo "<pre>";
echo 'var_dump(preg_split("/\//", realpath(__FILE__)));<br>';
var_dump(preg_split("/\//", realpath(__FILE__)));
echo "</pre>";

echo "<br>";
echo 'preg_split("/\//", realpath(__FILE__))[count(preg_split("/\//", realpath(__FILE__))) - 1];<br>';
echo preg_split("/\//", realpath(__FILE__))[count(preg_split("/\//", realpath(__FILE__))) - 1];
echo "<br>";

?>

No guarantee. No warranty. No support.
Use at your own risk.

Weiterlesen »

Freitag, 22. Dezember 2017

MySQL count database table columns with PHP

Count all columns of a MySQL database table with PHP and get out the number.

Procedural style

<?php

$select_count_columns = "
SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE table_schema = 'database_name'
AND table_name = 'table_name'
";

$database_connect = mysqli_connect("localhost", "user", "password", "database_name");

$database_connect_select_count_columns = mysqli_query($database_connect, $select_count_columns);

$database_connect_select_count_columns_result = mysqli_fetch_array($database_connect_select_count_columns);

$database_connect_select_count_columns_result_number = $database_connect_select_count_columns_result[0];

echo $database_connect_select_count_columns_result_number;

mysqli_close($database_connect);

?>
Weiterlesen »

Mittwoch, 20. Dezember 2017

Encoding & Charset in HTML/PHP/... mit notepad++

Das Thema Encoding und Charset bei HTML und PHP ist ein etwas kompliziertes, da die Definition der beiden Begriffe in der Verwendung der Begriffe nicht immer Beachtung findet und es Überschneidungen gibt. Das Thema betrifft auch Text Dateien, CSS Dateien, .htaccess Dateien, Javascript und sonstige Script Dateien sowie Computer-Dokumente im Allgemeinen.

Der Begriff Encoding meint eine Enkodierung eines Dokuments. Ein Dokument kann hier ein HTML oder PHP Dokument sein, dass die File Extension .html oder .php hat. Das Encoding wird beim Abspeichern eines Dokuments vorgenommen. Das Decoding wird beim Abrufen des Dokuments vorgenommen.

Der Begriff Charset meint den character set (Zeichensatz), der in einem HTML oder PHP Dokument verwendet wird. Das Charset dient zur Attribution (Zuschreibung von Eigenschaften) eines Dokuments. Mit der Charset Attribution wird angegeben, welches character set verwendet wird. Die Charset Attribution gibt Rückschlüsse auf das verwendete Encoding.

Die Namen der Kodierungs-Codes und der zugehörigen Charset Attributions sind grob gesehen gleich. Aus diesem Grund werden bei der Verwendung der Namen die beiden Begriffe Encoding und Charset von ihrer eigentlichen Definition gelöst und als allgemeine Begriffe verwendet.


Verwendet wurden folgende Programme:
npp.7.5.1.bin.x64 (portable)
WinSCP 5.11.2 (portable)
- Internal Editor
- npp.7.5.1.bin.minimalist.x64 (portable)
Hinweis: notepad++ 7.5.2 und 7.5.3 hat Probleme mit dem Encoding.


Reine Text-Dokumente wie HTML, PHP, TXT, CSS, JS, JSON und so weiter haben keinen File Header, in dem das Encoding angegeben ist. Deshalb wird das Encoding als Attribution im Dokument mitgeliefert und aus dieser Angabe ein File Header erzeugt.
Im folgenden einige Beispiele von File Headern anderer Dateien.
Mit notepad++ kann der File Header von Dateien angezeigt werden.

Code: Plugins - MIME Tools - Quoted-printable Encode
HEX: Plugins - Converter - ASCII -> HEX

JPEG File Interchange Format (JFIF)
Code: =FF=D8=FF=E0 =10JFIF
HEX: 3D46463D44383D46463D4530203D31304A464946

Portable Network Graphics (PNG)
Code: =89PNG
HEX: 89504E47

Portable Document Format (PDF)
Code: %PDF
HEX: 25504446

MP3 (MPEG-1 Audio Layer III / MPEG-2 Audio Layer III, Moving Picture Experts Group)
Code: ID3
HEX: 494433

Bei UTF-8-BOM, UTF-16-BOM und UTF-32-BOM wird ähnlich wie bei JPEG, PDF, PNG, MP3, ... am Anfang der Datei eine Markierung gesetzt - das sogenannte Byte Order Mark (BOM) - woran das Encoding erkannt werden kann. Allerdings zeigen einige Programme dieses Byte Order Mark mit an, zB auf der Webseite, was unerwünscht ist.

Encoding BOM in hexadecimal BOM in decimal BOM in CP1252
UTF-8 EF BB BF 239 187 191 
UTF-16 (BE) FE FF 254 255 þÿ
UTF-16 (LE) FF FE 255 254 ÿþ
UTF-32 (BE) 00 00 FE FF 0 0 254 255 ␀␀þÿ
UTF-32 (LE) FF FE 00 00 255 254 0 0 ÿþ␀␀
BE = Big Endian, LE = Little Endian

Die Kodierung eines HTML, PHP, TXT und ähnlichen Dokumentes wird durch das Charset Attribut übermittelt.

Encoding = Verwendetes Encoding beim Speichern des Dokuments.
Charset = Angabe des verwendeten Encodings.

Wenn die Kodierung eines Dokuments von dem Charset Attribut abweicht, kommt es zu Anzeigefehlern der characters (Zeichen). Einige Tools können die Kodierung eines Dokuments an den im Dokument verwendeten characters erkennen. Allerdings ist dazu eine Mindestanzahl von characters notwendig, da ansonsten falsche Ergebnisse wie "ERROR: (null)", "unknown-8bit" oder "binary" angezeigt werden können.

Nicht alle Encodings werden von einer Charset Attribution unterstützt. Welche Endcodings eine Charset Attribution bekommen legt die Internet Assigned Numbers Authority (IANA) fest. Einige Encodings haben ein gemeinsames Charset Attribute.

Encoding-codes (kleine Auswahl):
ASCII UTF-8 UTF-16 UTF-32 CSUNICODE UNICODEBIG UNICODELITTLE UCS-2LE JAVA ISO-8859-1 ISO-8859-2 ISO-8859-3 ISO-8859-4 ISO-8859-5 ISO-8859-6 ISO-8859-7 ISO-8859-8 ISO-8859-9 ISO-8859-10 ISO-8859-11 ISO-8859-13 ISO-8859-14 ISO-8859-15 ISO-8859-16 KOI8-R KOI8-U KOI8-RU WINDOWS-1250 (CP1250) WINDOWS-1251 (CP1251) WINDOWS-1252 (CP1252) WINDOWS-1253 (CP1253) WINDOWS-1254 (CP1254) WINDOWS-1255 (CP1255) WINDOWS-1256 (CP1256) WINDOWS-1257 (CP1257) WINDOWS-1258 (CP1258) CSPC862LATINHEBREW MACINTOSH MACCENTRALEUROPE MACICELAND MACCROATIAN MACROMANIA MACCYRILLIC MACUKRAINE MACGREEK MACTURKISH MACHEBREW MACARABIC MACTHAI ATARI

Charset Attributes (kleine Auswahl):
EUC-JP US-ASCII UTF-8 UTF-16 UTF-32 ISO-8859-1 ISO-8859-2 ISO-8859-3 ISO-8859-4 ISO-8859-5 ISO-8859-6 ISO-8859-7 ISO-8859-8 ISO-8859-9 ISO-8859-10 WINDOWS-1250 WINDOWS-1251 WINDOWS-1252 WINDOWS-1253 WINDOWS-1254 WINDOWS-1255 WINDOWS-1256 WINDOWS-1257 WINDOWS-1258 Windows-31J IBM-Symbols Big5 macintosh

Das Charset Attribute "US-ASCII" (ASCII) gilt für diese Encodings (Aliases):
iso-ir-6 ANSI_X3.4-1968 ANSI_X3.4-1986 ISO_646.irv:1991 ISO646-US US-ASCII us IBM367 cp367 csASCII

Die Charset Attribution eines Encodings kann an verschiedenen Stellen vorgenommen werden.

HTML header meta tag (HTML4)
<meta http-equiv="content-type" content="text/html; charset=utf-8">

HTML header meta tag (HTML5)
<meta charset="UTF-8">
- Die Angabe muss bei HTML5 innerhalb der ersten 1024 Bytes des Dokuments stehen.
- Die Angabe des Mime Types (text/html) als meta tag wurde gestrichen.
Beispiel HTML5 Header:
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
Info: Ein schließender Slash "/" (<meta charset="UTF-8" />) ist nur in XHTML notwendig.

XHTML5 header (.xhtml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta charset="UTF-8" />
- Ein .xhtml Dokument wird als XML Dokument gekennzeichnet.
- Die Angabe eines meta tag in <head> ist nicht notwendig.
- Die erste Zeile muss als erste Zeile im Dokument stehen.
"XML declaration allowed only at the start of the document"
- Bei XHTML müssen innerhalb des <html> tags alle HTML Tags mit einem Slash geschlossen werden "<meta ... />", <img ... />, ... , sowie wie in HTML </head>, </span>, </p>, </body>, </html>.

XHTML5 und PHP (.php)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<?php header("Content-type: text/html; charset=UTF-8"); ?>
- Bei XHTML5 mit PHP muss die file extension .php gesetzt werden.
- Die Angabe eines meta tag in <head> ist nicht notwendig.
- Bei XHTML müssen innerhalb des <html> tags alle HTML Tags mit einem Slash geschlossen werden "<meta ... />", <img ... />, ... , sowie wie in HTML </head>, </span>, </p>, </body>, </html>.

PHP header (.php)
header("Content-type: text/html; charset=UTF-8");
- erste Zeile nach <?php.
- wenn im Dokument PHP mit HTML vermischt ist, dann die file extension .php vergeben und den PHP header noch vor den HTML header setzen.
Beispiel (.php):
<?php header("Content-type: text/html; charset=UTF-8"); ?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
- Die Mime Types "application/x-httpd-php" und "application/x-httpd-php-source" veranlassen, dass der PHP Code in einem .php Dokument bei einem Aufruf im Browser nicht ausgeführt wird, sondern das Dokument zum Download angeboten wird. Bei einem .phtml Dokument wird mit diesen Mime Types der PHP Code nicht ausgeführt und im Quellcode angezeigt.

CSS header (.css)
@charset "UTF-8";
- Erste Zeile in der CSS Datei

Javascript (.js)
<script src="javascript.js" charset="UTF-8"></script>
- bei Javascripts ist eine Attribution nicht direkt im Dokument möglich.

.htaccess mod_mime
<IfModule mod_mime.c>
AddType text/html .html .phpAddType text/css .css
AddType application/javascript .js
AddType application/xhtml+xml .xhtml .xml
AddCharset UTF-8 .html .php .css .js .xhtml .xml
</IfModule>
- Der Mime Type "text/javascript" ist veraltet.
- Eine .htaccess Datei in UTF-8-BOM Encoding funktioniert nicht.

Wichtig ist, dass das Charset Attribut mit dem Encoding des Dokuments überein stimmt.

MIME TYPES Liste
Die komplette Liste aller von der IANA empfohlenen mime types:
http://www.iana.org/assignments/media-types/media-types.xhtml

Mit folgenden Linux Tools auf der Kommandozeile kann das Encoding und Charset Attribute ausgelesen werden.
Allerdings haben die Tools so ihre Eigenarten. Für das Tool file muss eine Mindestanzahl an Zeichen im Dokument vorhanden sein. Zudem zeigt file bei einem Dokument, das in einem Superset (zB UTF-8) gespeichert wurde und nur Zeichen eines Subsets (ASCII) des Supersets (UTF-8) beinhaltet, das Subset (ASCII) an.

curl
[user@server ]$ curl -I https://www.example.com/example.php
Content-Type: text/html; charset=UTF-8

HEAD
[user@server ]$ HEAD https://www.example.com/example.html
Content-Type: text/html; charset=utf-8

file
[user@server ]$ file -b --mime-type --mime-encoding /var/www/html/www.example.com/example.php
text/x-php; charset=us-ascii
- file ignoriert die Angaben von Mime Type und Charset und ermittelt beides selbst neu.
- der Mime Type "x-php" ist kein offizieller Standard und wird nur von file zur Anzeige des selbst ermittelten Mime Types genutzt. Es ist möglich, dass dieser irgendwann einmal Standard werden kann, wenn er sich durchsetzt, ansonsten nicht.

wget
[user@server ]$ wget --spider --server-response https://www.example.com/example.php
Content-Type: text/html; charset=UTF-8

Was zu Problemen, Anzeigefehlern und Missverständnissen führen kann ist, dass der beim speichern eines Dokuments verwendete Encoding-Code beim encoden (speichern) nicht in den File Header geschrieben wird. Jeder Encoding-Code hat gewisse Eigenheiten, an denen er eventuell erkannt werden kann. Allerdings ist das nicht zuverlässig. Deswegen soll ein Charset Attribut im Dokument angegeben werden. Dokumente haben so gesehen keinen echten File-Header, sondern der Dokumenten-Header wird als Plain-Text in das Dokument geschrieben, oder außerhalb des Dokuments angegeben. Bei einem Abruf des Dokuments wird ein Header erzeugt und das Charset Attribut darin aufgenommen.

Das Encoding findet immer auf Mindestebene statt. Deswegen sind Dokumente, die zwar in UTF-8 encoded wurden, aber nur ASCII Zeichen enthalten in ASCII encoded, da im Dokument keine Zeichen vorhanden sind, die ein UTF-8 Encoding erfordern. Hierbei spielen die Begriffe Subset und Superset eine Rolle. Das Dokument kann aber mit dem Charset Attribut UTF-8 versehen werden. Allerdings kann dieser Subset-Fallback Umstand zu Problemen führen. Editor-Tools wie notepad++ und ähnlich lesen keine Charset Attribute aus. Diese Tools erkennen das verwendete Encoding an der Kodierung der verwendeten Zeichen. Wenn nur ASCII Zeichen im Dokument vorkommen, dann wird das Dokument als in ASCII encoded geöffnet. Wenn aber das Charset Attribute UTF-8 ist und dies den Programmierer dazu veranlasst auch UTF-8 Zeichen im Dokument zu verwenden, das Dokument aber am Ende nur als ASCII encoded wird, wird es beim nächsten Öffnen des Dokuments einen Error geben.

Im Beispiel der Inhalt eines neuen Dokuments mit Umlauten und Eszett, das in notepad++ mit ANSI (ASCII) Encoding gespeichert wurde, danach geschlossen und wieder geöffnet wurde.
vorher: äöüß
HEX: C3A4C3B6C3BCC39F
nachher: הצ
HEX: D794D7A6EFA295EFA293

Ein wiederherstellen ist nicht möglich.

Der WinSCP interne Editor bietet ein Fallback auf "1252 (ANSI - Lateinisch I)", wenn ein Dokument als UTF-8 geöffnet werden soll, aber enthaltene Zeichen exklusive Windows-1252 characters sind. Das passiert, wenn ein Dokument mit Windows-1252 characters mit Encoding Windows-1252 gespeichert wurde und in den WinSCP Preferences für den Editor als Default UTF-8 gesetzt wurde. Der WinSCP interne Editor versucht also das Dokument im Default UTF-8 encoding zu öffnen und benachrichtigt mit "Error loading file", dass das Dokument nicht in UFT-8 encoding geöffnet werden kann, (weil Nicht-UTF-8 characters darin vorkommen, die nicht mit UTF-8 encoding gespeichert wurden).
Encoding und Charset in HTML PHP WinSCP editor

Allerdings bringt WinSCP in seinem Editor die Begriffe durcheinander. Mit "1252 (ANSI - Lateinisch I)" ist entweder Windows-1252 gemeint, oder ISO-8859-1 (Lateinisch I) und das "ANSI" wurde zur endgültigen Verwirrung noch hinzugefügt. Es werden also 2 Encoding-Codes mit einem Überbegriff mit einmal erwähnt. Dazu muss erwähnt werden, dass sogar auf seriösen Webseiten unter dem Begriff "charset" Windows-1252 als ANSI bezeichnet wird, wohingegen ISO-8859-1 als "Lateinisch I" gilt.
Vom character code point 0 bis 255 sind die characters im charset ISO-8859-1 und charset UTF-8 gleich. Windows-1252 enthält im code point range 0 bis 255 die gleichen characters wie ISO-8859-1 und UTF-8 plus zusätzliche characters (€  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ). Das charset UTF-8 hat ab code point 256 noch sehr viele characters mehr.
Ein Test hat ergeben, dass im WinSCP internen Editor mit "1252 (ANSI - Lateinisch I)" das Encoding Windows-1252 (CP1252) gemeint ist. Windows-1252 ist ein Superset von den charsets ASCII und ISO-8859-1 sowie innerhalb der code points 0 bis 255 auch vom charset UTF-8. Der WinSCP interne Editor zeigt Windows-1252 control points als Leerzeichen an (Beispiel: Alt+ 0129 in Microsoft Windows).

Die Begriffe ASCII, ANSI, Windows-1252 (CodePage 1252, CP1252), ISO-8859-1 (Windows Latin 1) und UTF-8 werden auch in anderen Programmen nicht immer eindeutig verwendet. Im Editor-Tool notepad++ verbirgt sich unter dem Menü-Punkt Encoding bei "Encode in ANSI" das Windows-1252 encoding in einfacher Form. Control characters werden nicht angezeigt. Erst wenn über den Untermenü-Punkt Character set - Western Europe - Windows-1252 ausgewählt wird, erscheinen die Control characters mit ihrem Namen in einem schwarzen Kästchen (Beispiel: Alt+ 0129 in Microsoft Windows).
Nun gibt es in den WinSCP Preferences unter den Einstellungen für New Document die Möglichkeit für ein Fallback "Apply to opened ANSI files". Wenn an dieser Stelle "ANSI" das Windows-1252 encoding/charset meinen würde, dann würde dies mit einem Dokument, das die characters enthält, die Windows-1252 im code point range 0 bis 255 zusätzlich zu UTF-8 enthält, nicht funktionieren. Also ist an dieser Stelle mit ANSI maximal ISO-8859-1 gemeint. Die Angelegenheit kann in notepad++ überprüft werden.
In notepad++ kann das euro sign mit dem shortcut ALT+ 0129 in Microsoft Windows jederzeit geschrieben werden. Danach kann es in verschiedenen Encoding-Codes gespeichert werden. Notepad++ zeigt nach dem erneuten öffnen des Dokuments "Encoded in ANSI" an, was nicht gleich Windows-1252 bedeuten muss, aber zumindest hat kein "Apply to opened ANSI files" (in UTF-8) stattgefunden. In ISO-8859-1 gibt es dieses Zeichen nicht. Der hexadecimale Code verrät das Encoding.
Ein Beispiel mit dem euro sign (Euro Zeichen, Alt+ 0128 in Microsoft Windows).
Das Zeichen markieren, dann
Menüleiste: Plugins - Mime Tools - Quoted-printable Encode

UTF-8
Plain: €
HEX: =E2=82=AC

Windows-1252
Plain: €
HEX: =80

Im Test wurde "=80" angezeigt, was bedeutet, dass das "ANSI" in "Apply to opened ANSI files" nur ISO-8859-1 und kein Windows-1252 meint und das "ANSI" in "Encoded in ANSI" auch Windows-1252 meint.
Hiermit sollte klar sein, dass an vielen Stellen mit ANSI nicht gleich ANSI gemeint ist.

Mit ANSI (American National Standards Institute) als Encoding oder Charset kann gemeint sein:
ASCII -  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
abcdefghijklmnopqrstuvwxyz{|}~
Windows-1252 (CodePage 1252, CP1252) - Superset von ASCII, Teilset von ISO-8859-1.
ISO-8859-1 - Superset von ASCII, Teilset von Windows-1252.

UTF-8 ist ein Superset von ASCII. ASCII ist ein Subset von UTF-8.
Mit dem Begriff "UTF-8" kann folgendes gemeint sein:
- ein Encoding-Code
- ein Charset Attribute
- ein Charset innerhalb der Code Points 0 bis 10FFFF im UNICODE.


Mit notepad++ können Dokumente Enkodiert (Encode) und das Encoding konvertiert (Convert) werden. Im Unter-Menü "Character sets" sind weitere Encoding-Codes zu finden. 
Encoding und Charset in HTML PHP notepad++

In notepad++ kann auch ein Fallback von ASCII und ISO-8859-1 (ANSI) auf UTF-8 eingeschaltet werden. Das bedeutet, dass als ASCII oder und ISO-8859-1 encoded Dokumente als in UTF-8 encoded geöffnet werden, also das Subset ASCII und und ISO-8859-1 mit Superset UTF-8 geöffnet wird ("Apply to opened ANSI files"). Das soll verhindern, dass Dokumente, die auch UTF-8 charcters enthalten sollen dürfen und das charset Attribute UTF-8 haben, aber nur ASCII oder ISO-8859-1 charcters enthalten, nicht als "Encoded in ANSI", sondern als "Encoded in UTF-8" geöffnet werden, damit sie auch wieder in UTF-8 encoding gespeichert werden und nicht in ANSI, was das Dokument zerstören könnte. Mit dem Begriff "ANSI" ist an dieser Stelle nicht Windows-1252 gemeint.
Encoding und Charset in HTML PHP notepad++


Keine Garantie. Keine Gewähr. Kein Support.
Benutzung auf eigenes Risiko.
Weiterlesen »

Montag, 18. Dezember 2017

Uberspace Quota Tutorial & Clearing

Als Disk Quota, kurz Quota, wird auf Unix Systemen die Begrenzung des Festplatten-Speicherplatzes für User und/oder Groups auf Mehrbenutzersystemen bezeichnet. In diesem Tutorial wird die Quota auf Uberspace Accounts anhand von Kommandozeilen-Befehlen (Command-line commands) auf der Shell (SSH) erklärt.

Die Quota ist sowas wie eine Partition für einen User.

Uberspace gibt jedem User eine Quota von 10 GB Speicherplatz. Diese 10 GB werden in der Quota als Soft Limit gesetzt. Das Hard Limit beträgt 11 GB bei einer Grace Periode (Gnadenfrist) von 7 Tagen. Die Grace Periode wird bei Überschreitung des Soft Limits gesetzt. Ein User hat also bei Überschreitung seines Soft Limits von 10 GB genau 7 Tage lang Zeit seinen belegten Speicher zu bereinigen (clearing). Mehr als das Hard Limit von 11 GB kann ein User nicht belegen.

Bei Uberspace wird in die Quota, also dem Festplattenspeicher pro User (Partition per User), auch die Größe der belegten Datenbanken mit einberechnet.

Die erste Quota Info ist im Webinterface, also nach Login in den eigenen Benutzerbereich auf uberspace.de/dashboard unter "Datenblatt" zu finden.
AUF DIESEM SERVER LIEGT DEIN UBERSPACE
Quota
Deine Dateien belegen aktuell 952M.
Deine MySQL-Datenbanken belegen aktuell 2.1G (Dieser Wert wird alle 5 Minuten aktualisiert).
Insgesamt belegst du also 3.0G von 10G (Das entspricht 30%). 
Hinweis: Uberspace verwendet den Begriff "Quota" leider zweideutig. Die eigentliche Definition von Quota meint ein Kontigent, das zur Verfügung steht. Uberspace verwendet den Begriff Quota auch im Zusammenhang für den freien und belegten Speicherplatz. Die Quota ist bei Uberspace immer für jeden User 10 GB plus 1 GB für die Grace Periode.

Eine weitere Infoquelle ist die Quota-Warning-Email. Diese Email ist eine Notification-Email, wenn der belegte Speicherplatz das Soft Limit von 10 GB überschritten hat und die Grace Periode gestartet wurde.
Bereff: [warning] Dein Uberspace »user« ist voll
In der Quota-Warning-Email werden jede Menge Verzeichnisse aufgelistet und wie viel Speicherplatz sie belegen, darunter auch die Verzeichnisse der Datenbanken, sowie jeweils eine Summe. Hier jetzt bei den Datei-Verzeichnissen nur die Summen. Die Datenbanken werden nur einzeln aufgeführt.
3.5G    /home/user
947M    /var/www/virtual/user
8.0K    /var/lib/mysql/
12M     /var/lib/mysql/user_abc
2.1G    /var/lib/mysql/user_xyz
344K    /var/lib/mysql/user_123
In dieser Quota-Warning-Email Aufzählung fehlt allerdings zwei Quellen von temporären Verzeichnissen. Diese können unter Umständen sehr viel Speicherplatz belegen, wenn es zB Probleme beim installieren eines Programmes mit linuxbrew/homebrew gibt.
Es bestehen 3 temporäre Verzeichnisse.
/tmp/
/var/tmp/
/home/user/tmp/
In allen 3 Verzeichnissen liegen die File Permissions (Dateiberechtigungen) bei den Usern, von denen diese stammen. Die ersten beiden werden nicht in der Quota-Warning-Email aufgelistet, aber zählen zur Berechnung der Quota dazu.

3 Kommandozeilen-Befehle zum Anzeigen der eigenen temporären Dateien.
username=`id -n -u`; ls -oh /tmp/ 2>&1 | grep $username
username=`id -n -u`; ls -oh /var/tmp/ 2>&1 | grep $username
username=`id -n -u`; ls -oh /home/user/tmp/ 2>&1 | grep $username
Ein Ergebnis sieht in etwa so aus:
drwxr-xr-x.    2    user    4.0K    Dec 13 19:16    hsperfdata_user
Die Dateien und Ordner, die als Owner den eigenen Namen tragen, können von diesem selbst gelöscht werden. In den temporären Verzeichnissen können die eigenen Dateien selbst gelöscht werden.

Es besteht ein Script, das die temporären Dateien in den ersten beiden erwähnten Verzeichnissen (/tmp, /var/tmp) täglich nach der access time (letzter Zugriff) überprüft und gegebenenfalls löscht.
/etc/cron.daily/tmpwatch
Uberspace nutzt hierfür das gleichnamige Programm tmpwatch.
which -a tmpwatch
/usr/bin/tmpwatch
/usr/sbin/tmpwatch 
/usr/bin/tmpwatch -> ../../usr/sbin/tmpwatch
In dem Script /etc/cron.daily/tmpwatch steht der Zeit-Parameter für das Löschen der temporären Dateien (10d = 10 Tage), sowie die Verzeichnisse und Dateien, die davon ausgeschlossen sind (-x, -X).
10d /tmp

-x /tmp/.X11-unix
-x /tmp/.XIM-unix
-x /tmp/.font-unix
-x /tmp/.ICE-unix
-x /tmp/.Test-unix
-X '/tmp/hsperfdata_*'
-X '/tmp/.hdb*lock'
-X '/tmp/.sapstartsrv*.log'
-X '/tmp/pymp-*'

30d /var/tmp
Desweiteren löscht das Script /etc/cron.daily/tmpwatch noch einiges in diesen Verzeichnissen automatisch nach 30 Tagen Nichtbenutzung.
30d /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}
Dort liegt aber hauptsächlich Kram von root.

Mit "man tmpwatch" sind mehr Informationen über das Programm tmpwatch in Erfahrung zu bringen.


Die nächsten Infoquellen für den noch freien und bereits belegten Speicherplatz sind ebenfalls über die Kommandozeile in der Shell zu finden.
Bei Uberspace ist jeder User eine eigene Gruppe. (Owner = Group)
quota -gsl
Disk quotas for group user (gid 541):
Filesystem blocks quota limit grace files quota limit grace
/dev/vda1  952M   8139M 9163M       8237  0     0
blocks = belegter Speicherplatz an Dateien und Ordner
quota = Soft Limit mit Abzug des Datenbanken-Speicherplatzes
limit = Hard Limit mit Abzug des Datenbanken-Speicherplatzes
grace = verbleibende Tage bei einer Grace Periode
files = Anzahl der Dateien
Uberspace setzt kein file quota, file limit, file grace, dessen Spalten mit angezeigt werden.

Der nächste Kommandozeilen-Befehl ist ein Uberspace internes Script. Hier werden die temporären Dateien in /tmp/ und /var/tmp/ mit aufgelistet.
uberspace-show-quota
Your quota
 what                 usage in MB
==============================
 Home.directory:      4
 DocumentRoot:        946
 System.maildir:      0
 vmailmgr.maildirs:   0
 temporary.files:     0
 temporary.files.var: 0
 MySQL.databases:     2101
==============================
 combined:            3051
Uberspace verwendet hier den Begriff Quota, obwohl nur der belegte Speicherplatz angezeigt wird. Hier werden jetzt alle temporären Verzeichnisse und der Datenbanken-Speicherplatz angezeigt. Zusammen mit dem Ergebnis vom vorherigen Befehl kann die Quota validiert werden.

quota = 8139M
MySQL.databases: 2101
8139 + 2101 = 10240 / 1024 = 10 GB

limit = 9163M
MySQL.databases: 2101
9163 + 2101 = 11264 / 1024 = 11 GB


Keine Garantie. Keine Gewähr. Kein Support.
Benutzung auf eigenes Risiko.
Weiterlesen »

Sonntag, 17. Dezember 2017

Windows 7 "Öffnen mit" / "Open with" Portable Programms

Es kann unter Umständen zu Problemen führen, wenn ein Programm ein anderes ablösen soll oder wenn eine portable Version ein installiertes Programm ablösen soll, oder wenn mehrere verschieden Versionen eines portablen Programms verwendet werden sollen, sowie in vielen ähnliche Situationen.

Windows 7 Öffnen mit Open with Portable Programms


Weiterlesen »

Dienstag, 8. August 2017

Auswirkungen des Geburtenknicks in Ostdeutschland (2016)

Der Geburtenknick Anfang der 1990er Jahre in den Neuen Bundesländern (Ostdeutschland) zeigt bis heute seine Auswirkungen. Aber auch der nach dem Geburtenknick erfolgte Geburtenanstieg hat bis heute Auswirkungen.

Altersunterschied Paare Geburtenknick Geschlechterverteilung Ostdeutschland

Durch den durchschnittlichen Altersunterschied von Paaren in Deutschland ist das Verhältnis der Geschlechterverteilung durch den Geburtenknick und den Geburtenanstieg stark beeinflußt worden.

Der durchschnittliche Altersunterschied von Paaren liegt in Deutschland bei 4,5 Jahren. Dabei ist der Mann älter und die Frau jünger.
Im folgenden Diagramm zeigen die grafisch dargestellten statistischen Zahlen des Geburtenknicks und des Geburtenanstiegs in den 1990er Jahren anhand vom Land Brandenburg die Auswirkungen auf das Geschlechterverhältnis.

Wegen des durchschnittlichen Altersunterschieds von Paaren ist die Geschlechterverteilung in Deutschland um 4,5 Jahre verschoben. Nicht die Geschlechter ein und desselben Jahrgangs stehen im Verhältnis zueinander, sondern die Geschlechter mit einem Geburtsjahr-Unterschied von 4,5 Jahren.
Beispiel: Die Männer mit Geburtsjahr 1990 stehen im Verhältnis zu den Frauen mit Geburtsjahr 1994/95. Insbesondere bei Geburtenknicken und starken Geburtenanstiegen hat das immense Auswirkungen.

Altersunterschied Paare Geburtenknick Geschlechterverteilung Ostdeutschland

Beim durchschnittlichen Altersunterschied von Paaren von 4,5 Jahren (Mann älter und Frau jünger) kommen in Brandenburg auf jede von 1992 bis 1994 geborene Frau zwei Männer. Im Umkehrschluss kommt auf zwei Männer nur eine Frau. Eine Single-Rate von 50% ist bei den männlichen Geburtsjahrgängen von 1987 bis 1989 statistisch vorprogrammiert.

Bei Frauen mit Geburtsjahr von 1997 bis 1999 besteht hingegen bei einem durchschnittlichen Altersunterschied von Paaren von 4,5 Jahren (Mann älter und Frau jünger) im Jahr 2015 ein durchschnittlicher Frauenüberschuß von 13%. Das bedeutet, dass beim durchschnittlichen Altersunterschied von Paaren auf 130 Frauen nur 100 Männer kommen. Statistisch gesehen können hier 3 von 10 Männern zwei Frauen haben.

Der Bevölkerungszuwachs bei den Männern mit Geburtsjahr von 1992 bis 1996 verändert die Geschlechterverteilung im durchschnittlichen Altersunterschied von Paaren positiv.

Bei Frauen mit Geburtsjahr von 2001 bis 2005 verändert der Bevölkerungszuwachs bei den Männern mit Geburtsjahr von 1997 bis 2001 die Geschlechterverteilung im durchschnittlichen Altersunterschied von Paaren negativ.

Der statistisch erhobene durchschnittliche Altersunterschied von Paaren bezieht sich auf alle Geburtsjahrgänge. Nach Geburtsjahren oder Altersjahren differenzierte Zahlen zum Altersunterschied von Paaren liegen nicht vor.

Warum im Durchschnitt bei Paaren die Frau jünger und der Mann älter ist, ist ein eigenes Thema. Geburtenknicks scheinen darauf keinen besonderen Einfluß zu haben.
Da immer weniger Frauen als Männer geboren werden ist für eine ausgewogene Geschlechterverteilung mit einem typischen Altersunterschied von Paaren mit Frau jünger und Mann älter eine stetig leicht ansteigende Geburtenrate die ideale Voraussetzung. Insbesondere Geburtenknicks verändern die Geschlechterverteilung im durchschnittlichen Altersunterschied von Paaren stark negativ.

Inwieweit ein Geburtenknick Auswirkungen auf die Zeugungsrate einer im Geburtenknick geborenen Person hat ist ebenfalls ein eigenes Thema. Für den Geburtenknick in den 1960/70er Jahren wird die Anti-Baby-Pille verantwortlich gemacht. Für den Geburtenknick in der ehemaligen DDR Anfang der 1990er Jahre die poltische Wende. Dabei fällt auf, dass die im 1960/70er-Geburtenknick geborenen zum Zeitpunkt des 1990er-Geburtenknicks im durschnittlichen Alter zum Kinder zeugen waren. Also ist es möglich, dass der Geburtenknick der 1960/70er mit eine Ursache für den Geburtenknick in den 1990er Jahren war. Denn auch in Westdeutschland gab es ab Anfang der 1990er Jahre einen Geburtenrückgang, der tendenziell bis 2010 anhielt. Es ist also möglich, dass der Geburtenknick in den 1990er Jahren ein Nachhall des Geburtenknicks in den 1960/70er Jahren ist. Allerdings scheint dieser danach verhallt zu sein.

Altersunterschied Paare Geburtenknick Geschlechterverteilung Ostdeutschland

Altersunterschied Paare Geburtenknick Geschlechterverteilung Ostdeutschland

Zuwanderung und Abwanderung hat zwar Einfluß auf die Geschlechterverteilung, aber keinen besonders großen.

Mehr detallierte grafisch dargestellte Statistiken zu den Geburtenraten, zur Geschlechterverteilung und der Geschlechterverteilung mit Altersunterschieden für jedes Geschlecht und jedes Bundesland in Deutschland und Österreich auf penultima.de.
Penultima.de/sexratio


Rohdaten-Quelle: Statistisches Bundesamt, Wiesbaden 2015, Genesis-Online; 
Datenlizenz: dl-de/by-2-0 
Darstellung: eigene Berechnung/eigene Darstellung.
Weiterlesen »

Montag, 7. August 2017

Unfälle durch aufgerissene Autotüren

Unfälle durch aufgerissene Autotüren
In der amtlichen Statistik werden die Verkehrsunfälle durch unachtsam aufgerissene Autotüren nicht separat ausgewiesen.
Diese Art von Unfällen werden der Unfallursache "Verkehrswidriges Verhalten beim Ein- und Aussteigen, Be- und Entladen" zugeordnet.
5 Ursachen von Straßenverkehrsunfällen in Berlin 2016

5.1 Fehlverhalten der Fahrzeugführer nach Art der Verkehrsbeteiligung und Unfallschwere
Verkehrswidriges Verhalten beim Ein- oder Aussteigen, Be- oder Entladen
Darunter Fahrzeugführer von
Personenkraftwagen: 452
Güterkraftfahrzeugen: 50

5.3 Straßenverkehrsunfälle und Verunglückte nach Unfallursachen
Verkehrswidriges Verhalten beim Ein- oder Aussteigen, Be- oder Entladen
Verunglückte schwer: 43
Verunglückte leicht: 479

Quelle: Amt für Statistik Berlin-Brandenburg - SB HI2-j/16-Berlin
Lizenz: Creative Commons BY
Foto: Author Jim.henderson, Lizenz public domain, Wikimedia.
Weiterlesen »

Dienstag, 7. März 2017

htaccess - Sicheres Passwort - Passwort Schutz

Überall wird einem geraten, man solle Sonderzeichen in Passwörtern verwenden. Nirgends wird dabei erwähnt, welche Sonderzeichen Probleme bereiten können. Hier nun die erlaubten Sonderzeichen für Passwörter.

Das Thema "Sichere Passwörter" muss wegen Inkompatibilität einiger Programme aus einer anderen Perspektive betrachtet werden. Niemanden nützt ein Passwortschutz, wenn die Ressource mittels dem richtigen Passwort nicht freigegeben wird. Die "Sicherheit" bei einem Passwort besteht deswegen aus sicheren Sonderzeichen, die auch wirklich funktionieren.

Beim anlegen eines .htaccess Passwort-Schutzes mittels .htpasswd passiert es am ehesten, dass die Imkompatibilität eines Programmes Probleme bereitet. Dann funktioniert das Passwort nicht, obwohl alles richtig gemacht wurde. Das Problem dabei besteht darin, dass eines der verwendeten Programme, zum Beispiel der Browser, nicht wirklich sicher UTF-8 kann. UTF-8 beinhaltet unter anderem die Umlaute äöüÄÖÜ. Hat der Browser Probleme mit dem Senden von Passwörtern mit Zeichen aus dem UTF-8 Zeichensatz, funktioniert das Passwort nicht.

Ein weiteres Problem besteht beim generieren eines htaccess Passwortes, wenn dieses über einen der im Internet zu findenden Passwort-Generatoren generiert wurde. Denn es sind darunter einige, die keine Zeichen aus dem UTF-8 Zeichensatz verwenden können. Diese Passwort-Generatoren generieren zwar ein Passwort, aber es funktioniert nicht. 

Programme, die nicht wirklich mit UFT-8 umgehen können bereiten Probleme bei Passwörtern mit bestimmten Sonderzeichen. Das kann schon beim Browser anfangen, mittels dem das Passwort übermittelt wird. Deshalb ist es ratsam auf Umlaute, wie äöüÄÖÜ und einige Sonderzeichen zu verzichten. Webmastern wird daher auch empfohlen, keine Usernamen mit Umlauten oder Sonderzeichen außerhalb des ASCII Zeichensatz zu verwenden.

Mit dem Schlagwort "ASCII" ist dieser Artikel auch schon an seinem Ziel. Wirklich sichere Passwörter bestehen nur aus Zeichen aus dem ASCII Zeichensatz. Mit diesen Zeichen kann jeder sicher sein, dass Passwörter mit allen Programmen funktionieren.

Die Zeichen im ASCII Zeichensatz:
!"#$%&'()*+,-./
0123456789
:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ
[\]^_`
abcdefghijklmnopqrstuvwxyz
{|}~

Verwende nur diese Zeichen für einen .htaccess Passwortschutz, bzw. genehmige nur diese Zeichen für Username und Passwort auf deiner Webseite und alles ist "sicher".

Bei den Passwort-Generatoren im Internet, weiß man nie, ob diese die eingegebenen Passwörter sammeln. Deshalb ist es das Beste, wenn das Passwort auf dem eigenen Server selbst generiert wird.

Tutorial: Password Protection mit der htaccess

1.) Ein Verzeichnis anlegen
Lege ein Verzeichnis an, dessen Zugang mit einem Passwort geschützt werden soll.
Beispielname für das Verzeichnis: "privat"

2.) Die .htaccess Datei
Lege in dem Verzeichnis "privat" eine neue Datei mit den Namen ".htaccess" an.
Schreibe in die .htaccess Datei folgendes:
AuthType Basic
AuthName "Privat"
AuthUserFile "/voller/pfad/zur/password/datei/.htpasswd"
Require valid-user
Bei "AuthUserFile" muss der vollständige Pfad zur Passwort-Datei angegeben werden.
Beispiel: "/var/www/virtual/username/html/privat/.htpasswd"

3.) Die .htpasswd Datei
Lege eine neue Datei mit dem Namen ".htpasswd" in dem in Punkt 2 von dir angegebenen Verzeichnis an.
Schreibe in die .htpasswd Datei die Namen und das verschlüsselte Passwort der Leute, die Zugang haben sollen.
Beispiel:
Sibille:{SHA}pkA4tgAuDbAbQf+A214iWhKIEJ4=
Privatpirat:{SHA}9JfmGc1grKUwFyPQ2ewNdHj38IU=
Meinereiner:{SHA}sjAtKfFsc+s/dYxY89gWq3snhEY=
Die verschlüsselten Passwörter kannst du wie folgt ganz einfach anlegen. Dabei müssen die Namen der Leute noch nicht in die .htpasswd Datei geschrieben sein, können aber schon drin stehen. Die folgende Anleitung funktioniert auch für das Updaten eines Passwortes für einen bestehenden Namen, sowie für das neue Anlegen eines Namens mit Passwort.

Wenn ein Zugriff auf die Shell (Kommandozeile) besteht, kann ein .htpasswd Passwort in Apache mit folgender Kommandozeile in SHA1 Hash angelegt werden. Bereits bestehende Passwörter werden dabei überschrieben.
Zuvor muss die Datei .htpasswd angelegt worden sein.

htpasswd -bs /verzeichnis/zur/htpasswd/datei/.htpasswd username passwort

Ohne vorher angelegte .htpasswd:
htpasswd -cbs /verzeichnis/zur/htpasswd/datei/.htpasswd username passwort

oder, wenn die .htpasswd im gleichen Verzeichnis wie die .htaccess (mit dem "Require") ist, dann nur:

htpasswd -bs .htpasswd username passwort

Ohne vorher angelegte .htpasswd:
htpasswd -cbs .htpasswd username passwort

"username" = Der Name für den Login.
"passwort" = Das dazugehörige Passwort für den Login.

In Apache 2.4 kann ein Passwort auch in bcrypt erstellt werden.

htpasswd -bB /verzeichnis/zur/htpasswd/datei/.htpasswd username passwort

Ohne vorher angelegte .htpasswd:
htpasswd -cbB /verzeichnis/zur/htpasswd/datei/.htpasswd username passwort

Nach dem Schließen der Shell (exit) bitte die Datei ".bash_history" leeren, da der Befehl samt blankem Passwort dort gespeichert wird.

Sollen die Dateien in einem Verzeichnis im Browser angezeigt werden anstatt eine PHP oder HTML Webpage, dann diese Zeile in die .htaccess im passwortgeschützten Verzeichnis schreiben.

Options +Indexes

Ausschluss-Klausel: Keine Garantie. Keine Gewähr. Kein Support. Anfragen zwecklos.
Weiterlesen »

Samstag, 25. Februar 2017

Gender-Anleitung mit Genus(s) & Sexus

Das Gendern ist ein Eingriff von Politik in eine jahrtausendealte kulturhistorische Sprache. Der nicht abgeschlossene Kulturkampf, der das Eingreifen von Politik in die Kultur verhindern soll, ist dafür verantwortlich zu machen.

Gender Anleitung TutorialDie Umgangssprache bildet sich aus den gesellschaftlichen Verhältnissen. Mit Sprache die gesellschaftlichen Verhältnisse zu ändern zieht das Pferd von hinten auf. Schäden in der Sprache sind damit vorprogrammiert. Ohne Zwang ist es nicht durchsetzbar. Eine Disziplinierung unabdingbar. Als Randbemerkung muss sich das Gendern dem Sexismus-Vorwurf stellen.

Anhand von Beispielen soll gezeigt werden, dass die Flexibilität der Sprache dem Gendern überlegen ist.

In Einzelform ist die geschlechtsspezifische Ansprache einer Person abhängig davon, ob die anzusprechende Person sich mit diesem Geschlecht identifizieren kann. Dabei kann es gerade bei Transgender zu Komplikationen führen, oder auch bei geschlechtsneutralen Vornamen wie "Vivian".

Los geht's mit dem Gendern!

Fangen wir mit "den Fußgängern" an, die bei Rot über eine Straße gehen.
Das Gendern verlangt hier ein "den Fußgänger-innen", "den FußgängerInnen" (Binnen I), oder "den Fußgängerinnen und Fußgängern".

Randbemerkung
Hier jetzt gleich zum Anfang die Randbemerkung zum Sexismus-Vorwurf:
Das "den Fußgänger-innen" enthält die Bindestrich Version "-innen". In Einzelform als "-in" verwendet. Beide Versionen vermitteln ein "Innen". Der Begriff "Innen" weißt geschlechtsbezogen auf das primäre weibliche Geschlechtsorgan, das innen liegt. In vielen Wörtern mit "-innen" steht zudem ein "r" davor, mit dem ein "r-innen" entsteht, das bei der Aussprache als "rinnen" betont wird. Das Wort "Rinnen" weißt geschlechtsbezogen auf den Schlitz des primären weiblichen Geschlechtsorgans. Zudem ist das Wort "Rinne" in der Umgangssprache mit der Abflussrinne am Rinnstein (Gehweg-Randstein) verknüpft, der als Begriff mit Schmutz in Verbindung steht.
Die Sprache ist nicht so simpel, als dass sie dies ignorieren könnte. Sie ist eine kulturhistorisch gewachsene und keine durch Disziplinierung entstandene. Allerdings wurde sie auch missbräuchlich verwendet und missverstanden, woraus u. a. die Wortendung -in entstand, die die Sprache verwirrt.
Mit dem Gendern wird eine Person auf ihr Geschlecht reduziert. Sie ist dann nicht mehr nur ein Fußgänger, sondern ein Fußgänger mit Vagina oder Penis, was sexistisch ist.

Weiter geht's mit dem Gendern!

Ist Vivian nun eine Fußgängerin oder ein Fußgänger? Vivian ist zuvorderst eine zu Fuß gehende Person mit dem Namen Vivian. Somit stehen in der Sprache diese Versionen zur Verfügung:
Die/Der Fußgänger/in Vivian überquerte die Straße bei Rot.
Vivian überquerte die Straße als zu Fuß gehende Person bei Rot.
Vivian überquerte die Straße zu Fuß bei Rot.
Ist der Name der Person nicht bekannt:
Die Person überquerte die Straße zu Fuß bei Rot.
("Der Person" oder "Die Person-in" ist ein Sprachkrampf.)
Nebenbei wird dabei der Person (Vivian) kein Status (Fußgänger) verliehen, der als Begriff mit Inhalten belegt ist.
Ohne eine bestimmte Person im Visier zu haben, stehen sich diese beiden Version gegenüber:
Ein/e Fußgänger/in überquerte die Straße bei Rot.
Eine Person zu Fuß überquerte die Straße bei Rot.
Eine Person per pedes überquerte die Straße bei Rot.
Hierbei ist "Person zu Fuß" ein gleichgestellter Begriff wie "Fußgänger" und bleibt geschlechtsneutral.

Genus & Sexus

Das Genussystem in der deutschen Sprache ist unabhängig vom biologischen Geschlecht eines Individuums. Für die Unterscheidung des biologischen Geschlechts eines Individuums ist der Sexus zuständig. Leider ist das in viele Köpfe nicht hineinzubringen, bzw. das Missverständnis herauszubringen. Es macht den Leuten zu viel Spaß, damit zu spielen. Aber es verwirrt sie so sehr, dass sie nicht mehr zwischen Spiel und Ernst unterscheiden können.

Du dumme Gans. (Die Gans = Genus weiblich. Ohne Sexus. meist ein Weib gemeint, weil der Genus weiblich ist und es ein Eigenwort für die männliche Gans gibt, "Der Gänserich".)
Du dummer Vogel. (Der Vogel = Genus männlich. Ohne Sexus. meist ein Mann gemeint, weil der Genus männlich ist.)

Diese Verwirrung soll mit der Gender-Sprache bereinigt werden.

Du dumme Gänsin.
Du dumme Vögelin.

Das "Geschlecht" im Genus hat nichts mit den Geschlechtsteilen zu tun. Für die Geschlechtsteile ist der Sexus zuständig.

Der Genus:
maskulines Genus (männliches Geschlecht), kurz: Maskulinum.
feminines Genus (weibliches Geschlecht), kurz: Femininum.
neutrales Genus (sächliches Geschlecht), kurz: Neutrum.

Info: Der Genus "sächlich" gibt keine Auskunft darüber, ob es sich um eine "Sache" handel, oder ein "Individuum". Aber auch dies wird missbräuchlich verstanden. "Das Weib" soll weniger wert sein, da es im Genus scheinbar nur eine Sache ist.

Kurze Erläuterung anhand eines alten Sprichworts:
"Jeder Topf findet seinen Deckel."
Der Topf.
Der Deckel.
Wird hier der Genus missbräuchlich zum Sexus, dann ist das Sprichwort eines für Homosexualität.
Es ist nur Zufall, dass der Genus manchmal dem Sexus entspricht.
Der Mann.
Der Herr.
Der Knabe.
Die Frau.
Die Dame.
Das Mädchen.
Das Weib.
Der Mann ist im Genus männlich, und im Sexus männlich, weil ein Sexus-Eigenwort.
Das Weib ist im Genus sächlich, aber im Sexus weiblich, weil ein Sexus-Eigenwort.

Der Professor.
Der Professor ist im Genus männlich. Hier wird nichts über den Sexus mitgeteilt.
Der Herr Professor. Im Genus männlich, im Sexus männlich.
Die Frau Professor. Im Genus männlich, im Sexus weiblich.
Richtiger wäre:
Der Mann Professor.
Das Weib Professor.

Problematisch ist es bei den Tieren geworden. Dort hat das Gendern in der Sprache eventuell seinen Ursprung.
Die Katze. Im Genus weiblich. Ohne Sexus. Missbräuchlich wird der Genus zum Sexus.
Der Kater. Im Genus männlich. Eigenwort für den männlichen Sexus.
Das Pferd. Im Genus sächlich. Ohne Sexus. Missbräuchlich wird der Genus zum Sexus.
Der Hengst. Im Genus männlich. Eigenwort für den männlichen Sexus.
Die Stute. Im Genus weiblich. Eigenwort für den weiblichen Sexus.
Der Mensch. Im Genus männlich. Ohne Sexus.
Der Mann. Im Genus männlich. Eigenwort für den männlichen Sexus.
Das Männchen. Im Genus neutral. Eigenwort für den männlichen Sexus.
Das Weib. Im Genus weiblich. Eigenwort für den weiblichen Sexus.
Das Weibchen.  Im Genus neutral. Eigenwort für den weiblichen Sexus.
Der Bär. Im Genus männlich. Ohne Sexus. Missbräuchlich wird der Genus zum Sexus.
Die Bärin. Im Genus weiblich. Eigenwort für den weiblichen Sexus. Das Gender "in" wird angehangen.

Weitere Beispiele von Missbrauch des Genus:
Der König.
Die Königin. (Missbrauch; bei Menschen, Bienen und Ameisen)
Der Arbeiter.
Die Arbeiterin. (Missbrauch; bei Menschen und Bienen)
Der Fußgänger.
Die Fußgängerin. (Missbrauch; bei Menschen)
Möglich:
Der arbeitende Mann
Das arbeitende Männchen.
Das arbeitende Weib
Das arbeitende Weibchen.
Der männliche Arbeiter.
Der weibliche Arbeiter.
Das Arbeitermännchen.
Das Arbeiterweibchen.

Beispiele für richtige Anwendung des Genus mit getrenntem Sexus.
Die Amsel. Im Genus weiblich. Ohne Sexus.
Der Amselhahn. (richtig, aber ziemlich verflixt. Hahn als Eigenwort des männlichen Huhn)
Das Amselweibchen. (richtig, da Eigenwort aus "Die weibliche Amsel")

Beispiele ohne Eigenwörter für Sexus.
Der Wal.
Der Frosch.
Die Kröte.
Die Schlange.
Die Fliege.
Die Spinne(n)! ;)

man - jemand - jefrau - jekind - jegreis

Das Wort "man" stößt beim Gendern auf Zweifel. Ist das Wort "man" maskulin? Feminin scheint es jedenfalls nicht zu sein. Es klingt zu sehr nach "Mann", also muss es maskulin sein. Dabei wird der kulturhistorische Ursprung des Wortes völlig ignoriert. Das Wort "man" ist ein generalisierendes Personalpronomen (Generalpronomen). Ein Generalpronomen bezieht sich nicht wie ein Personalpronomina auf einen spezifischen Referenten, sondern auf einen allgemeinen Referenten. Das Wort "Referent" wird hier in der Sprache als Sache definiert. Also "das" Auto, "die" Waschmaschine oder "die" Person ist gleichbedeutend, auch wenn das unschön klingt, weil eine Person als Sache behandelt wird.

Einwurf
Hierzu ein kleiner Einwurf zum nachdenken:
Mann = männlich
Weib = weiblich
Frau - fräulich?
Herr = herrlich?
Dame = dämlich?
Die Frau eines Mannes.
Der Mann einer Frau.
Das Weib eines Mannes.
Der Mann eines Weibes.
Des Mannes Weib.
Des Weibes Mann.

Das Wort "Weib“ wurde missbräuchlich verwendet und geriet in Verruf. Unter anderem wegen dem Unwort "weibisch“, das als abwertende Bezeichnung für Männer dienen soll und weil das Wort "Weib" abwertender als die Wörter "Dame" (von lateinisch "domina", Anrede von Göttinnen) und "Frau" (althochdeutsch "frouwa", Gegenwort zu "fro", Anrede für Götter) sein soll. Das Wort "Weib" meint hingegen in der Alltagssprache eine verheiratete, im Sinne von "vergebene", gemeine weibliche Person. Hier hat also ganz klar ein Missbrauch der Sprache stattgefunden, der das Wort "Weib" abgewertet hat.

Die englische Sprache verwirrt etwas innerhalb der indogermanischen Sprachen beim deutschen Wort "man". Im Englischen ist mit "man" auch "men" (Mann) gemeint. Wobei die Wörter "human" (Mensch) und "mankind" (Menschheit) den Sprachfehler aufdecken, da der Wortteil "man" neutral bleibt und das Wort "men" eine männliche Person sowie "women" eine weibliche Person meint.

man & es

Allerdings ist die Sprache so flexibel, dass sie auch das Wort "man" abfängt, wenn es einem nicht gefällt. Wer hat jetzt im vorherigen Satz etwas bemerkt?

Das Wort "man" und das Wort "es" können gegebenenfalls ausgetauscht werden.

Man könnte doch zu Fuß gehen und gendern.
Es könnte doch auch zu Fuß gegangen und gegendert werden.

Das Gendern verlangt, dass man das nicht so sagt.
Das Gendern verlangt, dass es nicht so gesagt werden soll.

Dabei stellt sich heraus, dass das Wort "man" dem Wort "es" gleichgestellt ist. Es ist an und für sich neutral. Hierbei kann der Fehler begangen werden, indem das Wort "es" als "das Es" verstanden wird und es somit als maskulin gilt. Das Wort "es" hat aber eine andere Bedeutung. Es wird als Expletivum (Füllwort) verwendet. Beispiel für die Verwendung von einem Füllwort:

"Ob er wohl die Gendersprache nutzt?" Hier ist das Wort "er" nur ein Füllwort. Allerdings wird das Wort "er" nicht neutral verstanden. Das Füllwort "sie" wird hier ebenfalls nicht neutral verstanden.
Das Füllwort "er" meint hier keine männliche Person, sondern "einen" Menschen.
er = dieser Mensch.
Das Füllwort "sie" meint hier keine weibliche Person, sondern "eine" Person.
sie = diese Person.
"Ob sie wohl die Gendersprache nutzt?"
Leider entsteht dabei eine offensichtlichere Rede über Dritte, die unhöflich klingt.
Das verflixte daran ist, dass ein Füllwort "es" hier nicht funktioniert.
"Ob es wohl die Gendersprache nutzt?"
Das Wort "man" funktioniert auch nicht.
"Ob man wohl die Gendersprache nutzt?"
Korrekt wäre daher dies:
"Ob dieser Mensch wohl die Gendersprache nutzt?"
"Ob diese Person wohl die Gendersprache nutzt?"
Was keiner verwendet, weil es "fremd" klingt.

Gendern ist klug klug!

Die Sprache kann also auch verwirrend sein, wenn sie missverstanden werden will.
Ein dauerhafter missverständlicher Gebrauch kann zu Schäden in der Gesellschaft führen.
Sprachakrobatiker können da noch viel mehr aus dem Hut zauber.
Der Klügere gibt nach.
Der Klügere kippt nach. (gluck gluck)
Der Klügere gibt Nachhilfe.

Gendern ist Krieg?

Ein etwas unschöneres Beisiel aus der Geschichte:
"Wollt ihr den totalen Krieg?"
Hier ist mit dem Wort "ihr" nicht eine Person gemeint, sondern die entpersonifizierte Menschenmenge. Mit dem Wort "ihr" sind hier zugleich alle und keine Person gemeint. Die Überzahl der einzelnen Personen in der Menge will keinen Krieg, da Krieg für sie ihren Tod bedeutet. Nur die entpersonifizierte Menschenmenge will Krieg, zu der sich jede einzelne Person zählt, da sie nur als solches einen Krieg überleben könnte. Es ist also ein Aufgeben der eigenen Person, bis hin zur eigenen Persönlichkeit, für eine größere Sache notwendig.
Die Frage:
"Willst du den totalen Krieg?"
an jede einzelne Person in der Menschenmenge ergibt ein anderes Ergebnis, wenn jede einzelne (freie) Antwort zu einem prozentualen Ergebnis zusammengezählt wird und keine vorherige Entpersonifizierung stattgefunden hat.

Gendern ist Politik!

Das Gendern ist ein rein soziales Produkt, dass politisch (gegen die Kultur) durchgesetzt werden soll.
Der einfache Blick auf die Menschen reicht aus, um festzustellen, dass die Unterschiede zwischen einem männlichen und einem weiblichen Menschen im Durchschnitt nur an den primären Geschlechtsorganen auszumachen ist. Allein der Körperbau ist im Durchschnitt gleich. Nur die Extreme erlauben eine Spezifizierung zwischen männlich und weiblich allein am Körperbau (großer Penis vs. große Brüste). Wobei weitere Extreme diese umkehren, indem es maskuline weibliche Menschen und feminine männliche Menschen gibt. Im Transgender wird dies aufgehoben.
Der soziale Unterschied zwischen männlichen und weiblichen Menschen wird durch das Gendern verstärkt hervorgehoben. Zudem werden dabei transgender Menschen ignoriert. Wenn es eine neutrale Ansprache von Menschen geben soll, dann kann diese nur transgender sein.

Sehr geehrte Damen und Herren,

Die heutige gebräuchliche höfliche Anrede benutzt die Wörter "Herr" und "Frau".

Sehr geehrter Herr Fußgänger,
Sehr geehrte Frau Fußgänger,

Was damit gemacht wird ist offensichtlich. Die Personen werden wieder auf ihr Geschlecht reduziert, bzw. durch dieses getrennt. Komplett ignoriert wird der Vorname, da Vornamen als unhöflich gelten? Wie wäre es damit:

Sehr geehrtes Vivian Fußgänger,

Richtig. Das klingt nicht nur doof, sondern ist eine Entpersonifizierung.
Eine althergebrachte, wenn auch altmodische, Version bietet hier Abhilfe:

Guten Tag Vivian Fußgänger,
Grüß Gott Vivian Fußgänger,

Bei einer allgemeinen Anrede stehen sich diese beiden Versionen gegenüber:

Sehr geehrte Damen und Herren,
Sehr geehrte Angestellte der Firma Fußgänger & Co. AG,

OK, das regt dazu an:
Sehr geehrte Angestelltinnen und Angestellte der Firma Fußgänger & Co. AG,

und klingt hoffentlich jedem doof genug, um es nicht zu verwenden, geschweige denn politisch durchsetzen zu wollen.

Möglich ist auch eine Anrede mit Geschlechterwahl.

Sehr geehrte Angestellte (m/w),

Hier werden allerdings nicht alle sozialen Geschlechterformen verwendet. Wenn dann könnte es so aussehen.

Sehr geehrte Mitarbeiter (m/w/x/o),

m = männlich
w = weiblich
x = beides (männlich-weiblich / weiblich-männlich)
o = offen (keine Festlegung)

Eine einfache unpersönliche Kurzform steht ebenfalls zur Verfügung:

Guten Tag,
Grüß Gott,

und Auf Wiedersehen!

Was kann das Gendern noch?

In einer nicht all zu fernen Gender-Zukunft ist es möglich, dass Nachnamen von Personen gegendert werden. Dazu fällt einem sofort Island ein. Dort bekommen weibliche Neugeborene einen anderen Nachnamen als männliche Neugeborene.

Ehepaar: Vivian Einarson & Vivian Einarsdóttir
Ein Sohn bekommt den Nachnamen: Viviansson
Eine Tochter bekommt den Nachnamen: Viviansdóttir

In Deutschland sähe das dann so aus:
Ehepaar: Vivian Müller & Vivian Müller
Ein Sohn bekommt den Nachnamen: Vivian Müller
Eine Tochter bekommt den Nachnamen: Vivian Müllerin

Wenn sich Vivian Müllerin in ihrem Körper als mehr männlich fühlt und Vivian Müller als mehr weiblich, stört der Nachname zudem ungemein. Es ist möglich, dass dieser nicht geändert werden darf, weil er Aufschluss darüber gibt, als was man geboren wurde.

Wenn eine Vivian Müllerin einen Vivian Müller heiratet, übernimmt entweder einer der beiden den Nachnamen des anderen, oder es entsteht ein Gender-Doppel-Nachname:
Weib: Müller-Müllerin (des Müllers Weib).
Mann: Müllerin-Müller (der Müllerins Mann).
Wenn Vivian Müllerin-Müller und Vivian Müller-Müllerin Kinder bekommen:
Ein Sohn bekommt den Nachnamen: Vivian Müller.
Eine Tochter bekommt den Nachnamen: Vivian Müllerin.

Somit werden Doppel-Nachnamen bei Heirat zum neuen Gender-Standard.
Weiterlesen »

Donnerstag, 26. Januar 2017

Musicstream and Audiostream Download Tutorial

Best practice for downloading music and video streams. In Example with Youtube Videodownload and Audiodownload.

There are a lot of Download-Helpers and Addons that have all of their peculiarities. Many are only free or without advertising or email phishing until they are popular enough. In this blog post a very simple guide is illustrated, with which everyone can download themselves music and video on Youtube.

Step by Step Instructions with pictures. Very simple tutorial.

1.) The very first step is that Flash must be uninstalled. Flash is a security risk anyway.

2.) In the second step please select the quality of the Youtube Video.

Youtube Downloader Instruction
Youtube Downloader Instruction

Youtube Downloader Instruction
Youtube Downloader Instruction
 3.) Now start the Youtube video and turn on the developer tool. In the example, Chrome has been used. In Firefox, the developer tool is found in a similar place.

Youtube Downloader Instruction
Youtube Downloader Instruction
Youtube Downloader Instruction
Youtube Downloader Instruction

4.) In the developer tool, click the "Network" tab.

Youtube Downloader Instruction
Youtube Downloader Instruction
5.) After starting the video, URLs are loaded. Here are the URLs interesting with "videoplayback?..." to begin.
This "videoplayback?..." URLs are URLs to small snippets of video and audio. So there are different, you have to try to find the right one. In this test, video and audio were separated into two files.
Right-click on such a link and open it in a new tab.

Youtube Downloader Instruction
Youtube Downloader Instruction
6.) Go to the end of the URL in the newly opened tab in the address line. Remove the "range". In the picture, it is highlighted in blue.
The "range" is the snippet. Without the "range" it is in full length.

Youtube Downloader Instruction
Youtube Downloader Instruction
7.) Click on the Play / Pause button with the right mouse button in the player and save the file.

Youtube Downloader Instruction
Youtube Downloader Instruction
8.) When saving you must specify the file extension. You can also specify a filename here.
In this example, only the music/audio from a Youtube video was downloaded. It is in this case no MP3 Stream, but an MP4 stream. The file may need to be converted afterwards.

Youtube Downloader Instruction
Youtube Downloader Instruction
9.) The downloaded MP4 music / audio stream can be played, for example, in the VLC video player.

Youtube Downloader Instruction - VLC Videoplayer
Youtube Downloader Instruction - VLC Videoplayer

10.) Convert/Transcode the downloaded Audio/Video-Files with VLC Player.
(Please read the VLC Instructions)


11.) Convert the Audio-File to MP3 with Audacity!

Audacity is a Freeware Audio-Editor. Audacity can import, edit and export audio files.
For the Youtube File, you must set two Free Codec in Audacity.
1. The Lame MP3 Codec. (for export/save).
2. The FFmpeg Codec. (for import).
This is quite simple.
Youtube Downloader Audacity
Youtube Downloader Audacity
- Download Audacity from manufacturer page: http://www.audacityteam.org/ (zip-file for portable version)
- Open Audacity and go to
→ Edit / Bearbeiten
→ Preferences / Einstellungen
→ Libraries / Bibliotheken
click the two "Download" Buttons. Download the newest Codecs (better the portable Zip-Files) and click "Locate..." for the File-Path to the Codec-Files.

In the Last Step move the downloaded Youtube-File with the mouse in Audacity, or import it.
Than click File / Datei → Export / Ton exportieren. Choose MP3 and Constant / Festwert 128 kbit/s. Click Save / Speichern and it's finished.


Test it! Share it! Make it better!

No guarantee. No warranty. No support.


Weiterlesen »