Switched to english.
I'm more and more into frontend developing in the last years.
Recently I needed the best way to clone an object. Here my result:
http://jsben.ch/#/t917Z
MySQL, PHP, Linux, Webserver - Performance / CSS3, HTML5, Javascript, Android
Montag, 17. Oktober 2016
Mittwoch, 16. Dezember 2015
Elemente finden, die einen horizontalen Scrollbalken verursachen
Developer Tools => Console öffnen.
Folgendes Skript pasten:
var docWidth = document.documentElement.offsetWidth;
[].forEach.call(
document.querySelectorAll('*'),
function(el) {
if (el.offsetWidth > docWidth) {
console.log(el);
}
}
);
Jetzt erscheinen die Elemente die untersucht werden müssen.
Dienstag, 19. Mai 2015
Mehrere OnPageStarted und OnPageFinshed Aufrufe bei Android Webview Apps behandeln.
Folgendes Problem bei einer WebView - Hybrid - Android - App: Wenn man eine URL lädt, setzt man meistens einen Loading-Dialog ein, damit der Nutzer weiß, dass er kurz warten muss.
In meinem Fall ist das ein Splash-Screen bestehend aus einem zweiten WebView. Das ist aber irrelevant.
Das Problem ist, dass es oft dazu kommt, dass mehrere "OnPageStarted" und "OnPageFinished" nacheinander oder parallel gestartet werden. Zum Beispiel bei Weiterleitungen, Iframes, Ajax-Calls usw. Zum Beispiel bei einem Facebook-API-Login sieht das dannziemlich doof aus.
Meine Lösung: Im OnPageFinished - Handler habe ich einen 500ms delay eingebaut. Nach den 500ms wird nachgesehen, ob ein "neuerer" "OnPageStart" vorhanden ist, Wenn ja, dann beende den Loading-Screen nicht, sondern warte bis der nächste "OnPageFinshed" kommt.
myWebView.setWebViewClient(new WebViewClient() {
boolean loadingFinished = true;
boolean redirect = false;
long last_page_start;
long now;
// Load the url
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (!loadingFinished) {
redirect = true;
}
loadingFinished = false;
view.loadUrl(url);
return false;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.i("p","pagestart");
loadingFinished = false;
last_page_start = System.nanoTime();
show_splash();
}
// When finish loading page
public void onPageFinished(WebView view, String url) {
Log.i("p","pagefinish");
if(!redirect){
loadingFinished = true;
}
//call remove_splash in 500 miSec
if(loadingFinished && !redirect){
now = System.nanoTime();
new android.os.Handler().postDelayed(
new Runnable() {
public void run() {
remove_splash();
}
},
500);
} else{
redirect = false;
}
}
private void show_splash() {
if(myWebView.getVisibility() == View.VISIBLE) {
myWebView.setVisibility(View.GONE);
myWebView_splash.setVisibility(View.VISIBLE);
}
}
//if a new "page start" was fired dont remove splash screen
private void remove_splash() {
if (last_page_start < now) {
myWebView.setVisibility(View.VISIBLE);
myWebView_splash.setVisibility(View.GONE);
}
}
});
In meinem Fall ist das ein Splash-Screen bestehend aus einem zweiten WebView. Das ist aber irrelevant.
Das Problem ist, dass es oft dazu kommt, dass mehrere "OnPageStarted" und "OnPageFinished" nacheinander oder parallel gestartet werden. Zum Beispiel bei Weiterleitungen, Iframes, Ajax-Calls usw. Zum Beispiel bei einem Facebook-API-Login sieht das dannziemlich doof aus.
Meine Lösung: Im OnPageFinished - Handler habe ich einen 500ms delay eingebaut. Nach den 500ms wird nachgesehen, ob ein "neuerer" "OnPageStart" vorhanden ist, Wenn ja, dann beende den Loading-Screen nicht, sondern warte bis der nächste "OnPageFinshed" kommt.
myWebView.setWebViewClient(new WebViewClient() {
boolean loadingFinished = true;
boolean redirect = false;
long last_page_start;
long now;
// Load the url
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (!loadingFinished) {
redirect = true;
}
loadingFinished = false;
view.loadUrl(url);
return false;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.i("p","pagestart");
loadingFinished = false;
last_page_start = System.nanoTime();
show_splash();
}
// When finish loading page
public void onPageFinished(WebView view, String url) {
Log.i("p","pagefinish");
if(!redirect){
loadingFinished = true;
}
//call remove_splash in 500 miSec
if(loadingFinished && !redirect){
now = System.nanoTime();
new android.os.Handler().postDelayed(
new Runnable() {
public void run() {
remove_splash();
}
},
500);
} else{
redirect = false;
}
}
private void show_splash() {
if(myWebView.getVisibility() == View.VISIBLE) {
myWebView.setVisibility(View.GONE);
myWebView_splash.setVisibility(View.VISIBLE);
}
}
//if a new "page start" was fired dont remove splash screen
private void remove_splash() {
if (last_page_start < now) {
myWebView.setVisibility(View.VISIBLE);
myWebView_splash.setVisibility(View.GONE);
}
}
});
Mittwoch, 5. November 2014
#1690 - BIGINT UNSIGNED value is out of range
#1690 - BIGINT UNSIGNED value is out of range
Kann bei einer MySQL - Abfrage erscheinen, wenn man innerhalb der Abfrage mit UNSIGNED Integer - Spalten rechnet und das Ergebnis ein negativer Wert ist.
Also beispielsweise die Tabellenspalte "time" ist eine unsigned Integer Spalte. Unsigned bedeutet übrigens, dass der Wert nicht negativ werden kann, aber dafür erhöht sich der gültige Wertebereich im postiven Bereich um 100%.
Nehmen wir an die Spalte "time" hat einen UNIX TIMESTAMP wert in der Vergangenheit und wir haben folgende Abfrage:
SELECT * FROM tabelle WHERE time - UNIX_TIMESTAMP() < 5
Hier würde entweder die Fehlermeldung von oben erscheinen oder ein sehr hoher Wert errechnet werden.
Die Lösung:
1. entweder die Spalte "time" zum normalen Integer umwandeln (ALTER TABLE `tabelle` CHANGE `time` `time` INT(10) NOT NULL DEFAULT '0';)
2. Oder MySQL im 'no_unsigned_subtraction' - Modus starten.
Dazu einfach in der my.cnf "sql_mode = 'no_unsigned_subtraction'" eintragen, bzw. "no_unsigned_subtraction" in der entsprechenden Zeile ergänzen.
Kann bei einer MySQL - Abfrage erscheinen, wenn man innerhalb der Abfrage mit UNSIGNED Integer - Spalten rechnet und das Ergebnis ein negativer Wert ist.
Also beispielsweise die Tabellenspalte "time" ist eine unsigned Integer Spalte. Unsigned bedeutet übrigens, dass der Wert nicht negativ werden kann, aber dafür erhöht sich der gültige Wertebereich im postiven Bereich um 100%.
Nehmen wir an die Spalte "time" hat einen UNIX TIMESTAMP wert in der Vergangenheit und wir haben folgende Abfrage:
SELECT * FROM tabelle WHERE time - UNIX_TIMESTAMP() < 5
Hier würde entweder die Fehlermeldung von oben erscheinen oder ein sehr hoher Wert errechnet werden.
Die Lösung:
1. entweder die Spalte "time" zum normalen Integer umwandeln (ALTER TABLE `tabelle` CHANGE `time` `time` INT(10) NOT NULL DEFAULT '0';)
2. Oder MySQL im 'no_unsigned_subtraction' - Modus starten.
Dazu einfach in der my.cnf "sql_mode = 'no_unsigned_subtraction'" eintragen, bzw. "no_unsigned_subtraction" in der entsprechenden Zeile ergänzen.
Mittwoch, 29. Oktober 2014
strict_trans_tables deaktivieren. Möglicher fix.
Ich musste wegen eines Projekts die irgendwann neu eingeführte Direktive "strict_trans_tables" in mysql deaktivieren, da sie dazu führte, dass einige MySQL-Queries nicht ausgeführt wurden.
Normalerweise geht man in die /etc/my.cnf , sucht nach "sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES" und kommentiert diese Zeile aus.
Hat aber nicht gereicht. Nach etwas Recherche suchte ich my.cnf die im /usr Verzeichnis sein sollte. Und tatsächlich, sie existierte. Dort gab es auch nur die Zeile "sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES", welche auskommentiert werden musste.
Normalerweise geht man in die /etc/my.cnf , sucht nach "sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES" und kommentiert diese Zeile aus.
Hat aber nicht gereicht. Nach etwas Recherche suchte ich my.cnf die im /usr Verzeichnis sein sollte. Und tatsächlich, sie existierte. Dort gab es auch nur die Zeile "sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES", welche auskommentiert werden musste.
MySQL Datenbank von einem Server zum anderen kopieren mittels ssh und mysqldump
Um eine Datenbank per SSH zu einem anderen Server zu kopieren kann man folgenden Befehl verwenden:
Ja: nach -u und -p kommt KEIN Leerzeichen. Hier ein Beispiel, wenn
User gleich root
Passwort gleich 123sonnenschein
Datenbank gleich MyDB
Ziel-Host: 192.168.2.1
Es sollte beachtet werden, dass auf dem Zielhost entsprechende Rechte des Users vorhanden sind. Also, dass er auch außerhalb von localhost auf den Server verbinden kann.
Zudem sollte die Datenbank (in diesem Fall MyDB) bereits angelegt worden sein.
Das Beispiel geht davon aus, dass User und Passwort auf beiden Servern gleich ist (was keine gute Idee ist).
mysqldump -uuser -ppassword db1 | mysql -h desthost -uuser -ppassword destdb
Ja: nach -u und -p kommt KEIN Leerzeichen. Hier ein Beispiel, wenn
User gleich root
Passwort gleich 123sonnenschein
Datenbank gleich MyDB
Ziel-Host: 192.168.2.1
mysqldump -uroot -p123sonnenschein MyDB | mysql -h 192.168.2.1 -uroot -p123sonnenschein MyDB
Es sollte beachtet werden, dass auf dem Zielhost entsprechende Rechte des Users vorhanden sind. Also, dass er auch außerhalb von localhost auf den Server verbinden kann.
Zudem sollte die Datenbank (in diesem Fall MyDB) bereits angelegt worden sein.
Das Beispiel geht davon aus, dass User und Passwort auf beiden Servern gleich ist (was keine gute Idee ist).
Dienstag, 7. Oktober 2014
[linux] SSH-Befehl im Hintergrund ausführen bzw. nicht beenden, wenn die Verbindung abbricht.
Manchmal möchte man im Remote - SSH einen Befehl eingeben, dessen Ausführung ziemlich lange dauern kann. zum Beispiel das Packen vieler Dateien oder weiß der Fuchs was.
Diese Aktion wird Standardmäßig abgebrochen, wenn die SSH Verbindung beendet wird. Das kann zum Beispiel durch den 24h - Reconnect des Providers sein oder irgendeinen anderen Grund haben. In jedem Fall ist das dann sehr ärgerlich.
Man kann das Ganze aber auch im Hintergrund ausführen - mit "screen".
Um genau das Problem zu lösen benutzt man folgenden Befehl:
"myscreen" ist dabei einfach eine Bezeichnung für den geöffneten neuen Screen.
Beendet man nun die Verbindung zum Server, werden die Befehle weiterhin ausgeführt.
Diese Aktion wird Standardmäßig abgebrochen, wenn die SSH Verbindung beendet wird. Das kann zum Beispiel durch den 24h - Reconnect des Providers sein oder irgendeinen anderen Grund haben. In jedem Fall ist das dann sehr ärgerlich.
Man kann das Ganze aber auch im Hintergrund ausführen - mit "screen".
Um genau das Problem zu lösen benutzt man folgenden Befehl:
screen -dmSL myscreen
"myscreen" ist dabei einfach eine Bezeichnung für den geöffneten neuen Screen.
Beendet man nun die Verbindung zum Server, werden die Befehle weiterhin ausgeführt.
Abonnieren
Posts (Atom)