Archiv ‘Uncategorized’

Montag, 16. Mai 2016

MariaDB (MySQL) meldet Errcode: 24 „Too many open files“

Vorgestern habe ich auf Grund von Performance-Problemen beim Umstieg auf cacti spine die Datenbank auf meinem Linux-Server ausgetauscht: Statt MySQL kommt nun MariaDB zum Einsatz.

Heute nun wurde ich auf einen Kollateralschaden aufmerksam. Jede Nacht lasse ich ein Script laufen, welches meine MySQL-Datenbanken sperrt (LOCK-ed) und die Datenbankdateien in ein Sicherungsverzeichnis kopiert. Mit tarsnap schreibe ich die Datenbankdateien dann weg in die Cloud und habe so versionierte Datenbankbackups.

Seit dem Wechsel und einigen Anpassungen an der MySQL-Konfiguration (my.cnf) traten bei der Verwendung des Scripts Probleme auf:

...
site_wedding
     /home/mysql/site_wedding.sql
mysqldump: Error: 'Out of resources when opening file '/tmp/#sql_4fde_2.MAD' (Errcode: 24 "Too many open files")' when trying to dump tablespaces
mysqldump: Got error: 23: "Out of resources when opening file './site_wedding/log.MYD' (Errcode: 24 "Too many open files")" when using LOCK TABLES
...

Und auch im mysql.log las ich:

...
May 16 06:30:02 ALPHA mysqld: 160516  6:30:02 [ERROR] Error in accept: Too many open files

Den Fehler behob ich mit folgenden Massnahmen:

Im Zuge des Performance-Tunings der Datenbank (für cacti spine) hatte ich folgende Zeilen in my.cnf eingefügt:

...
[mysqld]
...
open_files_limit	= 80000
...

Beim Starten der Datenbank mittels

# systemctl start mysql

fand sich im MySQL-Log folgender Eintrag:

...
May 16 12:55:45 ALPHA mysqld: 160516 12:55:45 [Warning] Could not increase number of max_open_files to more than 1024 (request: 80162)
...

Offenbar waren 1024 gleichzeitig geöffnete File Handles nicht ausreichend.

Ich nahm deshalb folgende Anpassung an /etc/security/limits.conf vor:

...
mysql hard nofile 102400
mysql soft nofile 102400

Quelle: How to permanently raise ulimit ‚open files‘ and MySQL ‚open_files_limit‘

Ein Neustart von MySQL löste das Problem aber nicht; die Fehlermeldung im Log blieb bestehen (eventuell muss man den Server neu starten, damit diese Limits aktiv werden?).

Ein wenig Recherche fügte dann zu Tage, dass man dem MySQL-Server via der systemd Service-Datei selber eine Maximalzahl an File Handles zuweisen kann.

Unter Debian findet sich die Service-Datei unter /etc/systemd/system/mysql.service, wo ich folgende Zeile einfügte:

...
[Service]
...
LimitNOFILE=infinity

Anschliessend musste ich folgenden Befehl ausführen, damit die Anpassungen von systemd zur Kenntnis genommen werden:

# systemctl stop mysql
Warning: mysql.service changed on disk. Run 'systemctl daemon-reload' to reload units.
# systemctl daemon-reload
# systemctl start mysql

Beim Neustart von MySQL erschien die Fehlermeldung im mysql.log erneut, dieses Mal aber mit einer deutlichen höheren Zahl an gleichzeitig geöffneten Dateien:

...
May 16 13:02:57 ALPHA mysqld: 160516 13:02:57 [Warning] Could not increase number of max_open_files to more than 65536 (request: 80162)
...

Good enough, dachte ich mir. Deshalb entschied ich mich, erneut my.cnf anzupassen:

...
[mysqld]
...
open_files_limit	= 60000
...

Noch einmal den Server neu starten, und gut war es:

# systemctl stop mysql
# systemctl start mysql

Bei der manuellen Ausführung des Scripts lief die Sause anschliessend durch, ohne zu stocken.

Tags: , , ,
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 17. April 2016

billiger-mietwagen.de: Toller Anbieter, bis auf den 10 Euro-Gutschein

Früher schwor ich auf Holidayautos.ch, doch irgendwann einmal bekehrte mich billiger-mietwagen.de zu ihrem Service. Eine andere Web-Site für Mietwagenbuchungen braucht der Ferienreisende nicht.

Doch wehe, man versucht diese ominösen 10 Euro-Gutscheine rückerstattet zu erhalten, welche der Anbieter gelegentlich per E-Mail versendet. Diese Gutscheine werden beim Erfassen und Bezahlen der Mietanfrage nicht etwa automatisch angerechnet, sondern müssen nach Rückgabe des Mietwagens online geltend gemacht werden.

Und hier begann für mich die Odyssee: Man hat erstens nur 30 Tage Zeit, die Vergütung einzufordern. Das heisst, dass man sich sofort nach der Rückkehr im E-Mail-Ordner umschauen und den Link im Erinnerungs-E-Mail anklicken sollte (immerhin ist der Anbieter so nett, dieses unaufgefordert zu versenden). Doch ohalätz, die Rückerstattung erfolgt zweitens nicht etwa auf die Kreditkarte, die man für die Online-Buchung verwendet hat (wäre ja zu einfach und die Auszahlungsrate läge bei 100 Prozent). Nein, man muss seine IBAN-Nummer angeben. Diese alleine reicht aber nicht, das Unternehmen wüsste gerne auch noch die Bankleitzahl. Und zu guter Letzt muss mit dem Geburtsdatum sichergestellt werden, dass auch wirklich der Kunde der Nutzniesser der Auszahlung ist.

Nun gut … ich tat, wie mir befohlen wurde, füllte das Formular aus, um dann mit folgender Fehlermeldung konfrontiert zu werden:

billiger-mietwagen Gutschein Rückerstattung

Wähle ich mich auf mein Benutzerprofil ein, steht dort mein Geburtsdatum aber klipp und klar:

billiger-mietwagen.de Kundenangaben

Das Problem könnte ich seinerzeit trotz mehrer Versuche nicht lösen (ein Schelm, wer Böses denkt …). Ich schrieb deshalb genau an dem Tag, an welchem das Angebot auslief, eine E-Mail an den Anbieter (info@billiger-mietwagen.de) und teilte diesem mein Problem mit. Eine Antwort erhielt ich nie.

Als ich heute die Buchhaltung nachführte strahlte mir die erfreuliche Botschaft auf dem Kontoauszug entgegen: Halleluja, eine gute Seele hatte meine manuell übermittelten Rückerstattungsangaben gesichtet und entschieden, dass ich für eine Rückerstattung qualifiziert sei:

Credit Suisse Zahlungseingang SilverTours GmbH

Tags: , , , , , ,
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 27. März 2016

Sismics Docs installieren

Als Projekt für das Oster-Wochenende habe ich mir die Installation eines Dokumentenmanagementsystems (DMS) vorgenommen. Ziel ist es, die von mir seit Jahren gescannten Einkaufsbelege sauber in einem Archiv abzulegen und die Belege anschliessend mit meiner selbstprogrammierten Buchhaltungs-Applikation (PHP/MySQL) zu verknüpfen.

Nach einem wenig erfolgsversprechenden Umweg über Alfresco (zu gross, zu komplex, beansprucht zu viele Ressourcen) landete ich schlussendlich bei Sismics Docs, auch wenn dieses in einer Übersicht quelloffener DMS aus dem Jahr 2010 nicht erwähnt wird. Die Screenshots haben mich überzeugt, die Software zu installieren und herunterzuladen.

Da ich mich nicht mit Java-Applikationen auskenne, liefere ich hier eine Installationsanleitung. Sie richtet sich an Personen, welche ausreichend Linux-Erfahrung haben, anstelle aus der Java- aber aus der PHP/MySQL-Ecke kommen.

Repository auschecken

Als erstes legen wir uns eine lokale Kopie des Git-Repositories an:

# mkdir /usr/local/bin/sismics
cd /usr/local/bin/sismics
git clone https://github.com/sismics/docs.git .

To Dock or not to Dock

Unter den Dateien des Repositories finden sich Hinweise darauf, dass der Entwickler Docker zu verwenden scheint; u.a. existieren im Wurzelverzeichnis des Repositories die Dateien Dockerfile, build.sh und run-service.sh.

Ich konnte das Teil mit Docker aber nicht zum Laufen bringen. Dies aus mehreren Gründen:

i686

Der kräftigere meiner beiden Linux-Server, welcher im Elternhaus läuft, hat Debian i686 installiert, ein 32-bit Linux. Docker erfordert x86_64 (64-bit). Ein forciertes Upgrade tönt nach digitalem Selbstmord.

Die Bit-Architektur überprüfen kann man dies mit folgendem Befehl:

$ uname -m
x86_64

Docker installieren

Der Intel NUC, welcher in unserer Mietwohnung im Netzwerk hängt, hat ein x86_64 Linux am Laufen. Deshalb führte ich dort die Installation gemäss der offiziellen Anleitung aus.

Vorgängig musste ich noch herausfinden, welche Debian-Version ich installiert hatte:

# lsb_release -da
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 8.3 (jessie)
Release:	8.3
Codename:	jessie

Quelle: Check what Debian version you are running on your Linux system

Jessie! Anschliessend folgte ich der offiziellen Anleitung:

# apt-get install apt-transport-https ca-certificates
# apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
# echo "deb https://apt.dockerproject.org/repo debian-jessie main" > /etc/apt/sources.list.d/docker.list
# apt-get update
# apt-get install docker-engine
# service docker start
# docker run hello-world

Bingo, Docker läuft.

Image nicht gefunden

Leider funktioniert die Generierung des Images für das Sismics Docs nicht:

# cd /usr/local/bin/sismics
# docker build -t sismics:0.1 .
Sending build context to Docker daemon 14.35 MB
Step 1 : FROM sismics/debian-java7-jetty9
Pulling repository docker.io/sismics/debian-java7-jetty9
Error: image sismics/debian-java7-jetty9 not found

Mit dem Switch -t definiert man das Paket und den Tag (vgl. Docker — build.

*seufz* Okey, dann halt kein Docker.

Manuelle Installation

Nun gut, da wir den Docker-Weg nicht beschreiten können, verlassen wir den Intel NUC und wenden uns wieder dem kräftigeren Server zu.

Pakete

Damit man schon nur die Testumgebung des DMS hockriegt, benötigt man folgende Pakete:

# apt-get install maven tesseract-ocr openjdk-7-jdk

Testinstallation bauen

Sobald die Pakete auf dem Rechner liegen, bauen wir uns die Testinstallation:

# cd /usr/local/bin/sismics/docs-parent
# mvn clean -DskipTests install
...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Docs Parent ........................................ SUCCESS [  7.114 s]
[INFO] Docs Core .......................................... SUCCESS [01:37 min]
[INFO] Docs Web Commons ................................... SUCCESS [ 47.086 s]
[INFO] Docs Web ........................................... SUCCESS [ 30.833 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:02 min
[INFO] Finished at: 2016-03-27T09:52:29+00:00
[INFO] Final Memory: 34M/94M
[INFO] ------------------------------------------------------------------------

Testinstallation starten

Nun starten wir die Testinstallation, um zu sehen, ob alles wie gewünscht funktioniert:

# cd /usr/local/bin/sismics/docs-web
mvn jetty:run
...
[INFO] Started ServerConnector@b40c2f{HTTP/1.1}{0.0.0.0:8080}
[INFO] Started @23372ms
[INFO] Started Jetty Server

Sobald diese Anzeige erscheint, können wir mit einem Web-Browser auf den Applikationsserver zugreifen:

10.1.2.3:8080/docs-web/src/

Das Standardpasswort des Administrator-Kontos lautet admin, wie eine Suche durch den Quellcode offenbart:

$ ack passw
...
docs-core/src/main/java/com/sismics/docs/core/constant/Constants.java
19:     * Administrator's default password ("admin").
...

Java Advanced Imaging

Die Web-Oberfläche funktioniert, man kann Dateien hochladen — doch ausgerechnet das erste PDF produzierte folgende Fehlermeldung im Log der Applikation:

Cannot read JPEG2000 image: Java Advanced Imaging (JAI) Image I/O Tools are not installed

Diese Tools installiert man sich folgendermassen:

$ cd /tmp
$ wget "https://install-java-jai-imageio.googlecode.com/files/install-java-jai-imageio"
# bash /tmp/install-java-jai-imageio

Quelle: Install Java Advanced Imaging ImageIO Tools on a Linux Machine

ACHTUNG: Bitte den Inhalt aller aus dem Netz heruntergeladenen Bash-Scripts gründlich prüfen, bevor man sie unter dem root-Account ausführt.

Weitere Pakete installieren

Rückblickendes Ziel meines Sonntagsprojekts war es, die Applikation unter dem Java-Applikationsserver Jetty persistent zum Laufen zu bringen. Hierzu bauen wir uns ein sog. war-File. Damit das auch sauber funktioniert, benötigen wir folgende Pakete:

# apt-get install nodejs npm
# ln -s /usr/bin/nodejs /usr/bin/node
# npm install -g grunt-cli

Wir sehen, ob alle nötigen Komponenten da sind, wenn folgende Befehle einen Wert zurückgeben:

$ which node
/usr/bin/node
$ which grunt
/usr/local/bin/grunt

Insbesondere das node-Binary ist zwingend nötig — bei den ersten Kompilationsversuchen erschien folgende Fehlermeldung …

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Docs Web 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ docs-web ---
[INFO] Deleting /usr/local/bin/sismics/docs-web/target
[INFO] 
[INFO] --- maven-antrun-plugin:1.8:run (default) @ docs-web ---
[INFO] Executing tasks

building:
     [exec] /usr/bin/env: ‘node’: No such file or directory
     [exec] Result: 127
[INFO] Executed tasks
[INFO] 
[INFO] --- maven-resources-plugin:2.7:resources (default-resources) @ docs-web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 1 resource
[INFO] Copying 1 resource
...

… und ich endete mit einem nur halbwegs funktionsfähigen .war, weil bestimmte nodejs-Komponenten fehlten:

building:
     [exec] /usr/bin/env: ‘node’: No such file or directory
     [exec] Result: 127

Der oben angelegte Symlink löst dieses Problem:

...
building:
     [exec] Running "clean:dist" (clean) task
     [exec] 
     [exec] Running "ngmin:dist" (ngmin) task
     [exec] ngminifying src/app/docs/app.js, src/app/docs/controller/Login.js, src/app/docs/controller/Main.js, src/app/docs/controller/Navigation.js, src/app/docs/controller/document/Document.js, src/app/docs/controller/document/DocumentDefault.js, src/app/docs/controller/document/DocumentEdit.js, src/app/docs/controller/document/DocumentModalPdf.js, src/app/docs/controller/document/DocumentModalShare.js, src/app/docs/controller/document/DocumentView.js, src/app/docs/controller/document/DocumentViewActivity.js, src/app/docs/controller/document/DocumentViewContent.js, src/app/docs/controller/document/DocumentViewPermissions.js, src/app/docs/controller/document/FileModalView.js, src/app/docs/controller/document/FileView.js, src/app/docs/controller/settings/Settings.js, src/app/docs/controller/settings/SettingsAccount.js, src/app/docs/controller/settings/SettingsDefault.js, src/app/docs/controller/settings/SettingsGroup.js, src/app/docs/controller/settings/SettingsGroupEdit.js, src/app/docs/controller/settings/SettingsLog.js, src/app/docs/controller/settings/SettingsSecurity.js, src/app/docs/controller/settings/SettingsSecurityModalDisableTotp.js, src/app/docs/controller/settings/SettingsSession.js, src/app/docs/controller/settings/SettingsUser.js, src/app/docs/controller/settings/SettingsUserEdit.js, src/app/docs/controller/settings/SettingsVocabulary.js, src/app/docs/controller/tag/Tag.js, src/app/docs/controller/usergroup/GroupProfile.js, src/app/docs/controller/usergroup/UserGroup.js, src/app/docs/controller/usergroup/UserProfile.js, src/app/docs/directive/Acl.js, src/app/docs/directive/AuditLog.js, src/app/docs/directive/File.js, src/app/docs/directive/ImgError.js, src/app/docs/directive/InlineEdit.js, src/app/docs/directive/SelectRelation.js, src/app/docs/directive/SelectTag.js, src/app/docs/filter/Filesize.js, src/app/docs/filter/Newline.js, src/app/docs/filter/Shorten.js, src/app/docs/service/Tag.js, src/app/docs/service/User.js, src/app/share/app.js, src/app/share/controller/FileModalView.js, src/app/share/controller/FileView.js, src/app/share/controller/Main.js, src/app/share/controller/Share.js, src/app/share/controller/ShareModalPdf.js, src/app/share/filter/Filesize.js, src/app/share/filter/Newline.js
     [exec] 
     [exec] Running "concat:docs" (concat) task
     [exec] File "dist/docs.js" created.
     [exec] 
     [exec] Running "concat:share" (concat) task
     [exec] File "dist/share.js" created.
     [exec] 
     [exec] Running "less:dist" (less) task
     [exec] File dist/less.css created.
     [exec] 
     [exec] Running "concat:css" (concat) task
     [exec] File "dist/style.css" created.
     [exec] 
     [exec] Running "cssmin:dist" (cssmin) task
     [exec] File 'dist/style/style.min.css' written.
     [exec] Uncompressed size: 165398 bytes.
     [exec] Compressed size: 31032 bytes gzipped (139383 bytes minified).
     [exec] 
     [exec] Running "uglify:docs" (uglify) task
     [exec] File dist/docs.min.js created.
     [exec] 
     [exec] Running "uglify:share" (uglify) task
     [exec] File dist/share.min.js created.
     [exec] 
     [exec] Running "copy:dist" (copy) task
     [exec] Created 23 directories, copied 53 files
     [exec] 
     [exec] Running "remove:dist" (remove) task
     [exec] 
     [exec] Running "cleanempty:src" (cleanempty) task
     [exec] Cleaning dist/locale...OK
     [exec] Cleaning dist/lib...OK
     [exec] 
     [exec] Running "htmlrefs:index" (htmlrefs) task
     [exec] 
     [exec] Running "htmlrefs:share" (htmlrefs) task
     [exec] 
     [exec] Running "replace:dist" (replace) task
     [exec] 
     [exec] Done, without errors.
...

Quelle: run npm command gives error „/usr/bin/env: node: No such file or directory“

.war kompilieren

Nun ist alles da, um das .war zu kompilieren:

# cd /usr/local/bin/sismics/docs-web
# mvn -Pprod -DskipTests clean install
...
[INFO] Installing /usr/local/bin/sismics/docs-web/target/docs-web-1.0-SNAPSHOT.war to /root/.m2/repository/com/sismics/docs/docs-web/1.0-SNAPSHOT/docs-web-1.0-SNAPSHOT.war
[INFO] Installing /usr/local/bin/sismics/docs-web/pom.xml to /root/.m2/repository/com/sismics/docs/docs-web/1.0-SNAPSHOT/docs-web-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 14.935 s
[INFO] Finished at: 2016-03-27T10:37:55+00:00
[INFO] Final Memory: 28M/68M
[INFO] ------------------------------------------------------------------------

Jetty installieren und das .war bekanntmachen

Als nächstes installiert man Jetty:

# apt-get install jetty9

Sobald Jetty existiert, kopiert man das vorhin kompilierte .war in folgendes Verzeichnis:

# cp /root/.m2/repository/com/sismics/docs/docs-web/1.0-SNAPSHOT/docs-web-1.0-SNAPSHOT.war /usr/share/jetty9/webapps/dms.war

ACHTUNG: Es gibt auch ein Verzeichnis /usr/share/jetty/webapps/; Jetty ignoriert dieses aber (meiner Meinung nach). Das .war gehört nicht hierhin.

Datenverzeichnis anlegen

# mkdir /var/docs
# chmod 777 /var/docs

Jetty neu starten

# service jetty9 start

Sismics Docs aufrufen

Sobald Jetty läuft, öffnet man den Browser wieder:

10.1.2.3:8080/dms/

Man loggt sich ein, ändert das Admin-Passwort, erstellt weitere User, lädt ein Testdokument hoch, loggt sich wieder aus — und dann stoppt man Jetty testhalber wieder um sicherzugehen, dass die Daten und Konfiguration auch einen Stop des Applikationsservers überlegen:

# service jetty9 stop
# service jetty9 start

Nun sollte man sich mit dem soeben gesetzten Admin-Passwort einloggen können und das vorher hochgeladene Dokument sehen.

Fertig! Nun kann der Spass beginnen.

Die API-Dokumentation habe ich leider noch nicht gefunden …

Tags: , , , , , , , , ,
Labels: Uncategorized

1 Kommentar | neuen Kommentar verfassen

Mittwoch, 24. Februar 2016

Eine interne Smokeping-Installation über Apache Reverse Proxy verfügbar machen

Heute morgen (US Pacific-Zeit) habe ich mir einige Minuten Zeit genommen, um eine Smokeping-Installation auf dem Linux-Server (nennen wir ihn BETA) in meiner Wohnung in Bern über einen Linux-Server im Elternhaus in Neuenegg zugänglich zu machen. Nur der Apache 2.4 Web-Server auf dem Linux-Server im Elternhaus (nennen wir ihn ALPHA) ist öffentlich aus dem Internet zugänglich.

Wenn Smokeping auf einem bestehenden Server bereits installiert, konfiguriert und aufrufbar ist, ist dieses Vorhaben äusserst simpel:

Als erstes laden wir auf ALPHA die benötigten zwei Proxy-Module:

# cd /etc/apache2/mods-enabled
# ln -s ../mods-available/proxy.conf .
# ln -s ../mods-available/proxy_http.conf .

Weiter erstellen wir ebenfalls auf ALPHA einen virtuellen Host mit folgenden Angaben:

<VirtualHost *:80>
	ServerName smokeping-beta.bern.homeip.net
	ServerAdmin info@eMeidi.com
	
	ProxyPass	/	http://10.1.2.3/
	
	<Location />
		AuthName		"Eyes Only"
		AuthType 		Digest
		AuthUserFile		/etc/apache2/auth/users.digest
		AuthDigestProvider	file
		AuthDigestDomain	/
		
		Require			valid-user
	</Location>
</VirtualHost>

Diese Angaben legen wir unter /etc/apache2/sites-available ab und nennen die Datei beispielsweise smokeping-bern. Schlussendlich aktivieren wir diese folgendermassen:

# cd /etc/apache2/sites-enabled
# ln -s ../sites-available/smokeping-bern

Anschliessend starten wir auf ALPHA den Web-Server neu:

# apache2ctl graceful

Damit Smokeping in der Folge sauber mit allen relativen Pfaden funktioniert, aber auch die Bilder (RRDtool-Graphen) angezeigt werden, rufe ich die Web-Site auf einem beliebigen Computer mit Internetverbindung folgendermassen auf:

http://smokeping-beta.bern.homeip.net/smokeping/smokeping.cgi

WICHTIG: Damit nur authentifizierte Personen auf diesen Reverse Proxy zugreifen können, schütze ich den gesamten Virtual Host mit Benutzernamen und Passwort. Dies ist deshalb auch wichtig, weil meine Konfiguration alle Anfragen auf den Virtual Host an den anderen Server weiterleitet — habe ich in anderen Unterverzeichnissen noch andere Applikationen laufen, wären diese ebenfalls über den Reverse Proxy ansprechbar. Das ist nicht schön, aber momentan als Quick & Dirty-Lösung akzeptabel.

Tags: , , , , , ,
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 14. Februar 2016

New York Times-Videos herunterladen

Heute wollte ich mir ein informatives Video der New York Times herunterladen, in welchem die Entdeckung von Gravitationswellen erläutert wird: Gravitational Waves Detected, Confirming Einstein’s Theory

Leider wird das Video gestreamt und kann nicht wie früher als komplettes MP4 heruntergeladen werden.

Mit Safaris Develop > Show Page Resources Menu war es mir dann aber rasch möglich, im Ordner „Other“ den Aufruf einer m3u8-Videoplaylist zu beobachten:

NYTimes m3u8

Bewaffnet mit dieser URL und der Unterstützung des geliebten ffmpeg konnte ich dann das Video streamen und im MP4-Format ablegen:

$ ffmpeg -i "http://vp.nyt.com/video/2016/02/13/38248_1_out-there-g-waves_wg_hls/master.m3u8" -strict -2 video.mp4
ffmpeg version 2.8.3 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
  configuration: --prefix=/opt/local --enable-swscale --enable-avfilter --enable-avresample --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libtheora --enable-libschroedinger --enable-libopenjpeg --enable-libmodplug --enable-libvpx --enable-libsoxr --enable-libspeex --enable-libass --enable-libbluray --enable-lzma --enable-gnutls --enable-fontconfig --enable-libfreetype --enable-libfribidi --disable-indev=jack --disable-outdev=xv --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/clang --enable-vda --enable-videotoolbox --arch=x86_64 --enable-yasm --enable-gpl --enable-postproc --enable-libx264 --enable-libxvid
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
[http @ 0x7fa8b1710060] No trailing CRLF found in HTTP header.
[http @ 0x7fa8b1710ba0] No trailing CRLF found in HTTP header.
[http @ 0x7fa8b153de80] No trailing CRLF found in HTTP header.
[http @ 0x7fa8b1536cc0] No trailing CRLF found in HTTP header.
[http @ 0x7fa8b2809660] No trailing CRLF found in HTTP header.
[http @ 0x7fa8b290fa60] No trailing CRLF found in HTTP header.
Input #0, hls,applehttp, from 'http://vp.nyt.com/video/2016/02/13/38248_1_out-there-g-waves_wg_hls/master.m3u8':
  Duration: 00:04:37.00, start: 10.000000, bitrate: 0 kb/s
  Program 0 
    Metadata:
      variant_bitrate : 3900747
    Stream #0:0: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709/bt709/unknown), 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Metadata:
      variant_bitrate : 3900747
    Stream #0:1: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 51 kb/s
    Metadata:
      variant_bitrate : 3900747
  Program 1 
    Metadata:
      variant_bitrate : 426834
    Stream #0:2: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 426x240 [SAR 1:1 DAR 71:40], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Metadata:
      variant_bitrate : 426834
    Stream #0:3: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 51 kb/s
    Metadata:
      variant_bitrate : 426834
  Program 2 
    Metadata:
      variant_bitrate : 1039878
    Stream #0:4: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Metadata:
      variant_bitrate : 1039878
    Stream #0:5: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 51 kb/s
    Metadata:
      variant_bitrate : 1039878
  Program 3 
    Metadata:
      variant_bitrate : 1652921
    Stream #0:6: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv, smpte170m/smpte170m/unknown), 854x480 [SAR 1:1 DAR 427:240], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Metadata:
      variant_bitrate : 1652921
    Stream #0:7: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 51 kb/s
    Metadata:
      variant_bitrate : 1652921
  Program 4 
    Metadata:
      variant_bitrate : 2674660
    Stream #0:8: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709/bt709/unknown), 1280x720 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Metadata:
      variant_bitrate : 2674660
    Stream #0:9: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 51 kb/s
    Metadata:
      variant_bitrate : 2674660
  Program 5 
    Metadata:
      variant_bitrate : 97776
    Stream #0:10: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 51 kb/s
    Metadata:
      variant_bitrate : 97776
[libx264 @ 0x7fa8b402d000] using SAR=1/1
[libx264 @ 0x7fa8b402d000] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 0x7fa8b402d000] profile High, level 4.0
[libx264 @ 0x7fa8b402d000] 264 - core 142 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'video.mp4':
  Metadata:
    encoder         : Lavf56.40.101
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=-1--1, 29.97 fps, 30k tbn, 29.97 tbc
    Metadata:
      variant_bitrate : 3900747
      encoder         : Lavc56.60.100 libx264
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, fltp, 128 kb/s
    Metadata:
      variant_bitrate : 3900747
      encoder         : Lavc56.60.100 aac
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
[http @ 0x7fa8b2b04620] No trailing CRLF found in HTTP header.rate=   0.2kbits/s dup=1 drop=0    
[hls,applehttp @ 0x7fa8b3000000] No longer receiving playlist 1
[hls,applehttp @ 0x7fa8b3000000] No longer receiving playlist 2
[hls,applehttp @ 0x7fa8b3000000] No longer receiving playlist 3
[hls,applehttp @ 0x7fa8b3000000] No longer receiving playlist 4
[hls,applehttp @ 0x7fa8b3000000] No longer receiving playlist 5
[http @ 0x7fa8b153dea0] No trailing CRLF found in HTTP header.trate= 129.0kbits/s dup=1 drop=0    
[http @ 0x7fa8b1710a60] No trailing CRLF found in HTTP header.trate= 934.7kbits/s dup=1 drop=0    
[http @ 0x7fa8b2a06800] No trailing CRLF found in HTTP header.trate=1266.5kbits/s dup=1 drop=0    
[http @ 0x7fa8b290f640] No trailing CRLF found in HTTP header.trate=1687.0kbits/s dup=1 drop=0    
[http @ 0x7fa8b1602500] No trailing CRLF found in HTTP header.trate=1430.5kbits/s dup=1 drop=0    
[http @ 0x7fa8b1408e60] No trailing CRLF found in HTTP header.trate=1839.4kbits/s dup=1 drop=0    
[http @ 0x7fa8b2949ac0] No trailing CRLF found in HTTP header.trate=2542.5kbits/s dup=1 drop=0    
[http @ 0x7fa8b17134c0] No trailing CRLF found in HTTP header.trate=2730.8kbits/s dup=1 drop=0    
[http @ 0x7fa8b2a03260] No trailing CRLF found in HTTP header.trate=2688.2kbits/s dup=1 drop=0    
[http @ 0x7fa8b1718b20] No trailing CRLF found in HTTP header.trate=2669.8kbits/s dup=1 drop=0    
[http @ 0x7fa8b153a500] No trailing CRLF found in HTTP header.trate=2726.5kbits/s dup=1 drop=0    
[http @ 0x7fa8b1533700] No trailing CRLF found in HTTP header.trate=3060.7kbits/s dup=1 drop=0    
[http @ 0x7fa8b2948ac0] No trailing CRLF found in HTTP header.trate=3412.8kbits/s dup=1 drop=0    
[http @ 0x7fa8b17143a0] No trailing CRLF found in HTTP header.trate=3669.3kbits/s dup=1 drop=0    
[http @ 0x7fa8b1403ae0] No trailing CRLF found in HTTP header.trate=3883.5kbits/s dup=1 drop=0    
[http @ 0x7fa8b2b03b00] No trailing CRLF found in HTTP header.trate=4061.9kbits/s dup=1 drop=0    
[http @ 0x7fa8b2a022a0] No trailing CRLF found in HTTP header.trate=4163.1kbits/s dup=1 drop=0    
[http @ 0x7fa8b152e620] No trailing CRLF found in HTTP header.trate=4201.3kbits/s dup=1 drop=0    
[http @ 0x7fa8b2b062c0] No trailing CRLF found in HTTP header.trate=4589.8kbits/s dup=1 drop=0    
[http @ 0x7fa8b1401ee0] No trailing CRLF found in HTTP header.trate=4955.7kbits/s dup=1 drop=0    
[http @ 0x7fa8b294dde0] No trailing CRLF found in HTTP header.trate=5290.4kbits/s dup=1 drop=0    
[http @ 0x7fa8b290fa60] No trailing CRLF found in HTTP header.trate=5383.0kbits/s dup=1 drop=0    
[http @ 0x7fa8b1534d80] No trailing CRLF found in HTTP header.trate=5476.8kbits/s dup=1 drop=0    
[http @ 0x7fa8b2a03960] No trailing CRLF found in HTTP header.trate=5499.9kbits/s dup=1 drop=0    
[http @ 0x7fa8b1535ce0] No trailing CRLF found in HTTP header.trate=5433.0kbits/s dup=1 drop=0    
[http @ 0x7fa8b2b074e0] No trailing CRLF found in HTTP header.trate=5348.0kbits/s dup=1 drop=0    
[http @ 0x7fa8b294cda0] No trailing CRLF found in HTTP header.trate=5295.3kbits/s dup=1 drop=0    
[http @ 0x7fa8b1713180] No trailing CRLF found in HTTP header.trate=5206.8kbits/s dup=1 drop=0    
[http @ 0x7fa8b1403900] No trailing CRLF found in HTTP header.trate=5077.6kbits/s dup=1 drop=0    
[http @ 0x7fa8b1712340] No trailing CRLF found in HTTP header.trate=4959.7kbits/s dup=1 drop=0    
[http @ 0x7fa8b1605f40] No trailing CRLF found in HTTP header.trate=4834.7kbits/s dup=1 drop=0    
[http @ 0x7fa8b1536700] No trailing CRLF found in HTTP header.trate=4884.1kbits/s dup=1 drop=0    
[http @ 0x7fa8b1534300] No trailing CRLF found in HTTP header.trate=4905.5kbits/s dup=1 drop=0    
[http @ 0x7fa8b1534320] No trailing CRLF found in HTTP header.trate=4854.4kbits/s dup=1 drop=0    
[http @ 0x7fa8b294fb40] No trailing CRLF found in HTTP header.trate=4758.6kbits/s dup=1 drop=0    
[http @ 0x7fa8b1401a00] No trailing CRLF found in HTTP header.trate=4719.5kbits/s dup=1 drop=0    
[http @ 0x7fa8b16048e0] No trailing CRLF found in HTTP header.trate=4656.1kbits/s dup=1 drop=0    
[http @ 0x7fa8b2803680] No trailing CRLF found in HTTP header.trate=4603.5kbits/s dup=1 drop=0    
[http @ 0x7fa8b1606b40] No trailing CRLF found in HTTP header.trate=4587.9kbits/s dup=1 drop=0    
[http @ 0x7fa8b1402a00] No trailing CRLF found in HTTP header.trate=4594.0kbits/s dup=1 drop=0    
[http @ 0x7fa8b2a03c60] No trailing CRLF found in HTTP header.trate=4618.0kbits/s dup=1 drop=0    
[http @ 0x7fa8b1403a20] No trailing CRLF found in HTTP header.trate=4624.4kbits/s dup=1 drop=0    
[http @ 0x7fa8b294c9e0] No trailing CRLF found in HTTP header.trate=4669.2kbits/s dup=1 drop=0    
[http @ 0x7fa8b2a03da0] No trailing CRLF found in HTTP header.trate=4708.8kbits/s dup=1 drop=0    
[http @ 0x7fa8b1404820] No trailing CRLF found in HTTP header.trate=4697.4kbits/s dup=1 drop=0    
[http @ 0x7fa8b1604620] No trailing CRLF found in HTTP header.trate=4695.4kbits/s dup=1 drop=0    
[http @ 0x7fa8b153a0c0] No trailing CRLF found in HTTP header.trate=4719.0kbits/s dup=1 drop=0    
[http @ 0x7fa8b2a032e0] No trailing CRLF found in HTTP header.trate=4712.0kbits/s dup=1 drop=0    
[http @ 0x7fa8b28056a0] No trailing CRLF found in HTTP header.trate=4757.4kbits/s dup=1 drop=0    
[http @ 0x7fa8b2805680] No trailing CRLF found in HTTP header.trate=4802.8kbits/s dup=1 drop=0    
[http @ 0x7fa8b2a027a0] No trailing CRLF found in HTTP header.trate=4848.1kbits/s dup=1 drop=0    
[http @ 0x7fa8b28066c0] No trailing CRLF found in HTTP header.trate=4901.2kbits/s dup=1 drop=0    
[http @ 0x7fa8b2a03680] No trailing CRLF found in HTTP header.trate=4898.0kbits/s dup=1 drop=0    
[http @ 0x7fa8b294b8c0] No trailing CRLF found in HTTP header.trate=4900.6kbits/s dup=1 drop=0    
[http @ 0x7fa8b2b0afe0] No trailing CRLF found in HTTP header.trate=4900.4kbits/s dup=1 drop=0    
[http @ 0x7fa8b1602440] No trailing CRLF found in HTTP header.trate=4900.4kbits/s dup=1 drop=0    
[http @ 0x7fa8b2a062e0] No trailing CRLF found in HTTP header.trate=4935.7kbits/s dup=1 drop=0    
[http @ 0x7fa8b1717840] No trailing CRLF found in HTTP header.trate=4923.7kbits/s dup=1 drop=0    
[http @ 0x7fa8b280c880] No trailing CRLF found in HTTP header.trate=4914.9kbits/s dup=1 drop=0    
[http @ 0x7fa8b2a02340] No trailing CRLF found in HTTP header.trate=4849.2kbits/s dup=1 drop=0    
[http @ 0x7fa8b1602b00] No trailing CRLF found in HTTP header.trate=4797.2kbits/s dup=1 drop=0    
[http @ 0x7fa8b2b10f20] No trailing CRLF found in HTTP header.trate=4750.1kbits/s dup=1 drop=0    
[http @ 0x7fa8b2808620] No trailing CRLF found in HTTP header.trate=4713.4kbits/s dup=1 drop=0    
[http @ 0x7fa8b1404980] No trailing CRLF found in HTTP header.trate=4892.4kbits/s dup=1 drop=0    
[http @ 0x7fa8b14044a0] No trailing CRLF found in HTTP header.trate=5097.0kbits/s dup=1 drop=0    
[http @ 0x7fa8b2a04ea0] No trailing CRLF found in HTTP header.trate=5236.7kbits/s dup=1 drop=0    
[http @ 0x7fa8b1536d40] No trailing CRLF found in HTTP header.trate=5251.2kbits/s dup=1 drop=0    
[http @ 0x7fa8b294ade0] No trailing CRLF found in HTTP header.trate=5216.1kbits/s dup=1 drop=0    
[http @ 0x7fa8b2a01d80] No trailing CRLF found in HTTP header.trate=5159.0kbits/s dup=1 drop=0    
[http @ 0x7fa8b15371e0] No trailing CRLF found in HTTP header.trate=5116.1kbits/s dup=1 drop=0    
[http @ 0x7fa8b2953fc0] No trailing CRLF found in HTTP header.trate=5068.9kbits/s dup=1 drop=0    
[http @ 0x7fa8b2954100] No trailing CRLF found in HTTP header.trate=5021.2kbits/s dup=1 drop=0    
[http @ 0x7fa8b2804b60] No trailing CRLF found in HTTP header.trate=4988.7kbits/s dup=1 drop=0    
[http @ 0x7fa8b2948fc0] No trailing CRLF found in HTTP header.trate=4956.8kbits/s dup=1 drop=0    
[http @ 0x7fa8b2805bc0] No trailing CRLF found in HTTP header.trate=4937.3kbits/s dup=1 drop=0    
[http @ 0x7fa8b1567be0] No trailing CRLF found in HTTP header.trate=4907.3kbits/s dup=1 drop=0    
[http @ 0x7fa8b16030e0] No trailing CRLF found in HTTP header.trate=4892.0kbits/s dup=1 drop=0    
[http @ 0x7fa8b2950600] No trailing CRLF found in HTTP header.trate=4893.3kbits/s dup=1 drop=0    
[http @ 0x7fa8b2b0e9c0] No trailing CRLF found in HTTP header.trate=4882.8kbits/s dup=1 drop=0    
[http @ 0x7fa8b1405380] No trailing CRLF found in HTTP header.trate=4892.7kbits/s dup=1 drop=0    
[http @ 0x7fa8b1712340] No trailing CRLF found in HTTP header.trate=4891.4kbits/s dup=1 drop=0    
[http @ 0x7fa8b2a03180] No trailing CRLF found in HTTP header.trate=4888.3kbits/s dup=1 drop=0    
[http @ 0x7fa8b171d040] No trailing CRLF found in HTTP header.trate=4883.4kbits/s dup=1 drop=0    
[http @ 0x7fa8b1717520] No trailing CRLF found in HTTP header.trate=4867.7kbits/s dup=1 drop=0    
[http @ 0x7fa8b153de80] No trailing CRLF found in HTTP header.trate=4864.0kbits/s dup=1 drop=0    
[http @ 0x7fa8b1402a40] No trailing CRLF found in HTTP header.trate=4849.4kbits/s dup=1 drop=0    
[http @ 0x7fa8b14026a0] No trailing CRLF found in HTTP header.trate=4878.3kbits/s dup=1 drop=0    
[http @ 0x7fa8b2b09980] No trailing CRLF found in HTTP header.trate=4861.0kbits/s dup=1 drop=0    
[http @ 0x7fa8b1710980] No trailing CRLF found in HTTP header.trate=4841.8kbits/s dup=1 drop=0    
[http @ 0x7fa8b2a024c0] No trailing CRLF found in HTTP header.trate=4829.8kbits/s dup=1 drop=0    
[http @ 0x7fa8b2b0d080] No trailing CRLF found in HTTP header.trate=4812.2kbits/s dup=1 drop=0    
frame= 8280 fps= 19 q=-1.0 Lsize=  161479kB time=00:04:36.20 bitrate=4789.2kbits/s dup=3 drop=0    
video:156761kB audio:4396kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.199356%
[libx264 @ 0x7fa8b402d000] frame I:124   Avg QP:19.52  size: 97053
[libx264 @ 0x7fa8b402d000] frame P:4102  Avg QP:22.58  size: 27562
[libx264 @ 0x7fa8b402d000] frame B:4054  Avg QP:24.78  size:  8739
[libx264 @ 0x7fa8b402d000] consecutive B-frames: 26.8% 20.0% 10.9% 42.3%
[libx264 @ 0x7fa8b402d000] mb I  I16..4: 14.0% 61.1% 24.9%
[libx264 @ 0x7fa8b402d000] mb P  I16..4:  2.8%  5.4%  1.2%  P16..4: 40.5%  9.3%  4.3%  0.0%  0.0%    skip:36.4%
[libx264 @ 0x7fa8b402d000] mb B  I16..4:  0.1%  0.2%  0.2%  B16..8: 41.5%  2.5%  0.4%  direct: 1.2%  skip:54.0%  L0:49.9% L1:48.4% BI: 1.8%
[libx264 @ 0x7fa8b402d000] 8x8 transform intra:57.5% inter:60.3%
[libx264 @ 0x7fa8b402d000] coded y,uvDC,uvAC intra: 47.1% 38.5% 6.2% inter: 12.1% 9.3% 0.2%
[libx264 @ 0x7fa8b402d000] i16 v,h,dc,p: 26% 31% 13% 30%
[libx264 @ 0x7fa8b402d000] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% 18% 33%  4%  5%  4%  5%  3%  5%
[libx264 @ 0x7fa8b402d000] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 18% 18% 25%  8%  8%  6%  8%  5%  6%
[libx264 @ 0x7fa8b402d000] i8c dc,h,v,p: 63% 21% 11%  4%
[libx264 @ 0x7fa8b402d000] Weighted P-Frames: Y:16.9% UV:11.9%
[libx264 @ 0x7fa8b402d000] ref P L0: 63.1% 15.1% 16.2%  5.3%  0.3%
[libx264 @ 0x7fa8b402d000] ref B L0: 86.4% 12.3%  1.4%
[libx264 @ 0x7fa8b402d000] ref B L1: 95.8%  4.2%
[libx264 @ 0x7fa8b402d000] kb/s:4648.19

Tags: , , , ,
Labels: Uncategorized

1 Kommentar | neuen Kommentar verfassen

Sonntag, 17. Januar 2016

MySQL meldet Fehler 2049

Vor einigen Wochen habe ich im Zuge eines apt-get upgrade MySQL auf meinem Linux-Server zu Hause aktualisiert. Wie gelegentlich der Fall resultierte das Update in einem Kollateralschaden. In meinem PHP Error-Log las ich nach dem Update für einige meiner Web-Applikationen folgendes:

MySQL returned error #2049: Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)

Nach etwas Googeln stellte sich heraus, dass einige meiner MySQL-Benutzer ihr Passwort noch mit einem uralten MySQL-Hash in der Datenbank liegen hatten:

Support for pre-4.1 password hashes is removed in MySQL 5.7.5. This includes removal of the mysql_old_password authentication plugin and the OLD_PASSWORD() function.

Quelle: 6.1.2.4 Password Hashing in MySQL

Nachdem ich die Klartext-Passwörter im PHP-Code der Applikationen ausfindig gemacht hatte, änderte ich diese mittels phpMyAdmin in den MySQL-Benutzertabelle und verwendete dafür die PASSWORD()-Funktion.

Noch ein FLUSH PRIVILEGES, und die Web-Applikationen funktionierten wieder ohne Murren.

Tags: , , , , ,
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 17. Januar 2016

Thanksgiving Turducken

Auch 2015 ehrten Stephanie und ich die US-amerikanischen Traditionen und feierten Thanksgiving. Seit vier Jahren gibt es an einem Wochenende im November Schweizer Truthahn und viele andere typische Gerichte, die die amerikanische Küche für dieses Fest erfunden hat.

Was ich hingegen bis heute noch nie zu Ohren und zu Gesicht bekommen habe ist ein sogenannter Turducken, ein Frankenstein-Gericht aus Turkey (Truthahn), Duck (Ente) und Chicken (Huhn). Womit die Amis wieder einmal ihrem Stereotyp von Gourmet-Banausen alle Ehren gemacht haben — Hauptsache Quantität, richtig?

Spontan erinnert mich das an folgende Gault Millau-Kreation:

Tags: , ,
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 17. Januar 2016

WiFi-Sicherheit erhöhen: Bye bye TKIP

Auf dem Flug von Tel Aviv nach Zürich hatte ich Zeit, längst überfällige YouTube-Videos zu schauen. Unter anderem auch eine Präsentation von der BruCON 0x07 mit dem Titel „Advances WiFi Attacks using Commodity Hardware“:

Noch während dem Flug notierte ich mir gemäss den Ausführungen im Video ab 42 Minuten 52 Sekunden, zu Hause auf meinem Asus RT-AC66U mit DD-WRT das unsichere Verschlüsselungsprotokoll TKIP zu deaktivieren. Aus (unnötigen) Kompatibilitätsgründen könnte dieses Protokoll nämlich auch 2016 noch Standardmässig auf WLAN-Access Points aktiviert sein.

Erleichtert durfte ich zu Hause dann aber feststellen, dass ich offenbar in weiser Voraussicht längst nur noch AES-CCMP aktiviert hatte:

DD-WRT Wireless Security

Tags: , , , , , , , , , , ,
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 3. Juni 2015

Europäischen Stromsteckerkopf von Nikon MH-24 entfernen

Wer wie ich regelmässig in die USA fliegt, schätzt es, wo immer möglich US-Stromsteckerköpfe an Netzteilen einzusetzen. Das Akkuladegerät Nikon MH-24, welches ich mit meiner Nikon D3300 gekauft habe, vereint beide Welten. In der unmodizifierten Fassung verfügt das Ladegerät über einen us-amerikanischen Stromstecker.

Bei in Europa verkauften Kameras legt Nikon dann einen aufsteckbaren Adapter bei, welcher das Ladegerät mit dem zweipoligen, runden Europaanschluss mit unserem Kontinent kompatibel macht.

Tritt man eine Reise nach Nordamerika an, empfiehlt es sich deshalb, den europäischen Aufsteckknopf zu entfernen. Dies ist auf Anhieb gar nicht so einfach. Eine Google-Suche hat mich deshalb auf folgende Forumsdiskussion gelenkt:

First you need to find a small flat screwdriver, you will also need something narrow that will fit into a hole about 3-4mm across (keep it clean guys I found a biro nib was ideal, you’ll have to remove it from the pen casing first though.

Hold the charger with the pins facing away from you like you’re about to put it into a power-socket, slide the flat screwdriver into the gap between the top of the charger and the join between the plug adapter (you’ll notice that there is a small hole here, but its easier to use a screwdriver trust me), slide the screwdriver in as far as you can (just to the side of the hole, as the catch is about 4mm wide either side of the hole) and keep pressure on it. Turn the whole unit 90 degrees so that you’re looking at it sideways; now gently pull the 3 pin adapter from the bottom away from the charing unit, as if you are peeling it off like a sticker.

This should release the catch at the top, however, you still have the catch at the side to deal with, and not much room to manouvre, I managed to release the second catch by twisting the 3 pin adapter towards the catch, however, this could damage the plastic catch a little, so to play safe, use your narrow item to push in the catch….you’ll have to push very hard to release it though.

Quelle: MH-24 plug charger problem?

Obwohl der lange Text auf den ersten Blick hin abschreckt darf ich beruhigen: Es ist wirklich ganz einfach. Man nehme einen kleinen, flachen Schraubenzieher und stosse diesen in Folge unter die beiden Plastic-Klemmen, mit welchen der Europa-Stecker an das Netzteil angemacht ist. Der Adapter löst sich und gibt die US-Stecker frei.

Ich habe das Prozedere nun bereits viele Male durchgeführt, ohne dass das Netzteil oder der Adapter je Schaden genommen hätten.

Tags: , , , , , ,
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 3. Juni 2015

PHP erlaubt keine Floats als Array-Schlüssel

Da programmiere ich seit bald 15 Jahren mit PHP, doch erst vor wenigen Wochen habe ich realisiert, dass Arrays keine Floats als Schlüssel unterstützen. Variablen mit Fliesskommazahlen können zwar durchaus als Schlüssel gesetzt werden, werden in der Folge aber in Integer-Werte umgewandelt. Dies führt dazu, dass Schlüssel wie ‚3.3‘ sowie ‚3.4‘ zu ‚3‘ umgewandelt werden und der Variablenwert dementsprechend überschrieben wird:

Working with an array with periods in key values

Wer die Fliesskommazahlen zwingend benötigt, muss diese zuerst in Strings umwandeln:

...
$key = 3.3;
$keyValid = (string)$key;
$array[$key] = 'One';
$array[$keyValid] = 'Two';
var_dump($array);
...

Via: ToString() equivalent in PHP

ergibt:

array(2) {
  [3]=>
  string(3) "One"
  ["3.3"]=>
  string(3) "Two"
}

Tags: , , , , , , , ,
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen