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 »