Montag, 17. Oktober 2016

JavaScript: deep copy / clone object. speed comparison.

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

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);
            }
        }

});

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.


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.


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:

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:

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.