02/28/21

Install Docker and Rails on Debian

Part 1: Docker auf einem frischen Debian Server installieren

  1. Install Docker Engine on Debian
  2. Install Docker Compose
  3. Quickstart: Compose and Rails || da ich lieber MySQL nutzen will: Setting up Ruby on Rails with docker and MySQL
    1. Aus den dockerdocs habe ich folgende Zeile übernommen für die docker-compose.yml: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" Erklärung: server.pid löschen, da das sonst oft zu Problemen führt beim Start.

12/1/16

RVM und Apache

Manage Ruby Versions and gem-packages

Mit RVM kann man pro Anwendung individuelle Railsversionen und gem-Packete definieren, die verwendet werden sollen. Extrem praktisch, um z.B. ein Projekt mit neuen Ruby oder Railsversionen zu testen oder umgekehrt dem Updatezwang zu entgehen.

Einführung in RVM

Ruby 2.1.1 installieren und benutzen

$ rvm install 2.1.1
$ rvm use 2.1.1

Um wieder das Default System-Ruby ohne rvm zu nutzen:

$ rvm use system

Gemsets Basics

Erst werden 1 oder mehrere (leere) gemsets erstellt.
Dann wird ein gemset mit der Rubyversion aktiviert. Dann können für dieses gemset gems installiert werden.

$ rvm gemset create rails410 rails320
Gemset 'rails410' created.
Gemset 'rails320' created.

$ rvm 2.1.1@rails410
$ gem install rails -v 4.1.0

$ rvm 2.1.1@rails320
$ gem install rails -v 3.2.0

Gemset erstellen und nutzen
rvm --create use 1.8.7@some-gemset-name
gem install rails -v 2.3.14

Infos zu den Gemsets:
Name des aktuelles Gemsets

$rvm gemset name

Show path des aktuellen gemsets

$rvm gemdir

Auflisten aller gemsets (für den aktuellen Rubyintepreter, alle)

$rvm list
$rvm list_all

 

RVM in Entwicklungsumgebung

myproject$ rvm 2.1.1@rails320
myproject$ ./script/server

Lädt das richtige gemset und startet den mongrel Testserver, der dann auf die Development_DB zugreift.

RVM in Apache

Ausführliche Behandlung des Themas

Unter sites-available in der x.conf den Pfad zum RVM-gemset angeben:

<VirtualHost *:80>
    PassengerRuby /usr/local/rvm/wrappers/ruby-1.9.3-p551@rails2318/ruby
...
</VirtualHost>
11/15/16

Datumsoperationen

Immer wieder werden in PHP Datumsumrechnungen benötigt. Hier der Spickzettel mit einigen gängigen Ausdrücken dazu:

 

$now = date('Y-m-d H:i:s');
    error_log($now."\n");
    $today = date('Y-m-d');
    error_log($today."\n");
    $LastCall = date('Y-m-d H:i:s',strtotime($metainfos['lastCallTimestamp']));    
    $dayOfLastCall = date('Y-m-d',strtotime($metainfos['lastCallTimestamp']));    
    error_log($dayOfLastCall."\n");

    error_log('$dayOfLastCall < $today: '.strval($dayOfLastCall < $today));
    
    $d1Str = '2016-10-20 15:00:23';
    $d2Str = '2016-10-20 16:00:23';
    $testdate1 = date('Y-m-d H:i:s',strtotime($d1Str));    
    $testdate2 = date('Y-m-d H:i:s',strtotime($d2Str));            
    error_log($testdate2 - $testdate1);    


    $diffHours = (strtotime($testdate2)-strtotime($testdate1)) / (60 * 60);
    echo $diffHours;
    if($diffHours < 1)echo "<"; 
    else if($diffHours == 1)echo "="; 
    else echo ">";

    $date1=  new DateTime("2016-10-20 20:10:23");
    $date2= new DateTime("2016-10-20 15:00:23");
    
    echo "\n".$date1->diff($date2)->format('%H:%I:%S')."\n";
11/20/14

Server Backup

Full system backup with rsync
======================
/backup/SERVER_XY/system::
rsync -avz –exclude={“/dev/*”,”/proc/*”,”/sys/*”,”/tmp/*”,”/run/*”,”/mnt/*”,”/media/*”} root@SERVER_XY:/* .

DB-Backup
=========
auf host::
mysqldump -u root -p –all-databases > fulldb-backup.sql

/backup/SERVER_XY/system::
scp root@SERVER_XY:fulldb-backup.sql .
WICHTIG:
========
Für ein richtiges Backup muss ein Skript erstellt werden, dass dann regelmäßig backups durchführt::
https://www.heinlein-support.de/howto/backups-und-snapshots-von-linux-servern-mit-rsync-und-ssh

06/25/13

Privatsphäre Online

Anonym Surfen

Benutzung von “Onion routing” bzw. “TOR”

=> Post zum Thema anonym surfen und Tor

Sichere Mail

Verschlüsselung per PGP nutzen.

Anonymes Chatten (Voice+Text)

Es gibt sie: die Alternative zu Skype mit der man Chatten, Video-Telefonieren, Screensharen etc. kann und das mit ordentlicher Verschlüsselung und OpenSource:

Ein von Hackern empfohlener Client ist JITSI. Downloaden unter jitsi.org. Eine Alternative wäre der Client Pidgin mit der otr-Erweiterung.

Für alle Clients wird ein XMPP(Jabber)-Account benötigt. Ein beliebter u. empfehlenswerter Jabber-Server ist z.B. der Server des Chaos Computer Clubs – https://web.jabber.ccc.de. Der neuen Account kann aus JITSI heraus angelegt werden.
Die XMPP Standards Foundation bietet eine Lange Liste weiterer öffentlicher Jabber-Server an.

Bebilderte Anleitung für JITSI+Jabber-Account: Weg von Skype, hin zu JITSI

=> Tutorial

=> Wikipedia-Artikel

Mac: OTR-Plugin für Adium

Kurzanleitung in 4 Schritten:
1. JITSI runterladen (für Mac/Win):
https://jitsi.org/Main/Download und

2. installieren und starten und dann

3. einen neuen Account anlegen:
Im Menü auf Datei->Konto hinzufügen->Netzwerk auswählen->XMPP. Dann “Neues XMPP-Konto erstellen” auswählen. Jetzt einen Benutzernamen ausdenken und den dann mit der Endung @jabber.ccc.de verbinden: erfundenes Bsp.: jhonnybegood@jabber.ccc.de und ein Passwort wählen und Hinzufügen klicken. Wenn der Benutzer noch nicht vorhanden ist wird der Account sofort erstellt.

4. Freunde hinzufügen:
Im Menü unter Datei->”Kontakt hinzufügen” auswählen. In das Feld “ID oder Nummer” kommt der vollständige Accountname (z.B. johnnybegood@jabber.ccc.de) und bei Anzeigename könnt Ihr frei wählen, was in Eurer Liste angezeigt werden soll (z.B. “Johnny B.”).

 

Cloud-Dienste

Cloud-Dienste sind so praktisch, dass sie für viele nicht mehr wegzudenken sind (Dropbox, Google-Kalender, …): – Synchronisieren von Dateien, Kalendern/Aufgaben, Musikstreaming: Opensourcesoftware Owncloud. Funktioniert mit verschlüsselter Verbindung. Entweder auf eigenem Server oder einen Account auf vertrauenswürdigem Server erstellen.

=> Owncloud-Installationsanleitung

Projektseiten/Wikis

Projektseiten/Wikis a la Googlesites lassen sich im Handumdrehen mit WordPress selbst erstellen: Entweder auf eigenem Server oder einen Account auf vertrauenswürdigem Server erstellen.

=> WordPress-Installationsanleitung

06/25/13

Mein digitaler Schutzschild

Artikel auf Zeit-online: Mein digitaler Schutzschild

Befasst sich mit folgenden Themen:

 

06/25/13

Security Update Debian

Security-update bei Debian
http://www.debian.org/doc/manuals/securing-debian-howto/ch4.de.html#s-security-update
Seit Debian Woody 3.0 wird Ihnen nach der Installation die Möglichkeit eingeräumt, Sicherheitsaktualisierungen Ihrem System hinzuzufügen. Wenn Sie hier ‘ja’ sagen, wird das Installationssystem die passenden Schritte unternehmen, um die Quellen der Sicherheitsaktualisierungen Ihren Paketquellen hinzuzufügen.

Damit reichen dann folgende beiden Befehle:
# aptitude update
# aptitude upgrade

oder

# apt-get update
# apt-get upgrade

05/5/13

WordPress

Wie ich zu WordPress kam
Ich war auf der Suche nach einer Technologie, mit der ich meine Homepage gestalten kann. Und zwar als OpenSource CMS mit der Möglichkeit Blogposts integrieren zu können. Außerdem sollten auch bestimmte Freunde die Seite mitgestalten können. Mit dem selben System wollte ich aber auch kleine nichtöffentliche Projektwikis anlegen können, auf die natürlich nur die jeweiligen Projektteilnehmer zugreifen können sollen. Für die Projektseiten soll es dann auch noch einen Issuetracker geben.

Fündig geworden bin ich bei WordPress. Welche Schritte dafür nötig sind, zeigt dieser Post.
Viel Erfolg 🙂

Basisinstallation

Das geht in wenigen Minuten 🙂

http://www.linuxcandy.com/2012/02/how-to-install-wordpress-in-ubuntudebain-system-or-server.html

Multisite

Damit kann man dann als Admin mit einem Klick neue Blogs/Sites hinzufügen, die komplett unterschiedliche Nutzergruoppen haben können.

http://www.redirect301.de/wordpress-multisite-mit-subdomains-installieren.html#blog-netzwerk-aktivieren

Multisite Privacy

Damit man bei den Multisites jeweils individuell einstellen kann, ob die Seite öffentlich sichtbar ist oder nur für die Nutzer der jeweiligen Site oder für alle Nutzer aus allen Blogs der Multisite, braucht es dieses Plugin.

http://wordpress.org/extend/plugins/more-privacy-options/installation/

Roles & Cpabilities

http://codex.wordpress.org/Roles_and_Capabilities

Issue tracker

Ganz einfacher Weg eine Issueliste anzulegen mit den üblichen Eintragungen (Task,  Verantwortlicher, Dauer, Zustand, …). Geht im Backend und kann als Widget in der Seitenleiste eingevlendet werden.

http://wordpress.org/extend/plugins/really-simple-issue-tracker/

CMS

WordPress lässt sich wunderbar als CMS verwenden. Einfach Pages anlegen. In den Settings bei Reading -> Front page displays -> A static page aussuchen. Geht nicht mit allen Templates (geht aber z.B. mit dem aktuellen Standarttheme “Twenty Twelve” ).

http://wordpress.lernenhoch2.de/handbuch/wordpress-als-cms/

http://www.websitestartup.de/wordpress-als-cms

Themes

http://www.tripwiremagazine.com/2013/01/wordpress-cms-themes.html

http://themeforest.net/item/avada-responsive-multipurpose-theme/full_screen_preview/2833226?ref=lvraa&ref=lvraa&clickthrough_id=129481994&redirect_back=true

Hilfe beim ersten großen Fehler

Description

All the default categories/tags links are not working, showing error..

“This is somewhat embarrassing, isn’t it?”

Steps to reproduce:

  1. Install WP 3.3.1 on domain, e.g.  http://blog.example.com
  2. Enable multi-site features, using subfolder instead of subdomain
  3. Create a site, e.g.  http://blog.example.com/test1
  4. Create a post, e.g.  http://blog.example.com/test1/2012/03/04/test1/
  5. Enter the default category link, e.g.  http://blog.example.com/test1/category/uncategorized/

Now you will see the message: “This is somewhat embarrassing, isn’t it?”

Fix:

  1. Enter this link:  http://blog.example.com/test1/wp-admin/options-permalink.php
  2. Change nothing, press “Save Changes”
  3. Now you can view the link correctly:  http://blog.example.com/test1/category/uncategorized/

The above issue also apply to tags

Hat bei mir wunderbar funktioniert 🙂

05/5/13

VIM

VIM SCHNELLÜBERSICHT

Grundlegende Bewegungen
h l k j Zeichen links, rechts; Zeile hoch, runter
b w Wort links, rechts
ge e Wortende links, rechts
{  } Anfang vorhergehender, nächster Absatz
( ) Anfang vorhergehender, nächster Satz
0 gm Zeilenanfang, Zeilenmitte
^  $ erstes, letztes Zeichen der Zeile
nngg Zeile n, Ersatzwert: letzte, erste Zeile
n% Prozentsatz n der Datei
n| Spalte n der akt. Zeile
% zugehörige Klammer, Kommentarende,#define
nnL Zeile n nach Dateianfang, vor Dateiende
M mittlere Zeile im Fenster
Einfügen & Ersetzen Einfügemodus
i a vor, nach dem Cursor einfügen
I A am Anfang, Ende der Zeile einfügen
gI in der 1. Spalte einfügen
o O neue Zeile unter, über der akt. Zeile öffnen
rc Zeichen unter dem Cursor durch c ersetzen
grc wie r, ohne Auswirkung auf das Layout
R Zeichen ab der Cursorposition ersetzen
gR wie R, ohne Auswirkung auf das Layout
cm ersetze Text des Bewegungsbefehls m
cc or S ersetze aktuelle Zeile
C ersetze bis zum Zeilenende
s ersetze ein Zeichen, gehe in den Einfügemodus
~ ändere Groß-/Kleinschreibung
g~m ändere Groß-/Kleinschr. des Bew.bef. m
gum gUm Klein-, Großschreibung des Bew.bef. m
<m >m Text der Bewegung m links, rechts schieben
n<< n>> n Zeilen links, rechts schieben
Löschen
x X lösche Zeichen unter, vor dem Cursor
dm lösche Text der Bewegung m
dd D lösche akt. Zeile, bis zum Zeilenende
J gJ 2 Zeilen zusammenfassen, ohne Leerzeichen
:rd lösche r Zeilen
:rdx lösche r Zeilen in Register x
Einfügemodus
^Vc ^Vn Zeichen c wörtl. einfügen, Dez.wert n
^A zuvor eingefügten Text einfügen
^@ wie ^A und Einfüge-  Befehlsmodus
^Rx ^R^Rx füge Inhalt des Registers x ein, wörtl.
^N ^P Textergänzung (Treffer nach, vor dem Cursor)
^W Wort vor dem Cursur löschen
^U alle eingefügten Zeichen der akt. Zeile löschen
^D ^T einen Tab.abstand links, rechts schieben
^Kc1c2 or c1c2 Digraph \c1,c2\ eingeben
^Oc Befehl c ausführen
^X^E ^X^Y aufwärts, abwärts blättern
<esc> or ^[ in den Befehlsmodus schalten
Kopieren
"x nächstes Löschen, Kopieren, Einfügen in Reg. x
:reg Inhalt aller Register zeigen
:reg x Inhalt von Register x zeigen
ym kopiere Text des Bewegungsbefehls m
yy or Y kopiere akt. Zeile in das Kopierregister
p P füge Kopierregister hinter, vor dem Cursor ein
]p [p wie pP mit Einrückung
gp gP wie pP, Cursor bleibt hinter dem Text
Weitere Einfügeoperationen
g?m rot13-Verschlüsselung für die Bewegung m
n^A n^X +n-n zur Zahl unter dem Cursor
gqm format. Bewegungsbereich m auf feste Breite
:rce w zentriere Zeilen im Bereich r auf Breite w
:rle i Zeilenbereich r linksbündig mit Einrückungi
:rri w Zeilenbereich r rechtsbündig auf Breite w
!mc filtere Bewegungsbereich m durch ext. Befehl c
n!!c filtere n Zeilen durch ext. Befehl c
:r!c filtere Zeilenbereich r durch ext. Befehl c
Markierungsmodus
v V ^V Zeichen-, Zeilen-, Blockmarkierung ein/aus
o Cursor an den Anfang der Markierung
gv letzten markierten Bereich nochmals markieren
aw as ap Wort, Satz, Absatz markieren
ab aB ( )-Block , { }-Block markieren
Rückgängig machen, Wiederholen & Register
u letzten Befehl rückgängig machen
U zuletzt geänderte Zeile wiederherstellen
letzte Änderungen wiederholen
^R rückgängig gemachten Befehl erneut anwenden
n letzte Änderungen n-mal durchführen
qc qC nächste Eingaben in Reg. c speichern, anfügen
q Aufzeichnung beenden
@c Inhalt von Register c ausführen
@@ letzten @-Befehl wiederholen
:@c Register c als Ex-Befehl ausführen
:rg/p/c Ex-Befehl c für Bereich r dort ausführen
wo das Muster p zutrifft
Komplexe Bewegungen
- + Zeile hoch, runter auf erstes Nichtleerzeichen
B W Wort links, rechts (Trennung: Leerzeichen)
gE E Wortende links, rechts (Trennung: Leerzeichen)
n_ n-1 Zeilen runter zum 1. Nichtleerzeichen
g0 Anfang der Bildschirmzeile
g^  g$ erstes, letztes Zeichen der Bildschirmzeile
gk gj Bildschirmzeile auf, ab
fc Fc nächstes, vorhergehendes Zeichen c suchen
tc Tc vor nächstes c, hinter vorhergehendes c
; , letztes fFtT wiederholen, in Gegenrichtung
[[ ]] zum Abschnittsbeginn rückwärts, vorwärts
[] ][ zum Abschnittsende rückwärts, vorwärts
[( ]) offene (, ) rückwärts, vorwärts
[{  [} offene {} rückwärts, vorwärts
[m ]m Anfang der vorhergeh., nächsten Java-Methode
[# ]# offenes #if#else#endif rückwärts, vorwärts
[* ]* Anfang, Ende /* */ rückwärts, vorwärts
Suchen & Ersetzen
/s  ?s suche s vorwärts, rückwärts
/s/o  ?s?o suche s vorw., rückw., Versatz o
or / letzte Suche vorwärts wiederholen
or ? letzte Suche rückwärts wiederholen
# * suche Wort unter Cursor rückwärts, vorwärts
g# g* dasselbe, auch teilweise Übereinstimmung
gd gD lok., glob. Def. des Symbols unter Cursor
:rs/f/t/x im Bereich r wird f durch t ersetzt
x: g-alle Vorkommen, c-mit Bestätigung
:rx Ersetzung mit neuem r & x wiederholen
Metazeichen in Suchmustern
.   ^  $ beliebiges Zeichen, Zeilenanfang, Zeilenende
\< \> Wortanfang, Wortende
[c1-c2] einzelnes Zeichen im Bereich c1..c2
[^c1-c2] einzelnes Zeichen nicht im Bereich c1..c2
\i \k \I \K Name, Schlüsselwort; ohne Ziffern
\f \p \F \P Dateiname, druck. Zeichen; ohne Ziffern
\s \S Leerzeichen, Nichtleerzeichen
\e \t \r \b <esc><tab><><>
\= * \+ Wiederholungen: 0..10..1..
\| trennt Alternativen (  Oder)
\( \) faßt Muster zu einer Gruppe zusammen
\& \n der ganze Treffer, die n-te () Gruppe
\u \l Groß-, Kleinbuchstabe
Versätze in Suchbefehlen
n or +n n Zeilen abwärts in Spalte 1
-n n Zeilen aufwärts in Spalte 1
e+n e-n n Zeilen rechts, links vom Ende des Treffers
s+n s-n n Zln. rechts, links vom Anfang des Treffers
;sc anschließend Suchbefehl sc ausführen
Marken und Bewegungen
mc Marke [a..Z] an die akt. Position setzen
`c `C zur Marke c in akt. Datei, C in belieb. Datei
`0..9 zur Pos. beim letzten Verlassen des Editors
`` `" zur Pos. vor dem Sprung, vor letztem Verl.
`[ `] zum Anfang, Ende des zuletzt geändert. Textes
:marks Liste der Markierungen ausgeben
:jumps Liste der Sprungpositionen ausgeben
n^O zur n-ten älteren Pos. in der Sprungliste
n^I zur n-ten jüngeren Pos. in der Sprungliste
Tastenbelegung & Abkürzungen
:map c e ersetze  e im Normal- & Mark.mod.
:map!  c e ersetze  e im Einfüge- & Bef.mod.
:unmap c  :unmap! c Ersetzung für c aufheben
:mk f akt. Einstellungen in Datei f schreiben
:ab c e definiere c als Abkürzung für e
:ab c Abkürzung zeigen, die mit c beginnen
:una c Abkürzung c löschen
Tags
:ta t springe zum tag t
:nta springe zum n-neueren tag des Stapels
^] ^T zum tag unter dem Cursor, zurück vom tag
:ts t Liste der tags zeigen, einen auswählen
:tj t springe zum tag t
:tags Liste der tags ausgeben
:npo :n^T zum n-älteren tag des Stapels
:tl springe zum letzten passenden tag
^W}  :pt t zeige tag unter Cursor, tag t (preview)
^W] teile Fenster und zeige tag unter dem Cursor
^Wz or :pc schließe preview-Fenster
Blättern & mehrere Fenster
^E ^Y Zeile auf, ab
^D ^U halbe Seite auf, ab
^F ^B Seite auf, ab
zt or z akt. Zeile an den Fensteranfang
zz or z.  akt. Zeile in die Fenstermitte
zb or z- akt. Zeile an das Fensterende
zh zl ein Zeichen nach rechts, links
zH zL halben Bildschirm nach rechts, links
^Ws or :split Fenster waagrecht teilen
^Wn or :new neues, leeres Fenster erzeugen
^Wo or :on akt. Fenster wird einziges Fenster
^Wj ^Wk in das Fenster unten, oben
^Ww ^W^W in das Fenster unten, oben (reihum)
Ex-Befehle ()
:e f editiere Datei f, außer nach Änderungen
:e!  f editiere Datei f in jedem Fall
:wn :wN Datei schreiben & nächste, vorhergeh. edit.
:n :N nächste, vorhergeh. Datei editieren
:rw Bereich r in akt. Datei schreiben
:rf Bereich r in Datei f schreiben
:rw>>f Bereich r an Datei f anhängen
:q :q! Editor verlassen, Änderungen verwerfen
:wq or 😡 or ZZ akt. Datei schreiben & Ed. verlassen
<up> <down> in der Befehlsliste blättern
:r f Inhalt von Datei f vor Cursor einfügen
:r!  c Ausgabe des Befehles c nach Cursor einfügen
:all ein Fenster pro Datei in der Arg.liste öffnen
:args die Argumentliste anzeigen
Ex-Bereiche
, ;  trennt 2 Zeilennummern, gehe zur ersten
der Zeilen
n absolute Zeilennummer n
.   $ akt. Zeile, letzte Zeile der Datei
% * ganze Datei, markierter Bereich
't Position der Marke t
/p/ ?p? nächste, vorherg. Zeile für die p zutrifft
+n -n +n-n zur akt. Zeilennummer
Faltung
zfm erzeuge Faltung bis Bewegung m
:rfo erzeuge Faltung für den Bereich r
zd zE lösche Faltung unter Cursor, alle im Fenster
zo zc zO zC öffne, schließe Faltung unter Cursor;
rekursiv
[z ]z zum Anfang, Ende der offenen Faltung
zj zk aufwärts, abwärts zum Anfang, Ende
der nächsten Faltung
Verschiedenes
:sh  :!c starte Shell, Shell-Befehl c ausführen
K man für Wort unter dem Cursor aufrufen
:make make starten, Fehler lesen, zum 1. springen
:cn  :cp zum nächste, vorherg. Fehler springen
:cl  :cf Fehlerliste ausgeben,   aus Datei lesen
^L Bildschirm neu schreiben
^G Dateinamen und Position zeigen
g^G zeige Cursorpos.: Spalte, Zeile, Wort, Byte
ga ASCII-Wert des Zeichens unter dem Cursor
gf Datei öffnen, deren Name unter dem Cursor steht
:redir>f Ausgabe in Datei f umleiten
:mkview [f] Darstellungsopt. speichern [in Datei f]
:loadview [f] Darstellungsopt. laden [aus Datei f]
^@ ^K ^_  \  Fn ^Fn nichtdef. Tasten, Neudef. möglich

Copyright (C) 2005 by Laurent GRÉGOIRE (laurent.gregoire@icam.fr)
Translated from English by Fritz Mehner
Converted from vimqrc-ge.tex using a Python script.